📄 makesetup
字号:
#! /bin/sh# Convert templates into Makefile and config.c, based on the module# definitions found in the file Setup.## Usage: makesetup [-s dir] [-c file] [-m file] [Setup] ... [-n [Setup] ...]## Options:# -s directory: alternative source directory (default derived from $0)# -c file: alternative config.c template (default $srcdir/config.c.in)# -c -: don't write config.c# -m file: alternative Makefile template (default ./Makefile.pre)# -m -: don't write Makefile## Remaining arguments are one or more Setup files (default ./Setup).# Setup files after a -n option are used for their variables, modules# and libraries but not for their .o files.## See Setup.in for a description of the format of the Setup file.## The following edits are made:## Copying config.c.in to config.c:# - insert an identifying comment at the start# - for each <module> mentioned in Setup before *noconfig*:# + insert 'extern void init<module>();' before MARKER 1# + insert '{"<module>", initmodule},' before MARKER 2## Copying Makefile.pre to Makefile:# - insert an identifying comment at the start# - replace _MODOBJS_ by the list of objects from Setup (except for# Setup files after a -n option)# - replace _MODLIBS_ by the list of libraries from Setup# - for each object file mentioned in Setup, append a rule# '<file>.o: <file>.c; <build commands>' to the end of the Makefile# - for each module mentioned in Setup, append a rule# which creates a shared library version to the end of the Makefile# - for each variable definition found in Setup, insert the definition# before the comment 'Definitions added by makesetup'# Loop over command line optionsusage='usage: makesetup [-s srcdir] [-c config.c.in] [-m Makefile.pre] [Setup] ... [-n [Setup] ...]'srcdir=''config=''makepre=''noobjects=''doconfig=yeswhile :do case $1 in -s) shift; srcdir=$1; shift;; -c) shift; config=$1; shift;; -m) shift; makepre=$1; shift;; --) shift; break;; -n) noobjects=yes;; -*) echo "$usage" 1>&2; exit 2;; *) break;; esacdone# Set default srcdir and config if not set by command line# (Not all systems have dirname)case $srcdir in'') case $0 in */*) srcdir=`echo $0 | sed 's,/[^/]*$,,'`;; *) srcdir=.;; esac;;esaccase $config in'') config=$srcdir/config.c.in;;esaccase $makepre in'') makepre=Makefile.pre;;esac# Newline for sed i and a commandsNL='\'# Main loopfor i in ${*-Setup}do case $i in -n) echo '*noobjects*';; *) echo '*doconfig*'; cat "$i";; esacdone |sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |( rulesf="@rules.$$" trap 'rm -f $rulesf' 0 1 2 3 echo "# Rules appended by makedepend" >$rulesf DEFS= MODS= SHAREDMODS= OBJS= LIBS= LOCALLIBS= BASELIBS= while read line do # to handle backslashes for sh's that don't automatically # continue a read when the last char is a backslash while echo $line | grep '\\$' > /dev/null do read extraline line=`echo $line| sed s/.$//`$extraline done # Output DEFS in reverse order so first definition overrides case $line in *=*) DEFS="$line$NL$DEFS"; continue;; 'include '*) DEFS="$line$NL$DEFS"; continue;; '*noobjects*') case $noobjects in yes) ;; *) LOCALLIBS=$LIBS; LIBS=;; esac noobjects=yes; continue;; '*doconfig*') doconfig=yes; continue;; '*static*') doconfig=yes; continue;; '*noconfig*') doconfig=no; continue;; '*shared*') doconfig=no; continue;; esac srcs= cpps= libs= mods= skip= for arg in $line do case $skip in libs) libs="$libs $arg"; skip=; continue;; cpps) cpps="$cpps $arg"; skip=; continue;; srcs) srcs="$srcs $arg"; skip=; continue;; esac case $arg in -[IDUC]*) cpps="$cpps $arg";; -Xlinker) libs="$libs $arg"; skip=libs;; -rpath) libs="$libs $arg"; skip=libs;; -[A-Zl]*) libs="$libs $arg";; *.a) libs="$libs $arg";; *.so) libs="$libs $arg";; *.sl) libs="$libs $arg";; /*.o) libs="$libs $arg";; *.o) srcs="$srcs `basename $arg .o`.c";; *.[cC]) srcs="$srcs $arg";; *.cc) srcs="$srcs $arg";; *.c++) srcs="$srcs $arg";; *.cxx) srcs="$srcs $arg";; *.cpp) srcs="$srcs $arg";; \$*) libs="$libs $arg" cpps="$cpps $arg";; *.*) echo 1>&2 "bad word $arg in $line" exit 1;; -u) skip=libs; libs="$libs -u";; [a-zA-Z_]*) mods="$mods $arg";; *) echo 1>&2 "bad word $arg in $line" exit 1;; esac done case $doconfig in yes) LIBS="$LIBS $libs" MODS="$MODS $mods" ;; esac case $noobjects in yes) continue;; esac objs='' for src in $srcs do case $src in *.c) obj=`basename $src .c`.o; cc='$(CC)';; *.cc) obj=`basename $src .cc`.o; cc='$(CCC)';; *.c++) obj=`basename $src .c++`.o; cc='$(CCC)';; *.C) obj=`basename $src .C`.o; cc='$(CCC)';; *.cxx) obj=`basename $src .cxx`.o; cc='$(CCC)';; *.cpp) obj=`basename $src .cpp`.o; cc='$(CCC)';; *) continue;; esac objs="$objs $obj" case $src in glmodule.c) ;; /*) ;; *) src='$(srcdir)/'$src;; esac case $doconfig in no) cc="$cc \$(CCSHARED)";; esac rule="$obj: $src; $cc $cpps \$(CFLAGS) -c $src" echo "$rule" >>$rulesf done case $doconfig in yes) OBJS="$OBJS $objs";; esac for mod in $mods do case $objs in *$mod.o*) base=$mod;; *) base=${mod}module;; esac file="$base\$(SO)" case $doconfig in no) SHAREDMODS="$SHAREDMODS $file";; esac rule="$file: $objs" rule="$rule; \$(LDSHARED) $objs $libs -o $file" echo "$rule" >>$rulesf done done case $SHAREDMODS in '') ;; *) DEFS="SHAREDMODS=$SHAREDMODS$NL$DEFS";; esac case $noobjects in yes) BASELIBS=$LIBS;; *) LOCALLIBS=$LIBS;; esac LIBS='$(LOCALMODLIBS) $(BASEMODLIBS)' DEFS="BASEMODLIBS=$BASELIBS$NL$DEFS" DEFS="LOCALMODLIBS=$LOCALLIBS$NL$DEFS" EXTDECLS= INITBITS= for mod in $MODS do# EXTDECLS="${EXTDECLS}extern void init$mod();$NL" INITBITS="${INITBITS} {\"$mod\", init$mod},$NL" done case $config in -) ;; *) sed -e " 1i$NL/* Generated automatically from $config by makesetup. */ /MARKER 1/i$NL$EXTDECLS /MARKER 2/i$NL$INITBITS " $config >config.c ;; esac case $makepre in -) ;; *) sedf="@sed.in.$$" trap 'rm -f $sedf' 0 1 2 3 echo "1i\\" >$sedf str="# Generated automatically from $makepre by makesetup." echo "$str" >>$sedf echo "s%_MODOBJS_%$OBJS%" >>$sedf echo "s%_MODLIBS_%$LIBS%" >>$sedf echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf sed -f $sedf $makepre >Makefile cat $rulesf >>Makefile rm -f $sedf ;; esac rm -f $rulesf)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -