Files
unixtime/configure

291 lines
5.2 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>
#
VERSION='configure Version 0.3 (08.Sep.2011 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"
expr="`cat \"$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
while read line ; do
files="$files $line"
done < "$FILES_DEF"
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 ###