#!/bin/sh # # configure # # A simple script to configure Makefiles # (i.e. read Makefile.in, replace strings and write Makefile). # # heinzel # # $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 </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 ###