Sun, 24 Sep 2023 18:43:58 +0200
use uwproj for build config generation
.hgignore | file | annotate | diff | comparison | revisions | |
Makefile | file | annotate | diff | comparison | revisions | |
clang.mk | file | annotate | diff | comparison | revisions | |
configure | file | annotate | diff | comparison | revisions | |
gcc.mk | 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 |
1.1 --- a/.hgignore Sun Jun 11 15:21:44 2023 +0200 1.2 +++ b/.hgignore Sun Sep 24 18:43:58 2023 +0200 1.3 @@ -6,4 +6,5 @@ 1.4 ^build/.*$ 1.5 ^nbproject/.*$ 1.6 .idea/ 1.7 +^config.mk$ 1.8
2.1 --- a/Makefile Sun Jun 11 15:21:44 2023 +0200 2.2 +++ b/Makefile Sun Sep 24 18:43:58 2023 +0200 2.3 @@ -26,30 +26,27 @@ 2.4 # POSSIBILITY OF SUCH DAMAGE. 2.5 # 2.6 2.7 -# available configs: gcc, clang 2.8 -CONF=gcc 2.9 - 2.10 -include $(CONF).mk 2.11 +include config.mk 2.12 2.13 SRC = frontend.c 2.14 SRC += c2html.c 2.15 SRC += highlighter.c 2.16 2.17 -OBJ = $(SRC:%.c=build/%$(OBJ_EXT)) 2.18 +OBJ = $(SRC:%.c=build/%.o) 2.19 2.20 all: build build/c2html 2.21 2.22 build/c2html: $(OBJ) 2.23 - $(LD) -o $@ $^ $(LDFLAGS) 2.24 + $(CC) -o $@ $^ $(LDFLAGS) 2.25 2.26 -build/%$(OBJ_EXT): src/%.c 2.27 +build/%.o: src/%.c 2.28 $(CC) -o $@ $(CFLAGS) -c $< 2.29 2.30 build: 2.31 $(MKDIR) $@ 2.32 2.33 -test: all 2.34 +check: all 2.35 cd test && $(MAKE) 2.36 2.37 clean: 2.38 - $(RM) $(RMFLAGS) build 2.39 + $(RMDIR) build
3.1 --- a/clang.mk Sun Jun 11 15:21:44 2023 +0200 3.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 3.3 @@ -1,39 +0,0 @@ 3.4 -# 3.5 -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3.6 -# 3.7 -# Copyright 2016 Mike Becker. All rights reserved. 3.8 -# 3.9 -# Redistribution and use in source and binary forms, with or without 3.10 -# modification, are permitted provided that the following conditions are met: 3.11 -# 3.12 -# 1. Redistributions of source code must retain the above copyright 3.13 -# notice, this list of conditions and the following disclaimer. 3.14 -# 3.15 -# 2. Redistributions in binary form must reproduce the above copyright 3.16 -# notice, this list of conditions and the following disclaimer in the 3.17 -# documentation and/or other materials provided with the distribution. 3.18 -# 3.19 -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 3.20 -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 3.21 -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 3.22 -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 3.23 -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 3.24 -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 3.25 -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 3.26 -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 3.27 -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3.28 -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3.29 -# POSSIBILITY OF SUCH DAMAGE. 3.30 -# 3.31 - 3.32 -# system related 3.33 -MKDIR = mkdir -p 3.34 -RM = rm 3.35 -RMFLAGS = -fR 3.36 - 3.37 -# build related 3.38 -CC = clang 3.39 -CFLAGS = -O2 3.40 -LD = clang 3.41 -LDFLAGS = -lucx 3.42 -OBJ_EXT = .o
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 4.2 +++ b/configure Sun Sep 24 18:43:58 2023 +0200 4.3 @@ -0,0 +1,341 @@ 4.4 +#!/bin/sh 4.5 + 4.6 +# create temporary directory 4.7 +TEMP_DIR=".tmp-`uname -n`" 4.8 +rm -Rf "$TEMP_DIR" 4.9 +if mkdir -p "$TEMP_DIR"; then 4.10 + : 4.11 +else 4.12 + echo "Cannot create tmp dir $TEMP_DIR" 4.13 + echo "Abort" 4.14 + exit 1 4.15 +fi 4.16 +touch "$TEMP_DIR/options" 4.17 +touch "$TEMP_DIR/features" 4.18 + 4.19 +# define standard variables 4.20 +PREFIX=/usr 4.21 +EPREFIX= 4.22 +BINDIR= 4.23 +SBINDIR= 4.24 +LIBDIR= 4.25 +LIBEXECDIR= 4.26 +DATADIR= 4.27 +SYSCONFDIR= 4.28 +SHAREDSTATEDIR= 4.29 +LOCALSTATEDIR= 4.30 +INCLUDEDIR= 4.31 +INFODIR= 4.32 +MANDIR= 4.33 + 4.34 +# custom variables 4.35 +MKDIR="mkdir -p" 4.36 +RMDIR="rm -fR" 4.37 + 4.38 +# features 4.39 + 4.40 +# clean abort 4.41 +abort_configure() 4.42 +{ 4.43 + rm -Rf "$TEMP_DIR" 4.44 + exit 1 4.45 +} 4.46 + 4.47 +# help text 4.48 +printhelp() 4.49 +{ 4.50 + echo "Usage: $0 [OPTIONS]..." 4.51 + cat << __EOF__ 4.52 +Installation directories: 4.53 + --prefix=PREFIX path prefix for architecture-independent files 4.54 + [/usr] 4.55 + --exec-prefix=EPREFIX path prefix for architecture-dependent files 4.56 + [PREFIX] 4.57 + 4.58 + --bindir=DIR user executables [EPREFIX/bin] 4.59 + --sbindir=DIR system admin executables [EPREFIX/sbin] 4.60 + --libexecdir=DIR program executables [EPREFIX/libexec] 4.61 + --sysconfdir=DIR system configuration files [PREFIX/etc] 4.62 + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] 4.63 + --localstatedir=DIR modifiable single-machine data [PREFIX/var] 4.64 + --libdir=DIR object code libraries [EPREFIX/lib] 4.65 + --includedir=DIR C header files [PREFIX/include] 4.66 + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] 4.67 + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] 4.68 + --infodir=DIR info documentation [DATAROOTDIR/info] 4.69 + --mandir=DIR man documentation [DATAROOTDIR/man] 4.70 + 4.71 +__EOF__ 4.72 +} 4.73 + 4.74 +# 4.75 +# parse arguments 4.76 +# 4.77 +BUILD_TYPE="default" 4.78 +for ARG in "$@" 4.79 +do 4.80 + case "$ARG" in 4.81 + "--prefix="*) PREFIX=${ARG#--prefix=} ;; 4.82 + "--exec-prefix="*) EPREFIX=${ARG#--exec-prefix=} ;; 4.83 + "--bindir="*) BINDIR=${ARG#----bindir=} ;; 4.84 + "--sbindir="*) SBINDIR=${ARG#--sbindir=} ;; 4.85 + "--libdir="*) LIBDIR=${ARG#--libdir=} ;; 4.86 + "--libexecdir="*) LIBEXECDIR=${ARG#--libexecdir=} ;; 4.87 + "--datadir="*) DATADIR=${ARG#--datadir=} ;; 4.88 + "--sysconfdir="*) SYSCONFDIR=${ARG#--sysconfdir=} ;; 4.89 + "--sharedstatedir="*) SHAREDSTATEDIR=${ARG#--sharedstatedir=} ;; 4.90 + "--localstatedir="*) LOCALSTATEDIR=${ARG#--localstatedir=} ;; 4.91 + "--includedir="*) INCLUDEDIR=${ARG#--includedir=} ;; 4.92 + "--infodir="*) INFODIR=${ARG#--infodir=} ;; 4.93 + "--mandir"*) MANDIR=${ARG#--mandir} ;; 4.94 + "--help"*) printhelp; abort_configure ;; 4.95 + "--debug") BUILD_TYPE="debug" ;; 4.96 + "--release") BUILD_TYPE="release" ;; 4.97 + "-"*) echo "unknown option: $ARG"; abort_configure ;; 4.98 + esac 4.99 +done 4.100 + 4.101 + 4.102 +# set dir variables 4.103 +: ${EPREFIX:="$PREFIX"} 4.104 +: ${BINDIR:="$EPREFIX/bin"} 4.105 +: ${SBINDIR:="$EPREFIX/sbin"} 4.106 +: ${LIBDIR:="$EPREFIX/lib"} 4.107 +: ${LIBEXECDIR:="$EPREFIX/libexec"} 4.108 +: ${DATADIR:="$PREFIX/share"} 4.109 +: ${SYSCONFDIR:="$PREFIX/etc"} 4.110 +: ${SHAREDSTATEDIR:="$PREFIX/com"} 4.111 +: ${LOCALSTATEDIR:="$PREFIX/var"} 4.112 +: ${INCLUDEDIR:="$PREFIX/include"} 4.113 +: ${INFODIR:="$PREFIX/info"} 4.114 +: ${MANDIR:="$PREFIX/man"} 4.115 + 4.116 +# Test for availability of pkg-config 4.117 +PKG_CONFIG=`command -v pkg-config` 4.118 +: ${PKG_CONFIG:="false"} 4.119 + 4.120 +# Simple uname based platform detection 4.121 +# $PLATFORM is used for platform dependent dependency selection 4.122 +OS=`uname -s` 4.123 +OS_VERSION=`uname -r` 4.124 +printf "detect platform... " 4.125 +if [ "$OS" = "SunOS" ]; then 4.126 + PLATFORM="solaris sunos unix svr4" 4.127 +fi 4.128 +if [ "$OS" = "Linux" ]; then 4.129 + PLATFORM="linux unix" 4.130 +fi 4.131 +if [ "$OS" = "FreeBSD" ]; then 4.132 + PLATFORM="freebsd bsd unix" 4.133 +fi 4.134 +if [ "$OS" = "Darwin" ]; then 4.135 + PLATFORM="macos osx bsd unix" 4.136 +fi 4.137 +if echo "$OS" | grep -i "MINGW" > /dev/null; then 4.138 + PLATFORM="windows mingw" 4.139 +fi 4.140 +: ${PLATFORM:="unix"} 4.141 + 4.142 +PLATFORM_NAME=`echo "$PLATFORM" | cut -f1 -d' ' -` 4.143 +echo "$PLATFORM_NAME" 4.144 + 4.145 +isplatform() 4.146 +{ 4.147 + for p in $PLATFORM 4.148 + do 4.149 + if [ "$p" = "$1" ]; then 4.150 + return 0 4.151 + fi 4.152 + done 4.153 + return 1 4.154 +} 4.155 +notisplatform() 4.156 +{ 4.157 + for p in $PLATFORM 4.158 + do 4.159 + if [ "$p" = "$1" ]; then 4.160 + return 1 4.161 + fi 4.162 + done 4.163 + return 0 4.164 +} 4.165 + 4.166 + 4.167 +# generate vars.mk 4.168 +cat > "$TEMP_DIR/vars.mk" << __EOF__ 4.169 +PREFIX="$PREFIX" 4.170 +EPREFIX="$EPREFIX" 4.171 +BINDIR="$BINDIR" 4.172 +SBINDIR="$SBINDIR" 4.173 +LIBDIR="$LIBDIR" 4.174 +LIBEXECDIR="$LIBEXECDIR" 4.175 +DATADIR="$DATADIR" 4.176 +SYSCONFDIR="$SYSCONFDIR" 4.177 +SHAREDSTATEDIR="$SHAREDSTATEDIR" 4.178 +LOCALSTATEDIR="$LOCALSTATEDIR" 4.179 +INCLUDEDIR="$INCLUDEDIR" 4.180 +INFODIR="$INFODIR" 4.181 +MANDIR="$MANDIR" 4.182 +MKDIR=$MKDIR 4.183 +RMDIR=$RMDIR 4.184 +__EOF__ 4.185 +sort -u -o "$TEMP_DIR/vars.mk" "$TEMP_DIR/vars.mk" 4.186 + 4.187 + 4.188 +# toolchain detection utilities 4.189 +. make/toolchain.sh 4.190 + 4.191 +# 4.192 +# DEPENDENCIES 4.193 +# 4.194 + 4.195 +# check languages 4.196 +lang_c= 4.197 +lang_cpp= 4.198 +if detect_c_compiler ; then 4.199 + lang_c=1 4.200 +fi 4.201 + 4.202 +# create buffer for make variables required by dependencies 4.203 +echo > "$TEMP_DIR/make.mk" 4.204 + 4.205 +test_pkg_config() 4.206 +{ 4.207 + if "$PKG_CONFIG" --exists "$1" ; then : 4.208 + else return 1 ; fi 4.209 + if [ -z "$2" ] || "$PKG_CONFIG" --atleast-version="$2" "$1" ; then : 4.210 + else return 1 ; fi 4.211 + if [ -z "$3" ] || "$PKG_CONFIG" --exact-version="$3" "$1" ; then : 4.212 + else return 1 ; fi 4.213 + if [ -z "$4" ] || "$PKG_CONFIG" --max-version="$4" "$1" ; then : 4.214 + else return 1 ; fi 4.215 + return 0 4.216 +} 4.217 + 4.218 +dependency_error_ucx() 4.219 +{ 4.220 + printf "checking for ucx... " 4.221 + # dependency ucx 4.222 + while true 4.223 + do 4.224 + if check_lib ucx cx/list.h > /dev/null ; then 4.225 + : 4.226 + else 4.227 + break 4.228 + fi 4.229 + TEMP_LDFLAGS="$TEMP_LDFLAGS -lucx" 4.230 + echo yes 4.231 + return 1 4.232 + done 4.233 + 4.234 + echo no 4.235 + return 0 4.236 +} 4.237 + 4.238 + 4.239 + 4.240 + 4.241 +# start collecting dependency information 4.242 +echo > "$TEMP_DIR/flags.mk" 4.243 + 4.244 +DEPENDENCIES_FAILED= 4.245 +ERROR=0 4.246 +# unnamed dependencies 4.247 +TEMP_CFLAGS= 4.248 +TEMP_CXXFLAGS= 4.249 +TEMP_LDFLAGS= 4.250 +while true 4.251 +do 4.252 + while true 4.253 + do 4.254 + if [ -z "$lang_c" ] ; then 4.255 + ERROR=1 4.256 + break 4.257 + fi 4.258 + 4.259 + break 4.260 + done 4.261 + break 4.262 +done 4.263 + 4.264 +# add general dependency flags to flags.mk 4.265 +echo "# general flags" >> "$TEMP_DIR/flags.mk" 4.266 +if [ -n "${TEMP_CFLAGS}" ]; then 4.267 + echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk" 4.268 +fi 4.269 +if [ -n "${TEMP_CXXFLAGS}" ]; then 4.270 + echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk" 4.271 +fi 4.272 +if [ -n "${TEMP_LDFLAGS}" ]; then 4.273 + echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk" 4.274 +fi 4.275 + 4.276 +# 4.277 +# OPTION VALUES 4.278 +# 4.279 + 4.280 +# 4.281 +# TARGETS 4.282 +# 4.283 + 4.284 +echo >> "$TEMP_DIR/flags.mk" 4.285 +# Target: default 4.286 +echo "# flags for target default" >> "$TEMP_DIR/flags.mk" 4.287 +TEMP_CFLAGS= 4.288 +TEMP_CXXFLAGS= 4.289 +TEMP_LDFLAGS= 4.290 + 4.291 +if dependency_error_ucx; then 4.292 + DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ucx " 4.293 + ERROR=1 4.294 +fi 4.295 + 4.296 +# Features 4.297 + 4.298 + 4.299 +if [ -n "${TEMP_CFLAGS}" ]; then 4.300 + echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk" 4.301 +fi 4.302 +if [ -n "${TEMP_CXXFLAGS}" ]; then 4.303 + echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk" 4.304 +fi 4.305 +if [ "$BUILD_TYPE" = "debug" ]; then 4.306 + echo 'CFLAGS += ${DEBUG_CC_FLAGS}' >> "$TEMP_DIR/flags.mk" 4.307 + echo 'CXXFLAGS += ${DEBUG_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk" 4.308 +fi 4.309 +if [ "$BUILD_TYPE" = "release" ]; then 4.310 + echo 'CFLAGS += ${RELEASE_CC_FLAGS}' >> "$TEMP_DIR/flags.mk" 4.311 + echo 'CXXFLAGS += ${RELEASE_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk" 4.312 +fi 4.313 +if [ -n "${TEMP_LDFLAGS}" ]; then 4.314 + echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk" 4.315 +fi 4.316 + 4.317 + 4.318 +# final result 4.319 +if [ $ERROR -ne 0 ]; then 4.320 + echo 4.321 + echo "Error: Unresolved dependencies" 4.322 + echo "$DEPENDENCIES_FAILED" 4.323 + abort_configure 4.324 +fi 4.325 + 4.326 +echo "configure finished" 4.327 +echo 4.328 +echo "Build Config:" 4.329 +echo " PREFIX: $PREFIX" 4.330 +echo " TOOLCHAIN: $TOOLCHAIN_NAME" 4.331 +echo 4.332 + 4.333 +# generate the config.mk file 4.334 +cat > "$TEMP_DIR/config.mk" << __EOF__ 4.335 +# 4.336 +# config.mk generated by configure 4.337 +# 4.338 + 4.339 +__EOF__ 4.340 +write_toolchain_defaults "$TEMP_DIR/toolchain.mk" 4.341 +cat "$TEMP_DIR/vars.mk" "$TEMP_DIR/toolchain.mk" "$TEMP_DIR/flags.mk" "$TEMP_DIR/make.mk" > config.mk 4.342 +rm -Rf "$TEMP_DIR" 4.343 + 4.344 +
5.1 --- a/gcc.mk Sun Jun 11 15:21:44 2023 +0200 5.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 5.3 @@ -1,39 +0,0 @@ 5.4 -# 5.5 -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 5.6 -# 5.7 -# Copyright 2016 Mike Becker. All rights reserved. 5.8 -# 5.9 -# Redistribution and use in source and binary forms, with or without 5.10 -# modification, are permitted provided that the following conditions are met: 5.11 -# 5.12 -# 1. Redistributions of source code must retain the above copyright 5.13 -# notice, this list of conditions and the following disclaimer. 5.14 -# 5.15 -# 2. Redistributions in binary form must reproduce the above copyright 5.16 -# notice, this list of conditions and the following disclaimer in the 5.17 -# documentation and/or other materials provided with the distribution. 5.18 -# 5.19 -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 5.20 -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 5.21 -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 5.22 -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 5.23 -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 5.24 -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 5.25 -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 5.26 -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 5.27 -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 5.28 -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 5.29 -# POSSIBILITY OF SUCH DAMAGE. 5.30 -# 5.31 - 5.32 -# system related 5.33 -MKDIR = mkdir -p 5.34 -RM = rm 5.35 -RMFLAGS = -fR 5.36 - 5.37 -# build related 5.38 -CC = gcc 5.39 -CFLAGS = -O2 -std=gnu99 5.40 -LD = gcc 5.41 -LDFLAGS = -lucx 5.42 -OBJ_EXT = .o
6.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 6.2 +++ b/make/cc.mk Sun Sep 24 18:43:58 2023 +0200 6.3 @@ -0,0 +1,8 @@ 6.4 +# 6.5 +# cc toolchain config 6.6 +# 6.7 + 6.8 +CFLAGS = 6.9 +DEBUG_CC_FLAGS = -g 6.10 +RELEASE_CC_FLAGS = -O3 -DNDEBUG 6.11 +LDFLAGS =
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 7.2 +++ b/make/configure.vm Sun Sep 24 18:43:58 2023 +0200 7.3 @@ -0,0 +1,597 @@ 7.4 +#!/bin/sh 7.5 + 7.6 +# create temporary directory 7.7 +TEMP_DIR=".tmp-`uname -n`" 7.8 +rm -Rf "$TEMP_DIR" 7.9 +if mkdir -p "$TEMP_DIR"; then 7.10 + : 7.11 +else 7.12 + echo "Cannot create tmp dir $TEMP_DIR" 7.13 + echo "Abort" 7.14 + exit 1 7.15 +fi 7.16 +touch "$TEMP_DIR/options" 7.17 +touch "$TEMP_DIR/features" 7.18 + 7.19 +# define standard variables 7.20 +PREFIX=/usr 7.21 +EPREFIX= 7.22 +BINDIR= 7.23 +SBINDIR= 7.24 +LIBDIR= 7.25 +LIBEXECDIR= 7.26 +DATADIR= 7.27 +SYSCONFDIR= 7.28 +SHAREDSTATEDIR= 7.29 +LOCALSTATEDIR= 7.30 +INCLUDEDIR= 7.31 +INFODIR= 7.32 +MANDIR= 7.33 + 7.34 +# custom variables 7.35 +#foreach( $var in $vars ) 7.36 +#if( $var.exec ) 7.37 +${var.varName}=`${var.value}` 7.38 +#else 7.39 +${var.varName}="${var.value}" 7.40 +#end 7.41 +#end 7.42 + 7.43 +# features 7.44 +#foreach( $feature in $features ) 7.45 +#if( ${feature.isDefault()} ) 7.46 +${feature.getVarName()}=auto 7.47 +#end 7.48 +#end 7.49 + 7.50 +# clean abort 7.51 +abort_configure() 7.52 +{ 7.53 + rm -Rf "$TEMP_DIR" 7.54 + exit 1 7.55 +} 7.56 + 7.57 +# help text 7.58 +printhelp() 7.59 +{ 7.60 + echo "Usage: $0 [OPTIONS]..." 7.61 + cat << __EOF__ 7.62 +Installation directories: 7.63 + --prefix=PREFIX path prefix for architecture-independent files 7.64 + [/usr] 7.65 + --exec-prefix=EPREFIX path prefix for architecture-dependent files 7.66 + [PREFIX] 7.67 + 7.68 + --bindir=DIR user executables [EPREFIX/bin] 7.69 + --sbindir=DIR system admin executables [EPREFIX/sbin] 7.70 + --libexecdir=DIR program executables [EPREFIX/libexec] 7.71 + --sysconfdir=DIR system configuration files [PREFIX/etc] 7.72 + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] 7.73 + --localstatedir=DIR modifiable single-machine data [PREFIX/var] 7.74 + --libdir=DIR object code libraries [EPREFIX/lib] 7.75 + --includedir=DIR C header files [PREFIX/include] 7.76 + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] 7.77 + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] 7.78 + --infodir=DIR info documentation [DATAROOTDIR/info] 7.79 + --mandir=DIR man documentation [DATAROOTDIR/man] 7.80 + 7.81 +#if( $options.size() > 0 ) 7.82 +Options: 7.83 + --debug add extra compile flags for debug builds 7.84 + --release add extra compile flags for release builds 7.85 +#foreach( $opt in $options ) 7.86 + --${opt.getArgument()}=${opt.getValuesString()} 7.87 +#end 7.88 + 7.89 +#end 7.90 +#if( $features.size() > 0 ) 7.91 +Optional Features: 7.92 +#foreach( $feature in $features ) 7.93 +#if( $feature.default ) 7.94 + --disable-${feature.arg} 7.95 +#else 7.96 + --enable-${feature.arg} 7.97 +#end 7.98 +#end 7.99 + 7.100 +#end 7.101 +__EOF__ 7.102 +} 7.103 + 7.104 +# 7.105 +# parse arguments 7.106 +# 7.107 +BUILD_TYPE="default" 7.108 +#set( $D = '$' ) 7.109 +for ARG in "$@" 7.110 +do 7.111 + case "$ARG" in 7.112 + "--prefix="*) PREFIX=${D}{ARG#--prefix=} ;; 7.113 + "--exec-prefix="*) EPREFIX=${D}{ARG#--exec-prefix=} ;; 7.114 + "--bindir="*) BINDIR=${D}{ARG#----bindir=} ;; 7.115 + "--sbindir="*) SBINDIR=${D}{ARG#--sbindir=} ;; 7.116 + "--libdir="*) LIBDIR=${D}{ARG#--libdir=} ;; 7.117 + "--libexecdir="*) LIBEXECDIR=${D}{ARG#--libexecdir=} ;; 7.118 + "--datadir="*) DATADIR=${D}{ARG#--datadir=} ;; 7.119 + "--sysconfdir="*) SYSCONFDIR=${D}{ARG#--sysconfdir=} ;; 7.120 + "--sharedstatedir="*) SHAREDSTATEDIR=${D}{ARG#--sharedstatedir=} ;; 7.121 + "--localstatedir="*) LOCALSTATEDIR=${D}{ARG#--localstatedir=} ;; 7.122 + "--includedir="*) INCLUDEDIR=${D}{ARG#--includedir=} ;; 7.123 + "--infodir="*) INFODIR=${D}{ARG#--infodir=} ;; 7.124 + "--mandir"*) MANDIR=${D}{ARG#--mandir} ;; 7.125 + "--help"*) printhelp; abort_configure ;; 7.126 + "--debug") BUILD_TYPE="debug" ;; 7.127 + "--release") BUILD_TYPE="release" ;; 7.128 + #foreach( $opt in $options ) 7.129 + "--${opt.getArgument()}="*) ${opt.getVarName()}=${D}{ARG#--${opt.getArgument()}=} ;; 7.130 + #end 7.131 + #foreach( $feature in $features ) 7.132 + "--enable-${feature.arg}") ${feature.getVarName()}=on ;; 7.133 + "--disable-${feature.arg}") unset ${feature.getVarName()} ;; 7.134 + #end 7.135 + "-"*) echo "unknown option: $ARG"; abort_configure ;; 7.136 + esac 7.137 +done 7.138 + 7.139 +## Begin unparsed content. ** 7.140 +#[[ 7.141 +# set dir variables 7.142 +: ${EPREFIX:="$PREFIX"} 7.143 +: ${BINDIR:="$EPREFIX/bin"} 7.144 +: ${SBINDIR:="$EPREFIX/sbin"} 7.145 +: ${LIBDIR:="$EPREFIX/lib"} 7.146 +: ${LIBEXECDIR:="$EPREFIX/libexec"} 7.147 +: ${DATADIR:="$PREFIX/share"} 7.148 +: ${SYSCONFDIR:="$PREFIX/etc"} 7.149 +: ${SHAREDSTATEDIR:="$PREFIX/com"} 7.150 +: ${LOCALSTATEDIR:="$PREFIX/var"} 7.151 +: ${INCLUDEDIR:="$PREFIX/include"} 7.152 +: ${INFODIR:="$PREFIX/info"} 7.153 +: ${MANDIR:="$PREFIX/man"} 7.154 + 7.155 +# Test for availability of pkg-config 7.156 +PKG_CONFIG=`command -v pkg-config` 7.157 +: ${PKG_CONFIG:="false"} 7.158 + 7.159 +# Simple uname based platform detection 7.160 +# $PLATFORM is used for platform dependent dependency selection 7.161 +OS=`uname -s` 7.162 +OS_VERSION=`uname -r` 7.163 +printf "detect platform... " 7.164 +if [ "$OS" = "SunOS" ]; then 7.165 + PLATFORM="solaris sunos unix svr4" 7.166 +fi 7.167 +if [ "$OS" = "Linux" ]; then 7.168 + PLATFORM="linux unix" 7.169 +fi 7.170 +if [ "$OS" = "FreeBSD" ]; then 7.171 + PLATFORM="freebsd bsd unix" 7.172 +fi 7.173 +if [ "$OS" = "Darwin" ]; then 7.174 + PLATFORM="macos osx bsd unix" 7.175 +fi 7.176 +if echo "$OS" | grep -i "MINGW" > /dev/null; then 7.177 + PLATFORM="windows mingw" 7.178 +fi 7.179 +: ${PLATFORM:="unix"} 7.180 + 7.181 +PLATFORM_NAME=`echo "$PLATFORM" | cut -f1 -d' ' -` 7.182 +echo "$PLATFORM_NAME" 7.183 + 7.184 +isplatform() 7.185 +{ 7.186 + for p in $PLATFORM 7.187 + do 7.188 + if [ "$p" = "$1" ]; then 7.189 + return 0 7.190 + fi 7.191 + done 7.192 + return 1 7.193 +} 7.194 +notisplatform() 7.195 +{ 7.196 + for p in $PLATFORM 7.197 + do 7.198 + if [ "$p" = "$1" ]; then 7.199 + return 1 7.200 + fi 7.201 + done 7.202 + return 0 7.203 +} 7.204 +]]# 7.205 +## End of unparsed content ** 7.206 + 7.207 +# generate vars.mk 7.208 +cat > "$TEMP_DIR/vars.mk" << __EOF__ 7.209 +PREFIX="$PREFIX" 7.210 +EPREFIX="$EPREFIX" 7.211 +BINDIR="$BINDIR" 7.212 +SBINDIR="$SBINDIR" 7.213 +LIBDIR="$LIBDIR" 7.214 +LIBEXECDIR="$LIBEXECDIR" 7.215 +DATADIR="$DATADIR" 7.216 +SYSCONFDIR="$SYSCONFDIR" 7.217 +SHAREDSTATEDIR="$SHAREDSTATEDIR" 7.218 +LOCALSTATEDIR="$LOCALSTATEDIR" 7.219 +INCLUDEDIR="$INCLUDEDIR" 7.220 +INFODIR="$INFODIR" 7.221 +MANDIR="$MANDIR" 7.222 +#foreach( $var in $vars ) 7.223 +${var.varName}="$${var.varName}" 7.224 +#end 7.225 +__EOF__ 7.226 +sort -u -o "$TEMP_DIR/vars.mk" "$TEMP_DIR/vars.mk" 7.227 + 7.228 + 7.229 +# toolchain detection utilities 7.230 +. make/toolchain.sh 7.231 + 7.232 +# 7.233 +# DEPENDENCIES 7.234 +# 7.235 + 7.236 +# check languages 7.237 +lang_c= 7.238 +lang_cpp= 7.239 +#foreach( $lang in $languages ) 7.240 +if detect_${lang}_compiler ; then 7.241 + lang_${lang}=1 7.242 +fi 7.243 +#end 7.244 + 7.245 +# create buffer for make variables required by dependencies 7.246 +echo > "$TEMP_DIR/make.mk" 7.247 + 7.248 +test_pkg_config() 7.249 +{ 7.250 + if "$PKG_CONFIG" --exists "$1" ; then : 7.251 + else return 1 ; fi 7.252 + if [ -z "$2" ] || "$PKG_CONFIG" --atleast-version="$2" "$1" ; then : 7.253 + else return 1 ; fi 7.254 + if [ -z "$3" ] || "$PKG_CONFIG" --exact-version="$3" "$1" ; then : 7.255 + else return 1 ; fi 7.256 + if [ -z "$4" ] || "$PKG_CONFIG" --max-version="$4" "$1" ; then : 7.257 + else return 1 ; fi 7.258 + return 0 7.259 +} 7.260 + 7.261 +#foreach( $dependency in $namedDependencies ) 7.262 +dependency_error_${dependency.name}() 7.263 +{ 7.264 + printf "checking for ${dependency.name}... " 7.265 + #foreach( $sub in $dependency.getSubdependencies() ) 7.266 + # dependency $sub.getFullName() 7.267 + while true 7.268 + do 7.269 + #if( $sub.platform ) 7.270 + if notisplatform "${sub.platform}"; then 7.271 + break 7.272 + fi 7.273 + #end 7.274 + #foreach( $np in $sub.getNotList() ) 7.275 + if isplatform "${np}"; then 7.276 + break 7.277 + fi 7.278 + #end 7.279 + #foreach( $lang in $sub.lang ) 7.280 + if [ -z "$lang_${lang}" ] ; then 7.281 + break 7.282 + fi 7.283 + #end 7.284 + #if( $sub.pkgconfig.size() > 0 ) 7.285 + if [ -z "$PKG_CONFIG" ]; then 7.286 + break 7.287 + fi 7.288 + #end 7.289 + #foreach( $test in $sub.tests ) 7.290 + if $test > /dev/null ; then 7.291 + : 7.292 + else 7.293 + break 7.294 + fi 7.295 + #end 7.296 + #foreach( $pkg in $sub.pkgconfig ) 7.297 + if test_pkg_config "$pkg.name" "$pkg.atleast" "$pkg.exact" "$pkg.max" ; then 7.298 + TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags $pkg.name`" 7.299 + TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs $pkg.name`" 7.300 + else 7.301 + break 7.302 + fi 7.303 + #end 7.304 + #foreach( $flags in $sub.flags ) 7.305 + #if( $flags.exec ) 7.306 + if tmp_flags=`$flags.value` ; then 7.307 + TEMP_$flags.varName="$TEMP_$flags.varName $tmp_flags" 7.308 + else 7.309 + break 7.310 + fi 7.311 + #else 7.312 + TEMP_$flags.varName="$TEMP_$flags.varName $flags.value" 7.313 + #end 7.314 + #end 7.315 + #if ( $sub.make.length() > 0 ) 7.316 + cat >> $TEMP_DIR/make.mk << __EOF__ 7.317 +# Dependency: $dependency.name 7.318 +$sub.make 7.319 +__EOF__ 7.320 + #end 7.321 + echo yes 7.322 + return 1 7.323 + done 7.324 + 7.325 + #end 7.326 + echo no 7.327 + return 0 7.328 +} 7.329 +#end 7.330 + 7.331 + 7.332 + 7.333 + 7.334 +# start collecting dependency information 7.335 +echo > "$TEMP_DIR/flags.mk" 7.336 + 7.337 +DEPENDENCIES_FAILED= 7.338 +ERROR=0 7.339 +#if( $dependencies.size() > 0 ) 7.340 +# unnamed dependencies 7.341 +TEMP_CFLAGS= 7.342 +TEMP_CXXFLAGS= 7.343 +TEMP_LDFLAGS= 7.344 +#foreach( $dependency in $dependencies ) 7.345 +while true 7.346 +do 7.347 + #if( $dependency.platform ) 7.348 + if notisplatform "${dependency.platform}"; then 7.349 + break 7.350 + fi 7.351 + #end 7.352 + #foreach( $np in $dependency.getNotList() ) 7.353 + if isplatform "${np}"; then 7.354 + break 7.355 + fi 7.356 + #end 7.357 + while true 7.358 + do 7.359 + #foreach( $lang in $dependency.lang ) 7.360 + if [ -z "$lang_${lang}" ] ; then 7.361 + ERROR=1 7.362 + break 7.363 + fi 7.364 + #end 7.365 + #if( $dependency.pkgconfig.size() > 0 ) 7.366 + if [ -z "$PKG_CONFIG" ]; then 7.367 + ERROR=1 7.368 + break 7.369 + fi 7.370 + #end 7.371 + #foreach( $pkg in $dependency.pkgconfig ) 7.372 + printf "checking for pkg-config package $pkg.name... " 7.373 + if test_pkg_config "$pkg.name" "$pkg.atleast" "$pkg.exact" "$pkg.max" ; then 7.374 + echo yes 7.375 + TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags $pkg.name`" 7.376 + TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs $pkg.name`" 7.377 + else 7.378 + echo no 7.379 + ERROR=1 7.380 + break 7.381 + fi 7.382 + #end 7.383 + 7.384 + #foreach( $flags in $dependency.flags ) 7.385 + #if( $flags.exec ) 7.386 + $flags.value > /dev/null 7.387 + if tmp_flags=`$flags.value` ; then 7.388 + TEMP_$flags.varName="$TEMP_$flags.varName $tmp_flags" 7.389 + else 7.390 + ERROR=1 7.391 + break 7.392 + fi 7.393 + #else 7.394 + TEMP_$flags.varName="$TEMP_$flags.varName $flags.value" 7.395 + #end 7.396 + #end 7.397 + #if ( $dependency.make.length() > 0 ) 7.398 + cat >> "$TEMP_DIR/make.mk" << __EOF__ 7.399 +$dependency.make 7.400 +__EOF__ 7.401 + #end 7.402 + break 7.403 + done 7.404 + break 7.405 +done 7.406 +#end 7.407 + 7.408 +# add general dependency flags to flags.mk 7.409 +echo "# general flags" >> "$TEMP_DIR/flags.mk" 7.410 +if [ -n "${TEMP_CFLAGS}" ]; then 7.411 + echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk" 7.412 +fi 7.413 +if [ -n "${TEMP_CXXFLAGS}" ]; then 7.414 + echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk" 7.415 +fi 7.416 +if [ -n "${TEMP_LDFLAGS}" ]; then 7.417 + echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk" 7.418 +fi 7.419 +#end 7.420 + 7.421 +# 7.422 +# OPTION VALUES 7.423 +# 7.424 +#foreach( $opt in $options ) 7.425 +#foreach( $val in $opt.values ) 7.426 +${val.func}() 7.427 +{ 7.428 + VERR=0 7.429 + #foreach( $dep in $val.dependencies ) 7.430 + if dependency_error_$dep ; then 7.431 + VERR=1 7.432 + fi 7.433 + #end 7.434 + if [ $VERR -ne 0 ]; then 7.435 + return 1 7.436 + fi 7.437 + #foreach( $def in $val.defines ) 7.438 + TEMP_CFLAGS="$TEMP_CFLAGS ${def.toFlags()}" 7.439 + TEMP_CXXFLAGS="$TEMP_CXXFLAGS ${def.toFlags()}" 7.440 + #end 7.441 + #if( $val.hasMake() ) 7.442 + cat >> "$TEMP_DIR/make.mk" << __EOF__ 7.443 +$val.make 7.444 +__EOF__ 7.445 + #end 7.446 + return 0 7.447 +} 7.448 +#end 7.449 +#end 7.450 + 7.451 +# 7.452 +# TARGETS 7.453 +# 7.454 + 7.455 +#foreach( $target in $targets ) 7.456 +echo >> "$TEMP_DIR/flags.mk" 7.457 +#if ( $target.name ) 7.458 +# Target: $target.name 7.459 +echo "# flags for target $target.name" >> "$TEMP_DIR/flags.mk" 7.460 +#else 7.461 +# Target 7.462 +echo "# flags for unnamed target" >> "$TEMP_DIR/flags.mk" 7.463 +#end 7.464 +TEMP_CFLAGS= 7.465 +TEMP_CXXFLAGS= 7.466 +TEMP_LDFLAGS= 7.467 + 7.468 +#foreach( $dependency in $target.dependencies ) 7.469 +if dependency_error_$dependency; then 7.470 + DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ${dependency} " 7.471 + ERROR=1 7.472 +fi 7.473 +#end 7.474 + 7.475 +# Features 7.476 +#foreach( $feature in $target.features ) 7.477 +if [ -n "$${feature.getVarName()}" ]; then 7.478 +#foreach( $dependency in $feature.dependencies ) 7.479 + # check dependency 7.480 + if dependency_error_$dependency ; then 7.481 + # "auto" features can fail and are just disabled in this case 7.482 + if [ "$${feature.getVarName()}" = "auto" ]; then 7.483 + DISABLE_${feature.getVarName()}=1 7.484 + else 7.485 + DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ${dependency} " 7.486 + ERROR=1 7.487 + fi 7.488 + fi 7.489 +#end 7.490 + if [ -n "$DISABLE_${feature.getVarName()}" ]; then 7.491 + unset ${feature.getVarName()} 7.492 + fi 7.493 +fi 7.494 +#end 7.495 + 7.496 +#foreach( $opt in $target.options ) 7.497 +# Option: --${opt.argument} 7.498 +if [ -z ${D}${opt.getVarName()} ]; then 7.499 + SAVED_ERROR="$ERROR" 7.500 + SAVED_DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED" 7.501 + ERROR=1 7.502 + while true 7.503 + do 7.504 + #foreach( $optdef in $opt.defaults ) 7.505 + #if( $optdef.platform ) 7.506 + if isplatform "$optdef.platform"; then 7.507 + #end 7.508 + if $optdef.func ; then 7.509 + echo " ${opt.argument}: ${optdef.valueName}" >> "$TEMP_DIR/options" 7.510 + ERROR=0 7.511 + break 7.512 + fi 7.513 + #if( $optdef.platform ) 7.514 + fi 7.515 + #end 7.516 + #end 7.517 + break 7.518 + done 7.519 + if [ $ERROR -ne 0 ]; then 7.520 + SAVED_ERROR=1 7.521 + fi 7.522 + ERROR="$SAVED_ERROR" 7.523 + DEPENDENCIES_FAILED="$SAVED_DEPENDENCIES_FAILED" 7.524 +else 7.525 + if false; then 7.526 + false 7.527 + #foreach( $optval in $opt.values ) 7.528 + elif [ "${D}${opt.getVarName()}" = "${optval.value}" ]; then 7.529 + echo " ${opt.argument}: ${D}${opt.getVarName()}" >> $TEMP_DIR/options 7.530 + if $optval.func ; then 7.531 + : 7.532 + else 7.533 + ERROR=1 7.534 + fi 7.535 + #end 7.536 + fi 7.537 +fi 7.538 +#end 7.539 + 7.540 +if [ -n "${TEMP_CFLAGS}" ]; then 7.541 + echo "${target.getCFlags()} += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk" 7.542 +fi 7.543 +if [ -n "${TEMP_CXXFLAGS}" ]; then 7.544 + echo "${target.getCXXFlags()} += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk" 7.545 +fi 7.546 +if [ "$BUILD_TYPE" = "debug" ]; then 7.547 + echo '${target.getCFlags()} += ${DEBUG_CC_FLAGS}' >> "$TEMP_DIR/flags.mk" 7.548 + echo '${target.getCXXFlags()} += ${DEBUG_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk" 7.549 +fi 7.550 +if [ "$BUILD_TYPE" = "release" ]; then 7.551 + echo '${target.getCFlags()} += ${RELEASE_CC_FLAGS}' >> "$TEMP_DIR/flags.mk" 7.552 + echo '${target.getCXXFlags()} += ${RELEASE_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk" 7.553 +fi 7.554 +if [ -n "${TEMP_LDFLAGS}" ]; then 7.555 + echo "${target.getLDFlags()} += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk" 7.556 +fi 7.557 + 7.558 +#end 7.559 + 7.560 +# final result 7.561 +if [ $ERROR -ne 0 ]; then 7.562 + echo 7.563 + echo "Error: Unresolved dependencies" 7.564 + echo "$DEPENDENCIES_FAILED" 7.565 + abort_configure 7.566 +fi 7.567 + 7.568 +echo "configure finished" 7.569 +echo 7.570 +echo "Build Config:" 7.571 +echo " PREFIX: $PREFIX" 7.572 +echo " TOOLCHAIN: $TOOLCHAIN_NAME" 7.573 +#if ( $options.size() > 0 ) 7.574 +echo "Options:" 7.575 +cat "$TEMP_DIR/options" 7.576 +#end 7.577 +#if ( $features.size() > 0 ) 7.578 +echo "Features:" 7.579 +#foreach( $feature in $features ) 7.580 +if [ -n "$${feature.getVarName()}" ]; then 7.581 +echo " $feature.name: on" 7.582 +else 7.583 +echo " $feature.name: off" 7.584 +fi 7.585 +#end 7.586 +#end 7.587 +echo 7.588 + 7.589 +# generate the config.mk file 7.590 +cat > "$TEMP_DIR/config.mk" << __EOF__ 7.591 +# 7.592 +# config.mk generated by configure 7.593 +# 7.594 + 7.595 +__EOF__ 7.596 +write_toolchain_defaults "$TEMP_DIR/toolchain.mk" 7.597 +cat "$TEMP_DIR/vars.mk" "$TEMP_DIR/toolchain.mk" "$TEMP_DIR/flags.mk" "$TEMP_DIR/make.mk" > config.mk 7.598 +rm -Rf "$TEMP_DIR" 7.599 + 7.600 +
8.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 8.2 +++ b/make/project.xml Sun Sep 24 18:43:58 2023 +0200 8.3 @@ -0,0 +1,15 @@ 8.4 +<?xml version="1.0" encoding="UTF-8"?> 8.5 +<project xmlns="http://unixwork.de/uwproj"> 8.6 + <config> 8.7 + <var name="MKDIR">mkdir -p</var> 8.8 + <var name="RMDIR">rm -fR</var> 8.9 + </config> 8.10 + <dependency> 8.11 + <lang>c</lang> 8.12 + </dependency> 8.13 + <dependency name="ucx"> 8.14 + <test>check_lib ucx cx/list.h</test> 8.15 + <ldflags>-lucx</ldflags> 8.16 + </dependency> 8.17 +</project> 8.18 +
9.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 9.2 +++ b/make/toolchain.sh Sun Sep 24 18:43:58 2023 +0200 9.3 @@ -0,0 +1,186 @@ 9.4 +#!/bin/sh 9.5 +# 9.6 +# toolchain detection 9.7 +# 9.8 + 9.9 +C_COMPILERS="gcc clang suncc cc" 9.10 +CPP_COMPILERS="g++ clang++ sunCC CC" 9.11 +unset TOOLCHAIN_NAME 9.12 +unset TOOLCHAIN_CC 9.13 +unset TOOLCHAIN_CXX 9.14 + 9.15 +check_c_compiler() 9.16 +{ 9.17 + cat > "$TEMP_DIR/test.c" << __EOF__ 9.18 +/* test file */ 9.19 +#include <stdio.h> 9.20 +int main(int argc, char **argv) { 9.21 +#if defined(__clang__) 9.22 + printf("clang\n"); 9.23 +#elif defined(__GNUC__) 9.24 + printf("gcc\n"); 9.25 +#elif defined(__sun) 9.26 + printf("suncc\n"); 9.27 +#else 9.28 + printf("unknown\n"); 9.29 +#endif 9.30 + return 0; 9.31 +} 9.32 +__EOF__ 9.33 + rm -f "$TEMP_DIR/checkcc" 9.34 + $1 -o "$TEMP_DIR/checkcc" $CFLAGS $LDFLAGS "$TEMP_DIR/test.c" 2> /dev/null 9.35 +} 9.36 + 9.37 +check_cpp_compiler() 9.38 +{ 9.39 + cat > "$TEMP_DIR/test.cpp" << __EOF__ 9.40 +/* test file */ 9.41 +#include <iostream> 9.42 +int main(int argc, char **argv) { 9.43 +#if defined(__clang__) 9.44 + std::cout << "clang" << std::endl; 9.45 +#elif defined(__GNUC__) 9.46 + std::cout << "gcc" << std::endl; 9.47 +#elif defined(__sun) 9.48 + std::cout << "suncc" << std::endl; 9.49 +#else 9.50 + std::cout << "cc" << std::endl; 9.51 +#endif 9.52 + return 0; 9.53 +} 9.54 +__EOF__ 9.55 + rm -f "$TEMP_DIR/checkcc" 9.56 + $1 -o "$TEMP_DIR/checkcc" $CXXFLAGS $LDFLAGS "$TEMP_DIR/test.cpp" 2> /dev/null 9.57 +} 9.58 + 9.59 +create_libtest_source() 9.60 +{ 9.61 + # $1: filename 9.62 + # $2: optional include 9.63 + cat > "$TEMP_DIR/$1" << __EOF__ 9.64 +/* libtest file */ 9.65 +int main(int argc, char **argv) { 9.66 + return 0; 9.67 +} 9.68 +__EOF__ 9.69 + if [ -n "$2" ]; then 9.70 + echo "#include <$2>" >> "$TEMP_DIR/$1" 9.71 + fi 9.72 +} 9.73 + 9.74 +check_c_lib() 9.75 +{ 9.76 + # $1: libname 9.77 + # $2: optional include 9.78 + if [ -z "$TOOLCHAIN_CC" ]; then 9.79 + return 1 9.80 + fi 9.81 + create_libtest_source "test.c" "$2" 9.82 + rm -f "$TEMP_DIR/checklib" 9.83 + $TOOLCHAIN_CC -o "$TEMP_DIR/checklib" $CFLAGS $LDFLAGS "-l$1" "$TEMP_DIR/test.c" 2> /dev/null 9.84 +} 9.85 + 9.86 +check_cpp_lib() 9.87 +{ 9.88 + # $1: libname 9.89 + # $2: optional include 9.90 + if [ -z "$TOOLCHAIN_CXX" ]; then 9.91 + return 1 9.92 + fi 9.93 + create_libtest_source "test.cpp" "$2" 9.94 + rm -f "$TEMP_DIR/checklib" 9.95 + $TOOLCHAIN_CXX -o "$TEMP_DIR/checklib" $CXXFLAGS $LDFLAGS "-l$1" "$TEMP_DIR/test.cpp" 2> /dev/null 9.96 +} 9.97 + 9.98 +check_lib() 9.99 +{ 9.100 + # $1: libname 9.101 + # $2: optional include 9.102 + if [ -n "$TOOLCHAIN_CC" ]; then 9.103 + check_c_lib "$1" "$2" 9.104 + elif [ -n "$TOOLCHAIN_CXX" ]; then 9.105 + check_cpp_lib "$1" "$2" 9.106 + fi 9.107 +} 9.108 + 9.109 +detect_c_compiler() 9.110 +{ 9.111 + if [ -n "$TOOLCHAIN_CC" ]; then 9.112 + return 0 9.113 + fi 9.114 + printf "detect C compiler... " 9.115 + if [ -n "$CC" ]; then 9.116 + if check_c_compiler "$CC"; then 9.117 + TOOLCHAIN_CC=$CC 9.118 + TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 9.119 + echo "$CC" 9.120 + return 0 9.121 + else 9.122 + echo "$CC is not a working C compiler" 9.123 + return 1 9.124 + fi 9.125 + else 9.126 + for COMP in $C_COMPILERS 9.127 + do 9.128 + if check_c_compiler "$COMP"; then 9.129 + TOOLCHAIN_CC=$COMP 9.130 + TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 9.131 + echo "$COMP" 9.132 + return 0 9.133 + fi 9.134 + done 9.135 + echo "not found" 9.136 + return 1 9.137 + fi 9.138 +} 9.139 + 9.140 +detect_cpp_compiler() 9.141 +{ 9.142 + if [ -n "$TOOLCHAIN_CXX" ]; then 9.143 + return 0 9.144 + fi 9.145 + printf "detect C++ compiler... " 9.146 + 9.147 + if [ -n "$CXX" ]; then 9.148 + if check_cpp_compiler "$CXX"; then 9.149 + TOOLCHAIN_CXX=$CXX 9.150 + TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 9.151 + echo "$CXX" 9.152 + return 0 9.153 + else 9.154 + echo "$CXX is not a working C++ compiler" 9.155 + return 1 9.156 + fi 9.157 + else 9.158 + for COMP in $CPP_COMPILERS 9.159 + do 9.160 + if check_cpp_compiler "$COMP"; then 9.161 + TOOLCHAIN_CXX=$COMP 9.162 + TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 9.163 + echo "$COMP" 9.164 + return 0 9.165 + fi 9.166 + done 9.167 + echo "${TOOLCHAIN_CXX:-"not found"}" 9.168 + return 1 9.169 + fi 9.170 +} 9.171 + 9.172 +write_toolchain_defaults() 9.173 +{ 9.174 + echo "# toolchain" >> "$1" 9.175 + if [ -n "$TOOLCHAIN_CC" ]; then 9.176 + echo "CC = ${TOOLCHAIN_CC}" >> "$1" 9.177 + fi 9.178 + if [ -n "$TOOLCHAIN_CXX" ]; then 9.179 + echo "CXX = ${TOOLCHAIN_CXX}" >> "$1" 9.180 + fi 9.181 + echo >> "$1" 9.182 + if [ -f "make/${TOOLCHAIN_NAME}.mk" ]; then 9.183 + cat "make/${TOOLCHAIN_NAME}.mk" >> "$1" 9.184 + elif [ -f "make/cc.mk" ]; then 9.185 + cat "make/cc.mk" >> "$1" 9.186 + else 9.187 + echo "!!! WARNING !!! Default toolchain flags not found. Configuration might be incomplete." 9.188 + fi 9.189 +}
10.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 10.2 +++ b/make/uwproj.xsd Sun Sep 24 18:43:58 2023 +0200 10.3 @@ -0,0 +1,131 @@ 10.4 +<?xml version="1.0" encoding="UTF-8"?> 10.5 +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 10.6 + xmlns="http://unixwork.de/uwproj" 10.7 + targetNamespace="http://unixwork.de/uwproj" 10.8 + elementFormDefault="qualified" 10.9 + version="0.1" 10.10 +> 10.11 + <xs:element name="project" type="ProjectType"/> 10.12 + 10.13 + <xs:complexType name="ProjectType"> 10.14 + <xs:sequence> 10.15 + <xs:element name="config" type="ConfigType" minOccurs="0"/> 10.16 + <xs:element name="dependency" type="DependencyType" minOccurs="0" maxOccurs="unbounded"/> 10.17 + <xs:element name="target" type="TargetType" minOccurs="0" maxOccurs="unbounded"/> 10.18 + </xs:sequence> 10.19 + </xs:complexType> 10.20 + 10.21 + <xs:complexType name="ConfigType"> 10.22 + <xs:sequence> 10.23 + <xs:element name="var" type="ConfigVarType" minOccurs="0" maxOccurs="unbounded"/> 10.24 + </xs:sequence> 10.25 + </xs:complexType> 10.26 + 10.27 + <xs:complexType name="ConfigVarType"> 10.28 + <xs:simpleContent> 10.29 + <xs:extension base="xs:string"> 10.30 + <xs:attribute name="name" type="xs:string" use="required"/> 10.31 + <xs:attribute name="exec" type="xs:boolean" default="false"/> 10.32 + </xs:extension> 10.33 + </xs:simpleContent> 10.34 + </xs:complexType> 10.35 + 10.36 + <xs:complexType name="PkgConfigType"> 10.37 + <xs:simpleContent> 10.38 + <xs:extension base="xs:string"> 10.39 + <xs:attribute name="atleast" type="xs:string"/> 10.40 + <xs:attribute name="exact" type="xs:string"/> 10.41 + <xs:attribute name="max" type="xs:string"/> 10.42 + </xs:extension> 10.43 + </xs:simpleContent> 10.44 + </xs:complexType> 10.45 + 10.46 + <xs:simpleType name="LangType"> 10.47 + <xs:restriction base="xs:string"> 10.48 + <xs:enumeration value="c"/> 10.49 + <xs:enumeration value="cpp"/> 10.50 + </xs:restriction> 10.51 + </xs:simpleType> 10.52 + 10.53 + <xs:complexType name="DependencyType"> 10.54 + <xs:choice minOccurs="0" maxOccurs="unbounded"> 10.55 + <xs:element name="lang" type="LangType"/> 10.56 + <xs:element name="cflags" type="FlagsType"/> 10.57 + <xs:element name="cxxflags" type="FlagsType"/> 10.58 + <xs:element name="ldflags" type="FlagsType"/> 10.59 + <xs:element name="pkgconfig" type="PkgConfigType"/> 10.60 + <xs:element name="test" type="xs:string"/> 10.61 + <xs:element name="make" type="xs:string"/> 10.62 + </xs:choice> 10.63 + <xs:attribute name="name" type="xs:string"/> 10.64 + <xs:attribute name="platform" type="xs:string"/> 10.65 + <xs:attribute name="not" type="xs:string"/> 10.66 + </xs:complexType> 10.67 + 10.68 + <xs:complexType name="FlagsType"> 10.69 + <xs:simpleContent> 10.70 + <xs:extension base="xs:string"> 10.71 + <xs:attribute name="exec" type="xs:boolean" default="false"/> 10.72 + </xs:extension> 10.73 + </xs:simpleContent> 10.74 + </xs:complexType> 10.75 + 10.76 + <xs:complexType name="TargetType"> 10.77 + <xs:choice minOccurs="0" maxOccurs="unbounded"> 10.78 + <xs:element name="feature" type="FeatureType"/> 10.79 + <xs:element name="option" type="OptionType"/> 10.80 + <xs:element name="define" type="DefineType"/> 10.81 + <xs:element name="dependencies" type="DependenciesType"/> 10.82 + <xs:element name="alldependencies"> 10.83 + <xs:complexType/> 10.84 + </xs:element> 10.85 + </xs:choice> 10.86 + <xs:attribute name="name" type="xs:string"/> 10.87 + </xs:complexType> 10.88 + 10.89 + <xs:complexType name="FeatureType"> 10.90 + <xs:choice minOccurs="0" maxOccurs="unbounded"> 10.91 + <xs:group ref="TargetDataGroup"/> 10.92 + </xs:choice> 10.93 + <xs:attribute name="name" type="xs:string" use="required"/> 10.94 + <xs:attribute name="arg" type="xs:string"/> 10.95 + <xs:attribute name="default" type="xs:boolean" default="false"/> 10.96 + </xs:complexType> 10.97 + 10.98 + <xs:complexType name="OptionType"> 10.99 + <xs:sequence> 10.100 + <xs:element name="value" type="OptionValueType" minOccurs="0" maxOccurs="unbounded"/> 10.101 + <xs:element name="default" type="OptionDefaultType" minOccurs="0" maxOccurs="unbounded"/> 10.102 + </xs:sequence> 10.103 + <xs:attribute name="arg" type="xs:string"/> 10.104 + </xs:complexType> 10.105 + 10.106 + <xs:complexType name="OptionValueType"> 10.107 + <xs:choice minOccurs="0" maxOccurs="unbounded"> 10.108 + <xs:group ref="TargetDataGroup"/> 10.109 + </xs:choice> 10.110 + <xs:attribute name="str" type="xs:string" use="required"/> 10.111 + </xs:complexType> 10.112 + 10.113 + <xs:complexType name="OptionDefaultType"> 10.114 + <xs:attribute name="value" type="xs:string" use="required"/> 10.115 + <xs:attribute name="platform" type="xs:string"/> 10.116 + </xs:complexType> 10.117 + 10.118 + <xs:group name="TargetDataGroup"> 10.119 + <xs:choice> 10.120 + <xs:element name="define" type="DefineType" minOccurs="0" maxOccurs="unbounded"/> 10.121 + <xs:element name="dependencies" type="DependenciesType" minOccurs="0" maxOccurs="unbounded"/> 10.122 + <xs:element name="make" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 10.123 + </xs:choice> 10.124 + </xs:group> 10.125 + 10.126 + <xs:complexType name="DefineType"> 10.127 + <xs:attribute name="name" type="xs:string" use="required"/> 10.128 + <xs:attribute name="value" type="xs:string"/> 10.129 + </xs:complexType> 10.130 + 10.131 + <xs:simpleType name="DependenciesType"> 10.132 + <xs:restriction base="xs:string"/> 10.133 + </xs:simpleType> 10.134 +</xs:schema> 10.135 \ No newline at end of file