mirror of https://github.com/0intro/wmii
237 lines
5.5 KiB
Bash
Executable File
237 lines
5.5 KiB
Bash
Executable File
#!/bin/sh -f
|
|
|
|
# What I wouldn't do for rc...
|
|
# Well... it's better than m4shgmake.
|
|
|
|
CONFIG="$ROOT/config.mk"
|
|
CONFSTR='# Generated by "make config"'
|
|
|
|
# ==================== The Messy Part ====================
|
|
|
|
#XXX Ignores lines ending in \
|
|
parseconfig() {
|
|
cat <<'!' | sed "s/CONFSTR/$CONFSTR/"
|
|
/^CONFSTR/ {exit}
|
|
/^( *#| )/ {next}
|
|
function fixup() {
|
|
sub(/ #.*/, "")
|
|
sub(/^ */, "")
|
|
gsub(/'/, "'\"'\"'")
|
|
sub(/[ ]*\+?=[ ]*/, "='")
|
|
sub(/[ ]*$/, "'")
|
|
var = $0
|
|
val = $0
|
|
sub(/\+?=.*/, "", var)
|
|
sub(/^[^=]+=/, "", val)
|
|
}
|
|
/\+=/ && !/^ / {
|
|
fixup()
|
|
if(!set[var]) {
|
|
print var"=''"
|
|
append[var]++
|
|
}
|
|
print var"=\"$" var " \"" val
|
|
print var"_orig=\"$" var "\""
|
|
next
|
|
}
|
|
/=/ && !/^ / {
|
|
fixup()
|
|
delete append[var]
|
|
set[var]++
|
|
|
|
print var"="val
|
|
print var"_orig=\"$" var "\""
|
|
}
|
|
END{
|
|
for(v in set)
|
|
print v "_append=''"
|
|
for(v in append)
|
|
print v "_append=true"
|
|
}
|
|
!
|
|
}
|
|
|
|
findinc() {
|
|
var="$1"; file="$2"; shift 2
|
|
for d in "$@"; do
|
|
if [ -d "$d" -a -f "$d/$file" ]; then
|
|
eval "$var=\"-I$d\""
|
|
break; fi; done
|
|
}
|
|
soext=.so
|
|
aext=.a
|
|
findlib() {
|
|
var="$1"; lib="$2"; shift 2
|
|
for d in "$@"; do
|
|
if [ -d "$d" -a -f "$d/$lib.so" -o -f "$d/lib$lib.a" ]; then
|
|
_libdir="$d"; _libname="$lib"
|
|
eval "$var=\"-L$d -l$lib\""
|
|
break; fi; done
|
|
}
|
|
|
|
expand() {
|
|
_expand="$@"; _expand_old=''
|
|
while [ "$_expand" != "$_expand_old" ]; do
|
|
_expand_old="$_expand"
|
|
eval "_expand=\"$_expand\""; done
|
|
echo -n "$_expand"
|
|
}
|
|
|
|
cfg() {
|
|
CFG="$CFG
|
|
$@"
|
|
}
|
|
|
|
equals() {
|
|
if [ -z "$append" ]; then
|
|
echo -n "=";
|
|
else
|
|
echo -n "+="; fi
|
|
}
|
|
|
|
prompt() {
|
|
var=$1; shift
|
|
eval "def=\$$var; orig=\$${var}_orig; append=\$${var}_append"
|
|
|
|
unset val
|
|
if [ -z "$def" -o -n "$force" ]; then
|
|
echo "$@"
|
|
echo -n "$var[$def]$(equals) "
|
|
read val
|
|
echo
|
|
fi
|
|
|
|
if [ -z "$val" ]; then
|
|
val="$def"; fi
|
|
if [ "$(expand $val)" != "$(expand "$orig")" ]; then
|
|
cfg "$var$(equals)$val"; fi
|
|
}
|
|
|
|
# The messy sed... Turns $(VAR) into ${VAR}, but not $$(VAR) into $${VAR}
|
|
eval "$(sed 's/\([^$]\)\$(\([A-Za-z_]*\))/\1${\2}/g' <"$CONFIG" | awk "`parseconfig`")"
|
|
CFG="$(sed -n "/^$CONFSTR/q; p" "$CONFIG"; echo "$CONFSTR")"
|
|
|
|
# ==================== The Fun Part ====================
|
|
|
|
cat <<!
|
|
Configuring for the wmii build.
|
|
|
|
You'll be prompted for a number of settings which wmii needs to build,
|
|
install, and run properly. In most cases, the defaults will be sufficient,
|
|
in which case, you may simply press return to accept them.
|
|
|
|
!
|
|
|
|
# Guess...
|
|
AWKPATH=$(which awk 2>/dev/null)
|
|
|
|
prompt AWKPATH "Full path to your system's 'awk' program"
|
|
prompt PLAN9 "Path of a Plan 9 Port or 9base installation"
|
|
|
|
force=1
|
|
prompt PREFIX Installation prefix
|
|
|
|
echo
|
|
echo "Compilation details (if you don't understand these, just leave the defaults)"
|
|
echo
|
|
prompt CC C object compiler
|
|
prompt LD 'Linker (this should normally not be "ld")'
|
|
|
|
set -- $CC
|
|
if $1 -v 2>&1 | grep 'gcc version' >/dev/null; then
|
|
echo -n You appear to be using gcc. Is this correct? '[yes] '
|
|
while :; do
|
|
read resp
|
|
case "$resp" in
|
|
[Yy][Ee][Ss]|'')
|
|
cfg 'include $(ROOT)/mk/gcc.mk'
|
|
break;;
|
|
[Nn][Oo])
|
|
cfg 'CFLAGS=""'
|
|
# Not perfect. Botches system cflags, but we
|
|
# need to ditch the gcc ones.
|
|
break;;
|
|
*)
|
|
echo -n 'Please answer yes or no: '
|
|
esac
|
|
done
|
|
echo
|
|
fi
|
|
|
|
prompt INCPATH Search path for include files
|
|
prompt LIBS Libraries to be linked with every executable
|
|
|
|
prompt CFLAGS Flags for the C compiler
|
|
prompt LDFLAGS Flags for the linker
|
|
case $(uname -s) in
|
|
[Dd]arwin) cfg 'STATIC=""';;
|
|
*) prompt STATIC Extra linker flags to produce a static executable;;
|
|
esac
|
|
unset force
|
|
|
|
# Make some guesses
|
|
|
|
# Extract the -L paths from ldflags.
|
|
ldlibs="$(awk 'BEGIN{
|
|
for(i=1; i <= ARGC; i++)
|
|
if(ARGV[i] ~ /-L/)
|
|
print ":" substr(ARGV[i], 3)
|
|
}' $LDFLAGS)"
|
|
# Turn include paths into ../lib paths.
|
|
inclibs="$(expand "$INCPATH"|sed 's,/include:,/lib:,g; s,/include$,/lib,')"
|
|
# Lace them all together, and expand them.
|
|
libs="$(expand "$LIBDIR:$ldlibs:$inclibs:/usr/local/lib:/opt/local/lib")"
|
|
|
|
LIBIXP=${LIBIXP%/libixp.a}
|
|
INCPATH="$INCPATH:/usr/local/include:/opt/local/include"
|
|
incpath="$(expand "$INCPATH")"
|
|
|
|
oifs="$IFS"; IFS=:
|
|
findinc INCX11 X11/Xlib.h $incpath \
|
|
/usr/X11R6/include /usr/x11/include /usr/x11/include /usr/X11/include \
|
|
/usr/openwin/include /opt/x11/include /opt/X11/include
|
|
findinc INCICONV iconv.h $incpath
|
|
|
|
findlib LIBX11 X11 $libs \
|
|
/usr/X11R6/lib /usr/X11/lib /usr/openwin/lib /usr/x11/lib \
|
|
/opt/X11 /opt/x11 /usr/local/lib /opt/local/lib
|
|
findlib LIBICONV iconv $libs
|
|
|
|
if [ -d "$ROOT/libixp" ]; then
|
|
_libdir="$ROOT/lib"; else
|
|
soext=.a findlib LIBIXP ixp "$ROOT/lib" $libs; fi
|
|
LIBIXP="$_libdir/libixp.a"
|
|
IFS="$oifs"
|
|
|
|
# Back to prompting
|
|
echo Library paths...
|
|
prompt INCX11 Compiler flags to find X11 includes
|
|
prompt LIBX11 Linker flags to link against libX11
|
|
|
|
# Find out if the system libc includes iconv...
|
|
# GNU systems tend to make /usr/lib/libc.so or /lib/libc.so
|
|
# linker scripts rather than libraries, so I can't parse them.
|
|
# As a kludge, I ask ldd what actual libc.so /bin/sh links to,
|
|
# which is pretty reliable. It's very unlikely that anyone will
|
|
# actually be prompted for this.
|
|
# I suppose the auto*hell way would be to just compile
|
|
# something against libc. Perhaps another day.
|
|
if nm -D $(ldd /bin/sh | awk '$1 ~ /^libc\.so/ {print $3}') |
|
|
awk -ve=1 '$2 == "T" && $3 == "iconv" {e=0; exit}; END {exit e}'
|
|
then
|
|
echo
|
|
echo "Your system's libc appears to include iconv."
|
|
echo
|
|
else
|
|
prompt LIBICONV Linker flags to link agains libiconv \
|
|
'(may be left blank if iconv is part of your system libc)'
|
|
fi
|
|
prompt INCICONV Compiler flags to find iconv.h
|
|
prompt LIBIXP Path to libixp.a
|
|
|
|
echo Writing config.mk
|
|
echo "$CFG
|
|
" >config.mk
|
|
echo Done.
|
|
|