From da81e0815fd5385dfbf827fb5a88d7316609278b Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Sat, 7 Sep 2019 12:12:41 -0400 Subject: [PATCH] * build.template: Rewrite to allow gnulib support. --- build.template | 115 ++++++++++++++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 45 deletions(-) diff --git a/build.template b/build.template index 538cb9f6..2eb2b630 100644 --- a/build.template +++ b/build.template @@ -23,67 +23,92 @@ LIBOBJDIR=lib/ U= -top_srcdir="@top_srcdir@" -CC="@CC@" -CFLAGS="@CFLAGS@ @GUILE_CFLAGS@" -CPPFLAGS="@CPPFLAGS@" -LDFLAGS="@AM_LDFLAGS@ @LDFLAGS@" -ALLOCA="@ALLOCA@" -LOADLIBES="@LIBS@ @GUILE_LIBS@ @LIBINTL@" -LIBOBJS="@LIBOBJS@" -REMOTE="@REMOTE@" -OBJEXT="@OBJEXT@" -EXEEXT="@EXEEXT@" - -# Use our old-style glob implementation -test x"@USE_SYSTEM_GLOB@" = xno && LIBOBJS="${LIBOBJS} ${LIBOBJDIR}fnmatch.$OBJEXT ${LIBOBJDIR}glob.$OBJEXT" +top_srcdir='@top_srcdir@' +CC='@CC@' +AR='@AR@' +CFLAGS='@CFLAGS@ @GUILE_CFLAGS@' +CPPFLAGS='@CPPFLAGS@' +DEFS='@DEFS@' +ARFLAGS='@ARFLAGS@' +LDFLAGS='@AM_LDFLAGS@ @LDFLAGS@' +ALLOCA='@ALLOCA@' +LOADLIBES='@LIBS@ @GUILE_LIBS@ @LIBINTL@' +REMOTE='@REMOTE@' +OBJEXT='@OBJEXT@' +EXEEXT='@EXEEXT@' # Common prefix for machine-independent installed files. -prefix="@prefix@" +prefix='@prefix@' # Common prefix for machine-dependent installed files. exec_prefix=`eval echo @exec_prefix@` # Directory to find libraries in for '-lXXX'. -libdir=${exec_prefix}/lib +libdir=$exec_prefix/lib # Directory to search by default for included makefiles. -includedir=${prefix}/include +includedir=$prefix/include -localedir=${prefix}/share/locale +localedir=$prefix/share/locale -defines="-DLOCALEDIR=\"${localedir}\" -DLIBDIR=\"${libdir}\" -DINCLUDEDIR=\"${includedir}\" @DEFS@" +defines="-DLOCALEDIR=\"$localedir\" -DLIBDIR=\"$libdir\" -DINCLUDEDIR=\"$includedir\"" + +# Look up a make variable value +# It can handle very simple recursion, where variables are separate words +get_mk_var () +{ + file=$1 + var=$2 + + val= + v=$(sed -e :a -e '/\\$/N; s/\\\n//; ta' "$file" | sed -n "s=^ *$var *\= *==p") + for w in $v; do + case $w in + (\$[\(\{]*[\)\}]) w=${w#\$[\(\{]}; w=$(get_mk_var "$file" "${w%[\)\}]}") ;; + esac + val="${val:+$val }$w" + done + + printf %s "$val" +} + +# Get source files provided from gnulib +LIBOBJS= +for lc in $(get_mk_var lib/Makefile libgnu_a_SOURCES); do + case $lc in + (*.c) LIBOBJS="${LIBOBJS:+$LIBOBJS }$LIBOBJDIR${lc%.c}.$OBJEXT" ;; + (*) echo ignore $lc ;; + esac +done + +compile () +{ + objs= + for ofile in "$@"; do + file=${ofile%.$OBJEXT}.c + echo "compiling $file..." + mkdir -p _bldobj/${file%/*} + of=_bldobj/$ofile + $CC $defines $DEFS $CPPFLAGS $CFLAGS -c -o "$of" \ + -Isrc -I"$top_srcdir"/src -Ilib -I"$top_srcdir"/lib "$top_srcdir/$file" + objs="${objs:+$objs }$of" + done +} # Exit as soon as any command fails. set -e -# These are all the objects we need to link together. -objs="%objs% src/remote-${REMOTE}.${OBJEXT} ${LIBOBJS}" +rm -rf _bldobj +mkdir _bldobj -case $LIBOBJS in - (*alloca*) cp "$top_srcdir"/lib/alloca.in.h lib/alloca.h ;; -esac -case $LIBOBJS in - (*fnmatch*) cp "$top_srcdir"/lib/fnmatch.in.h lib/fnmatch.h ;; -esac -case $LIBOBJS in - (*glob*) cp "$top_srcdir"/lib/glob.in.h lib/glob.h ;; -esac +# Build the gnulib library +compile $LIBOBJS + +echo creating libgnu.a... +$AR $ARFLAGS _bldobj/lib/libgnu.a $objs # Compile the source files into those objects. -for file in `echo ${objs} | sed 's/\.'${OBJEXT}'/.c/g'`; do - echo compiling ${file}... - $CC $defines $CPPFLAGS $CFLAGS \ - -c -Isrc -I"$top_srcdir"/src -Ilib -I"$top_srcdir"/lib "$top_srcdir"/$file -done - -# The object files were actually all put in the current directory. -# Remove the source directory names from the list. -srcobjs="$objs" -objs= -for obj in $srcobjs; do - objs="$objs `basename $obj`" -done +compile %objs% src/remote-$REMOTE.$OBJEXT # Link all the objects together. echo linking make... -$CC $CFLAGS $LDFLAGS $objs $LOADLIBES -o makenew${EXEEXT} +$CC $CFLAGS $LDFLAGS -L_bldobj/lib $objs -lgnu $LOADLIBES -o makenew$EXEEXT echo done -mv -f makenew${EXEEXT} make${EXEEXT} +mv -f makenew$EXEEXT make$EXEEXT