#!/bin/sh # Copyright (C) 2008 Jonathan Moore Liles # # # # This program is free software; you can redistribute it and/or modify it # # under the terms of the GNU General Public License as published by the # # Free Software Foundation; either version 2 of the License, or (at your # # option) any later version. # # # # This program is distributed in the hope that it will be useful, but WITHOUT # # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # # more details. # # # # You should have received a copy of the GNU General Public License along # # with This program; see the file COPYING. If not,write to the Free Software # # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # . scripts/colors ##### ## support functions for 'configure' scripts. fatal () { echo "$BOLD$RED$*$SGR0" > /dev/stderr exit 255 } HELP=no INTERACTIVE=no split () { while [ $# -gt 0 ] do echo $1 shift 1 done } if [ $# -gt 0 ] then case "$1" in --help|-h) HELP=yes shift 1 ;; --interactive|-i) INTERACTIVE=yes shift 1 ;; *) # fatal "This is not an autoconf script. Run it without any options and you will be prompted." ;; esac if [ $# -gt 0 ] then echo "## options" > .config split "$@" | sed ' s/--\(enable\|disable\)-\([^ =]\+\)/--\1-\U\2/g; s/--enable-\([^ =]\+\)=\(.*\)/USE_\1=\2/g; s/--enable-\([^ =]\+\)/USE_\1=yes/g; s/--disable-\([^ =]\+\)/USE_\1=no/g; s/--\([^ =]\+\)/\1/g; ' | sed -n '/^[^ =]\+=./p' >> .config INTERACTIVE=no; fi fi if [ $HELP != yes ] && [ $INTERACTIVE != no ] then if ! ( [ -t 0 ] && [ -t 1 ] ) then fatal "not a terminal!" fi fi ask () { local A D O D="`eval echo \\$$2`" D=${D:-$3} if [ $HELP = yes ] then if [ "$3" = yes ] || [ "$3" = no ] then O=`echo -n "$2" | sed s/^USE_/--enable-/ | tr '[[:upper:]]' '[[:lower:]]'` else O=`echo -n "--$2" | tr '[[:upper:]]' '[[:lower:]]'` fi printf " ${BOLD}${GREEN}%-15s${SGR0}\t%-40s (currently: ${BOLD}%s${SGR0})\n" "$O" "$1" "$D" return fi echo -n "$BLACK$BOLD::$SGR0 ${1}? [$BOLD${D}$SGR0] " if [ $INTERACTIVE = no ] then A="$D" echo else read A A=${A:-$D} fi if [ "$3" = yes ] || [ "$3" = no ] then case "$A" in no | n | N) A=no ;; yes | y | Y) A=yes ;; * ) fatal "Invalid response. Must be 'yes' or 'no'" ;; esac fi append "${2}=${A:-$D}" eval "${2}='${A:-$D}'" } ok () { echo ' '`tput cuf 30`"$BOLD${GREEN}ok${SGR0} ${*:+${BOLD}${BLACK}($*)${SGR0}}" } failed () { echo ' '`tput cuf 30`"$BOLD${RED}failed!${SGR0}" > /dev/stderr rm -f .config } missing () { echo ' '`tput cuf 30`"$BOLD${YELLOW}missing!${SGR0}" > /dev/stderr } using () { [ "`eval echo \\$USE_$1`" = yes ] return $? } upcase () { echo "$*" | tr '[[:lower:]]' '[[:upper:]]' } extract_options () { local line name value if [ -f .config ] then { while read line do [ "$line" = "## options" ] && break done while read line do if [ "$line" = "## libs" ] then break else name=${line%=*} value=${line#*=} eval "$name='$value'" fi done } < .config fi } begin () { echo -n "Checking sanity..." require_command tput tput > /dev/null require_command pkg_config pkg-config > /dev/null require_command sed sed > /dev/null ok } warn () { echo " ${BOLD}${YELLOW}* ${SGR0}${BOLD}$*" } info () { echo "${BOLD}${CYAN}--- ${SGR0}$*" } begin_options () { # get the old values extract_options if [ $HELP = yes ] then echo warn "This is a ${BOLD}non-configure${SGR0} script. Run with ${BOLD}--interactive${SGR0} argument and you will be prompted" warn "with configuration choices. Alternatively, you may use the following autoconf style" warn "arguments for non-interactive configuration." echo echo " Available options:" echo else echo > .config append "# This file was automatically generated on `date`. Any changes may be lost!" append "## options" if [ $INTERACTIVE = no ] then info "Non-interactively updating configuration" else info "Interactive configuration requested" fi fi } begin_tests () { if [ $HELP = yes ] then echo exit 0; fi append "## libs" extract_options } append () { echo "$1" >> .config } end () { info "Configuration complete. You may now run 'make'" touch .config } require_command () { echo -n "Checking for ${BOLD}$1${SGR0}..." local name; if [ -x "$2" ] then name="$PWD/$2" ok "$name" elif [ -x "`which "$2"`" ] then name="`which "$2"`" ok "$name" else failed fatal "Command $1 not found." fi append "$1=$name" eval "${1}='${name}'" } require_package () { local name echo -n "Checking for $BOLD$1$SGR0..." if ! pkg-config --exists $3 then failed fatal "Required package $1 doesn't appear to be installed." elif ! pkg-config --atleast-version $2 $3 then failed fatal "The installed version of $1 (`pkg-config --mod-version $3`) is too old." fi name="`upcase \"$1\"`" append "${name}_LIBS=`pkg-config --libs $3 | sed 's/,\\?--as-needed//g'`" append "${name}_CFLAGS=-DHAVE_${1} `pkg-config --cflags $3`" ok `pkg-config --modversion "$3"` return 0 } suggest_package () { local name echo -n "Checking for $BOLD$1$SGR0..." if ! pkg-config --exists $3 then missing warn "Suggested package $1 doesn't appear to be installed. Some functionality may be missing from your build." warn "Continuing without $1...\n" return 1; elif ! pkg-config --atleast-version $2 $3 then missing warn "The installed version of suggested package $1 (`pkg-config --mod-version $3`) is too old." warn "Continuing without $1..." return 1; fi name="`upcase \"$1\"`" append "${name}_LIBS=`pkg-config --libs $3 | sed 's/,\\?--as-needed//g'`" append "${name}_CFLAGS=-DHAVE_${1} `pkg-config --cflags $3`" ok `pkg-config --modversion "$3"` return 0 } _test_version () { if [ $# = 6 ] then [ $1 -gt $4 ] && return 0 [ $1 -eq $4 ] && [ $2 -gt $5 ] && return 0 [ $1 -eq $4 ] && [ $2 -eq $5 ] && [ $3 -gt $6 ] && return 0 [ $1 -eq $4 ] && [ $2 -eq $5 ] && [ $3 -eq $6 ] && return 0 return 1 elif [ $# = 4 ] then [ $1 -gt $3 ] && return 0 [ $1 -eq $3 ] && [ $2 -eq $4 ] && return 0 return 1 fi } # return true if #1 is greater than or equal to $2 test_version () { local IFS IFS='.' _test_version $1 $2 } version_of () { echo `pkg-config --modversion $1` } hostname_resolvable () { ping -c1 `hostname` >/dev/null 2>/dev/null } require_NTK () { local use local appendflags local is_local is_local= echo -n "Checking for ${BOLD}NTK${SGR0}..." if [ -n "`which ntk-config`" ] then echo "found system NTK..." require_command ntk_config ntk-config else echo "no system NTK found... checking for bundled version..." require_command ntk_config lib/ntk/ntk-config is_local=yes fi FLTK_VERSION=`${ntk_config} --version` if ! test_version $FLTK_VERSION $1 then failed fatal "The installed FLTK version ($FLTK_VERSION) is too old." else ok $FLTK_VERSION fi if [ "x$is_local" = "xyes" ] then require_command FLUID lib/ntk/fluid/ntk-fluid else require_command FLUID ntk-fluid fi use= appendflags= while [ $# -gt 1 ] do shift 1 [ "$1" = 'cairo' ] && appendflags="-DFLTK_HAVE_CAIRO=1 -DUSE_X11=1" use="$use --use-$1" done append "FLTK_LIBS=`${ntk_config} $use --libs | sed 's/,\\?--as-needed//g'`" append "FLTK_LDFLAGS=`${ntk_config} $use --ldflags | sed 's/,\\?--as-needed//g'`" append "FLTK_CFLAGS=`${ntk_config} $use --cflags` $appendflags" }