add uwproj configure script generator

Sun, 01 Oct 2023 12:53:35 +0200

author
Mike Becker <universe@uap-core.de>
date
Sun, 01 Oct 2023 12:53:35 +0200
changeset 71
0bdb910478cc
parent 70
5427beba96d1
child 72
7e58e0f74e50

add uwproj configure script generator

.hgignore file | annotate | diff | comparison | revisions
Makefile file | annotate | diff | comparison | revisions
configure file | annotate | diff | comparison | revisions
make/cc.mk file | annotate | diff | comparison | revisions
make/configure.vm file | annotate | diff | comparison | revisions
make/project.xml file | annotate | diff | comparison | revisions
make/toolchain.sh file | annotate | diff | comparison | revisions
make/uwproj.xsd file | annotate | diff | comparison | revisions
src/Makefile file | annotate | diff | comparison | revisions
src/chess/Makefile file | annotate | diff | comparison | revisions
src/terminal-chess.h file | annotate | diff | comparison | revisions
     1.1 --- a/.hgignore	Tue Aug 13 00:33:59 2019 +0200
     1.2 +++ b/.hgignore	Sun Oct 01 12:53:35 2023 +0200
     1.3 @@ -5,3 +5,4 @@
     1.4  \.conflict\~$
     1.5  ^build/.*$
     1.6  ^nbproject/.*$
     1.7 +^config\.mk$
     2.1 --- a/Makefile	Tue Aug 13 00:33:59 2019 +0200
     2.2 +++ b/Makefile	Sun Oct 01 12:53:35 2023 +0200
     2.3 @@ -26,21 +26,14 @@
     2.4  # POSSIBILITY OF SUCH DAMAGE.
     2.5  #
     2.6  
     2.7 -include conf.mk
     2.8 +include config.mk
     2.9  
    2.10 -ROOTDIR=$(shell pwd)
    2.11 +all: $(BUILDDIR)
    2.12 +	cd src; $(MAKE)
    2.13  
    2.14 -all: chess
    2.15 -	cd src; $(MAKE) BUILDDIR=$(ROOTDIR)/build/release
    2.16 +$(BUILDDIR):
    2.17 +	$(MKDIR) $(MKDIRFLAGS) $(BUILDDIR)
    2.18  
    2.19 -debug: chess-debug
    2.20 -	cd src; $(MAKE) BUILDDIR=$(ROOTDIR)/build/debug CFLAGS="${CFLAGS_D}"
    2.21 +clean:
    2.22 +	$(RM) $(RMFLAGS) $(BUILDDIR)
    2.23  
    2.24 -chess:
    2.25 -	cd src/chess; $(MAKE) BUILDDIR=$(ROOTDIR)/build/release
    2.26 -
    2.27 -chess-debug:
    2.28 -	cd src/chess; $(MAKE) BUILDDIR=$(ROOTDIR)/build/debug CFLAGS="${CFLAGS_D}"
    2.29 -	
    2.30 -clean:
    2.31 -	$(RM) $(RMFLAGS) build
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/configure	Sun Oct 01 12:53:35 2023 +0200
     3.3 @@ -0,0 +1,431 @@
     3.4 +#!/bin/sh
     3.5 +
     3.6 +# create temporary directory
     3.7 +TEMP_DIR=".tmp-`uname -n`"
     3.8 +rm -Rf "$TEMP_DIR"
     3.9 +if mkdir -p "$TEMP_DIR"; then
    3.10 +    :
    3.11 +else
    3.12 +    echo "Cannot create tmp dir $TEMP_DIR"
    3.13 +    echo "Abort"
    3.14 +    exit 1
    3.15 +fi
    3.16 +touch "$TEMP_DIR/options"
    3.17 +touch "$TEMP_DIR/features"
    3.18 +
    3.19 +# define standard variables
    3.20 +PREFIX=/usr
    3.21 +EPREFIX=
    3.22 +BINDIR=
    3.23 +SBINDIR=
    3.24 +LIBDIR=
    3.25 +LIBEXECDIR=
    3.26 +DATADIR=
    3.27 +SYSCONFDIR=
    3.28 +SHAREDSTATEDIR=
    3.29 +LOCALSTATEDIR=
    3.30 +INCLUDEDIR=
    3.31 +INFODIR=
    3.32 +MANDIR=
    3.33 +
    3.34 +# custom variables
    3.35 +BUILDDIR=`pwd`/build
    3.36 +
    3.37 +# features
    3.38 +
    3.39 +# clean abort
    3.40 +abort_configure()
    3.41 +{
    3.42 +    rm -Rf "$TEMP_DIR"
    3.43 +    exit 1
    3.44 +}
    3.45 +
    3.46 +# help text
    3.47 +printhelp()
    3.48 +{
    3.49 +    echo "Usage: $0 [OPTIONS]..."
    3.50 +    cat << __EOF__
    3.51 +Installation directories:
    3.52 +  --prefix=PREFIX         path prefix for architecture-independent files
    3.53 +                          [/usr]
    3.54 +  --exec-prefix=EPREFIX   path prefix for architecture-dependent files
    3.55 +                          [PREFIX]
    3.56 +
    3.57 +  --bindir=DIR            user executables [EPREFIX/bin]
    3.58 +  --sbindir=DIR           system admin executables [EPREFIX/sbin]
    3.59 +  --libexecdir=DIR        program executables [EPREFIX/libexec]
    3.60 +  --sysconfdir=DIR        system configuration files [PREFIX/etc]
    3.61 +  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
    3.62 +  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
    3.63 +  --libdir=DIR            object code libraries [EPREFIX/lib]
    3.64 +  --includedir=DIR        C header files [PREFIX/include]
    3.65 +  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
    3.66 +  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
    3.67 +  --infodir=DIR           info documentation [DATAROOTDIR/info]
    3.68 +  --mandir=DIR            man documentation [DATAROOTDIR/man]
    3.69 +
    3.70 +__EOF__
    3.71 +}
    3.72 +
    3.73 +#
    3.74 +# parse arguments
    3.75 +#
    3.76 +BUILD_TYPE="default"
    3.77 +for ARG in "$@"
    3.78 +do
    3.79 +    case "$ARG" in
    3.80 +        "--prefix="*)         PREFIX=${ARG#--prefix=} ;;
    3.81 +        "--exec-prefix="*)    EPREFIX=${ARG#--exec-prefix=} ;;
    3.82 +        "--bindir="*)         BINDIR=${ARG#----bindir=} ;;
    3.83 +        "--sbindir="*)        SBINDIR=${ARG#--sbindir=} ;;
    3.84 +        "--libdir="*)         LIBDIR=${ARG#--libdir=} ;;
    3.85 +        "--libexecdir="*)     LIBEXECDIR=${ARG#--libexecdir=} ;;
    3.86 +        "--datadir="*)        DATADIR=${ARG#--datadir=} ;;
    3.87 +        "--sysconfdir="*)     SYSCONFDIR=${ARG#--sysconfdir=} ;;
    3.88 +        "--sharedstatedir="*) SHAREDSTATEDIR=${ARG#--sharedstatedir=} ;;
    3.89 +        "--localstatedir="*)  LOCALSTATEDIR=${ARG#--localstatedir=} ;;
    3.90 +        "--includedir="*)     INCLUDEDIR=${ARG#--includedir=} ;;
    3.91 +        "--infodir="*)        INFODIR=${ARG#--infodir=} ;;
    3.92 +        "--mandir"*)          MANDIR=${ARG#--mandir} ;;
    3.93 +        "--help"*) printhelp; abort_configure ;;
    3.94 +        "--debug")           BUILD_TYPE="debug" ;;
    3.95 +        "--release")         BUILD_TYPE="release" ;;
    3.96 +        "-"*) echo "unknown option: $ARG"; abort_configure ;;
    3.97 +    esac
    3.98 +done
    3.99 +
   3.100 +
   3.101 +# set dir variables
   3.102 +: ${EPREFIX:="$PREFIX"}
   3.103 +: ${BINDIR:="$EPREFIX/bin"}
   3.104 +: ${SBINDIR:="$EPREFIX/sbin"}
   3.105 +: ${LIBDIR:="$EPREFIX/lib"}
   3.106 +: ${LIBEXECDIR:="$EPREFIX/libexec"}
   3.107 +: ${DATADIR:="$PREFIX/share"}
   3.108 +: ${SYSCONFDIR:="$PREFIX/etc"}
   3.109 +: ${SHAREDSTATEDIR:="$PREFIX/com"}
   3.110 +: ${LOCALSTATEDIR:="$PREFIX/var"}
   3.111 +: ${INCLUDEDIR:="$PREFIX/include"}
   3.112 +: ${INFODIR:="$PREFIX/info"}
   3.113 +: ${MANDIR:="$PREFIX/man"}
   3.114 +
   3.115 +# Test for availability of pkg-config
   3.116 +PKG_CONFIG=`command -v pkg-config`
   3.117 +: ${PKG_CONFIG:="false"}
   3.118 +
   3.119 +# Simple uname based platform detection
   3.120 +# $PLATFORM is used for platform dependent dependency selection
   3.121 +OS=`uname -s`
   3.122 +OS_VERSION=`uname -r`
   3.123 +printf "detect platform... "
   3.124 +if [ "$OS" = "SunOS" ]; then
   3.125 +    PLATFORM="solaris sunos unix svr4"
   3.126 +fi
   3.127 +if [ "$OS" = "Linux" ]; then
   3.128 +    PLATFORM="linux unix"
   3.129 +fi
   3.130 +if [ "$OS" = "FreeBSD" ]; then
   3.131 +    PLATFORM="freebsd bsd unix"
   3.132 +fi
   3.133 +if [ "$OS" = "Darwin" ]; then
   3.134 +    PLATFORM="macos osx bsd unix"
   3.135 +fi
   3.136 +if echo "$OS" | grep -i "MINGW" > /dev/null; then
   3.137 +    PLATFORM="windows mingw"
   3.138 +fi
   3.139 +: ${PLATFORM:="unix"}
   3.140 +
   3.141 +PLATFORM_NAME=`echo "$PLATFORM" | cut -f1 -d' ' -`
   3.142 +echo "$PLATFORM_NAME"
   3.143 +
   3.144 +isplatform()
   3.145 +{
   3.146 +    for p in $PLATFORM
   3.147 +    do
   3.148 +        if [ "$p" = "$1" ]; then
   3.149 +            return 0
   3.150 +        fi
   3.151 +    done
   3.152 +    return 1
   3.153 +}
   3.154 +notisplatform()
   3.155 +{
   3.156 +    for p in $PLATFORM
   3.157 +    do
   3.158 +        if [ "$p" = "$1" ]; then
   3.159 +            return 1
   3.160 +        fi
   3.161 +    done
   3.162 +    return 0
   3.163 +}
   3.164 +
   3.165 +
   3.166 +# generate vars.mk
   3.167 +cat > "$TEMP_DIR/vars.mk" << __EOF__
   3.168 +PREFIX=$PREFIX
   3.169 +EPREFIX=$EPREFIX
   3.170 +BINDIR=$BINDIR
   3.171 +SBINDIR=$SBINDIR
   3.172 +LIBDIR=$LIBDIR
   3.173 +LIBEXECDIR=$LIBEXECDIR
   3.174 +DATADIR=$DATADIR
   3.175 +SYSCONFDIR=$SYSCONFDIR
   3.176 +SHAREDSTATEDIR=$SHAREDSTATEDIR
   3.177 +LOCALSTATEDIR=$LOCALSTATEDIR
   3.178 +INCLUDEDIR=$INCLUDEDIR
   3.179 +INFODIR=$INFODIR
   3.180 +MANDIR=$MANDIR
   3.181 +BUILDDIR=$BUILDDIR
   3.182 +__EOF__
   3.183 +sort -u -o "$TEMP_DIR/vars.mk" "$TEMP_DIR/vars.mk"
   3.184 +
   3.185 +
   3.186 +# toolchain detection utilities
   3.187 +. make/toolchain.sh
   3.188 +
   3.189 +#
   3.190 +# DEPENDENCIES
   3.191 +#
   3.192 +
   3.193 +# check languages
   3.194 +lang_c=
   3.195 +lang_cpp=
   3.196 +if detect_c_compiler ; then
   3.197 +    lang_c=1
   3.198 +fi
   3.199 +
   3.200 +# create buffer for make variables required by dependencies
   3.201 +echo > "$TEMP_DIR/make.mk"
   3.202 +
   3.203 +test_pkg_config()
   3.204 +{
   3.205 +    if "$PKG_CONFIG" --exists "$1" ; then :
   3.206 +    else return 1 ; fi
   3.207 +    if [ -z "$2" ] || "$PKG_CONFIG" --atleast-version="$2" "$1" ; then :
   3.208 +    else return 1 ; fi
   3.209 +    if [ -z "$3" ] || "$PKG_CONFIG" --exact-version="$3" "$1" ; then :
   3.210 +    else return 1 ; fi
   3.211 +    if [ -z "$4" ] || "$PKG_CONFIG" --max-version="$4" "$1" ; then :
   3.212 +    else return 1 ; fi
   3.213 +    return 0
   3.214 +}
   3.215 +
   3.216 +dependency_error_archiver()
   3.217 +{
   3.218 +    printf "checking for archiver... "
   3.219 +    # dependency archiver
   3.220 +    while true
   3.221 +    do
   3.222 +        if command -v ar > /dev/null ; then
   3.223 +            :
   3.224 +        else
   3.225 +            break
   3.226 +        fi
   3.227 +        cat >> $TEMP_DIR/make.mk << __EOF__
   3.228 +# Dependency: archiver
   3.229 +AR = ar
   3.230 +ARFLAGS = -r
   3.231 +
   3.232 +__EOF__
   3.233 +        echo yes
   3.234 +        return 1
   3.235 +    done
   3.236 +
   3.237 +    echo no
   3.238 +    return 0
   3.239 +}
   3.240 +dependency_error_rmdir()
   3.241 +{
   3.242 +    printf "checking for rmdir... "
   3.243 +    # dependency rmdir
   3.244 +    while true
   3.245 +    do
   3.246 +        if command -v rm > /dev/null ; then
   3.247 +            :
   3.248 +        else
   3.249 +            break
   3.250 +        fi
   3.251 +        cat >> $TEMP_DIR/make.mk << __EOF__
   3.252 +# Dependency: rmdir
   3.253 +RM = rm
   3.254 +RMFLAGS = -f -R
   3.255 +
   3.256 +__EOF__
   3.257 +        echo yes
   3.258 +        return 1
   3.259 +    done
   3.260 +
   3.261 +    echo no
   3.262 +    return 0
   3.263 +}
   3.264 +dependency_error_ncurses()
   3.265 +{
   3.266 +    printf "checking for ncurses... "
   3.267 +    # dependency ncurses
   3.268 +    while true
   3.269 +    do
   3.270 +        if [ -z "$PKG_CONFIG" ]; then
   3.271 +            break
   3.272 +        fi
   3.273 +        if test_pkg_config "ncursesw" "" "" "" ; then
   3.274 +            TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags ncursesw`"
   3.275 +            TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs ncursesw`"
   3.276 +        else
   3.277 +            break
   3.278 +        fi
   3.279 +        echo yes
   3.280 +        return 1
   3.281 +    done
   3.282 +
   3.283 +    echo no
   3.284 +    return 0
   3.285 +}
   3.286 +dependency_error_mkdir()
   3.287 +{
   3.288 +    printf "checking for mkdir... "
   3.289 +    # dependency mkdir
   3.290 +    while true
   3.291 +    do
   3.292 +        if command -v mkdir > /dev/null ; then
   3.293 +            :
   3.294 +        else
   3.295 +            break
   3.296 +        fi
   3.297 +        cat >> $TEMP_DIR/make.mk << __EOF__
   3.298 +# Dependency: mkdir
   3.299 +MKDIR = mkdir
   3.300 +MKDIRFLAGS = -p
   3.301 +
   3.302 +__EOF__
   3.303 +        echo yes
   3.304 +        return 1
   3.305 +    done
   3.306 +
   3.307 +    echo no
   3.308 +    return 0
   3.309 +}
   3.310 +
   3.311 +
   3.312 +
   3.313 +
   3.314 +# start collecting dependency information
   3.315 +echo > "$TEMP_DIR/flags.mk"
   3.316 +
   3.317 +DEPENDENCIES_FAILED=
   3.318 +ERROR=0
   3.319 +# unnamed dependencies
   3.320 +TEMP_CFLAGS=
   3.321 +TEMP_CXXFLAGS=
   3.322 +TEMP_LDFLAGS=
   3.323 +while true
   3.324 +do
   3.325 +    while true
   3.326 +    do
   3.327 +        if [ -z "$lang_c" ] ; then
   3.328 +            ERROR=1
   3.329 +            break
   3.330 +        fi
   3.331 +
   3.332 +        cat >> "$TEMP_DIR/make.mk" << __EOF__
   3.333 +LIB_EXT = .a
   3.334 +OBJ_EXT = .o
   3.335 +
   3.336 +__EOF__
   3.337 +        break
   3.338 +    done
   3.339 +    break
   3.340 +done
   3.341 +
   3.342 +# add general dependency flags to flags.mk
   3.343 +echo "# general flags" >> "$TEMP_DIR/flags.mk"
   3.344 +if [ -n "${TEMP_CFLAGS}" ]; then
   3.345 +    echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
   3.346 +fi
   3.347 +if [ -n "${TEMP_CXXFLAGS}" ]; then
   3.348 +    echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
   3.349 +fi
   3.350 +if [ -n "${TEMP_LDFLAGS}" ]; then
   3.351 +    echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
   3.352 +fi
   3.353 +
   3.354 +#
   3.355 +# OPTION VALUES
   3.356 +#
   3.357 +
   3.358 +#
   3.359 +# TARGETS
   3.360 +#
   3.361 +
   3.362 +echo >> "$TEMP_DIR/flags.mk"
   3.363 +# Target: default
   3.364 +echo "# flags for target default" >> "$TEMP_DIR/flags.mk"
   3.365 +TEMP_CFLAGS=
   3.366 +TEMP_CXXFLAGS=
   3.367 +TEMP_LDFLAGS=
   3.368 +
   3.369 +if dependency_error_archiver; then
   3.370 +    DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED archiver "
   3.371 +    ERROR=1
   3.372 +fi
   3.373 +if dependency_error_rmdir; then
   3.374 +    DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED rmdir "
   3.375 +    ERROR=1
   3.376 +fi
   3.377 +if dependency_error_ncurses; then
   3.378 +    DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ncurses "
   3.379 +    ERROR=1
   3.380 +fi
   3.381 +if dependency_error_mkdir; then
   3.382 +    DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED mkdir "
   3.383 +    ERROR=1
   3.384 +fi
   3.385 +
   3.386 +# Features
   3.387 +
   3.388 +
   3.389 +if [ -n "${TEMP_CFLAGS}" ]; then
   3.390 +    echo "CFLAGS  += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
   3.391 +fi
   3.392 +if [ -n "${TEMP_CXXFLAGS}" ]; then
   3.393 +    echo "CXXFLAGS  += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
   3.394 +fi
   3.395 +if [ "$BUILD_TYPE" = "debug" ]; then
   3.396 +    echo 'CFLAGS += ${DEBUG_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
   3.397 +    echo 'CXXFLAGS += ${DEBUG_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
   3.398 +fi
   3.399 +if [ "$BUILD_TYPE" = "release" ]; then
   3.400 +    echo 'CFLAGS += ${RELEASE_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
   3.401 +    echo 'CXXFLAGS += ${RELEASE_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
   3.402 +fi
   3.403 +if [ -n "${TEMP_LDFLAGS}" ]; then
   3.404 +    echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
   3.405 +fi
   3.406 +
   3.407 +
   3.408 +# final result
   3.409 +if [ $ERROR -ne 0 ]; then
   3.410 +    echo
   3.411 +    echo "Error: Unresolved dependencies"
   3.412 +    echo "$DEPENDENCIES_FAILED"
   3.413 +    abort_configure
   3.414 +fi
   3.415 +
   3.416 +echo "configure finished"
   3.417 +echo
   3.418 +echo "Build Config:"
   3.419 +echo "  PREFIX:    $PREFIX"
   3.420 +echo "  TOOLCHAIN: $TOOLCHAIN_NAME"
   3.421 +echo
   3.422 +
   3.423 +# generate the config.mk file
   3.424 +cat > "$TEMP_DIR/config.mk" << __EOF__
   3.425 +#
   3.426 +# config.mk generated by configure
   3.427 +#
   3.428 +
   3.429 +__EOF__
   3.430 +write_toolchain_defaults "$TEMP_DIR/toolchain.mk"
   3.431 +cat "$TEMP_DIR/vars.mk" "$TEMP_DIR/toolchain.mk" "$TEMP_DIR/flags.mk" "$TEMP_DIR/make.mk" > config.mk
   3.432 +rm -Rf "$TEMP_DIR"
   3.433 +
   3.434 +
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/make/cc.mk	Sun Oct 01 12:53:35 2023 +0200
     4.3 @@ -0,0 +1,11 @@
     4.4 +#
     4.5 +# cc toolchain config
     4.6 +#
     4.7 +
     4.8 +CFLAGS =
     4.9 +DEBUG_CC_FLAGS = -g
    4.10 +RELEASE_CC_FLAGS = -O3 -DNDEBUG
    4.11 +LDFLAGS =
    4.12 +
    4.13 +SHLIB_CFLAGS = -fPIC
    4.14 +SHLIB_LDFLAGS = -shared
    4.15 \ No newline at end of file
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/make/configure.vm	Sun Oct 01 12:53:35 2023 +0200
     5.3 @@ -0,0 +1,597 @@
     5.4 +#!/bin/sh
     5.5 +
     5.6 +# create temporary directory
     5.7 +TEMP_DIR=".tmp-`uname -n`"
     5.8 +rm -Rf "$TEMP_DIR"
     5.9 +if mkdir -p "$TEMP_DIR"; then
    5.10 +    :
    5.11 +else
    5.12 +    echo "Cannot create tmp dir $TEMP_DIR"
    5.13 +    echo "Abort"
    5.14 +    exit 1
    5.15 +fi
    5.16 +touch "$TEMP_DIR/options"
    5.17 +touch "$TEMP_DIR/features"
    5.18 +
    5.19 +# define standard variables
    5.20 +PREFIX=/usr
    5.21 +EPREFIX=
    5.22 +BINDIR=
    5.23 +SBINDIR=
    5.24 +LIBDIR=
    5.25 +LIBEXECDIR=
    5.26 +DATADIR=
    5.27 +SYSCONFDIR=
    5.28 +SHAREDSTATEDIR=
    5.29 +LOCALSTATEDIR=
    5.30 +INCLUDEDIR=
    5.31 +INFODIR=
    5.32 +MANDIR=
    5.33 +
    5.34 +# custom variables
    5.35 +#foreach( $var in $vars )
    5.36 +#if( $var.exec )
    5.37 +${var.varName}=`${var.value}`
    5.38 +#else
    5.39 +${var.varName}=${var.value}
    5.40 +#end
    5.41 +#end
    5.42 +
    5.43 +# features
    5.44 +#foreach( $feature in $features )
    5.45 +#if( ${feature.isDefault()} )
    5.46 +${feature.getVarName()}=auto
    5.47 +#end
    5.48 +#end
    5.49 +
    5.50 +# clean abort
    5.51 +abort_configure()
    5.52 +{
    5.53 +    rm -Rf "$TEMP_DIR"
    5.54 +    exit 1
    5.55 +}
    5.56 +
    5.57 +# help text
    5.58 +printhelp()
    5.59 +{
    5.60 +    echo "Usage: $0 [OPTIONS]..."
    5.61 +    cat << __EOF__
    5.62 +Installation directories:
    5.63 +  --prefix=PREFIX         path prefix for architecture-independent files
    5.64 +                          [/usr]
    5.65 +  --exec-prefix=EPREFIX   path prefix for architecture-dependent files
    5.66 +                          [PREFIX]
    5.67 +
    5.68 +  --bindir=DIR            user executables [EPREFIX/bin]
    5.69 +  --sbindir=DIR           system admin executables [EPREFIX/sbin]
    5.70 +  --libexecdir=DIR        program executables [EPREFIX/libexec]
    5.71 +  --sysconfdir=DIR        system configuration files [PREFIX/etc]
    5.72 +  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
    5.73 +  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
    5.74 +  --libdir=DIR            object code libraries [EPREFIX/lib]
    5.75 +  --includedir=DIR        C header files [PREFIX/include]
    5.76 +  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
    5.77 +  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
    5.78 +  --infodir=DIR           info documentation [DATAROOTDIR/info]
    5.79 +  --mandir=DIR            man documentation [DATAROOTDIR/man]
    5.80 +
    5.81 +#if( $options.size() > 0 )
    5.82 +Options:
    5.83 +  --debug                 add extra compile flags for debug builds
    5.84 +  --release               add extra compile flags for release builds
    5.85 +#foreach( $opt in $options )
    5.86 +  --${opt.getArgument()}=${opt.getValuesString()}
    5.87 +#end
    5.88 +
    5.89 +#end
    5.90 +#if( $features.size() > 0 )
    5.91 +Optional Features:
    5.92 +#foreach( $feature in $features )
    5.93 +#if( $feature.default )
    5.94 +  --disable-${feature.arg}
    5.95 +#else
    5.96 +  --enable-${feature.arg}
    5.97 +#end
    5.98 +#end
    5.99 +
   5.100 +#end
   5.101 +__EOF__
   5.102 +}
   5.103 +
   5.104 +#
   5.105 +# parse arguments
   5.106 +#
   5.107 +BUILD_TYPE="default"
   5.108 +#set( $D = '$' )
   5.109 +for ARG in "$@"
   5.110 +do
   5.111 +    case "$ARG" in
   5.112 +        "--prefix="*)         PREFIX=${D}{ARG#--prefix=} ;;
   5.113 +        "--exec-prefix="*)    EPREFIX=${D}{ARG#--exec-prefix=} ;;
   5.114 +        "--bindir="*)         BINDIR=${D}{ARG#----bindir=} ;;
   5.115 +        "--sbindir="*)        SBINDIR=${D}{ARG#--sbindir=} ;;
   5.116 +        "--libdir="*)         LIBDIR=${D}{ARG#--libdir=} ;;
   5.117 +        "--libexecdir="*)     LIBEXECDIR=${D}{ARG#--libexecdir=} ;;
   5.118 +        "--datadir="*)        DATADIR=${D}{ARG#--datadir=} ;;
   5.119 +        "--sysconfdir="*)     SYSCONFDIR=${D}{ARG#--sysconfdir=} ;;
   5.120 +        "--sharedstatedir="*) SHAREDSTATEDIR=${D}{ARG#--sharedstatedir=} ;;
   5.121 +        "--localstatedir="*)  LOCALSTATEDIR=${D}{ARG#--localstatedir=} ;;
   5.122 +        "--includedir="*)     INCLUDEDIR=${D}{ARG#--includedir=} ;;
   5.123 +        "--infodir="*)        INFODIR=${D}{ARG#--infodir=} ;;
   5.124 +        "--mandir"*)          MANDIR=${D}{ARG#--mandir} ;;
   5.125 +        "--help"*) printhelp; abort_configure ;;
   5.126 +        "--debug")           BUILD_TYPE="debug" ;;
   5.127 +        "--release")         BUILD_TYPE="release" ;;
   5.128 +    #foreach( $opt in $options )
   5.129 +        "--${opt.getArgument()}="*) ${opt.getVarName()}=${D}{ARG#--${opt.getArgument()}=} ;;
   5.130 +    #end
   5.131 +    #foreach( $feature in $features )
   5.132 +        "--enable-${feature.arg}") ${feature.getVarName()}=on ;;
   5.133 +        "--disable-${feature.arg}") unset ${feature.getVarName()} ;;
   5.134 +    #end
   5.135 +        "-"*) echo "unknown option: $ARG"; abort_configure ;;
   5.136 +    esac
   5.137 +done
   5.138 +
   5.139 +## Begin unparsed content. **
   5.140 +#[[
   5.141 +# set dir variables
   5.142 +: ${EPREFIX:="$PREFIX"}
   5.143 +: ${BINDIR:="$EPREFIX/bin"}
   5.144 +: ${SBINDIR:="$EPREFIX/sbin"}
   5.145 +: ${LIBDIR:="$EPREFIX/lib"}
   5.146 +: ${LIBEXECDIR:="$EPREFIX/libexec"}
   5.147 +: ${DATADIR:="$PREFIX/share"}
   5.148 +: ${SYSCONFDIR:="$PREFIX/etc"}
   5.149 +: ${SHAREDSTATEDIR:="$PREFIX/com"}
   5.150 +: ${LOCALSTATEDIR:="$PREFIX/var"}
   5.151 +: ${INCLUDEDIR:="$PREFIX/include"}
   5.152 +: ${INFODIR:="$PREFIX/info"}
   5.153 +: ${MANDIR:="$PREFIX/man"}
   5.154 +
   5.155 +# Test for availability of pkg-config
   5.156 +PKG_CONFIG=`command -v pkg-config`
   5.157 +: ${PKG_CONFIG:="false"}
   5.158 +
   5.159 +# Simple uname based platform detection
   5.160 +# $PLATFORM is used for platform dependent dependency selection
   5.161 +OS=`uname -s`
   5.162 +OS_VERSION=`uname -r`
   5.163 +printf "detect platform... "
   5.164 +if [ "$OS" = "SunOS" ]; then
   5.165 +    PLATFORM="solaris sunos unix svr4"
   5.166 +fi
   5.167 +if [ "$OS" = "Linux" ]; then
   5.168 +    PLATFORM="linux unix"
   5.169 +fi
   5.170 +if [ "$OS" = "FreeBSD" ]; then
   5.171 +    PLATFORM="freebsd bsd unix"
   5.172 +fi
   5.173 +if [ "$OS" = "Darwin" ]; then
   5.174 +    PLATFORM="macos osx bsd unix"
   5.175 +fi
   5.176 +if echo "$OS" | grep -i "MINGW" > /dev/null; then
   5.177 +    PLATFORM="windows mingw"
   5.178 +fi
   5.179 +: ${PLATFORM:="unix"}
   5.180 +
   5.181 +PLATFORM_NAME=`echo "$PLATFORM" | cut -f1 -d' ' -`
   5.182 +echo "$PLATFORM_NAME"
   5.183 +
   5.184 +isplatform()
   5.185 +{
   5.186 +    for p in $PLATFORM
   5.187 +    do
   5.188 +        if [ "$p" = "$1" ]; then
   5.189 +            return 0
   5.190 +        fi
   5.191 +    done
   5.192 +    return 1
   5.193 +}
   5.194 +notisplatform()
   5.195 +{
   5.196 +    for p in $PLATFORM
   5.197 +    do
   5.198 +        if [ "$p" = "$1" ]; then
   5.199 +            return 1
   5.200 +        fi
   5.201 +    done
   5.202 +    return 0
   5.203 +}
   5.204 +]]#
   5.205 +## End of unparsed content **
   5.206 +
   5.207 +# generate vars.mk
   5.208 +cat > "$TEMP_DIR/vars.mk" << __EOF__
   5.209 +PREFIX=$PREFIX
   5.210 +EPREFIX=$EPREFIX
   5.211 +BINDIR=$BINDIR
   5.212 +SBINDIR=$SBINDIR
   5.213 +LIBDIR=$LIBDIR
   5.214 +LIBEXECDIR=$LIBEXECDIR
   5.215 +DATADIR=$DATADIR
   5.216 +SYSCONFDIR=$SYSCONFDIR
   5.217 +SHAREDSTATEDIR=$SHAREDSTATEDIR
   5.218 +LOCALSTATEDIR=$LOCALSTATEDIR
   5.219 +INCLUDEDIR=$INCLUDEDIR
   5.220 +INFODIR=$INFODIR
   5.221 +MANDIR=$MANDIR
   5.222 +#foreach( $var in $vars )
   5.223 +${var.varName}=$${var.varName}
   5.224 +#end
   5.225 +__EOF__
   5.226 +sort -u -o "$TEMP_DIR/vars.mk" "$TEMP_DIR/vars.mk"
   5.227 +
   5.228 +
   5.229 +# toolchain detection utilities
   5.230 +. make/toolchain.sh
   5.231 +
   5.232 +#
   5.233 +# DEPENDENCIES
   5.234 +#
   5.235 +
   5.236 +# check languages
   5.237 +lang_c=
   5.238 +lang_cpp=
   5.239 +#foreach( $lang in $languages )
   5.240 +if detect_${lang}_compiler ; then
   5.241 +    lang_${lang}=1
   5.242 +fi
   5.243 +#end
   5.244 +
   5.245 +# create buffer for make variables required by dependencies
   5.246 +echo > "$TEMP_DIR/make.mk"
   5.247 +
   5.248 +test_pkg_config()
   5.249 +{
   5.250 +    if "$PKG_CONFIG" --exists "$1" ; then :
   5.251 +    else return 1 ; fi
   5.252 +    if [ -z "$2" ] || "$PKG_CONFIG" --atleast-version="$2" "$1" ; then :
   5.253 +    else return 1 ; fi
   5.254 +    if [ -z "$3" ] || "$PKG_CONFIG" --exact-version="$3" "$1" ; then :
   5.255 +    else return 1 ; fi
   5.256 +    if [ -z "$4" ] || "$PKG_CONFIG" --max-version="$4" "$1" ; then :
   5.257 +    else return 1 ; fi
   5.258 +    return 0
   5.259 +}
   5.260 +
   5.261 +#foreach( $dependency in $namedDependencies )
   5.262 +dependency_error_${dependency.name}()
   5.263 +{
   5.264 +    printf "checking for ${dependency.name}... "
   5.265 +    #foreach( $sub in $dependency.getSubdependencies() )
   5.266 +    # dependency $sub.getFullName()
   5.267 +    while true
   5.268 +    do
   5.269 +        #if( $sub.platform )
   5.270 +        if notisplatform "${sub.platform}"; then
   5.271 +            break
   5.272 +        fi
   5.273 +        #end
   5.274 +        #foreach( $np in $sub.getNotList() )
   5.275 +        if isplatform "${np}"; then
   5.276 +            break
   5.277 +        fi
   5.278 +        #end
   5.279 +        #foreach( $lang in $sub.lang )
   5.280 +        if [ -z "$lang_${lang}" ] ; then
   5.281 +            break
   5.282 +        fi
   5.283 +        #end
   5.284 +        #if( $sub.pkgconfig.size() > 0 )
   5.285 +        if [ -z "$PKG_CONFIG" ]; then
   5.286 +            break
   5.287 +        fi
   5.288 +        #end
   5.289 +        #foreach( $test in $sub.tests )
   5.290 +        if $test > /dev/null ; then
   5.291 +            :
   5.292 +        else
   5.293 +            break
   5.294 +        fi
   5.295 +        #end
   5.296 +        #foreach( $pkg in $sub.pkgconfig )
   5.297 +        if test_pkg_config "$pkg.name" "$pkg.atleast" "$pkg.exact" "$pkg.max" ; then
   5.298 +            TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags $pkg.name`"
   5.299 +            TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs $pkg.name`"
   5.300 +        else
   5.301 +            break
   5.302 +        fi
   5.303 +        #end
   5.304 +        #foreach( $flags in $sub.flags )
   5.305 +        #if( $flags.exec )
   5.306 +        if tmp_flags=`$flags.value` ; then
   5.307 +            TEMP_$flags.varName="$TEMP_$flags.varName $tmp_flags"
   5.308 +        else
   5.309 +            break
   5.310 +        fi
   5.311 +        #else
   5.312 +        TEMP_$flags.varName="$TEMP_$flags.varName $flags.value"
   5.313 +        #end
   5.314 +        #end
   5.315 +        #if ( $sub.make.length() > 0 )
   5.316 +        cat >> $TEMP_DIR/make.mk << __EOF__
   5.317 +# Dependency: $dependency.name
   5.318 +$sub.make
   5.319 +__EOF__
   5.320 +        #end
   5.321 +        echo yes
   5.322 +        return 1
   5.323 +    done
   5.324 +
   5.325 +    #end
   5.326 +    echo no
   5.327 +    return 0
   5.328 +}
   5.329 +#end
   5.330 +
   5.331 +
   5.332 +
   5.333 +
   5.334 +# start collecting dependency information
   5.335 +echo > "$TEMP_DIR/flags.mk"
   5.336 +
   5.337 +DEPENDENCIES_FAILED=
   5.338 +ERROR=0
   5.339 +#if( $dependencies.size() > 0 )
   5.340 +# unnamed dependencies
   5.341 +TEMP_CFLAGS=
   5.342 +TEMP_CXXFLAGS=
   5.343 +TEMP_LDFLAGS=
   5.344 +#foreach( $dependency in $dependencies )
   5.345 +while true
   5.346 +do
   5.347 +    #if( $dependency.platform )
   5.348 +    if notisplatform "${dependency.platform}"; then
   5.349 +        break
   5.350 +    fi
   5.351 +    #end
   5.352 +    #foreach( $np in $dependency.getNotList() )
   5.353 +    if isplatform "${np}"; then
   5.354 +        break
   5.355 +    fi
   5.356 +    #end
   5.357 +    while true
   5.358 +    do
   5.359 +        #foreach( $lang in $dependency.lang )
   5.360 +        if [ -z "$lang_${lang}" ] ; then
   5.361 +            ERROR=1
   5.362 +            break
   5.363 +        fi
   5.364 +        #end
   5.365 +        #if( $dependency.pkgconfig.size() > 0 )
   5.366 +        if [ -z "$PKG_CONFIG" ]; then
   5.367 +            ERROR=1
   5.368 +            break
   5.369 +        fi
   5.370 +        #end
   5.371 +        #foreach( $pkg in $dependency.pkgconfig )
   5.372 +        printf "checking for pkg-config package $pkg.name... "
   5.373 +        if test_pkg_config "$pkg.name" "$pkg.atleast" "$pkg.exact" "$pkg.max" ; then
   5.374 +            echo yes
   5.375 +            TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags $pkg.name`"
   5.376 +            TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs $pkg.name`"
   5.377 +        else
   5.378 +            echo no
   5.379 +            ERROR=1
   5.380 +            break
   5.381 +        fi
   5.382 +        #end
   5.383 +
   5.384 +        #foreach( $flags in $dependency.flags )
   5.385 +        #if( $flags.exec )
   5.386 +        $flags.value > /dev/null
   5.387 +        if tmp_flags=`$flags.value` ; then
   5.388 +            TEMP_$flags.varName="$TEMP_$flags.varName $tmp_flags"
   5.389 +        else
   5.390 +            ERROR=1
   5.391 +            break
   5.392 +        fi
   5.393 +        #else
   5.394 +        TEMP_$flags.varName="$TEMP_$flags.varName $flags.value"
   5.395 +        #end
   5.396 +        #end
   5.397 +        #if ( $dependency.make.length() > 0 )
   5.398 +        cat >> "$TEMP_DIR/make.mk" << __EOF__
   5.399 +$dependency.make
   5.400 +__EOF__
   5.401 +        #end
   5.402 +        break
   5.403 +    done
   5.404 +    break
   5.405 +done
   5.406 +#end
   5.407 +
   5.408 +# add general dependency flags to flags.mk
   5.409 +echo "# general flags" >> "$TEMP_DIR/flags.mk"
   5.410 +if [ -n "${TEMP_CFLAGS}" ]; then
   5.411 +    echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
   5.412 +fi
   5.413 +if [ -n "${TEMP_CXXFLAGS}" ]; then
   5.414 +    echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
   5.415 +fi
   5.416 +if [ -n "${TEMP_LDFLAGS}" ]; then
   5.417 +    echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
   5.418 +fi
   5.419 +#end
   5.420 +
   5.421 +#
   5.422 +# OPTION VALUES
   5.423 +#
   5.424 +#foreach( $opt in $options )
   5.425 +#foreach( $val in $opt.values )
   5.426 +${val.func}()
   5.427 +{
   5.428 +    VERR=0
   5.429 +    #foreach( $dep in $val.dependencies )
   5.430 +    if dependency_error_$dep ; then
   5.431 +        VERR=1
   5.432 +    fi
   5.433 +    #end
   5.434 +    if [ $VERR -ne 0 ]; then
   5.435 +        return 1
   5.436 +    fi
   5.437 +    #foreach( $def in $val.defines )
   5.438 +        TEMP_CFLAGS="$TEMP_CFLAGS ${def.toFlags()}"
   5.439 +        TEMP_CXXFLAGS="$TEMP_CXXFLAGS ${def.toFlags()}"
   5.440 +    #end
   5.441 +    #if( $val.hasMake() )
   5.442 +    cat >> "$TEMP_DIR/make.mk" << __EOF__
   5.443 +$val.make
   5.444 +__EOF__
   5.445 +    #end
   5.446 +    return 0
   5.447 +}
   5.448 +#end
   5.449 +#end
   5.450 +
   5.451 +#
   5.452 +# TARGETS
   5.453 +#
   5.454 +
   5.455 +#foreach( $target in $targets )
   5.456 +echo >> "$TEMP_DIR/flags.mk"
   5.457 +#if ( $target.name )
   5.458 +# Target: $target.name
   5.459 +echo "# flags for target $target.name" >> "$TEMP_DIR/flags.mk"
   5.460 +#else
   5.461 +# Target
   5.462 +echo "# flags for unnamed target" >> "$TEMP_DIR/flags.mk"
   5.463 +#end
   5.464 +TEMP_CFLAGS=
   5.465 +TEMP_CXXFLAGS=
   5.466 +TEMP_LDFLAGS=
   5.467 +
   5.468 +#foreach( $dependency in $target.dependencies )
   5.469 +if dependency_error_$dependency; then
   5.470 +    DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ${dependency} "
   5.471 +    ERROR=1
   5.472 +fi
   5.473 +#end
   5.474 +
   5.475 +# Features
   5.476 +#foreach( $feature in $target.features )
   5.477 +if [ -n "$${feature.getVarName()}" ]; then
   5.478 +#foreach( $dependency in $feature.dependencies )
   5.479 +    # check dependency
   5.480 +    if dependency_error_$dependency ; then
   5.481 +        # "auto" features can fail and are just disabled in this case
   5.482 +        if [ "$${feature.getVarName()}" = "auto" ]; then
   5.483 +            DISABLE_${feature.getVarName()}=1
   5.484 +        else
   5.485 +            DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ${dependency} "
   5.486 +            ERROR=1
   5.487 +        fi
   5.488 +    fi
   5.489 +#end
   5.490 +    if [ -n "$DISABLE_${feature.getVarName()}" ]; then
   5.491 +        unset ${feature.getVarName()}
   5.492 +    fi
   5.493 +fi
   5.494 +#end
   5.495 +
   5.496 +#foreach( $opt in $target.options )
   5.497 +# Option: --${opt.argument}
   5.498 +if [ -z ${D}${opt.getVarName()} ]; then
   5.499 +    SAVED_ERROR="$ERROR"
   5.500 +    SAVED_DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED"
   5.501 +    ERROR=1
   5.502 +    while true
   5.503 +    do
   5.504 +        #foreach( $optdef in $opt.defaults )
   5.505 +        #if( $optdef.platform )
   5.506 +        if isplatform "$optdef.platform"; then
   5.507 +        #end
   5.508 +        if $optdef.func ; then
   5.509 +            echo "  ${opt.argument}: ${optdef.valueName}" >> "$TEMP_DIR/options"
   5.510 +            ERROR=0
   5.511 +            break
   5.512 +        fi
   5.513 +        #if( $optdef.platform )
   5.514 +        fi
   5.515 +        #end
   5.516 +        #end
   5.517 +        break
   5.518 +    done
   5.519 +    if [ $ERROR -ne 0 ]; then
   5.520 +        SAVED_ERROR=1
   5.521 +    fi
   5.522 +    ERROR="$SAVED_ERROR"
   5.523 +    DEPENDENCIES_FAILED="$SAVED_DEPENDENCIES_FAILED"
   5.524 +else
   5.525 +    if false; then
   5.526 +        false
   5.527 +    #foreach( $optval in $opt.values )
   5.528 +    elif [ "${D}${opt.getVarName()}" = "${optval.value}" ]; then
   5.529 +        echo "  ${opt.argument}: ${D}${opt.getVarName()}" >> $TEMP_DIR/options
   5.530 +        if $optval.func ; then
   5.531 +            :
   5.532 +        else
   5.533 +            ERROR=1
   5.534 +        fi
   5.535 +    #end
   5.536 +    fi
   5.537 +fi
   5.538 +#end
   5.539 +
   5.540 +if [ -n "${TEMP_CFLAGS}" ]; then
   5.541 +    echo "${target.getCFlags()}  += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
   5.542 +fi
   5.543 +if [ -n "${TEMP_CXXFLAGS}" ]; then
   5.544 +    echo "${target.getCXXFlags()}  += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
   5.545 +fi
   5.546 +if [ "$BUILD_TYPE" = "debug" ]; then
   5.547 +    echo '${target.getCFlags()} += ${DEBUG_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
   5.548 +    echo '${target.getCXXFlags()} += ${DEBUG_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
   5.549 +fi
   5.550 +if [ "$BUILD_TYPE" = "release" ]; then
   5.551 +    echo '${target.getCFlags()} += ${RELEASE_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
   5.552 +    echo '${target.getCXXFlags()} += ${RELEASE_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
   5.553 +fi
   5.554 +if [ -n "${TEMP_LDFLAGS}" ]; then
   5.555 +    echo "${target.getLDFlags()} += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
   5.556 +fi
   5.557 +
   5.558 +#end
   5.559 +
   5.560 +# final result
   5.561 +if [ $ERROR -ne 0 ]; then
   5.562 +    echo
   5.563 +    echo "Error: Unresolved dependencies"
   5.564 +    echo "$DEPENDENCIES_FAILED"
   5.565 +    abort_configure
   5.566 +fi
   5.567 +
   5.568 +echo "configure finished"
   5.569 +echo
   5.570 +echo "Build Config:"
   5.571 +echo "  PREFIX:    $PREFIX"
   5.572 +echo "  TOOLCHAIN: $TOOLCHAIN_NAME"
   5.573 +#if ( $options.size() > 0 )
   5.574 +echo "Options:"
   5.575 +cat "$TEMP_DIR/options"
   5.576 +#end
   5.577 +#if ( $features.size() > 0 )
   5.578 +echo "Features:"
   5.579 +#foreach( $feature in $features )
   5.580 +if [ -n "$${feature.getVarName()}" ]; then
   5.581 +echo "  $feature.name: on"
   5.582 +else
   5.583 +echo "  $feature.name: off"
   5.584 +fi
   5.585 +#end
   5.586 +#end
   5.587 +echo
   5.588 +
   5.589 +# generate the config.mk file
   5.590 +cat > "$TEMP_DIR/config.mk" << __EOF__
   5.591 +#
   5.592 +# config.mk generated by configure
   5.593 +#
   5.594 +
   5.595 +__EOF__
   5.596 +write_toolchain_defaults "$TEMP_DIR/toolchain.mk"
   5.597 +cat "$TEMP_DIR/vars.mk" "$TEMP_DIR/toolchain.mk" "$TEMP_DIR/flags.mk" "$TEMP_DIR/make.mk" > config.mk
   5.598 +rm -Rf "$TEMP_DIR"
   5.599 +
   5.600 +
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/make/project.xml	Sun Oct 01 12:53:35 2023 +0200
     6.3 @@ -0,0 +1,38 @@
     6.4 +<?xml version="1.0" encoding="UTF-8"?>
     6.5 +<project xmlns="http://unixwork.de/uwproj">
     6.6 +	<config>
     6.7 +		<var name="BUILDDIR">`pwd`/build</var>
     6.8 +	</config>
     6.9 +	<dependency>
    6.10 +		<lang>c</lang>
    6.11 +		<make>
    6.12 +LIB_EXT = .a
    6.13 +OBJ_EXT = .o
    6.14 +		</make>
    6.15 +	</dependency>
    6.16 +	<dependency name="mkdir">
    6.17 +		<test>command -v mkdir</test>
    6.18 +		<make>
    6.19 +MKDIR = mkdir
    6.20 +MKDIRFLAGS = -p
    6.21 +		</make>
    6.22 +	</dependency>
    6.23 +	<dependency name="rmdir">
    6.24 +		<test>command -v rm</test>
    6.25 +		<make>
    6.26 +RM = rm
    6.27 +RMFLAGS = -f -R
    6.28 +		</make>
    6.29 +	</dependency>
    6.30 +	<dependency name="archiver">
    6.31 +		<test>command -v ar</test>
    6.32 +		<make>
    6.33 +AR = ar
    6.34 +ARFLAGS = -r
    6.35 +		</make>
    6.36 +	</dependency>
    6.37 +	<dependency name="ncurses">
    6.38 +		<pkgconfig>ncursesw</pkgconfig>
    6.39 +	</dependency>
    6.40 +</project>
    6.41 +
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/make/toolchain.sh	Sun Oct 01 12:53:35 2023 +0200
     7.3 @@ -0,0 +1,186 @@
     7.4 +#!/bin/sh
     7.5 +#
     7.6 +# toolchain detection
     7.7 +#
     7.8 +
     7.9 +C_COMPILERS="gcc clang suncc cc"
    7.10 +CPP_COMPILERS="g++ clang++ sunCC CC"
    7.11 +unset TOOLCHAIN_NAME
    7.12 +unset TOOLCHAIN_CC
    7.13 +unset TOOLCHAIN_CXX
    7.14 +
    7.15 +check_c_compiler()
    7.16 +{
    7.17 +	cat > "$TEMP_DIR/test.c" << __EOF__
    7.18 +/* test file */
    7.19 +#include <stdio.h>
    7.20 +int main(int argc, char **argv) {
    7.21 +#if defined(__clang__)
    7.22 +	printf("clang\n");
    7.23 +#elif defined(__GNUC__)
    7.24 +	printf("gcc\n");
    7.25 +#elif defined(__sun)
    7.26 +	printf("suncc\n");
    7.27 +#else
    7.28 +	printf("unknown\n");
    7.29 +#endif
    7.30 +	return 0;
    7.31 +}
    7.32 +__EOF__
    7.33 +	rm -f "$TEMP_DIR/checkcc"
    7.34 +	$1 -o "$TEMP_DIR/checkcc" $CFLAGS $LDFLAGS "$TEMP_DIR/test.c" 2> /dev/null
    7.35 +}
    7.36 +
    7.37 +check_cpp_compiler()
    7.38 +{
    7.39 +	cat > "$TEMP_DIR/test.cpp" << __EOF__
    7.40 +/* test file */
    7.41 +#include <iostream>
    7.42 +int main(int argc, char **argv) {
    7.43 +#if defined(__clang__)
    7.44 +	std::cout << "clang" << std::endl;
    7.45 +#elif defined(__GNUC__)
    7.46 +	std::cout << "gcc" << std::endl;
    7.47 +#elif defined(__sun)
    7.48 +	std::cout << "suncc" << std::endl;
    7.49 +#else
    7.50 +	std::cout << "cc" << std::endl;
    7.51 +#endif
    7.52 +	return 0;
    7.53 +}
    7.54 +__EOF__
    7.55 +	rm -f "$TEMP_DIR/checkcc"
    7.56 +	$1 -o "$TEMP_DIR/checkcc" $CXXFLAGS $LDFLAGS "$TEMP_DIR/test.cpp" 2> /dev/null
    7.57 +}
    7.58 +
    7.59 +create_libtest_source()
    7.60 +{
    7.61 +  # $1: filename
    7.62 +  # $2: optional include
    7.63 +	cat > "$TEMP_DIR/$1" << __EOF__
    7.64 +/* libtest file */
    7.65 +int main(int argc, char **argv) {
    7.66 +	return 0;
    7.67 +}
    7.68 +__EOF__
    7.69 +  if [ -n "$2" ]; then
    7.70 +    echo "#include <$2>" >> "$TEMP_DIR/$1"
    7.71 +  fi
    7.72 +}
    7.73 +
    7.74 +check_c_lib()
    7.75 +{
    7.76 +  # $1: libname
    7.77 +  # $2: optional include
    7.78 +  if [ -z "$TOOLCHAIN_CC" ]; then
    7.79 +    return 1
    7.80 +  fi
    7.81 +  create_libtest_source "test.c" "$2"
    7.82 +  rm -f "$TEMP_DIR/checklib"
    7.83 +	$TOOLCHAIN_CC -o "$TEMP_DIR/checklib" $CFLAGS $LDFLAGS "-l$1" "$TEMP_DIR/test.c" 2> /dev/null
    7.84 +}
    7.85 +
    7.86 +check_cpp_lib()
    7.87 +{
    7.88 +  # $1: libname
    7.89 +  # $2: optional include
    7.90 +  if [ -z "$TOOLCHAIN_CXX" ]; then
    7.91 +    return 1
    7.92 +  fi
    7.93 +	create_libtest_source "test.cpp" "$2"
    7.94 +  rm -f "$TEMP_DIR/checklib"
    7.95 +	$TOOLCHAIN_CXX -o "$TEMP_DIR/checklib" $CXXFLAGS $LDFLAGS "-l$1" "$TEMP_DIR/test.cpp" 2> /dev/null
    7.96 +}
    7.97 +
    7.98 +check_lib()
    7.99 +{
   7.100 +  # $1: libname
   7.101 +  # $2: optional include
   7.102 +	if [ -n "$TOOLCHAIN_CC" ]; then
   7.103 +		check_c_lib "$1" "$2"
   7.104 +	elif  [ -n "$TOOLCHAIN_CXX" ]; then
   7.105 +	  check_cpp_lib "$1" "$2"
   7.106 +	fi
   7.107 +}
   7.108 +
   7.109 +detect_c_compiler()
   7.110 +{
   7.111 +  if [ -n "$TOOLCHAIN_CC" ]; then
   7.112 +    return 0
   7.113 +  fi
   7.114 +  printf "detect C compiler... "
   7.115 +  if [ -n "$CC" ]; then
   7.116 +    if check_c_compiler "$CC"; then
   7.117 +      TOOLCHAIN_CC=$CC
   7.118 +      TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"`
   7.119 +      echo "$CC"
   7.120 +      return 0
   7.121 +    else
   7.122 +      echo "$CC is not a working C compiler"
   7.123 +      return 1
   7.124 +    fi
   7.125 +  else
   7.126 +    for COMP in $C_COMPILERS
   7.127 +    do
   7.128 +      if check_c_compiler "$COMP"; then
   7.129 +        TOOLCHAIN_CC=$COMP
   7.130 +        TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"`
   7.131 +        echo "$COMP"
   7.132 +        return 0
   7.133 +      fi
   7.134 +    done
   7.135 +    echo "not found"
   7.136 +    return 1
   7.137 +  fi
   7.138 +}
   7.139 +
   7.140 +detect_cpp_compiler()
   7.141 +{
   7.142 +  if [ -n "$TOOLCHAIN_CXX" ]; then
   7.143 +    return 0
   7.144 +  fi
   7.145 +  printf "detect C++ compiler... "
   7.146 +
   7.147 +  if [ -n "$CXX" ]; then
   7.148 +    if check_cpp_compiler "$CXX"; then
   7.149 +      TOOLCHAIN_CXX=$CXX
   7.150 +      TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"`
   7.151 +      echo "$CXX"
   7.152 +      return 0
   7.153 +    else
   7.154 +      echo "$CXX is not a working C++ compiler"
   7.155 +      return 1
   7.156 +    fi
   7.157 +  else
   7.158 +    for COMP in $CPP_COMPILERS
   7.159 +    do
   7.160 +      if check_cpp_compiler "$COMP"; then
   7.161 +        TOOLCHAIN_CXX=$COMP
   7.162 +        TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"`
   7.163 +        echo "$COMP"
   7.164 +        return 0
   7.165 +      fi
   7.166 +    done
   7.167 +    echo "${TOOLCHAIN_CXX:-"not found"}"
   7.168 +    return 1
   7.169 +  fi
   7.170 +}
   7.171 +
   7.172 +write_toolchain_defaults()
   7.173 +{
   7.174 +  echo "# toolchain" >> "$1"
   7.175 +  if [ -n "$TOOLCHAIN_CC" ]; then
   7.176 +    echo "CC = ${TOOLCHAIN_CC}" >> "$1"
   7.177 +  fi
   7.178 +  if [ -n "$TOOLCHAIN_CXX" ]; then
   7.179 +    echo "CXX = ${TOOLCHAIN_CXX}" >> "$1"
   7.180 +  fi
   7.181 +  echo >> "$1"
   7.182 +  if [ -f "make/${TOOLCHAIN_NAME}.mk" ]; then
   7.183 +    cat "make/${TOOLCHAIN_NAME}.mk" >> "$1"
   7.184 +  elif [ -f "make/cc.mk" ]; then
   7.185 +    cat "make/cc.mk" >> "$1"
   7.186 +  else
   7.187 +    echo "!!! WARNING !!! Default toolchain flags not found. Configuration might be incomplete."
   7.188 +  fi
   7.189 +}
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/make/uwproj.xsd	Sun Oct 01 12:53:35 2023 +0200
     8.3 @@ -0,0 +1,131 @@
     8.4 +<?xml version="1.0" encoding="UTF-8"?>
     8.5 +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
     8.6 +           xmlns="http://unixwork.de/uwproj"
     8.7 +           targetNamespace="http://unixwork.de/uwproj"
     8.8 +           elementFormDefault="qualified"
     8.9 +           version="0.1"
    8.10 +>
    8.11 +    <xs:element name="project" type="ProjectType"/>
    8.12 +
    8.13 +    <xs:complexType name="ProjectType">
    8.14 +        <xs:sequence>
    8.15 +            <xs:element name="config" type="ConfigType" minOccurs="0"/>
    8.16 +            <xs:element name="dependency" type="DependencyType" minOccurs="0" maxOccurs="unbounded"/>
    8.17 +            <xs:element name="target" type="TargetType" minOccurs="0" maxOccurs="unbounded"/>
    8.18 +        </xs:sequence>
    8.19 +    </xs:complexType>
    8.20 +
    8.21 +    <xs:complexType name="ConfigType">
    8.22 +        <xs:sequence>
    8.23 +            <xs:element name="var" type="ConfigVarType" minOccurs="0" maxOccurs="unbounded"/>
    8.24 +        </xs:sequence>
    8.25 +    </xs:complexType>
    8.26 +
    8.27 +    <xs:complexType name="ConfigVarType">
    8.28 +        <xs:simpleContent>
    8.29 +            <xs:extension base="xs:string">
    8.30 +                <xs:attribute name="name" type="xs:string" use="required"/>
    8.31 +                <xs:attribute name="exec" type="xs:boolean" default="false"/>
    8.32 +            </xs:extension>
    8.33 +        </xs:simpleContent>
    8.34 +    </xs:complexType>
    8.35 +
    8.36 +    <xs:complexType name="PkgConfigType">
    8.37 +        <xs:simpleContent>
    8.38 +            <xs:extension base="xs:string">
    8.39 +                <xs:attribute name="atleast" type="xs:string"/>
    8.40 +                <xs:attribute name="exact" type="xs:string"/>
    8.41 +                <xs:attribute name="max" type="xs:string"/>
    8.42 +            </xs:extension>
    8.43 +        </xs:simpleContent>
    8.44 +    </xs:complexType>
    8.45 +
    8.46 +    <xs:simpleType name="LangType">
    8.47 +        <xs:restriction base="xs:string">
    8.48 +            <xs:enumeration value="c"/>
    8.49 +            <xs:enumeration value="cpp"/>
    8.50 +        </xs:restriction>
    8.51 +    </xs:simpleType>
    8.52 +
    8.53 +    <xs:complexType name="DependencyType">
    8.54 +        <xs:choice minOccurs="0" maxOccurs="unbounded">
    8.55 +            <xs:element name="lang" type="LangType"/>
    8.56 +            <xs:element name="cflags" type="FlagsType"/>
    8.57 +            <xs:element name="cxxflags" type="FlagsType"/>
    8.58 +            <xs:element name="ldflags" type="FlagsType"/>
    8.59 +            <xs:element name="pkgconfig" type="PkgConfigType"/>
    8.60 +            <xs:element name="test" type="xs:string"/>
    8.61 +            <xs:element name="make" type="xs:string"/>
    8.62 +        </xs:choice>
    8.63 +        <xs:attribute name="name" type="xs:string"/>
    8.64 +        <xs:attribute name="platform" type="xs:string"/>
    8.65 +        <xs:attribute name="not" type="xs:string"/>
    8.66 +    </xs:complexType>
    8.67 +
    8.68 +    <xs:complexType name="FlagsType">
    8.69 +        <xs:simpleContent>
    8.70 +            <xs:extension base="xs:string">
    8.71 +                <xs:attribute name="exec" type="xs:boolean" default="false"/>
    8.72 +            </xs:extension>
    8.73 +        </xs:simpleContent>
    8.74 +    </xs:complexType>
    8.75 +
    8.76 +    <xs:complexType name="TargetType">
    8.77 +        <xs:choice minOccurs="0" maxOccurs="unbounded">
    8.78 +            <xs:element name="feature" type="FeatureType"/>
    8.79 +            <xs:element name="option" type="OptionType"/>
    8.80 +            <xs:element name="define" type="DefineType"/>
    8.81 +            <xs:element name="dependencies" type="DependenciesType"/>
    8.82 +            <xs:element name="alldependencies">
    8.83 +                <xs:complexType/>
    8.84 +            </xs:element>
    8.85 +        </xs:choice>
    8.86 +        <xs:attribute name="name" type="xs:string"/>
    8.87 +    </xs:complexType>
    8.88 +
    8.89 +    <xs:complexType name="FeatureType">
    8.90 +        <xs:choice minOccurs="0" maxOccurs="unbounded">
    8.91 +            <xs:group ref="TargetDataGroup"/>
    8.92 +        </xs:choice>
    8.93 +        <xs:attribute name="name" type="xs:string" use="required"/>
    8.94 +        <xs:attribute name="arg" type="xs:string"/>
    8.95 +        <xs:attribute name="default" type="xs:boolean" default="false"/>
    8.96 +    </xs:complexType>
    8.97 +
    8.98 +    <xs:complexType name="OptionType">
    8.99 +        <xs:sequence>
   8.100 +            <xs:element name="value" type="OptionValueType" minOccurs="0" maxOccurs="unbounded"/>
   8.101 +            <xs:element name="default" type="OptionDefaultType" minOccurs="0" maxOccurs="unbounded"/>
   8.102 +        </xs:sequence>
   8.103 +        <xs:attribute name="arg" type="xs:string"/>
   8.104 +    </xs:complexType>
   8.105 +
   8.106 +    <xs:complexType name="OptionValueType">
   8.107 +        <xs:choice minOccurs="0" maxOccurs="unbounded">
   8.108 +            <xs:group ref="TargetDataGroup"/>
   8.109 +        </xs:choice>
   8.110 +        <xs:attribute name="str" type="xs:string" use="required"/>
   8.111 +    </xs:complexType>
   8.112 +
   8.113 +    <xs:complexType name="OptionDefaultType">
   8.114 +        <xs:attribute name="value" type="xs:string" use="required"/>
   8.115 +        <xs:attribute name="platform" type="xs:string"/>
   8.116 +    </xs:complexType>
   8.117 +
   8.118 +    <xs:group name="TargetDataGroup">
   8.119 +        <xs:choice>
   8.120 +            <xs:element name="define" type="DefineType" minOccurs="0" maxOccurs="unbounded"/>
   8.121 +            <xs:element name="dependencies" type="DependenciesType" minOccurs="0" maxOccurs="unbounded"/>
   8.122 +            <xs:element name="make" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
   8.123 +        </xs:choice>
   8.124 +    </xs:group>
   8.125 +
   8.126 +    <xs:complexType name="DefineType">
   8.127 +        <xs:attribute name="name" type="xs:string" use="required"/>
   8.128 +        <xs:attribute name="value" type="xs:string"/>
   8.129 +    </xs:complexType>
   8.130 +
   8.131 +    <xs:simpleType name="DependenciesType">
   8.132 +        <xs:restriction base="xs:string"/>
   8.133 +    </xs:simpleType>
   8.134 +</xs:schema>
   8.135 \ No newline at end of file
     9.1 --- a/src/Makefile	Tue Aug 13 00:33:59 2019 +0200
     9.2 +++ b/src/Makefile	Sun Oct 01 12:53:35 2023 +0200
     9.3 @@ -26,25 +26,22 @@
     9.4  # POSSIBILITY OF SUCH DAMAGE.
     9.5  #
     9.6  
     9.7 -include ../conf.mk
     9.8 +include ../config.mk
     9.9  
    9.10 -SRC  = main.c
    9.11 -SRC += colors.c
    9.12 -SRC += network.c
    9.13 -SRC += input.c
    9.14 -SRC += server.c
    9.15 -SRC += client.c
    9.16 -SRC += game.c
    9.17 +SRC  = main.c colors.c network.c input.c server.c client.c game.c
    9.18  
    9.19  OBJ = $(SRC:%.c=$(BUILDDIR)/%$(OBJ_EXT))
    9.20  
    9.21 -all: $(BUILDDIR) $(OBJ)
    9.22 -	$(LD) -o $(BUILDDIR)/$(BIN) $(OBJ) \
    9.23 -	$(BUILDDIR)/chess$(LIB_EXT) $(LDFLAGS)
    9.24 +all: $(BUILDDIR)/terminal-chess FORCE
    9.25 +	@echo "Build complete."
    9.26 +
    9.27 +$(BUILDDIR)/terminal-chess: $(OBJ) $(BUILDDIR)/libchess$(LIB_EXT)
    9.28 +	$(CC) -o $@ $(LDFLAGS) $^
    9.29 +
    9.30 +$(BUILDDIR)/libchess$(LIB_EXT): FORCE
    9.31 +	cd chess; $(MAKE)
    9.32  
    9.33  $(BUILDDIR)/%$(OBJ_EXT): %.c
    9.34  	$(CC) -o $@ $(CFLAGS) -c $<
    9.35 -	
    9.36 -$(BUILDDIR):
    9.37 -	$(MKDIR) $(MKDIRFLAGS) $(BUILDDIR)
    9.38  
    9.39 +FORCE:
    10.1 --- a/src/chess/Makefile	Tue Aug 13 00:33:59 2019 +0200
    10.2 +++ b/src/chess/Makefile	Sun Oct 01 12:53:35 2023 +0200
    10.3 @@ -26,25 +26,19 @@
    10.4  # POSSIBILITY OF SUCH DAMAGE.
    10.5  #
    10.6  
    10.7 -include ../../conf.mk
    10.8 +include ../../config.mk
    10.9  
   10.10 -SRC += pawn.c
   10.11 -SRC += rook.c
   10.12 -SRC += knight.c
   10.13 -SRC += bishop.c
   10.14 -SRC += queen.c
   10.15 -SRC += king.c
   10.16 -SRC += rules.c
   10.17 -SRC += pgn.c
   10.18 +SRC = pawn.c rook.c knight.c bishop.c queen.c king.c \
   10.19 +      rules.c pgn.c
   10.20  
   10.21  OBJ = $(SRC:%.c=$(BUILDDIR)/%$(OBJ_EXT))
   10.22  
   10.23  all: $(BUILDDIR) $(OBJ)
   10.24 -	$(AR) $(ARFLAGS) $(BUILDDIR)/chess$(LIB_EXT) $(OBJ)
   10.25 +	$(AR) $(ARFLAGS) $(BUILDDIR)/libchess$(LIB_EXT) $(OBJ)
   10.26  
   10.27  $(BUILDDIR)/%$(OBJ_EXT): %.c
   10.28  	$(CC) -o $@ $(CFLAGS) -c $<
   10.29  	
   10.30  $(BUILDDIR):
   10.31  	$(MKDIR) $(MKDIRFLAGS) $(BUILDDIR)
   10.32 -	
   10.33 \ No newline at end of file
   10.34 +	
    11.1 --- a/src/terminal-chess.h	Tue Aug 13 00:33:59 2019 +0200
    11.2 +++ b/src/terminal-chess.h	Sun Oct 01 12:53:35 2023 +0200
    11.3 @@ -36,7 +36,7 @@
    11.4  #ifndef TERMINAL_CHESS_H
    11.5  #define	TERMINAL_CHESS_H
    11.6  
    11.7 -#define PROGRAM_VERSION "0.9-r70"
    11.8 +#define PROGRAM_VERSION "0.9-r71"
    11.9  
   11.10  #ifdef	__cplusplus
   11.11  extern "C" {

mercurial