Sun, 17 Dec 2023 14:25:34 +0100
[Makefile] fix missing rules preventing dry-runs
We have to support dry-runs, because many IDEs are using
dry-runs to collect build information.
Some rules have dependencies that expect certain files or
directories to be just present. We added respective build
rules which invoke the test program. This way, the behavior
when running make normally is exactly the same, but dry-runs
are also not failing now.
#!/bin/sh PREFIX=/usr EPREFIX=$PREFIX BINDIR= SBINDIR= LIBDIR= LIBEXECDIR= DATADIR= SYSCONFDIR= SHAREDSTATEDIR= LOCALSTATEDIR= INCLUDEDIR= INFODIR= MANDIR= OS=`uname -s` OS_VERSION=`uname -r` TEMP_DIR=".tmp-`uname -n`" mkdir -p "$TEMP_DIR" if [ $? -ne 0 ]; then echo "Cannot create tmp dir" echo "Abort" fi touch "$TEMP_DIR/options" touch "$TEMP_DIR/features" # features # help text printhelp() { echo "Usage: $0 [OPTIONS]..." cat << __EOF__ Installation directories: --prefix=PREFIX path prefix for architecture-independent files [/usr] --exec-prefix=EPREFIX path prefix for architecture-dependent files [PREFIX] --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR system configuration files [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --mandir=DIR man documentation [DATAROOTDIR/man] __EOF__ } # # parse arguments # for ARG in "$@" do case "$ARG" in "--prefix="*) PREFIX=${ARG#--prefix=} ;; "--exec-prefix="*) EPREFIX=${ARG#--exec-prefix=} ;; "--bindir="*) BINDIR=${ARG#----bindir=} ;; "--sbindir="*) SBINDIR=${ARG#--sbindir=} ;; "--libdir="*) LIBDIR=${ARG#--libdir=} ;; "--libexecdir="*) LIBEXECDIR=${ARG#--libexecdir=} ;; "--datadir="*) DATADIR=${ARG#--datadir=} ;; "--sysconfdir="*) SYSCONFDIR=${ARG#--sysconfdir=} ;; "--sharedstatedir="*) SHAREDSTATEDIR=${ARG#--sharedstatedir=} ;; "--localstatedir="*) LOCALSTATEDIR=${ARG#--localstatedir=} ;; "--includedir="*) INCLUDEDIR=${ARG#--includedir=} ;; "--infodir="*) INFODIR=${ARG#--infodir=} ;; "--mandir"*) MANDIR=${ARG#--mandir} ;; "--help"*) printhelp; rm -Rf "$TEMP_DIR"; exit 1 ;; "-"*) echo "unknown option: $ARG"; rm -Rf "$TEMP_DIR"; exit 1 ;; esac done # set dir variables if [ -z "$BINDIR" ]; then BINDIR=$EPREFIX/bin fi if [ -z "$SBINDIR" ]; then SBINDIR=$EPREFIX/sbin fi if [ -z "$LIBDIR" ]; then LIBDIR=$EPREFIX/lib fi if [ -z "$LIBEXEC" ]; then LIBEXECDIR=$EPREFIX/libexec fi if [ -z "$DATADIR" ]; then DATADIR=$PREFIX/share fi if [ -z "$SYSCONFDIR" ]; then SYSCONFDIR=$PREFIX/etc fi if [ -z "$SHAREDSTATEDIR" ]; then SHAREDSTATEDIR=$PREFIX/com fi if [ -z "$LOCALSTATEDIR" ]; then LOCALSTATEDIR=$PREFIX/var fi if [ -z "$INCLUDEDIR" ]; then INCLUDEDIR=$PREFIX/include fi if [ -z "$INFODIR" ]; then INFODIR=$PREFIX/info fi if [ -z "$MANDIR" ]; then MANDIR=$PREFIX/man fi which pkg-config > /dev/null if [ $? -eq 0 ]; then PKG_CONFIG=pkg-config else PKG_CONFIG=false fi # Simple uname based platform detection # $PLATFORM is used for platform dependent dependency selection printf "detect platform... " if [ "$OS" = "SunOS" ]; then PLATFORM="solaris sunos unix svr4" fi if [ "$OS" = "Linux" ]; then PLATFORM="linux unix" fi if [ "$OS" = "FreeBSD" ]; then PLATFORM="freebsd bsd unix" fi if [ "$OS" = "Darwin" ]; then PLATFORM="macos osx bsd unix" fi echo "$OS" | grep -i "MINGW" > /dev/null if [ $? -eq 0 ]; then PLATFORM="windows mingw" fi if [ -z "$PLATFORM" ]; then PLATFORM="unix" fi for p in $PLATFORM do PLATFORM_NAME=$p break done echo $PLATFORM_NAME isplatform() { for p in $PLATFORM do if [ "$p" = "$1" ]; then return 0 fi done return 1 } isnotplatform() { for p in $PLATFORM do if [ "$p" = "$1" ]; then return 1 fi done return 0 } # generate config.mk and config.h cat > "$TEMP_DIR/config.mk" << __EOF__ # # config.mk generated by configure # # general vars PREFIX=$PREFIX EPREFIX=$EPREFIX BINDIR=$BINDIR SBINDIR=$SBINDIR LIBDIR=$LIBDIR LIBEXECDIR=$LIBEXECDIR DATADIR=$DATADIR SYSCONFDIR=$SYSCONFDIR SHAREDSTATEDIR=$SHAREDSTATEDIR LOCALSTATEDIR=$LOCALSTATEDIR INCLUDEDIR=$INCLUDEDIR INFODIR=$INFODIR MANDIR=$MANDIR __EOF__ echo > "$TEMP_DIR/make.mk" ENV_CFLAGS=$CFLAGS ENV_LDFLAGS=$LDFLAGS ENV_CXXFLAGS=$CXXFLAGS # Toolchain detection # this will insert make vars to config.mk . make/toolchain.sh # add user specified flags to config.mk echo "# project specific flags" >> "$TEMP_DIR/config.mk" if [ -n "${ENV_CFLAGS}" ]; then echo "CFLAGS += $ENV_CFLAGS" >> "$TEMP_DIR/config.mk" fi if [ -n "${ENV_CXXFLAGS}" ]; then echo "CXXFLAGS += $ENV_CXXFLAGS" >> "$TEMP_DIR/config.mk" fi if [ -n "${ENV_LDFLAGS}" ]; then echo "LDFLAGS += $ENV_LDFLAGS" >> "$TEMP_DIR/config.mk" fi # # DEPENDENCIES # dependency_curl() { printf "checking for curl... " # dependency curl platform="windows" while true do if isnotplatform "windows"; then break fi TEMP_CFLAGS="$TEMP_CFLAGS -I/mingw/include" TEMP_LDFLAGS="$TEMP_LDFLAGS -lcurl" echo yes return 0 done # dependency curl platform="macos" while true do if isnotplatform "macos"; then break fi curl-config --cflags > /dev/null if [ $? -eq 0 ]; then TEMP_CFLAGS="$TEMP_CFLAGS `curl-config --cflags`" else break fi curl-config --ldflags > /dev/null if [ $? -eq 0 ]; then TEMP_LDFLAGS="$TEMP_LDFLAGS `curl-config --ldflags`" else break fi echo yes return 0 done # dependency curl while true do if [ -z "$PKG_CONFIG" ]; then break fi $PKG_CONFIG libcurl if [ $? -ne 0 ] ; then break fi TEMP_CFLAGS="$TEMP_CFLAGS `$PKG_CONFIG --cflags libcurl`" TEMP_LDFLAGS="$TEMP_LDFLAGS `$PKG_CONFIG --libs libcurl`" echo yes return 0 done # dependency curl while true do curl-config --cflags > /dev/null if [ $? -eq 0 ]; then TEMP_CFLAGS="$TEMP_CFLAGS `curl-config --cflags`" else break fi curl-config --libs > /dev/null if [ $? -eq 0 ]; then TEMP_LDFLAGS="$TEMP_LDFLAGS `curl-config --libs`" else break fi echo yes return 0 done echo no return 1 } dependency_openssl() { printf "checking for openssl... " # dependency openssl platform="windows" while true do if isnotplatform "windows"; then break fi TEMP_LDFLAGS="$TEMP_LDFLAGS -lssl -lcrypto" echo yes return 0 done # dependency openssl platform="macos" while true do if isnotplatform "macos"; then break fi TEMP_LDFLAGS="$TEMP_LDFLAGS -framework CoreFoundation" echo yes return 0 done # dependency openssl platform="bsd" while true do if isnotplatform "bsd"; then break fi if isplatform "macos"; then break fi TEMP_LDFLAGS="$TEMP_LDFLAGS -lssl -lcrypto" echo yes return 0 done # dependency openssl while true do if [ -z "$PKG_CONFIG" ]; then break fi $PKG_CONFIG openssl if [ $? -ne 0 ] ; then break fi TEMP_CFLAGS="$TEMP_CFLAGS `$PKG_CONFIG --cflags openssl`" TEMP_LDFLAGS="$TEMP_LDFLAGS `$PKG_CONFIG --libs openssl`" echo yes return 0 done echo no return 1 } dependency_libxml2() { printf "checking for libxml2... " # dependency libxml2 platform="windows" while true do if isnotplatform "windows"; then break fi xml2-config --cflags > /dev/null if [ $? -eq 0 ]; then TEMP_CFLAGS="$TEMP_CFLAGS `xml2-config --cflags`" else break fi xml2-config --libs > /dev/null if [ $? -eq 0 ]; then TEMP_LDFLAGS="$TEMP_LDFLAGS `xml2-config --libs`" else break fi echo yes return 0 done # dependency libxml2 platform="macos" while true do if isnotplatform "macos"; then break fi xml2-config --cflags > /dev/null if [ $? -eq 0 ]; then TEMP_CFLAGS="$TEMP_CFLAGS `xml2-config --cflags`" else break fi xml2-config --libs > /dev/null if [ $? -eq 0 ]; then TEMP_LDFLAGS="$TEMP_LDFLAGS `xml2-config --libs`" else break fi echo yes return 0 done # dependency libxml2 while true do if [ -z "$PKG_CONFIG" ]; then break fi $PKG_CONFIG libxml-2.0 if [ $? -ne 0 ] ; then break fi TEMP_CFLAGS="$TEMP_CFLAGS `$PKG_CONFIG --cflags libxml-2.0`" TEMP_LDFLAGS="$TEMP_LDFLAGS `$PKG_CONFIG --libs libxml-2.0`" echo yes return 0 done # dependency libxml2 while true do xml2-config --cflags > /dev/null if [ $? -eq 0 ]; then TEMP_CFLAGS="$TEMP_CFLAGS `xml2-config --cflags`" else break fi xml2-config --libs > /dev/null if [ $? -eq 0 ]; then TEMP_LDFLAGS="$TEMP_LDFLAGS `xml2-config --libs`" else break fi echo yes return 0 done echo no return 1 } DEPENDENCIES_FAILED= ERROR=0 # general dependencies TEMP_CFLAGS= TEMP_LDFLAGS= while true do while true do TEMP_LDFLAGS="$TEMP_LDFLAGS -lm -lpthread" break done break done while true do if isnotplatform "bsd"; then break fi if isplatform "macos"; then break fi while true do TEMP_CFLAGS="$TEMP_CFLAGS -I/usr/local/include" TEMP_LDFLAGS="$TEMP_LDFLAGS -L/usr/local/lib" break done break done while true do if isnotplatform "macos"; then break fi while true do cat >> "$TEMP_DIR/make.mk" << __EOF__ OBJ_EXT = .o LIB_EXT = .a __EOF__ break done break done while true do if isnotplatform "unix"; then break fi if isplatform "macos"; then break fi while true do cat >> "$TEMP_DIR/make.mk" << __EOF__ OBJ_EXT = .o LIB_EXT = .a __EOF__ break done break done # add general dependency flags to config.mk echo >> "$TEMP_DIR/config.mk" if [ -n "${TEMP_CFLAGS}" ]; then echo "CFLAGS += $TEMP_CFLAGS" >> $TEMP_DIR/config.mk fi if [ -n "${TEMP_CXXFLAGS}" ]; then echo "CXXFLAGS += $TEMP_CXXFLAGS" >> $TEMP_DIR/config.mk fi if [ -n "${TEMP_LDFLAGS}" ]; then echo "LDFLAGS += $TEMP_LDFLAGS" >> $TEMP_DIR/config.mk fi # # OPTION VALUES # # # TARGETS # TEMP_CFLAGS= TEMP_CXXFLAGS= TEMP_LDFLAGS= # Target: dav TEMP_CFLAGS= TEMP_LDFLAGS= TEMP_CXXFLAGS= dependency_curl if [ $? -ne 0 ]; then DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED curl " ERROR=1 fi dependency_libxml2 if [ $? -ne 0 ]; then DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED libxml2 " ERROR=1 fi dependency_openssl if [ $? -ne 0 ]; then DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED openssl " ERROR=1 fi # Features echo >> "$TEMP_DIR/config.mk" if [ -n "${TEMP_CFLAGS}" ]; then echo "DAV_CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/config.mk" fi if [ -n "${TEMP_CXXFLAGS}" ]; then echo "DAV_CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/config.mk" fi if [ -n "${TEMP_LDFLAGS}" ]; then echo "DAV_LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/config.mk" fi if [ $ERROR -ne 0 ]; then echo echo "Error: Unresolved dependencies" echo "$DEPENDENCIES_FAILED" rm -Rf "$TEMP_DIR" exit 1 fi echo "configure finished" echo echo "Build Config:" echo " PREFIX: $PREFIX" echo " TOOLCHAIN: $TOOLCHAIN_NAME" echo cat "$TEMP_DIR/config.mk" "$TEMP_DIR/make.mk" > config.mk rm -Rf "$TEMP_DIR"