291 lines
5.2 KiB
Bash
Executable File
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 ###
|