This implementation has very few reasonable code (call atol() and ctime()), but has some nice standard program stuff (parse options, print help, ...).
292 lines
5.3 KiB
Bash
Executable File
292 lines
5.3 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# configure
|
|
#
|
|
# A simple script to configure Makefiles
|
|
# (i.e. read Makefile.in, replace strings and write Makefile).
|
|
#
|
|
# heinzel <heinzel@heinzelwelt.de>
|
|
#
|
|
# $Id: configure,v 1.1 2008/02/19 14:12:59 heinzel Exp $
|
|
#
|
|
VERSION='configure Version 0.1 $Revision: 1.1 $ ($Date: 2008/02/19 14:12:59 $ $Author: heinzel $)'
|
|
|
|
### config ###
|
|
FILES=""
|
|
FILES_DEF="configure.files"
|
|
|
|
TEMPLATE_SUFFIX=".in"
|
|
MACROS_DEF="configure.macros"
|
|
|
|
MACROS="CTEMPLATE"
|
|
MACRO_CTEMPLATE="@CFILE@ (created by configure script)"
|
|
|
|
### functions ###
|
|
function print_help() {
|
|
cat <<EOH
|
|
configure create files by processing templates and replace macros.
|
|
For now macros are simple name-value pairs. Use strings like @NAME@ within
|
|
the template files and configure will replace those strings by the named
|
|
value while creating the resulting files.
|
|
|
|
Usage: ./configure [OPTIONS]
|
|
|
|
Options:
|
|
-h, --help
|
|
-V, --version
|
|
|
|
Generic Options (and default values):
|
|
EOH
|
|
for m in $MACROS ; do
|
|
case "$m" in
|
|
CFILE|CTEMPLATE)
|
|
continue
|
|
;;
|
|
esac
|
|
|
|
name="`echo $m | tr [[:upper:]] [[:lower:]]`"
|
|
text="`eval_macro $m`"
|
|
case "$text" in
|
|
0)
|
|
output=" --without-${name}"
|
|
;;
|
|
1)
|
|
output=" --with-${name}"
|
|
;;
|
|
*)
|
|
output=" --${name} $text"
|
|
;;
|
|
esac
|
|
echo "$output"
|
|
done
|
|
echo ""
|
|
cat <<EOH
|
|
Files:
|
|
This script will create following files: $FILES
|
|
or read file names to create from '$FILES_DEF'
|
|
The templates have to end with '$TEMPLATE_SUFFIX'
|
|
The macros can be defined in '$MACROS_DEF'
|
|
EOH
|
|
}
|
|
|
|
function print_version() {
|
|
echo "$VERSION"
|
|
}
|
|
|
|
function set_macro() {
|
|
case "$1" in
|
|
'')
|
|
return 1
|
|
;;
|
|
--with-*|--enable-*)
|
|
name="`echo $1 | cut -f1 -d= | cut -f4- -d- | tr [[:lower:]] [[:upper:]]`"
|
|
text="1"
|
|
;;
|
|
--without-*|--disable-*)
|
|
name="`echo $1 | cut -f1 -d= | cut -f4- -d- | tr [[:lower:]] [[:upper:]]`"
|
|
text="0"
|
|
;;
|
|
--*=*)
|
|
name="`echo $1 | cut -f1 -d= | cut -c3- | tr [[:lower:]] [[:upper:]]`"
|
|
text="`echo $1 | cut -f2- -d=`"
|
|
;;
|
|
--*)
|
|
name="`echo $1 | cut -c3- | tr [[:lower:]] [[:upper:]]`"
|
|
text="$2"
|
|
;;
|
|
*=*)
|
|
name="`echo $1 | cut -f1 -d= | tr [[:lower:]] [[:upper:]]`"
|
|
text="`echo $1 | cut -f2- -d=`"
|
|
;;
|
|
*)
|
|
name="`echo $1 | tr [[:lower:]] [[:upper:]]`"
|
|
text=""
|
|
;;
|
|
esac
|
|
eval MACRO_${name}=${text}
|
|
if ! expr " $MACROS " : ".* $name .*" >/dev/null ; then
|
|
MACROS="$MACROS ${name}"
|
|
fi
|
|
}
|
|
|
|
function eval_macro() {
|
|
local name="$1"
|
|
local text=""
|
|
local return=""
|
|
|
|
eval text="\$MACRO_${name}"
|
|
while : ; do
|
|
# Test if text contains more macros.
|
|
echo "$text" | grep -E "@[A-Z][A-Z0-9]*@" >/dev/null
|
|
r=$?
|
|
if test "1${r}" != "10" ; then
|
|
# Text is macro free.
|
|
return="$text"
|
|
break
|
|
else
|
|
# Get the last macro name from text...
|
|
sm_name="`echo $text | sed -e 's=^.*@\([A-Z][A-Z0-9]*\)@.*$=\1='`"
|
|
# Resolve it...
|
|
sm_text="`eval_macro $sm_name`"
|
|
# Substitute macro...
|
|
text="`echo $text | sed -e 's=@'${sm_name}'@='${sm_text}'=g'`"
|
|
fi
|
|
done
|
|
|
|
echo "$return"
|
|
}
|
|
|
|
function load_defaults() {
|
|
local inc="${MACROS_DEF:-configure.macros}"
|
|
local i=0
|
|
local line=""
|
|
|
|
if test "X${inc}" = "X" ; then
|
|
return 1
|
|
fi
|
|
if test ! -r "$inc" -o -d "$inc" ; then
|
|
echo "${inc}: not a readable file." >&2
|
|
return 1
|
|
fi
|
|
|
|
while read line ; do
|
|
i="`expr $i + 1`"
|
|
case "$line" in
|
|
\#*|\ *|'')
|
|
continue
|
|
;;
|
|
*=*)
|
|
set_macro "$line"
|
|
;;
|
|
*)
|
|
echo "Warning: $inc: unexpected line ($i)." >&2
|
|
;;
|
|
esac
|
|
done < "$inc"
|
|
}
|
|
|
|
function configure() {
|
|
local file="$1"
|
|
local ext="${TEMPLATE_SUFFIX:-.in}"
|
|
local template=""
|
|
|
|
local static_file=""
|
|
|
|
local expr=""
|
|
local name=""
|
|
local text=""
|
|
|
|
if test "X${file}" = "X" ; then
|
|
echo "No filename given." >&2
|
|
return 1
|
|
fi
|
|
template="${file}${ext}"
|
|
if test ! -r "$template" -o -d "$template" ; then
|
|
echo "$file: cannot read template ($template)."
|
|
return 1
|
|
fi
|
|
|
|
set_macro CFILE="$file"
|
|
ctext="`eval_macro CTEMPLATE`"
|
|
cexpr="s=@${template}@=${ctext}=g"
|
|
|
|
if test "X${CONFIGURE_STATIC_FILE}" != "X" ; then
|
|
static_file="$CONFIGURE_STATIC_FILE"
|
|
read expr < "$static_file"
|
|
else
|
|
static_file="`mktemp configure.tmp.XXXXXX`"
|
|
if test "1$?" -ne "10" -o "X${static_file}" = "X" \
|
|
-o ! -w "$static_file" ; then
|
|
echo "Cannot create temp file." >&2
|
|
return 1
|
|
fi
|
|
CONFIGURE_STATIC_FILE="$static_file"
|
|
|
|
expr=""
|
|
for name in $MACROS ; do
|
|
case "$name" in
|
|
CFILE|CTEMPLATE)
|
|
continue
|
|
;;
|
|
esac
|
|
text="`eval_macro $name`"
|
|
expr="s=@$name@=$text=g
|
|
$expr"
|
|
done
|
|
|
|
echo "$expr" > "$static_file"
|
|
fi
|
|
|
|
sed -e "$cexpr" -e "$expr" "$template" > "$file"
|
|
}
|
|
|
|
function clean_up() {
|
|
if test "X${CONFIGURE_STATIC_FILE}" != "X" -a -f "$CONFIGURE_STATIC_FILE" ; then
|
|
rm "$CONFIGURE_STATIC_FILE"
|
|
fi
|
|
}
|
|
|
|
### set options ###
|
|
load_defaults
|
|
|
|
while test "1$#" -gt "10" ; do
|
|
case "$1" in
|
|
-h|--help)
|
|
print_help
|
|
exit 0
|
|
;;
|
|
-V|--version)
|
|
print_version
|
|
exit 0
|
|
;;
|
|
--with-*|--without-*)
|
|
set_macro "$1"
|
|
shift
|
|
;;
|
|
--enable-*|--disable-*)
|
|
set_macro "$1"
|
|
shift
|
|
;;
|
|
--*=*)
|
|
set_macro "$1"
|
|
shift
|
|
;;
|
|
--*)
|
|
case "$2" in
|
|
''|-*)
|
|
set_macro "${1}=1"
|
|
shift
|
|
;;
|
|
*)
|
|
set_macro "$1" "$2"
|
|
shift
|
|
shift
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
done
|
|
|
|
### action ###
|
|
|
|
files="$FILES"
|
|
if test "X${FILES_DEF}" != "X" -a -f "$FILES_DEF" ; then
|
|
read buf < "$FILES_DEF"
|
|
files="$files $buf"
|
|
fi
|
|
|
|
|
|
if test "X${files}" = "X" ; then
|
|
echo "No files to configure." >&2
|
|
echo " Make sure '$FILES_DEF' is there and readable." >&2
|
|
exit 1
|
|
fi
|
|
|
|
for f in $files ; do
|
|
echo "Creating file $f..."
|
|
configure $f
|
|
done
|
|
|
|
clean_up
|
|
### end ###
|