makesetup 5.89 KB
Newer Older
1 2
#! /bin/sh

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
# 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
25
# - for each <module> mentioned in Setup before *noconfig*:
26 27 28 29 30
#   + 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
31
# - replace _MODOBJS_ by the list of objects from Setup (except for
32
#   Setup files after a -n option)
33
# - replace _MODLIBS_ by the list of libraries from Setup
34 35 36 37
# - 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
38 39
# - for each variable definition found in Setup, insert the definition
#   before the comment 'Definitions added by makesetup'
40

41 42 43 44 45 46 47 48
# Loop over command line options
usage='
usage: makesetup [-s srcdir] [-c config.c.in] [-m Makefile.pre]
                 [Setup] ... [-n [Setup] ...]'
srcdir=''
config=''
makepre=''
noobjects=''
49
doconfig=yes
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
while :
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;;
	esac
done

# 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;;
esac
case $config in
'')	config=$srcdir/config.c.in;;
esac
case $makepre in
'')	makepre=Makefile.pre;;
esac

# Newline for sed i and a commands
79 80
NL='\
'
81

82 83 84 85
# Main loop
for i in ${*-Setup}
do
	case $i in
86 87
	-n)	echo '*noobjects*';;
	*)	echo '*doconfig*'; cat "$i";;
88 89 90
	esac
done |
sed -e 's/[ 	]*#.*//' -e '/^[ 	]*$/d' |
91
(
92 93 94 95 96
	rulesf="@rules.$$"
	trap 'rm -f $rulesf' 0 1 2 3
	echo "
# Rules appended by makedepend
" >$rulesf
97 98
	DEFS=
	MODS=
99
	SHAREDMODS=
100 101
	OBJS=
	LIBS=
102 103
	LOCALLIBS=
	BASELIBS=
104 105
	while read line
	do
106
		# Output DEFS in reverse order so first definition overrides
107
		case $line in
108
		*=*)	DEFS="$line$NL$DEFS"; continue;;
109
		'*noobjects*')
110 111 112 113 114
			case $noobjects in
			yes)	;;
			*)	LOCALLIBS=$LIBS; LIBS=;;
			esac
			noobjects=yes;
115 116
			continue;;
		'*doconfig*')	doconfig=yes; continue;;
117
		'*static*')	doconfig=yes; continue;;
118
		'*noconfig*')	doconfig=no; continue;;
119
		'*shared*')	doconfig=no; continue;;
120
		esac
121
		srcs=
122
		cpps=
123 124
		libs=
		mods=
125
		skip=
126
		for arg in $line
127
		do
128 129 130 131 132
			case $skip in
			libs)	libs="$libs $arg"; skip=; continue;;
			cpps)	cpps="$cpps $arg"; skip=; continue;;
			srcs)	srcs="$srcs $arg"; skip=; continue;;
			esac
133 134
			case $arg in
			-[IDUC]*)	cpps="$cpps $arg";;
135 136
			-[A-Zl]*)	libs="$libs $arg";;
			*.a)		libs="$libs $arg";;
137 138
			*.so)		libs="$libs $arg";;
			*.sl)		libs="$libs $arg";;
139
			*.o)		srcs="$srcs `basename $arg .o`.c";;
140 141 142
			*.[cC])		srcs="$srcs $arg";;
			*.cc)		srcs="$srcs $arg";;
			*.c++)		srcs="$srcs $arg";;
143 144
			\$*)		libs="$libs $arg"
					cpps="$cpps $arg";;
145 146
			*.*)		echo 1>&2 "bad word $arg in $line"
					exit 1;;
147
			-u)		skip=libs; libs="$libs -u";;
148
			[a-zA-Z_]*)	mods="$mods $arg";;
149 150 151 152
			*)		echo 1>&2 "bad word $arg in $line"
					exit 1;;
			esac
		done
153 154 155 156 157 158
		case $doconfig in
		yes)
			LIBS="$LIBS $libs"
			MODS="$MODS $mods"
			;;
		esac
159 160 161
		case $noobjects in
		yes)	continue;;
		esac
162 163
		objs=''
		for src in $srcs
164
		do
165 166 167 168 169 170 171 172 173 174 175 176 177
			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)';;
			*)     continue;;
			esac
			objs="$objs $obj"
			case $src in
			glmodule.c) ;;
			*) src='$(srcdir)/'$src;;
			esac
			case $doconfig in
178
			no)	cc="$cc \$(CCSHARED)";;
179 180 181
			esac
			rule="$obj: $src; $cc \$(CFLAGS) $cpps -c $src"
			echo "$rule" >>$rulesf
182
		done
183 184 185 186
		case $doconfig in
		yes)	OBJS="$OBJS $objs";;
		esac
		for mod in $mods
187
		do
188 189 190 191 192 193 194 195 196
			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"
197
			rule="$rule; \$(LDSHARED) $objs $libs -o $file"
198
			echo "$rule" >>$rulesf
199
		done
200 201
	done

202 203 204 205 206
	case $SHAREDMODS in
	'')	;;
	*)	DEFS="SHAREDMODS=$SHAREDMODS$NL$DEFS";;
	esac

207 208 209 210 211 212 213 214
	case $noobjects in
	yes)	BASELIBS=$LIBS;;
	*)	LOCALLIBS=$LIBS;;
	esac
	LIBS='$(LOCALMODLIBS) $(BASEMODLIBS)'
	DEFS="BASEMODLIBS=$BASELIBS$NL$DEFS"
	DEFS="LOCALMODLIBS=$LOCALLIBS$NL$DEFS"

215 216 217 218 219 220 221 222
	EXTDECLS=
	INITBITS=
	for mod in $MODS
	do
		EXTDECLS="${EXTDECLS}extern void init$mod();$NL"
		INITBITS="${INITBITS}	{\"$mod\", init$mod},$NL"
	done

223

224 225 226 227 228
	case $config in
	-)  ;;
	*)  sed -e "
		1i$NL/* Generated automatically from $config by makesetup. */
		/MARKER 1/i$NL$EXTDECLS
229 230
		/MARKER 2/i$NL$INITBITS

231 232 233
		" $config >config.c
	    ;;
	esac
234

235
	case $makepre in
236 237 238 239 240 241
	-)	;;
	*)	sedf="@sed.in.$$"
		trap 'rm -f $sedf' 0 1 2 3
		echo "1i\\" >$sedf
		str="# Generated automatically from $makepre by makesetup."
		echo "$str" >>$sedf
242 243
		echo "s%_MODOBJS_%$OBJS%" >>$sedf
		echo "s%_MODLIBS_%$LIBS%" >>$sedf
244 245 246 247
		echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf
		sed -f $sedf $makepre >Makefile
		cat $rulesf >>Makefile
		rm -f $sedf
248 249
	    ;;
	esac
250

251
	rm -f $rulesf
252
)