From 092ccd97aabe048cb5730b5799d712332c98a9da Mon Sep 17 00:00:00 2001 From: midipix Date: Apr 25 2021 12:14:41 +0000 Subject: build system: created skeleton. --- diff --git a/COPYING.SOFORT b/COPYING.SOFORT new file mode 100644 index 0000000..71b26c7 --- /dev/null +++ b/COPYING.SOFORT @@ -0,0 +1,80 @@ +/*****************************************************************************/ +/* */ +/* sofort: portable software project skeleton */ +/* */ +/* Copyright (C) 2015--2021 Z. Gilboa */ +/* */ +/* sofort provides a build system that can be incorporated into Works */ +/* which may or may not be covered by a copyleft license. THE FOLLOWING */ +/* LICENSE THEREFORE GOVERNS ONLY THOSE FILES WHICH ARE EXPLICITLY */ +/* LISTED HEREWITHIN. */ +/* */ +/* ./configure */ +/* ./config.usage */ +/* ./Makefile.in */ +/* */ +/* ./sofort/ccenv/ccenv.in */ +/* ./sofort/ccenv/ccenv.sh */ +/* ./sofort/ccenv/ccenv.usage */ +/* ./sofort/ccenv/ccenv.vars */ +/* ./sofort/ccenv/pedefs.in */ +/* ./sofort/cfgtest/cfgtest.sh */ +/* ./sofort/config/cfgdefs.in */ +/* ./sofort/config/config.vars */ +/* ./sofort/config/flag.vars */ +/* ./sofort/config/opt.vars */ +/* ./sofort/core/_flavor/flavor_app_frontend_disabled.mk */ +/* ./sofort/core/_flavor/flavor_app_frontend_enabled.mk */ +/* ./sofort/core/_flavor/flavor_app_linking_all_shared.mk */ +/* ./sofort/core/_flavor/flavor_app_linking_all_static.mk */ +/* ./sofort/core/_flavor/flavor_app_linking_default.mk */ +/* ./sofort/core/_flavor/flavor_install_headers_custom.mk */ +/* ./sofort/core/_flavor/flavor_install_headers_default.mk */ +/* ./sofort/core/_flavor/flavor_shared_library_disabled.mk */ +/* ./sofort/core/_flavor/flavor_shared_library_enabled.mk */ +/* ./sofort/core/_flavor/flavor_static_library_disabled.mk */ +/* ./sofort/core/_flavor/flavor_static_library_enabled.mk */ +/* ./sofort/core/_infer/infer_modern.mk */ +/* ./sofort/core/_infer/infer_posix.mk */ +/* ./sofort/core/_version/_soname/version_soname_copy.mk */ +/* ./sofort/core/_version/_soname/version_soname_symlink.mk */ +/* ./sofort/core/_version/version_none.mk */ +/* ./sofort/core/_version/version_used.mk */ +/* ./sofort/core/defs.mk */ +/* ./sofort/core/flavor.mk */ +/* ./sofort/core/infer.mk */ +/* ./sofort/core/pkgconf.mk */ +/* ./sofort/core/version.mk */ +/* ./sofort/exrules/_pe/pe_mdso_version_none.mk */ +/* ./sofort/exrules/_pe/pe_mdso_version_used.mk */ +/* ./sofort/exrules/_pe/pe_version_none.mk */ +/* ./sofort/exrules/_pe/pe_version_used.mk */ +/* ./sofort/exrules/default.mk */ +/* ./sofort/exrules/pe-common.mk */ +/* ./sofort/exrules/pe-dlltool.mk */ +/* ./sofort/exrules/pe-mdso.mk */ +/* ./sofort/exrules/pe-version.mk */ +/* ./sofort/tools/pkgconf.sh */ +/* ./sofort/tools/srctree.sh */ +/* ./sofort/tools/version.sh */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be included */ +/* in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS */ +/* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/* */ +/*****************************************************************************/ diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..49ee097 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,346 @@ +# Makefile.in: primary common build logic. +# this file is covered by COPYING.SOFORT. + +.POSIX: + +.SUFFIXES: .a .c .s .o .lo .ao + +PACKAGE = @package@ +NICKNAME = @nickname@ +PROJECT_DIR = @project_dir@ +SOURCE_DIR = @source_dir@ +GIT_REFERENCE_INDEX = @git_reference_index@ +CUSTOM_INSTALL_HEADERS = @custom_install_headers@ +AVOID_VERSION = @avoid_version@ + +PKGNAME = @pkgname@ +PKGDESC = @pkgdesc@ +PKGUSRC = @pkgusrc@ +PKGREPO = @pkgrepo@ +PKGPSRC = @pkgpsrc@ +PKGDURL = @pkgdurl@ +PKGBUGS = @pkgbugs@ +PKGHOME = @pkghome@ +PKGDEFS = @pkgdefs@ +PKGLIBS = @pkglibs@ + +SRCINFO = @srcinfo@ +SRCSITE = @srcsite@ + +PGPRKEY = @pgprkey@ +PGPSKEY = @pgpskey@ + +RAWBALL = @rawball@ +RAWBALL_URL = @rawball_url@ +RAWBALL_SHA256 = @rawball_sha256@ +MODBALL = @modball@ +MODBALL_URL = @modball_url@ +MODBALL_SHA256 = @modball_sha256@ +SRCBALL = @srcball@ +SRCBALL_URL = @srcball_url@ +SRCBALL_SHA256 = @srcball_sha256@ + +MAKE = @make@ +MAKEMODE = @makemode@ + +BUILD = @build@ +HOST = @host@ +CCHOST = @cchost@ +CFGHOST = @cfghost@ +TARGET = @target@ +ARCH = @arch@ +COMPILER = @compiler@ +TOOLCHAIN = @toolchain@ +SYSROOT = @sysroot@ +CROSS_COMPILE = @cross_compile@ +SHELL = @shell@ + +PREFIX = @prefix@ +EXEC_PREFIX = @exec_prefix@ +BINDIR = @bindir@ +SBINDIR = @sbindir@ +LIBDIR = @libdir@ +INCLUDEDIR = @includedir@ +OLDINCLUDEDIR = @oldincludedir@ +MANDIR = @mandir@ +DOCDIR = @docdir@ +LIBEXECDIR = @libexecdir@ + +SYSCONFDIR = @sysconfdir@ +SHAREDSTATEDIR = @sharedstatedir@ +LOCALSTATEDIR = @localstatedir@ +RUNSTATEDIR = @runstatedir@ +DATAROOTDIR = @datarootdir@ +DATADIR = @datadir@ +INFODIR = @infodir@ +LOCALEDIR = @localedir@ +HTMLDIR = @htmldir@ +DVIDIR = @dvidir@ +PDFDIR = @pdfdir@ +PSDIR = @psdir@ + +CFLAGS_COMMON += @cflags_common@ +CFLAGS_DEBUG += @cflags_debug@ +CFLAGS_CMDLINE += @cflags_cmdline@ +CFLAGS_CONFIG += @cflags_config@ +CFLAGS_SYSROOT += @cflags_sysroot@ +CFLAGS_OS += @cflags_os@ +CFLAGS_SITE += @cflags_site@ +CFLAGS_PATH += @cflags_path@ +CFLAGS_STRICT += @cflags_strict@ +CFLAGS_UTIL += @cflags_util@ +CFLAGS_LAST += @cflags_last@ +CFLAGS_ONCE += @cflags_once@ + +LDFLAGS_COMMON += @ldflags_common@ +LDFLAGS_DEBUG += @ldflags_debug@ +LDFLAGS_CMDLINE += @ldflags_cmdline@ +LDFLAGS_CONFIG += @ldflags_config@ +LDFLAGS_SYSROOT += @ldflags_sysroot@ +LDFLAGS_PATH += @ldflags_path@ +LDFLAGS_STRICT += @ldflags_strict@ +LDFLAGS_UTIL += @ldflags_util@ +LDFLAGS_LAST += @ldflags_last@ +LDFLAGS_ONCE += @ldflags_once@ + +USER_CC = @user_cc@ +USER_CPP = @user_cpp@ +USER_CXX = @user_cxx@ + +NATIVE_HOST = @native_host@ +NATIVE_CFGHOST = @native_cfghost@ +NATIVE_CFLAGS = @native_cflags@ +NATIVE_LDFLAGS = @native_ldflags@ + +ALL_SHARED = @all_shared@ +ALL_STATIC = @all_static@ +DISABLE_FRONTEND = @disable_frontend@ +DISABLE_SHARED = @disable_shared@ +DISABLE_STATIC = @disable_static@ + +USE_CUSTOM_CFGDEFS = @use_custom_cfgdefs@ +USE_CUSTOM_USRDEFS = @use_custom_usrdefs@ + +SHARED_LIB_CMD = @shared_lib_cmd@ +SHARED_LIB_LDFLAGS = @shared_lib_ldflags@ + +VERSION_OPT = @version_opt@ + +SHARED_LIBRARY_OPT = @shared_library_opt@ +STATIC_LIBRARY_OPT = @static_library_opt@ + +APP_FRONTEND_OPT = @app_frontend_opt@ +APP_LINKING_OPT = @app_linking_opt@ + +INSTALL_HEADERS_OPT = @install_headers_opt@ + + +all: +install: +shared: +static: + +install-extras: +install-app-extras: + +.cflags-host: + @true : $(CFLAGS) + +.cflags-native: + @true : $(NATIVE_CFLAGS) + + +include ./ccenv/host.mk +include ./ccenv/native.mk + +include ./cfgdefs.mk +include ./usrdefs.mk + +include $(PROJECT_DIR)/sofort/core/defs.mk +include $(PROJECT_DIR)/sofort/core/pkgconf.mk +include $(PROJECT_DIR)/sofort/core/version.mk +include $(PROJECT_DIR)/sofort/core/flavor.mk +include $(PROJECT_DIR)/sofort/core/infer.mk + +include $(PROJECT_DIR)/project/osforce.mk +include $(PROJECT_DIR)/project/tree.mk +include $(PROJECT_DIR)/project/depends.mk +include $(PROJECT_DIR)/project/headers.mk +include $(PROJECT_DIR)/project/common.mk +include $(PROJECT_DIR)/project/arch.mk +include $(PROJECT_DIR)/project/extras.mk +include $(PROJECT_DIR)/project/overrides.mk + + +all: package-shared package-static app + +install: package-install-app +install: package-install-extras +install: install-libs + +app: app-tag + +app.tag: + cp $(PACKAGE_APP) $(APP) + touch app.tag + +install-libs: package-install-shared +install-libs: package-install-static + +install-headers-default: + mkdir -p $(DESTDIR)$(INCLUDEDIR)/$(PACKAGE) + cp $(API_HEADERS) $(DESTDIR)$(INCLUDEDIR)/$(PACKAGE) + +install-shared: shared install-lib install-implib +install-shared: package-install-soname package-install-solink +install-shared: install-headers + +install-lib: shared + mkdir -p $(DESTDIR)$(LIBDIR) + cp $(SHARED_LIB) $(DESTDIR)$(LIBDIR) + +install-static: static install-headers + mkdir -p $(DESTDIR)$(LIBDIR) + cp $(STATIC_LIB) $(DESTDIR)$(LIBDIR) + +install-app: app install-app-extras + mkdir -p $(DESTDIR)$(BINDIR) + cp $(APP) $(DESTDIR)$(BINDIR) + +install-static-app: static-app install-app-extras + mkdir -p $(DESTDIR)$(BINDIR) + cp $(STATIC_APP) $(DESTDIR)$(BINDIR)/$(NICKNAME)$(OS_APP_SUFFIX) + + + +shared: shared-lib implib +shared: package-shared-soname package-shared-solink + +static: static-lib + +shared-lib: shared-objs $(SHARED_LIB) + +shared-soname: shared-lib $(SHARED_SONAME) + +shared-solink: shared-lib $(SHARED_SOLINK) + +static-lib: static-objs $(STATIC_LIB) + + + +default-app: version.tag static-objs $(DEFAULT_APP) + +shared-app: version.tag shared $(SHARED_APP) + +static-app: version.tag static-objs $(STATIC_APP) + + + +shared-objs: dirs $(SHARED_OBJS) + +static-objs: dirs $(STATIC_OBJS) + +app-objs: dirs $(APP_OBJS) + + + +$(APP_SRCS): srcs.tag + +$(COMMON_SRCS): srcs.tag + +$(APP_OBJS): $(ALL_HEADERS) host.tag tree.tag + +$(SHARED_OBJS): $(ALL_HEADERS) host.tag tree.tag + +$(STATIC_OBJS): $(ALL_HEADERS) host.tag tree.tag + + +$(SHARED_LIB): $(SHARED_OBJS) + +$(STATIC_LIB): $(STATIC_OBJS) + +$(APP): $(PACKAGE_APP) + +$(DEFAULT_APP): $(STATIC_OBJS) $(APP_OBJS) + rm -f app.tag + $(CC) -o $@ $(STATIC_OBJS) $(APP_OBJS) $(LDFLAGS_APP) + +$(SHARED_APP): $(DSO_REF_SOLINK) $(APP_OBJS) $(SHARED_SOLINK) + rm -f app.tag + $(CC) -o $@ $(APP_OBJS) $(LDFLAGS_APP) -l$(PACKAGE) + +$(STATIC_APP): $(STATIC_OBJS) $(APP_OBJS) + rm -f app.tag + $(CC) -static -o $@ $(STATIC_OBJS) $(APP_OBJS) $(LDFLAGS_STATIC) + + +dirs: dirs.tag + +dirs.tag: + mkdir -p build + mkdir -p bin + mkdir -p lib + touch dirs.tag + +host.tag: Makefile + $(CC) $(CFLAGS) -dumpmachine > host.tmp + mv host.tmp host.tag + +version.tag: $(GIT_REFERENCE_INDEX) dirs.tag + $(PROJECT_DIR)/sofort/tools/version.sh \ + -s $(SOURCE_DIR) \ + -o build/$(PACKAGE)_version.h \ + -p $(PACKAGE) + touch version.tag + +distclean: clean + rm -f ccenv/host.mk + rm -f ccenv/native.mk + rm -f cfgdefs.mk + rm -f usrdefs.mk + rm -f config.log + rm -f Makefile + rmdir build ccenv bin lib 2>&1 || true + +clean: clean-implib + rm -f tree.tag + rm -f srcs.tag + rm -f dirs.tag + rm -f host.tag + rm -f host.tmp + rm -f version.tag + rm -f app.tag + rm -f $(SHARED_OBJS) + rm -f $(STATIC_OBJS) + rm -f $(APP_OBJS) + rm -f $(SHARED_LIB) + rm -f $(SHARED_SONAME) + rm -f $(SHARED_SOLINK) + rm -f $(STATIC_LIB) + rm -f $(APP) + rm -f $(DEFAULT_APP) + rm -f $(SHARED_APP) + rm -f $(STATIC_APP) + rm -f build/$(PACKAGE)_version.h + rm -f build/$(PACKAGE).pc + + +.PHONY: package-app \ + all install shared static app \ + shared-objs shared-lib \ + shared-soname shared-solink \ + package-shared-soname package-shared-solink \ + static-objs static-lib \ + default-app shared-app static-app \ + install-shared install-static \ + install-soname install-solink \ + package-install-soname package-install-solink \ + install-headers install-app \ + install-headers-default install-headers-custom \ + clean distclean clean-implib version \ + .display .conf \ + .display-project .display-env .display-tools .display-flags \ + .display-pe .display-dirs .display-build \ + implib implib-ver implib-soname implib-solink \ + install-implib install-implib-ver \ + install-implib-soname install-implib-solink diff --git a/config.usage b/config.usage new file mode 100644 index 0000000..98c36a6 --- /dev/null +++ b/config.usage @@ -0,0 +1,185 @@ +configure: common usage + +supported switches: +------------------- + --help + + --nickname + --program-prefix + --avoid-version + --source-dir + --srcdir + + --pkgname + --pkgdesc + --pkgusrc + --pkgrepo + --pkgpsrc + --pkgdurl + --pkgdefs + --pkglibs + + --srcinfo + --srcsite + + --pgprkey + --pgpskey + + --rawball + --rawball-url + --rawball-sha256 + --modball + --modball-url + --modball-sha256 + --srcball + --srcball-url + --srcball-sha256 + + --prefix + --exec-prefix + --bindir + --sbindir + --libdir + --includedir + --oldincludedir + --mandir + --docdir + --libexecdir + + --sysconfdir + --sharedstatedir + --localstatedir + --runstatedir + --datarootdir + --datadir + --infodir + --localedir + --htmldir + --dvidir + --pdfdir + --psdir + + --make + --makemode + + --build + --host + --cchost + --cfghost + --target + --arch + --compiler + --toolchain + --sysroot + --cross-compile + --shell + --debug + + --strict + --ccstrict + --ldstrict + + --all-static + --all-shared + --enable-static + --enable-shared + --disable-static + --disable-shared + + --enable-app + --enable-frontend + --disable-app + --disable-frontend + + --enable-dependency-tracking + --disable-dependency-tracking + + +supported variables: +-------------------- + NICKNAME + SOURCE_DIR + + PREFIX + EXEC_PREFIX + BINDIR + SBINDIR + LIBDIR + INCLUDEDIR + MANDIR + DOCDIR + LIBEXECDIR + + SYSCONFDIR + SHAREDSTATEDIR + LOCALSTATEDIR + RUNSTATEDIR + DATAROOTDIR + DATADIR + INFODIR + LOCALEDIR + HTMLDIR + DVIDIR + PDFDIR + PSDIR + + CC + CPP + CXX + + MAKE + MAKEMODE + + BUILD + HOST + CCHOST + CFGHOST + TARGET + ARCH + COMPILER + TOOLCHAIN + SYSROOT + CROSS_COMPILE + SHELL + + CFLAGS + CFLAGS_DEBUG + CFLAGS_COMMON + CFLAGS_CMDLINE + CFLAGS_CONFIG + CFLAGS_SYSROOT + CFLAGS_OS + CFLAGS_SITE + CFLAGS_PATH + CFLAGS_STRICT + CFLAGS_UTIL + CFLAGS_LAST + CFLAGS_ONCE + + LDFLAGS + LDFLAGS_DEBUG + LDFLAGS_COMMON + LDFLAGS_CMDLINE + LDFLAGS_CONFIG + LDFLAGS_SYSROOT + LDFLAGS_PATH + LDFLAGS_STRICT + LDFLAGS_UTIL + LDFLAGS_LAST + LDFLAGS_ONCE + + PE_SUBSYSTEM + PE_IMAGE_BASE + + NATIVE_CC + NATIVE_CPP + NATIVE_CXX + + NATIVE_HOST + NATIVE_CFGHOST + NATIVE_CFLAGS + NATIVE_LDFLAGS + + NATIVE_OS + NATIVE_OS_BITS + NATIVE_OS_UNDERSCORE diff --git a/configure b/configure new file mode 100755 index 0000000..4712b13 --- /dev/null +++ b/configure @@ -0,0 +1,1271 @@ +#!/bin/sh + +# project-agnostic ./configure script, written by hand. +# this file is covered by COPYING.SOFORT. + +set -eu + +trap config_failure 1 2 EXIT + +# before we begin... +mb_path="$PATH" +mb_script="$0" +mb_success=no + +usage() +{ + cat "$mb_project_dir"/config.usage + + if [ _$mb_use_custom_cfgdefs = _yes ]; then + printf '\n\n%s%s\n' \ + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" \ + "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" + + printf '%s%s\n' \ + "| Listed above are configure's common switches " \ + "and environment variables. |" + + printf '%s%s\n' \ + "| Found below are project-specific variables " \ + "and other customization options. |" + + printf '%s%s\n\n\n' \ + " ___________________________________________" \ + "__________________________________" + + cat "$mb_project_dir"/project/config/cfgdefs.usage + fi + + exit 0 +} + +error_msg() +{ + printf '%s\n' "$@" >&2 +} + +warning_msg() +{ + printf '%s\n' "$@" >&2 +} + +output_step_prolog() +{ + mb_line_dots='.................................' + mb_line_dots="${mb_line_dots}.${mb_line_dots}" + mb_step_desc="${mb_package} : ${1##*/} : ${2}() " + mb_step_dlen="$((${#mb_line_dots} - ${#mb_step_desc}))" + + printf "configure step: ${2}()\n" >&3 + printf "%s%${mb_step_dlen}.${mb_step_dlen}s " "${mb_step_desc}" "${mb_line_dots}" +} + +output_step_epilog() +{ + printf 'OK.\n' +} + +output_script_status() +{ + mb_step_name="${1##*/} : ${2}" + mb_step_desc="${mb_package} : ${mb_step_name}" + + printf "configure info: ${2}\n" >&3 + printf "%s\n" "${mb_step_desc}" +} + +output_section_break() +{ + printf ' ..\n' +} + +verify_safe_path() +{ + case "$mb_safe_path_name" in + -*) + error_msg "$mb_safe_path_desc may not begin with a hyphen." + exit 2 + ;; + + *\ *) + error_msg "$mb_safe_path_desc may not contain spaces." + exit 2 + ;; + esac +} + +init_log() +{ + exec 3> config.log + + printf "This is config.log, generated by sofort's configure script.\n\n" >&3 + printf '$ %s' "$mb_script" >&3 +} + +init_vars() +{ + mb_project_dir=$(cd -- "${mb_script%/*}/" ; pwd -P) + mb_pwd=$(pwd -P) + + mb_safe_path_desc='project directory' + mb_safe_path_name="$mb_project_dir" + verify_safe_path + + mb_safe_path_desc='working directory' + mb_safe_path_name="$mb_pwd" + verify_safe_path + + mb_custom_cfgdefs_args='' + mb_custom_cfgdefs_space='' + + mb_srcinfo='$(PROJECT_DIR)/project/srcdist/srcinfo.in' + mb_srcsite='localhost' + + mb_pgprkey='!!VARIABLE_NOT_SET!!' + mb_pgpskey='!!VARIABLE_NOT_SET!!' + + sfrt_impl_dir=$mb_project_dir/sofort + sfrt_config_dir=$sfrt_impl_dir/config + sfrt_core_dir=$sfrt_impl_dir/core + sfrt_config_vars=$sfrt_config_dir/config.vars + sfrt_flag_vars=$sfrt_config_dir/flag.vars + sfrt_opt_vars=$sfrt_config_dir/opt.vars + sfrt_cfgdefs_in=$sfrt_config_dir/cfgdefs.in + + mb_make_vars=$(< "$sfrt_config_vars" \ + grep -v -e '^#' -e '^$' | tr '[:lower:]' '[:upper:]') + + mb_impl_vars=$(< "$sfrt_config_vars" \ + grep -v -e '^#' -e '^$' | sed 's/^/mb_/g') + + mb_proj_vars=$(< "$sfrt_config_vars" \ + grep -v -e '^#' -e '^$' | sed 's/^/mb_default_/g') + + mb_flag_vars=$(< "$sfrt_flag_vars" \ + grep -v -e '^#' -e '^$') + + mb_vars="$mb_make_vars $mb_impl_vars $mb_proj_vars $mb_flag_vars" + + for mb_var in $(printf '%s' "$mb_vars") ; do + mb_expr=$mb_var='${'$mb_var':-}' + eval "$mb_expr" + done + + # ccenv + . $mb_project_dir/sofort/ccenv/ccenv.sh + + if ! [ -L ./ccenv ]; then + if [ -d ./ccenv ]; then + rm -f ./ccenv/host.mk + rm -f ./ccenv/native.mk + rmdir ./ccenv + fi + fi + + # config.project + if [ -z "$mb_config" ]; then + mb_config="$mb_project_dir/config.project" + fi + + . "$mb_config" + + # config.project make preferences + if [ -z "${MAKE}" ]; then + MAKE="$mb_make" + fi + + if [ -z "${MAKEMODE}" ]; then + MAKEMODE="$mb_makemode" + fi + + # project-specific initialization + if [ _$mb_use_custom_cfginit = _yes ]; then + . "$mb_project_dir/project/config/cfginit.sh" + fi + + # package + if [ -z "$mb_package" ]; then + error_msg "$mb_script: incomplete information in $mb_config." + error_msg "$mb_script: \$mb_package not set." + exit 1 + fi + + if [ -z "${NICKNAME}" ]; then + NICKNAME="$mb_nickname" + fi + + # srcinfo + if [ -n "$SOURCE_DIR" ]; then + mb_source_dir_set=yes + fi + + # step prolog + output_step_prolog ${mb_script} 'init_vars' + + # project + mb_nickname=$NICKNAME + mb_source_dir=$SOURCE_DIR + + # dirs + mb_prefix=$PREFIX + mb_exec_prefix=$EXEC_PREFIX + mb_bindir=$BINDIR + mb_sbindir=$SBINDIR + mb_libdir=$LIBDIR + mb_includedir=$INCLUDEDIR + mb_oldincludedir=$OLDINCLUDEDIR + mb_mandir=$MANDIR + mb_docdir=$DOCDIR + mb_libexecdir=$LIBEXECDIR + + mb_sysconfdir=$SYSCONFDIR + mb_sharedstatedir=$SHAREDSTATEDIR + mb_localstatedir=$LOCALSTATEDIR + mb_runstatedir=$RUNSTATEDIR + mb_datarootdir=$DATAROOTDIR + mb_datadir=$DATADIR + mb_infodir=$INFODIR + mb_localedir=$LOCALEDIR + mb_htmldir=$HTMLDIR + mb_dvidir=$DVIDIR + mb_pdfdir=$PDFDIR + mb_psdir=$PSDIR + + # make + mb_make=$MAKE + mb_makemode=$MAKEMODE + + # build + mb_build=$BUILD + mb_cchost=$CCHOST + mb_cfghost=$CFGHOST + mb_arch=$ARCH + mb_compiler=$COMPILER + mb_toolchain=$TOOLCHAIN + mb_sysroot=$SYSROOT + mb_cross_compile=$CROSS_COMPILE + mb_shell=$SHELL + + # switches + mb_cflags=$CFLAGS + mb_cflags_debug=$CFLAGS_DEBUG + mb_cflags_common=$CFLAGS_COMMON + mb_cflags_cmdline=$CFLAGS_CMDLINE + mb_cflags_config=$CFLAGS_CONFIG + mb_cflags_sysroot=$CFLAGS_SYSROOT + mb_cflags_os=$CFLAGS_OS + mb_cflags_site=$CFLAGS_SITE + mb_cflags_path=$CFLAGS_PATH + mb_cflags_strict=$CFLAGS_STRICT + mb_cflags_util=$CFLAGS_UTIL + mb_cflags_last=$CFLAGS_LAST + mb_cflags_once=$CFLAGS_ONCE + + mb_ldflags=$LDFLAGS + mb_ldflags_debug=$LDFLAGS_DEBUG + mb_ldflags_common=$LDFLAGS_COMMON + mb_ldflags_cmdline=$LDFLAGS_CMDLINE + mb_ldflags_config=$LDFLAGS_CONFIG + mb_ldflags_sysroot=$LDFLAGS_SYSROOT + mb_ldflags_path=$LDFLAGS_PATH + mb_ldflags_strict=$LDFLAGS_STRICT + mb_ldflags_util=$LDFLAGS_UTIL + mb_ldflags_last=$LDFLAGS_LAST + mb_ldflags_once=$LDFLAGS_ONCE + + mb_pe_subsystem=$PE_SUBSYSTEM + mb_pe_image_base=$PE_IMAGE_BASE + + # overrides + mb_user_cc=$CC + mb_user_cpp=$CPP + mb_user_cxx=$CXX + + mb_native_cc=$NATIVE_CC + mb_native_cpp=$NATIVE_CPP + mb_native_cxx=$NATIVE_CXX + + mb_native_host=$NATIVE_HOST + mb_native_cfghost=$NATIVE_CFGHOST + mb_native_cflags=$NATIVE_CFLAGS + mb_native_ldflags=$NATIVE_LDFLAGS + + mb_native_pe_subsystem=$NATIVE_PE_SUBSYSTEM + mb_native_pe_image_base=$NATIVE_PE_IMAGE_BASE + + # step epilog + output_step_epilog +} + + +verify_build_directory() +{ + output_step_prolog ${mb_script} 'verify_build_directory' + + if [ "$mb_project_dir" = "$mb_pwd" ]; then + if [ _$mb_require_out_of_tree = _yes ]; then + error_msg "$mb_package: out-of-tree builds are required." + error_msg "please invoke configure again from a clean build directory." + exit 1 + else + mb_project_dir='.' + fi + fi + + rm -f Makefile Makefile.host Makefile.tmp Makefile.failed + + output_step_epilog +} + + +verify_source_directory() +{ + output_step_prolog ${mb_script} 'verify_source_directory' + + if [ _"$mb_source_dir" != _${mb_source_dir##* } ]; then + error_msg "source directory path contains spaces, aborting." + exit 1 + fi + + eval mb_source_dir=$(printf '%s' "$mb_source_dir") + + if [ -z "$mb_source_dir" ]; then + if [ _$mb_require_source_dir = _yes ]; then + error_msg "$mb_package: specifying an external source directory is required." + error_msg "you can set the source directory either via --source-dir=," + error_msg "or by setting the SOURCE_DIR variable." + exit 1 + fi + fi + + output_step_epilog +} + + +verify_source_info() +{ + output_step_prolog ${mb_script} 'verify_source_info' + + if [ "${mb_source_dir_set:-}" = yes ]; then + if [ -n "$mb_rawball" ] || [ -n "$mb_modball" ] || [ -n "$mb_srcball" ]; then + error_msg "$mb_package: conflicting arguments: --rawball/--modball/--srcball arguments" + error_msg "may not be used together with an explicit source-dir argument or variable." + exit 1 + fi + fi + + if [ -n "$mb_srcball" ]; then + eval mb_srcball=$(printf '%s' "$mb_srcball") + + if [ -n "$mb_rawball" ] || [ -n "$mb_modball" ]; then + error_msg "$mb_package: conflicting arguments: --rawball and/or --modball arguments" + error_msg "may not be used together with an explicitly --srcball argument." + exit 1 + fi + + if [ -z "$mb_srcball_sha256" ]; then + error_msg "$mb_package: --srcball-sha256 must be provided" + error_msg "in conjunction with --srcball." + exit 1 + fi + + mb_srcball_sha256_test=$(sha256sum "$mb_srcball") + mb_srcball_sha256_test="${mb_srcball_sha256_test%% *}" + + if [ "$mb_srcball_sha256_test" != "$mb_srcball_sha256" ]; then + error_msg "$mb_package: sha256 signature of srcball $mb_srcball does not match!" + exit 1 + fi + + mb_srcball_topdir=$(xz -c -d "$mb_srcball" | pax | sed -n '1,1p') + mb_source_dir="./srctree/$mb_package/${mb_srcball_topdir%/}" + + mb_srcball_dirname=$(cd -- "${mb_srcball%/*}" ; pwd -P) + mb_srcball_basename=${mb_srcball##*/} + mb_srcball="$mb_srcball_dirname/$mb_srcball_basename" + + mkdir -p "./srctree/$mb_package" + mb_dummy=$(cd -- "./srctree/$mb_package"; xz -c -d "$mb_srcball" | pax -r) + mb_source_dir=$(cd -- $mb_source_dir; pwd -P) + fi + + if [ -z "$mb_rawball" ] && [ -n "$mb_modball" ]; then + error_msg "$mb_package: conflicting arguments: --modball argument may only be used" + error_msg "together with an explicit --rawball argument." + exit 1 + fi + + if [ -n "$mb_modball" ]; then + eval mb_modball=$(printf '%s' "$mb_modball") + + if [ -z "$mb_modball_sha256" ]; then + error_msg "$mb_package: --modball-sha256 must be provided" + error_msg "in conjunction with --modball." + exit 1 + fi + + mb_modball_sha256_test=$(sha256sum "$mb_modball") + mb_modball_sha256_test="${mb_modball_sha256_test%% *}" + + if [ "$mb_modball_sha256_test" != "$mb_modball_sha256" ]; then + error_msg "$mb_package: sha256 signature of modball $mb_modball does not match!" + exit 1 + fi + fi + + if [ -n "$mb_rawball" ]; then + eval mb_rawball=$(printf '%s' "$mb_rawball") + + if [ -z "$mb_rawball_sha256" ]; then + error_msg "$mb_package: --rawball-sha256 must be provided." + error_msg "in conjunction with --rawball." + exit 1 + fi + + mb_rawball_sha256_test=$(sha256sum "$mb_rawball") + mb_rawball_sha256_test="${mb_rawball_sha256_test%% *}" + + if [ "$mb_rawball_sha256_test" != "$mb_rawball_sha256" ]; then + error_msg "$mb_package: sha256 signature of rawball $mb_rawball does not match!" + exit 1 + fi + + mb_rawball_topdir=$(xz -c -d "$mb_rawball" | pax | sed -n '1,1p') + mb_source_dir="./srctree/$mb_package/${mb_rawball_topdir%/}" + + mb_rawball_dirname=$(cd -- "${mb_rawball%/*}" ; pwd -P) + mb_rawball_basename=${mb_rawball##*/} + mb_rawball="$mb_rawball_dirname/$mb_rawball_basename" + + mkdir -p "./srctree/$mb_package" + mb_dummy=$(cd -- "./srctree/$mb_package"; xz -c -d "$mb_rawball" | pax -r) + mb_source_dir=$(cd -- $mb_source_dir; pwd -P) + fi + + if [ -n "$mb_modball" ]; then + mb_modball_dirname=$(cd -- "${mb_modball%/*}" ; pwd -P) + mb_modball_basename=${mb_modball##*/} + mb_modball="$mb_modball_dirname/$mb_modball_basename" + + mb_modball_topdir="./modtree/$mb_package/$mb_modball_sha256" + mkdir -p "$mb_modball_topdir" + mb_modball_topdir=$(cd -- $mb_modball_topdir; pwd -P) + mb_dummy=$(cd -- "$mb_modball_topdir"; xz -c -d "$mb_modball" | pax -r) + + if [ -d "$mb_modball_topdir/overlay" ]; then + mb_dummy=$(cd -- "$mb_modball_topdir/overlay"; \ + cp -p -P -R . "$mb_source_dir") + fi + + if [ -d "$mb_modball_topdir/patches" ]; then + mb_dummy=$(cd -- "$mb_source_dir"; \ + for p in $mb_modball_topdir/patches/*.patch; do \ + patch -p1 < $p; \ + done); + fi + fi + + output_step_epilog +} + + +common_defaults() +{ + # step prolog + output_step_prolog ${mb_script} 'common_defaults' + + # project-specific config definitions + if [ _$mb_use_custom_cfgdefs = _yes ]; then + cat $sfrt_cfgdefs_in > cfgdefs.mk + else + printf '%s %s\n\n' \ + '# this project does not include' \ + 'a custom config step.' \ + > cfgdefs.mk + cat $sfrt_cfgdefs_in >> cfgdefs.mk + + if [ -f $mb_project_dir/project/cfgdefs.in ]; then + cat $mb_project_dir/project/cfgdefs.in >> cfgdefs.mk + fi + fi + + # user build-time overrides + touch usrdefs.mk + + # git + if [ -n "$mb_source_dir" ]; then + if [ -d "$mb_source_dir/.git" ]; then + mb_git_reference_index="\$(SOURCE_DIR)/.git/index" + fi + elif [ -d "$mb_project_dir/.git" ]; then + mb_git_reference_index="\$(PROJECT_DIR)/.git/index" + fi + + # project + [ -n "$mb_nickname" ] || mb_nickname=$mb_package + [ -n "$mb_source_dir" ] || mb_source_dir=$mb_project_dir + [ -n "$mb_avoid_version" ] || mb_avoid_version='no' + + # pkgconfig + [ -n "$mb_pkgname" ] || mb_pkgname="$mb_default_pkgname" + [ -n "$mb_pkgdesc" ] || mb_pkgdesc="$mb_default_pkgdesc" + [ -n "$mb_pkgusrc" ] || mb_pkgusrc="$mb_default_pkgusrc" + [ -n "$mb_pkgrepo" ] || mb_pkgrepo="$mb_default_pkgrepo" + [ -n "$mb_pkgpsrc" ] || mb_pkgpsrc="$mb_default_pkgpsrc" + [ -n "$mb_pkgdurl" ] || mb_pkgdurl="$mb_default_pkgdurl" + [ -n "$mb_pkgbugs" ] || mb_pkgbugs="$mb_default_pkgbugs" + [ -n "$mb_pkghome" ] || mb_pkghome="$mb_default_pkghome" + [ -n "$mb_pkgdefs" ] || mb_pkgdefs="$mb_default_pkgdefs" + [ -n "$mb_pkglibs" ] || mb_pkglibs="$mb_default_pkglibs" + + # srcinfo + [ -n "$mb_rawball" ] || mb_rawball="$mb_default_rawball" + [ -n "$mb_rawball_url" ] || mb_rawball_url="$mb_default_rawball_url" + [ -n "$mb_rawball_sha256" ] || mb_rawball_sha256="$mb_default_rawball_sha256" + [ -n "$mb_modball" ] || mb_modball="$mb_default_modball" + [ -n "$mb_modball_url" ] || mb_modball_url="$mb_default_modball_url" + [ -n "$mb_modball_sha256" ] || mb_modball_sha256="$mb_default_modball_sha256" + [ -n "$mb_srcball" ] || mb_srcball="$mb_default_srcball" + [ -n "$mb_srcball_url" ] || mb_srcball_url="$mb_default_srcball_url" + [ -n "$mb_srcball_sha256" ] || mb_srcball_sha256="$mb_default_srcball_sha256" + + # dirs + [ -n "$mb_prefix" ] || [ -n "$mb_prefix_set" ] \ + || mb_prefix='/usr/local' + + [ -n "$mb_exec_prefix" ] || [ -n "$mb_exec_prefix_set" ] \ + || mb_exec_prefix=$mb_prefix + + [ -n "$mb_bindir" ] || [ -n "$mb_bindir_set" ] \ + || [ -n "$mb_bindir_basename" ] \ + || mb_bindir=$mb_exec_prefix/bin + + [ -n "$mb_bindir" ] || [ -n "$mb_bindir_set" ] \ + || mb_bindir=$mb_exec_prefix/$mb_bindir_basename + + [ -n "$mb_sbindir" ] || mb_sbindir=$mb_exec_prefix/sbin + [ -n "$mb_libdir" ] || mb_libdir=$mb_exec_prefix/lib + [ -n "$mb_includedir" ] || mb_includedir=$mb_prefix/include + [ -n "$mb_oldincludedir" ] || mb_oldincludedir=$mb_prefix/include + [ -n "$mb_datarootdir" ] || mb_datarootdir=$mb_prefix/share + [ -n "$mb_mandir" ] || mb_mandir=$mb_datarootdir/man + [ -n "$mb_docdir" ] || mb_docdir=$mb_datarootdir/doc/'$(PACKAGE)' + [ -n "$mb_libexecdir" ] || mb_libexecdir=$mb_exec_prefix/libexec + + [ -n "$mb_sysconfdir" ] || mb_sysconfdir=$mb_exec_prefix/etc + [ -n "$mb_sharedstatedir" ] || mb_sharedstatedir=$mb_prefix/com + [ -n "$mb_localstatedir" ] || mb_localstatedir=$mb_prefix/var + [ -n "$mb_runstatedir" ] || mb_runstatedir=$mb_localstatedir/run + [ -n "$mb_datarootdir" ] || mb_datarootdir=$mb_prefix/share + [ -n "$mb_datadir" ] || mb_datadir=$mb_datarootdir + [ -n "$mb_infodir" ] || mb_infodir=$mb_datarootdir/info + [ -n "$mb_localedir" ] || mb_localedir=$mb_datarootdir/locale + [ -n "$mb_htmldir" ] || mb_htmldir=$mb_docdir + [ -n "$mb_dvidir" ] || mb_dvidir=$mb_docdir + [ -n "$mb_pdfdir" ] || mb_pdfdir=$mb_docdir + [ -n "$mb_psdir" ] || mb_psdir=$mb_docdir + + # switches + [ -n "$mb_cflags_debug" ] || mb_cflags_debug=$mb_default_cflags_debug + [ -n "$mb_cflags_common" ] || mb_cflags_common=$mb_default_cflags_common + [ -n "$mb_cflags_cmdline" ] || mb_cflags_cmdline=$mb_default_cflags_cmdline + [ -n "$mb_cflags_config" ] || mb_cflags_config=$mb_default_cflags_config + [ -n "$mb_cflags_sysroot" ] || mb_cflags_sysroot=$mb_default_cflags_sysroot + [ -n "$mb_cflags_os" ] || mb_cflags_os=$mb_default_cflags_os + [ -n "$mb_cflags_site" ] || mb_cflags_site=$mb_default_cflags_site + [ -n "$mb_cflags_path" ] || mb_cflags_path=$mb_default_cflags_path + [ -n "$mb_cflags_strict" ] || mb_cflags_strict=$mb_default_cflags_strict + [ -n "$mb_cflags_util" ] || mb_cflags_util=$mb_default_cflags_util + [ -n "$mb_cflags_last" ] || mb_cflags_last=$mb_default_cflags_last + [ -n "$mb_cflags_once" ] || mb_cflags_once=$mb_default_cflags_once + + [ -n "$mb_ldflags_debug" ] || mb_ldflags_debug=$mb_default_ldflags_debug + [ -n "$mb_ldflags_common" ] || mb_ldflags_common=$mb_default_ldflags_common + [ -n "$mb_ldflags_cmdline" ] || mb_ldflags_cmdline=$mb_default_ldflags_cmdline + [ -n "$mb_ldflags_config" ] || mb_ldflags_config=$mb_default_ldflags_config + [ -n "$mb_ldflags_sysroot" ] || mb_ldflags_sysroot=$mb_default_ldflags_sysroot + [ -n "$mb_ldflags_path" ] || mb_ldflags_path=$mb_default_ldflags_path + [ -n "$mb_ldflags_strict" ] || mb_ldflags_strict=$mb_default_ldflags_strict + [ -n "$mb_ldflags_util" ] || mb_ldflags_util=$mb_default_ldflags_util + [ -n "$mb_ldflags_last" ] || mb_ldflags_last=$mb_default_ldflags_last + [ -n "$mb_ldflags_once" ] || mb_ldflags_once=$mb_default_ldflags_once + + # native switches + [ -n "$mb_native_cflags" ] || mb_native_cflags=$mb_default_native_cflags + [ -n "$mb_native_ldflags" ] || mb_native_ldflags=$mb_default_native_ldflags + + # config + [ -n "$mb_all_static" ] || mb_all_static='no' + [ -n "$mb_all_shared" ] || mb_all_shared='no' + [ -n "$mb_disable_frontend" ] || mb_disable_frontend='no' + [ -n "$mb_disable_static" ] || mb_disable_static='no' + [ -n "$mb_disable_shared" ] || mb_disable_shared='no' + + # host/target + [ -n "$mb_host" ] || mb_host=$mb_target + [ -n "$mb_target" ] || mb_target=$mb_host + + # sysroot + if [ -n "$mb_sysroot" ]; then + if [ -z "$mb_cflags_sysroot" ]; then + mb_cflags_sysroot="--sysroot=$mb_sysroot" + fi + + if [ -z "$mb_ldflags_sysroot" ]; then + mb_ldflags_sysroot="--sysroot=$mb_sysroot" + fi + fi + + # debug + if [ _$mb_debug = _yes ]; then + if [ -z "$mb_cflags_debug" ]; then + mb_cflags_debug='-g3 -O0' + fi + fi + + # make + if [ -z "$mb_make" ]; then + mb_make='make' + fi + + if [ -z "$mb_makemode" ]; then + mb_makemode='posix' + + printf '%s\n%s\n%s\n\n%s\n\n' \ + 'ifeq (a,b)' \ + 'VAR = val' \ + 'endif' \ + 'all:' \ + | ${mb_make} -s -f - 2>/dev/null \ + && mb_makemode='modern' + + fi + + # shell + if [ -z "$mb_shell" ]; then + mb_shell='/bin/sh' + fi + + # inherited cflags & ldflags + mb_cflags_cmdline="$mb_cflags_cmdline $mb_cflags" + mb_ldflags_cmdline="$mb_ldflags_cmdline $mb_ldflags" + + # add the prefix's library directory to the linker library path + mb_ldflags_last="$mb_ldflags_last -L$mb_libdir" + + # step epilog + output_step_epilog +} + + +config_flags() +{ + # step prolog + output_step_prolog ${mb_script} 'config_flags' + + mb_ldflags_tmp=" $mb_ldflags " + mb_ldflags_libs=$(printf '%s' "$mb_ldflags_tmp" | sed 's/ -static / /g') + + if [ "$mb_ldflags_tmp" != "$mb_ldflags_libs" ]; then + mb_ldflags="$mb_ldflags_libs" + mb_ldflags_util="$mb_ldflags_util -static" + fi + + # ccstrict + if [ _$mb_ccstrict = _yes ]; then + mb_cflags_strict='-Wall -Werror -Wextra -Wundef' + fi + + # ldstrict + if [ _$mb_ldstrict = _yes ]; then + mb_ldflags_strict='-Wl,--no-undefined' + fi + + # step epilog + output_step_epilog +} + + +config_opts() +{ + if [ "$mb_avoid_version" = 'yes' ]; then + mb_version_opt='none' + else + mb_version_opt='used' + fi + + if [ "$mb_custom_install_headers" = 'yes' ]; then + mb_install_headers_opt='custom' + else + mb_install_headers_opt='default' + fi + + if [ "$mb_disable_static" = 'yes' ]; then + mb_static_library_opt='disabled' + else + mb_static_library_opt='enabled' + fi + + if [ "$mb_disable_shared" = 'yes' ]; then + mb_shared_library_opt='disabled' + else + mb_shared_library_opt='enabled' + fi + + if [ "$mb_disable_frontend" = 'yes' ]; then + mb_app_frontend_opt='disabled' + else + mb_app_frontend_opt='enabled' + fi + + if [ "$mb_all_static" = 'yes' ]; then + mb_app_linking_opt='all_static' + + elif [ "$mb_all_shared" = 'yes' ]; then + mb_app_linking_opt='all_shared' + + else + mb_app_linking_opt='default' + fi +} + +config_copy() +{ + output_step_prolog ${mb_script} 'config_copy' + + mb_var_defs= + mb_sed_substs= + + mb_vars=$(cut -d'=' -f1 "$sfrt_config_vars" "$sfrt_opt_vars" \ + | grep -v '^#'); + + for __var in $(printf '%s' "$mb_vars"); do + mb_sed_subst=$(printf '%s %s%s%s' \ + '-e' "'s^@$__var@" \ + "^___${__var}___" \ + "^g'") + + mb_sed_substs="$mb_sed_substs $mb_sed_subst" + + mb_var_def=$(printf '%s%s="${%s}"' "-D" "___${__var}___" "mb_${__var}") + eval mb_var_defs='"$mb_var_defs "$mb_var_def' + done + + eval sed $mb_sed_substs $mb_project_dir/Makefile.in \ + | eval m4 $mb_var_defs - \ + | sed -e 's/[[:blank:]]*$//g' \ + > $mb_pwd/Makefile.tmp + + output_step_epilog +} + + +config_ccenv() +{ + mkdir -p ./ccenv + touch ./ccenv/host.mk + touch ./ccenv/native.mk + + output_section_break + ccenv_set_host_variables + + output_section_break + ccenv_set_native_variables + + output_section_break + config_copy +} + +config_custom_cfgdefs() +{ + . $mb_project_dir/project/config/cfgdefs.sh +} + +config_custom() +{ + if [ _$mb_use_custom_cfgdefs = _yes ]; then + output_section_break + output_script_status ${mb_script} \ + 'invoking project-specific cfgdefs.sh' + + eval config_custom_cfgdefs "$mb_custom_cfgdefs_args" + + output_section_break + config_copy + fi + + if [ _$mb_use_custom_usrdefs = _yes ]; then + output_section_break + output_script_status ${mb_scirpt} \ + 'invoking project-specific usrdefs.sh' + + . $mb_project_dir/project/usrdefs.sh + output_section_break + fi +} + + +config_cfghost() +{ + output_step_prolog ${mb_script} 'config_cfghost' + + if [ -z "$mb_cfghost" ]; then + mb_cfghost=$mb_cchost + fi + + sed -e 's^@cchost@^'"$mb_cchost"'^g' \ + -e 's^@cfghost@^'"$mb_cfghost"'^g' \ + $mb_pwd/Makefile.tmp > $mb_pwd/Makefile.host + + rm $mb_pwd/Makefile.tmp + mv $mb_pwd/Makefile.host $mb_pwd/Makefile + + output_step_epilog +} + + +config_host() +{ + output_step_prolog ${mb_script} 'config_host' + + ${mb_make} -s host.tag \ + && output_step_epilog \ + && return 0 + + error_msg "configure was able to generate a Makefile for the selected host," + error_msg "however the host-targeting compiler was found to be missing" + error_msg "at least one of the required headers or features." + exit 2 +} + + +config_fini() +{ + # rename Makefile as needed + if [ -n "$mb_makefile" ]; then + mv $mb_pwd/Makefile $mb_pwd/$mb_makefile + fi + + # project-specific post-configuration steps + if [ _$mb_use_custom_cfgfini = _yes ]; then + . "$mb_project_dir/project/config/cfgfini.sh" + fi +} + + +config_status() +{ + output_script_status ${mb_script} \ + 'configuration completed successfully.' + printf '\n' +} + + +config_failure() +{ + if [ _$mb_success = _yes ]; then + return 0 + fi + + printf 'configure info: exiting due to an error.\n' >&3 + + exit 2 +} + + +config_success() +{ + trap '' EXIT + mb_success=yes + exit 0 +} + + +# one: init +mb_args_defs= +mb_args_text= +mb_args_idx=0 + +init_log + +for arg ; do + mb_args_idx=$((mb_args_idx+1)) + + mb_arg_def=$(printf '%s%s="${%s}"' "-D_" "${mb_args_idx}" "${mb_args_idx}") + eval mb_args_defs='"$mb_args_defs "$mb_arg_def' + + mb_args_text="$mb_args_text '_$((mb_args_idx))'" +done + +printf "$mb_args_text\n\n" | eval m4 $mb_args_defs - >&3 + +if [ $mb_args_idx -gt 1 ]; then + printf '$ %s' "$mb_script" >&3 + + mb_args_idx=0 + mb_args_text= + + for arg; do + mb_args_idx=$((mb_args_idx+1)) + mb_args_text="$mb_args_text"$(printf ' \\\\\n\t%s_%d%s' "'" "$mb_args_idx" "'") + done + + printf "$mb_args_text\n\n" | eval m4 $mb_args_defs - >&3 +fi + +init_vars +verify_build_directory + + +# two: args +for arg ; do + case "$arg" in + --help) + usage + ;; + --help=ccenv) + ccenv_usage + ;; + + # ccenv + --cross-compile=*) + mb_cross_compile=${arg#*=} + ;; + --compiler=*) + mb_compiler=${arg#*=} + ;; + --toolchain=*) + mb_toolchain=${arg#*=} + ;; + --zealous) + mb_agnostic=yes + mb_zealous= + ;; + --zealous=*) + mb_zealous=${arg#*=} + ;; + --ccenv=*) + mb_ccenv=${arg#*=} + ;; + + # dirs + --prefix=*) + mb_prefix_set=yes + mb_prefix=${arg#*=} + ;; + --exec-prefix=*) + mb_exec_prefix_set=yes + mb_exec_prefix=${arg#*=} + ;; + --bindir=*) + mb_bindir_set=yes + mb_bindir=${arg#*=} + ;; + --sbindir=*) + mb_sbindir=${arg#*=} + ;; + --libdir=*) + mb_libdir=${arg#*=} + ;; + --includedir=*) + mb_includedir=${arg#*=} + ;; + --oldincludedir=*) + mb_oldincludedir=${arg#*=} + ;; + --mandir=*) + mb_mandir=${arg#*=} + ;; + --libexecdir=*) + mb_libexecdir=${arg#*=} + ;; + + + --sysconfdir=*) + mb_sysconfdir=${arg#*=} + ;; + --sharedstatedir=*) + mb_sharedstatedir=${arg#*=} + ;; + --localstatedir=*) + mb_localstatedir=${arg#*=} + ;; + --runstatedir=*) + mb_runstatedir=${arg#*=} + ;; + --datarootdir=*) + mb_datarootdir=${arg#*=} + ;; + --datadir=*) + mb_datadir=${arg#*=} + ;; + --infodir=*) + mb_infodir=${arg#*=} + ;; + --localedir=*) + mb_localedir=${arg#*=} + ;; + --htmldir=*) + mb_htmldir=${arg#*=} + ;; + --dvidir=*) + mb_dvidir=${arg#*=} + ;; + --pdfdir=*) + mb_pdfdir=${arg#*=} + ;; + --psdir=*) + mb_psdir=${arg#*=} + ;; + + #make + --make=*) + mb_make=${arg#*=} + ;; + + --makemode=*) + mb_makemode=${arg#*=} + ;; + + # build + --build=*) + mb_build=${arg#*=} + ;; + --host=*) + mb_host=${arg#*=} + ;; + --cchost=*) + mb_cchost=${arg#*=} + ;; + --cfghost=*) + mb_cfghost=${arg#*=} + ;; + --target=*) + mb_target=${arg#*=} + ;; + --arch=*) + mb_arch=${arg#*=} + ;; + --sysroot=*) + mb_sysroot=${arg#*=} + ;; + --shell=*) + mb_shell=${arg#*=} + ;; + --debug) + mb_debug=yes + ;; + + # config + --all-static) + mb_all_static=yes + mb_all_shared=no + ;; + --all-shared) + mb_all_shared=yes + mb_all_static=no + ;; + --disable-frontend) + mb_disable_frontend=yes + ;; + --disable-app) + mb_disable_frontend=yes + ;; + --enable-frontend) + mb_disable_frontend='no' + ;; + --enable-app) + mb_disable_frontend='no' + ;; + --disable-static) + mb_disable_static=yes + ;; + --disable-shared) + mb_disable_shared=yes + ;; + --enable-static) + mb_disable_static='no' + ;; + --enable-shared) + mb_disable_shared='no' + ;; + + # convenience + --strict) + mb_ccstrict=yes + mb_ldstrict=yes + ;; + --ccstrict) + mb_ccstrict=yes + ;; + --ldstrict) + mb_ldstrict=yes + ;; + + # project + --nickname=*) + mb_nickname=${arg#*=} + ;; + --program-prefix=*) + mb_program_prefix=${arg#*=} + ;; + --avoid-version) + mb_avoid_version=yes + ;; + --source-dir=*) + mb_source_dir=${arg#*=} + mb_source_dir_set=yes + ;; + --srcdir=*) + mb_source_dir=${arg#*=} + mb_source_dir_set=yes + ;; + + # pkgconfig + --pkgname=*) + mb_pkgname=${arg#*=} + ;; + + --pkgdesc=*) + mb_pkgdesc=${arg#*=} + ;; + + --pkgusrc=*) + mb_pkgusrc=${arg#*=} + ;; + + --pkgrepo=*) + mb_pkgrepo=${arg#*=} + ;; + + --pkgpsrc=*) + mb_pkgpsrc=${arg#*=} + ;; + + --pkgdurl=*) + mb_pkgdurl=${arg#*=} + ;; + + --pkgbugs=*) + mb_pkgbugs=${arg#*=} + ;; + + --pkghome=*) + mb_pkghome=${arg#*=} + ;; + + --pkgdefs=*) + mb_pkgdefs=${arg#*=} + ;; + + --pkglibs=*) + mb_pkglibs=${arg#*=} + ;; + + # srcinfo + --srcinfo=*) + mb_srcinfo=${arg#*=} + ;; + + --srcsite=*) + mb_srcsite=${arg#*=} + ;; + + --pgprkey=*) + mb_pgprkey=${arg#*=} + ;; + + --pgpskey=*) + mb_pgpskey=${arg#*=} + ;; + + --rawball=*) + mb_rawball=${arg#*=} + ;; + + --rawball-url=*) + mb_rawball_url=${arg#*=} + ;; + + --rawball-sha256=*) + mb_rawball_sha256=${arg#*=} + ;; + + --modball=*) + mb_modball=${arg#*=} + ;; + + --modball-url=*) + mb_modball_url=${arg#*=} + ;; + + --modball-sha256=*) + mb_modball_sha256=${arg#*=} + ;; + + --srcball=*) + mb_srcball=${arg#*=} + ;; + + --srcball-url=*) + mb_srcball_url=${arg#*=} + ;; + + --srcball-sha256=*) + mb_srcball_sha256=${arg#*=} + ;; + + # compatibility + --enable-dependency-tracking) + ;; + --disable-dependency-tracking) + ;; + + *) + if [ _$mb_use_custom_cfgdefs = _yes ]; then + mb_escaped_arg=\'$(printf '%s\n' "$arg" | sed -e "s/'/'\\\\''/g")\' + mb_escaped_arg="$mb_custom_cfgdefs_space$mb_escaped_arg" + mb_custom_cfgdefs_args="$mb_custom_cfgdefs_args$mb_escaped_arg" + mb_custom_cfgdefs_space=' ' + else + error_msg ${arg#}: "unsupported config argument." + exit 2 + fi + ;; + esac + + mb_safe_path_desc='source directory' + mb_safe_path_name="$mb_source_dir" + verify_safe_path +done + + + +# three: validation +verify_source_directory +verify_source_info + +if ! [ -z "$mb_program_prefix" ]; then + error_msg "--program-prefix is not yet fully support (must be null)." +fi + + + +# four: defaults +common_defaults + + +# five: config +config_flags +config_opts +config_copy +config_ccenv +config_custom +config_cfghost +config_host +config_fini +config_status + + +# all done +config_success diff --git a/sofort/ccenv/ccenv.in b/sofort/ccenv/ccenv.in new file mode 100644 index 0000000..61f9897 --- /dev/null +++ b/sofort/ccenv/ccenv.in @@ -0,0 +1,88 @@ +# @ccenv_cfgtype@ system flavor +OS = @ccenv_os@ +OS_SEMANTICS = @ccenv_os_semantics@ + +OS_DSO_EXRULES = @ccenv_os_dso_exrules@ +OS_DSO_LINKAGE = @ccenv_os_dso_linkage@ + +OS_APP_PREFIX = @ccenv_os_app_prefix@ +OS_APP_SUFFIX = @ccenv_os_app_suffix@ + +OS_LIB_PREFIX = @ccenv_os_lib_prefix@ +OS_LIB_SUFFIX = @ccenv_os_lib_suffix@ + +OS_IMPLIB_EXT = @ccenv_os_implib_ext@ +OS_LIBDEF_EXT = @ccenv_os_libdef_ext@ + +OS_ARCHIVE_EXT = @ccenv_os_archive_ext@ +OS_SONAME = @ccenv_os_soname@ + +OS_LIB_PREFIXED_SUFFIX = @ccenv_os_lib_prefixed_suffix@ +OS_LIB_SUFFIXED_SUFFIX = @ccenv_os_lib_suffixed_suffix@ + +# @ccenv_cfgtype@ characteristics +CC_HOST = @ccenv_cc_host@ +CC_BITS = @ccenv_cc_bits@ + +CC_ARFMT = @ccenv_cc_arfmt@ +CC_SOFMT = @ccenv_cc_sofmt@ +CC_BINFMT = @ccenv_cc_binfmt@ +CC_UNDERSCORE = @ccenv_cc_underscore@ + +CC_ARCH_BFD = @ccenv_cc_arch_bfd@ +CC_ARCH_LLVM = @ccenv_cc_arch_llvm@ + +# incompatible tool variants +AS_ASM = @ccenv_as_asm@ +AS_LL = @ccenv_as_ll@ +AS_MC = @ccenv_as_mc@ + +LD_BFD = @ccenv_ld_bfd@ +LD_GOLD = @ccenv_ld_gold@ +LD_LLD = @ccenv_ld_lld@ + +OBJDUMP_BFD = @ccenv_objdump_bfd@ +OBJDUMP_LLVM = @ccenv_objdump_llvm@ + +READELF_BFD = @ccenv_readelf_bfd@ +READELF_LLVM = @ccenv_readelf_llvm@ + +# @ccenv_cfgtype@ primary tools +CC = @ccenv_cc@ +CPP = @ccenv_cpp@ +CXX = @ccenv_cxx@ + +AR = @ccenv_ar@ +NM = @ccenv_nm@ +OBJDUMP = @ccenv_objdump@ +RANLIB = @ccenv_ranlib@ +SIZE = @ccenv_size@ +STRIP = @ccenv_strip@ +STRINGS = @ccenv_strings@ + +ADDR2LINE = @ccenv_addr2line@ +COV = @ccenv_cov@ +CXXFILT = @ccenv_cxxfilt@ +OBJCOPY = @ccenv_objcopy@ + +ELFEDIT = @ccenv_elfedit@ +READELF = @ccenv_readelf@ +READOBJ = @ccenv_readobj@ + +PERK = @ccenv_perk@ +MDSO = @ccenv_mdso@ +DLLTOOL = @ccenv_dlltool@ + +WINDMC = @ccenv_windmc@ +WINDRC = @ccenv_windrc@ + +# @ccenv_cfgtype@ secondary tools +# note: the direct use of $(@ccenv_makevar_prefix@LD) is highly discouraged +AS = @ccenv_as@ +LD = @ccenv_ld@ + +# @ccenv_cfgtype@ cflags +CFLAGS_OS += -DOS_LIB_SUFFIX=\"@ccenv_os_lib_suffix@\" +CFLAGS_OS += @ccenv_cflags_os@ +CFLAGS_PIC += @ccenv_cflags_pic@ + diff --git a/sofort/ccenv/ccenv.sh b/sofort/ccenv/ccenv.sh new file mode 100644 index 0000000..62caa96 --- /dev/null +++ b/sofort/ccenv/ccenv.sh @@ -0,0 +1,1476 @@ +# ccenv.sh: sofort's tool-finding bits, +# invoked from within the project-agnostic configure script. + +# this file is covered by COPYING.SOFORT. + +# invocation and names of binary tools: +# agnostic names (ar, nm, objdump, ...); +# target-prefixed agnostic names (x86_64-nt64-midipix-ar, ...); +# branded names (llvm-ar, llvm-nm, llvm-objdump, ...); +# target-prefixed branded names (x86_64-linux-gnu-gcc-ar, ...); +# target-specifying branded tools (llvm-ar --target=x86_64-linux, ...). + +# cross-compilation: default search order: +# target-prefixed agnostic tools; +# target-prefixed branded tools, starting with the prefix +# most commonly associated with the selected compiler (that is, +# ``gcc'' when using gcc, and ``llvm'' when using clang); +# target-speficying branded tools, starting once again with the +# prefix most commonly associated with the selected compiler. + +# internal variables of interest: +# ccenv_cfgtype: the type of host being tested (host/native) +# ccenv_cfgfile: the configuration file for the host being tested +# ccenv_cflags: the comprehensive cflags for the host being tested +# ccenv_cchost: the host being tested, as reported by -dumpmachine + + +ccenv_usage() +{ + cat "$mb_project_dir"/sofort/ccenv/ccenv.usage + exit 0 +} + + +ccenv_newline() +{ + printf '\n' >> "$ccenv_cfgfile" +} + + +ccenv_comment() +{ + ccenv_internal_str='#' + + for ccenv_internal_arg ; do + ccenv_internal_str="$ccenv_internal_str $ccenv_internal_arg" + done + + printf '%s\n' "$ccenv_internal_str" >> "$ccenv_cfgfile" +} + + +ccenv_tool_prolog() +{ + ccenv_line_dots='.....................................' + ccenv_tool_desc=" == checking for ${1}" + ccenv_tool_dlen="${#ccenv_line_dots}" + + printf '\n%s\n' '________________________' >&3 + printf "ccenv: checking for ${1}\n\n" >&3 + printf "%${ccenv_tool_dlen}.${ccenv_tool_dlen}s" \ + "${ccenv_tool_desc} ${mb_line_dots}" +} + + +ccenv_tool_epilog() +{ + ccenv_line_dots='................................' + ccenv_tool_dlen="$((${#ccenv_line_dots} - ${#1}))" + + case ${ccenv_tool_dlen} in + 0 | -* ) + ccenv_tool_dlen='3' ;; + esac + + printf "%${ccenv_tool_dlen}.${ccenv_tool_dlen}s %s.\n" \ + "${ccenv_line_dots}" "${1}" + + if [ "${1}" = 'false' ]; then + printf '\n\nccenv: not (yet) found.\n' >&3 + else + printf "\n\nccenv : found $(command -v ${1}).\n" >&3 + fi + + printf '%s\n' '------------------------' >&3 +} + + +ccenv_tool_variant_epilog() +{ + ccenv_expr=${1}='${'${1}':-false}' + eval "$ccenv_expr" + + ccenv_expr='${'${1}'}' + eval ccenv_tool_epilog "$ccenv_expr" +} + + +ccenv_attr_prolog() +{ + ccenv_line_dots=' .....................................' + ccenv_attr_desc=" == detect ${ccenv_cfgtype} ${1}" + ccenv_attr_dlen="${#ccenv_line_dots}" + + printf "%${ccenv_attr_dlen}.${ccenv_attr_dlen}s" \ + "${ccenv_attr_desc} ${ccenv_line_dots}" + + printf '\n%s\n' '________________________' >&3 + printf "ccenv: detecting ${1}\n\n" >&3 +} + + +ccenv_attr_epilog() +{ + ccenv_line_dots='................................' + ccenv_tool_dlen="$((${#ccenv_line_dots} - 1 - ${#1}))" + + case ${ccenv_tool_dlen} in + 0 | -* ) + ccenv_tool_dlen='3' ;; + esac + + printf "%${ccenv_tool_dlen}.${ccenv_tool_dlen}s %s.\n" \ + "${ccenv_line_dots}" "${1}" + + printf '\n\nccenv: detected result: %s\n' "${1}" >&3 + printf '%s\n' '------------------------' >&3 +} + + +ccenv_find_tool() +{ + if [ -z "$ccenv_prefixes" ]; then + for ccenv_candidate in $(printf '%s' "$ccenv_candidates"); do + ccenv_cmd_args="${@:-}" + + if [ -z "$ccenv_cmd_args" ]; then + if command -v "$ccenv_candidate" > /dev/null; then + ccenv_tool="$ccenv_candidate" + return 0 + fi + else + if command -v "$ccenv_candidate" > /dev/null; then + if "$ccenv_candidate" $@ > /dev/null 2>&3; then + ccenv_tool="$ccenv_candidate" + return 0 + fi + fi + fi + done + + ccenv_tool=false + + return 0 + fi + + for ccenv_prefix in $(printf '%s' "$ccenv_prefixes"); do + for ccenv_candidate in $(printf '%s' "$ccenv_candidates"); do + ccenv_tool="$ccenv_prefix$ccenv_candidate" + + if command -v "$ccenv_tool" > /dev/null; then + return 0 + fi + done + done + + for ccenv_candidate in $(printf '%s' "$ccenv_candidates"); do + if command -v "$ccenv_candidate" > /dev/null; then + ccenv_tool="$ccenv_candidate" + return 0 + fi + done + + ccenv_tool=false + + return 0 +} + + +ccenv_set_primary_tools() +{ + ccenv_core_tools="ar nm objdump ranlib size strip strings objcopy" + ccenv_hack_tools="addr2line cov elfedit readelf readobj otool" + ccenv_peep_tools="perk mdso dlltool windmc windres" + + for __tool in $(printf '%s' "$ccenv_core_tools $ccenv_hack_tools $ccenv_peep_tools"); do + ccenv_tool_prolog "$__tool" + + if [ -n "$mb_agnostic" ]; then + ccenv_candidates=" $__tool" + + elif [ -n "$mb_zealous" ]; then + ccenv_candidates="$mb_zealous-$__tool" + + elif [ "$mb_toolchain" = 'gcc' ]; then + ccenv_candidates="gcc-$__tool" + ccenv_candidates="$ccenv_candidates $__tool" + ccenv_candidates="$ccenv_candidates llvm-$__tool" + + elif [ "$mb_toolchain" = 'llvm' ]; then + ccenv_candidates="llvm-$__tool" + ccenv_candidates="$ccenv_candidates $__tool" + ccenv_candidates="$ccenv_candidates gcc-$__tool" + + elif [ -n "$mb_toolchain" ]; then + ccenv_candidates="$mb_toolchain-$__tool" + ccenv_candidates="$ccenv_candidates $__tool" + ccenv_candidates="$ccenv_candidates gcc-$__tool" + ccenv_candidates="$ccenv_candidates llvm-$__tool" + + else + ccenv_candidates="$__tool" + ccenv_candidates="$ccenv_candidates gcc-$__tool" + ccenv_candidates="$ccenv_candidates llvm-$__tool" + fi + + if [ "$ccenv_cfgtype" = 'host' ]; then + ccenv_var_prefix='mb_' + else + ccenv_var_prefix='mb_native_' + fi + + ccenv_var_name=$ccenv_var_prefix$__tool + ccenv_var_expr='${'$ccenv_var_name':-}' + eval ccenv_var_val=$ccenv_var_expr + + if [ -n "$ccenv_var_val" ]; then + eval ccenv_$__tool="$ccenv_var_val" + else + ccenv_find_tool + eval ccenv_$__tool="$ccenv_tool" + fi + + ccenv_tool_epilog "$ccenv_tool" + done + + # windrc + ccenv_windrc="$ccenv_windres" + + # archive format preamble + ccenv_libgcc_a_header=$(od -b -N8 $($ccenv_cc -print-file-name=libgcc.a) | head -n1) + ccenv_cc_arfmt='common' + + # ar (big) + ccenv_bigaf_header=$(printf '%s\n' '' | od -b | head -n1) + + if [ "$ccenv_libgcc_a_header" = "$ccenv_bigaf_header" ]; then + ccenv_cc_arfmt='bigaf' + + for __tool in $(printf '%s' "$ccenv_core_tools"); do + ccenv_var_name=ccenv_$__tool + ccenv_var_expr='${'$ccenv_var_name':-}' + eval ccenv_var_val="$ccenv_var_expr" + + if [ "$ccenv_var_val" != false ]; then + ccenv_var_val="$ccenv_var_val -X64" + ccenv_var_expr='${ccenv_var_val:-}' + eval ccenv_$__tool="$ccenv_var_expr" + fi + done + fi + + # ar (small) + ccenv_aiaff_header=$(printf '%s\n' '' | od -b | head -n1) + + if [ "$ccenv_libgcc_a_header" = "$ccenv_aiaff_header" ]; then + ccenv_cc_arfmt='aiaff' + + for __tool in $(printf '%s' "$ccenv_core_tools"); do + ccenv_var_name=ccenv_$__tool + ccenv_var_expr='${'$ccenv_var_name':-}' + eval ccenv_var_val="$ccenv_var_expr" + + if [ "$ccenv_var_val" != false ]; then + ccenv_var_val="$ccenv_var_val -X32" + ccenv_var_expr='${ccenv_var_val:-}' + eval ccenv_$__tool="$ccenv_var_expr" + fi + done + fi +} + +ccenv_set_tool_variants() +{ + # as (asm) + ccenv_tool_prolog 'as (asm)' + ccenv_candidates=as + ccenv_find_tool + + if [ "$ccenv_tool" = false ]; then + ccenv_as_asm= + else + $ccenv_tool --help 2>&1 | grep -i '.bc assembler' \ + || ccenv_as_asm="$ccenv_tool" + fi + + ccenv_tool_variant_epilog 'ccenv_as_asm' + + # as (ll) + ccenv_tool_prolog 'as (ll)' + ccenv_candidates=llvm-as + ccenv_find_tool + + if [ "$ccenv_tool" != false ]; then + ccenv_as_ll="$ccenv_tool" + fi + + ccenv_tool_variant_epilog 'ccenv_as_ll' + + # as (mc) + ccenv_tool_prolog 'as (mc)' + ccenv_candidates=llvm-mc + ccenv_find_tool + + if [ "$ccenv_tool" != false ]; then + ccenv_as_mc="$ccenv_tool" + fi + + ccenv_tool_variant_epilog 'ccenv_as_mc' + + # ld (bfd) + ccenv_tool_prolog 'ld (bfd)' + ccenv_candidates=ld.bfd + ccenv_find_tool + + if [ "$ccenv_tool" != false ]; then + ccenv_ld_bfd="$ccenv_tool" + fi + + ccenv_tool_variant_epilog 'ccenv_ld_bfd' + + # ld (gold) + ccenv_tool_prolog 'ld (gold)' + ccenv_candidates=ld.gold + ccenv_find_tool + + if [ "$ccenv_tool" != false ]; then + ccenv_ld_gold="$ccenv_tool" + fi + + ccenv_tool_variant_epilog 'ccenv_ld_gold' + + # ld (lld) + ccenv_tool_prolog 'ld (lld)' + ccenv_candidates=lld + ccenv_find_tool + + if [ "$ccenv_tool" != false ]; then + ccenv_ld_lld="$ccenv_tool" + fi + + ccenv_tool_variant_epilog 'ccenv_ld_lld' + + # objdump (bfd) + ccenv_tool_prolog 'objdump (bfd)' + ccenv_candidates=objdump + ccenv_find_tool + + if $ccenv_tool --version | grep -i Binutils > /dev/null; then + ccenv_objdump_bfd="$ccenv_tool" + fi + + ccenv_tool_variant_epilog 'ccenv_objdump_bfd' + + # objdump (llvm) + ccenv_tool_prolog 'objdump (llvm)' + ccenv_candidates=llvm-objdump + ccenv_find_tool + + if $ccenv_tool --version | grep -i LLVM > /dev/null; then + ccenv_objdump_llvm="$ccenv_tool" + fi + + ccenv_tool_variant_epilog 'ccenv_objdump_llvm' + + # readelf (bfd) + ccenv_tool_prolog 'readelf (bfd)' + ccenv_candidates=readelf + ccenv_find_tool + + if $ccenv_tool --version | grep -i Binutils > /dev/null; then + ccenv_readelf_bfd="$ccenv_tool" + fi + + ccenv_tool_variant_epilog 'ccenv_readelf_bfd' + + # readelf (llvm) + ccenv_tool_prolog 'readelf (llvm)' + ccenv_candidates=llvm-readelf + ccenv_find_tool + + if $ccenv_tool --version | grep -i LLVM > /dev/null; then + ccenv_readelf_llvm="$ccenv_tool" + fi + + ccenv_tool_variant_epilog 'ccenv_readelf_llvm' + + # as + if [ -n "$ccenv_cc" ]; then + ccenv_as='$('"$ccenv_makevar_prefix"'CC) -c -x assembler' + elif [ -n "$mb_agnostic" ]; then + ccenv_as='$('"$ccenv_makevar_prefix"'AS_ASM)' + elif [ "$mb_zealous" = 'gcc' ]; then + ccenv_as='$('"$ccenv_makevar_prefix"'AS_ASM)' + elif [ -n "$mb_zealous" = 'llvm' ]; then + ccenv_as='$('"$ccenv_makevar_prefix"'AS_MC)' + elif [ "$mb_toolchain" = 'gcc' ]; then + ccenv_as='$('"$ccenv_makevar_prefix"'AS_ASM)' + elif [ "$mb_toolchain" = 'llvm' ]; then + ccenv_as='$('"$ccenv_makevar_prefix"'AS_MC)' + fi + + # ld + if [ -n "$ccenv_cc" ]; then + ccenv_ld='$('"$ccenv_makevar_prefix"'CC) -nostdlib -nostartfiles' + fi +} + +ccenv_set_c_compiler_candidates() +{ + if [ -n "$mb_compiler" ]; then + ccenv_candidates="$mb_compiler" + + elif [ -n "$mb_agnostic" ]; then + ccenv_candidates="c99 c11 cc" + + elif [ "$mb_zealous" = 'gcc' ]; then + ccenv_candidates="gcc" + + elif [ "$mb_zealous" = 'llvm' ]; then + ccenv_candidates="clang" + + elif [ "$mb_toolchain" = 'gcc' ]; then + ccenv_candidates="gcc c99 c11 cc clang" + + elif [ "$mb_toolchain" = 'llvm' ]; then + ccenv_candidates="clang c99 c11 cc gcc" + + elif [ -n "$mb_toolchain" ]; then + ccenv_candidates="$mb_toolchain c99 c11 cc gcc clang" + + else + ccenv_candidates="c99 c11 cc gcc clang" + fi +} + + +ccenv_set_cc() +{ + ccenv_tool_prolog 'C compiler' + + if [ -z "$ccenv_cc" ]; then + ccenv_set_c_compiler_candidates + ccenv_find_tool -dumpmachine + ccenv_cc="$ccenv_tool" + fi + + if [ "$ccenv_cc" = false ] && [ -n "$mb_compiler" ]; then + ccenv_cc="$mb_compiler" + fi + + ccenv_cc_cmd="$ccenv_cc" + ccenv_errors= + + if [ "$ccenv_cfgtype" = 'native' ]; then + ccenv_host=$(eval $ccenv_cc $(printf '%s' "$ccenv_cflags") -dumpmachine 2>&3) + ccenv_cchost=$ccenv_host + ccenv_tool_epilog "$ccenv_cc" + return 0 + fi + + if [ -n "$mb_cchost" ]; then + ccenv_host="$mb_cchost" + elif [ -n "$mb_host" ]; then + ccenv_host="$mb_host" + else + ccenv_host= + fi + + if [ -z "$ccenv_host" ]; then + ccenv_host=$($ccenv_cc $(printf '%s' "$ccenv_cflags") -dumpmachine 2>&3) + ccenv_cchost=$ccenv_host + else + ccenv_tmp=$(mktemp ./tmp_XXXXXXXXXXXXXXXX) + ccenv_cmd="$ccenv_cc --target=$ccenv_host -E -xc -" + + if [ -z "$mb_user_cc" ]; then + $(printf %s "$ccenv_cmd") < /dev/null > /dev/null \ + 2>"$ccenv_tmp" || true + + ccenv_errors=$(cat "$ccenv_tmp") + + if [ -z "$ccenv_errors" ]; then + ccenv_tflags="--target=$ccenv_host" + ccenv_cc="$ccenv_cc $ccenv_tflags" + else + printf '%s' "$ccenv_errors" >&3 + fi + fi + + rm -f "$ccenv_tmp" + unset ccenv_tmp + + ccenv_cchost=$($ccenv_cc $(printf '%s' "$ccenv_cflags") -dumpmachine 2>&3) + fi + + if [ "$ccenv_cchost" != "$ccenv_host" ]; then + printf 'error!\n' >&2 + printf 'ccenv:\n' >&2 + printf 'ccenv: ccenv_host: %s \n' $ccenv_host >&2 + printf 'ccenv: ccenv_cchost: %s \n' $ccenv_cchost >&2 + + if [ -z "$ccenv_tflags" ]; then + printf 'ccenv:\n' >&2 + printf 'ccenv: ccenv_host and ccenv_cchost do not match, most likely because:\n' >&2 + printf 'ccenv: (1) you explicitly set CC (or passed --compiler=...)\n' >&2 + printf 'ccenv: (2) the selected compiler does not accept --target=...\n' >&2 + printf 'ccenv: (3) the host reported by -dumpmachine differs from the one you requested.\n' >&2 + fi + + if [ -n "$ccenv_errors" ]; then + printf 'ccenv:\n' >&2 + printf 'ccenv: something went wrong, see the command and compiler message below.\n\n' >&2 + printf 'cmd: %s < /dev/null > /dev/null\n' "$ccenv_cmd" >&2 + printf '%s\n\n' "$ccenv_errors" >&2 + else + printf 'ccenv:\n' >&2 + printf 'ccenv: something went wrong, bailing out.\n\n' >&2 + fi + + return 2 + fi + + ccenv_tool_epilog "$ccenv_cc" +} + +ccenv_set_cpp() +{ + ccenv_tool_prolog 'C pre-processor' + + case "$ccenv_cc_cmd" in + cc | c99 | c11 | gcc) + ccenv_cpp_prefix= + ccenv_candidates="cpp" ;; + + clang ) + ccenv_cpp_prefix= + ccenv_candidates="clang-cpp" ;; + + *-cc ) + ccenv_cpp_prefix=${ccenv_cc_cmd%-cc*}- + ccenv_candidates="${ccenv_cpp_prefix}cpp" ;; + + *-c99 ) + ccenv_cpp_prefix=${ccenv_cc_cmd%-c99*}- + ccenv_candidates="${ccenv_cpp_prefix}cpp" ;; + + *-c11 ) + ccenv_cpp_prefix=${ccenv_cc_cmd%-c11*}- + ccenv_candidates="${ccenv_cpp_prefix}cpp" ;; + + *-gcc ) + ccenv_cpp_prefix=${ccenv_cc_cmd%-gcc*}- + ccenv_candidates="${ccenv_cpp_prefix}cpp" ;; + + *-clang ) + ccenv_cpp_prefix=${ccenv_cc_cmd%-clang*}- + ccenv_candidates="${ccenv_cpp_prefix}clang-cpp" ;; + + * ) + ccenv_cpp="$ccenv_cc -E" + ccenv_tool_epilog "$ccenv_cpp" + return 0 + esac + + ccenv_find_tool + + if [ "$ccenv_tool" = false ]; then + ccenv_cpp="$ccenv_cc -E" + elif [ -n "$ccenv_tflags" ]; then + ccenv_cpp="$ccenv_tool $ccenv_tflags" + else + ccenv_cpp="$ccenv_tool" + fi + + ccenv_tool_epilog "$ccenv_cpp" +} + +ccenv_set_cxx() +{ + ccenv_tool_prolog 'C++ compiler' + + case "$ccenv_cc_cmd" in + cc | c99 | c11 ) + ccenv_cxx_prefix= + ccenv_candidates="cxx c++" ;; + + gcc ) + ccenv_cxx_prefix= + ccenv_candidates="g++" ;; + + clang ) + ccenv_cxx_prefix= + ccenv_candidates="clang++" ;; + + *-gcc ) + ccenv_cxx_prefix=${ccenv_cc_cmd%-gcc*}- + ccenv_candidates="${ccenv_cxx_prefix}g++" ;; + + *-clang ) + ccenv_cxx_prefix=${ccenv_cc_cmd%-clang*}- + ccenv_candidates="${ccenv_cxx_prefix}clang++" ;; + + /*cc | /*c99 | /*c11 ) + ccenv_cxx_prefix=${ccenv_cc_cmd%/*} + ccenv_candidates="${ccenv_cxx_prefix}/cxx" + ccenv_candidates="${ccenv_candidates} ${ccenv_cxx_prefix}/c++" ;; + + /*gcc ) + ccenv_cxx_prefix=${ccenv_cc_cmd%/*} + ccenv_candidates="${ccenv_cxx_prefix}/g++" ;; + + /*clang ) + ccenv_cxx_prefix=${ccenv_cc_cmd%/*} + ccenv_candidates="${ccenv_cxx_prefix}/clang++" ;; + + * ) + ccenv_cxx="$ccenv_cc -xc++" + ccenv_tool_epilog "$ccenv_cxx" + return 0 + esac + + ccenv_find_tool + + if [ "$ccenv_tool" = false ]; then + ccenv_cxx="$ccenv_cc -xc++" + elif [ -n "$ccenv_tflags" ]; then + ccenv_cxx="$ccenv_tool $ccenv_tflags" + else + ccenv_cxx="$ccenv_tool" + fi + + ccenv_tool_epilog "$ccenv_cxx" +} + +ccenv_set_cc_host() +{ + ccenv_attr_prolog 'system' + ccenv_cc_host="$ccenv_cchost" + ccenv_attr_epilog "$ccenv_cc_host" +} + +ccenv_set_cc_bits() +{ + ccenv_attr_prolog 'bits' + + ccenv_internal_size= + ccenv_internal_type='void *' + ccenv_internal_test='char x[(sizeof(%s) == %s/8) ? 1 : -1];' + + for ccenv_internal_guess in 64 32 128; do + if [ -z "${ccenv_internal_size:-}" ]; then + ccenv_internal_str=$(printf "$ccenv_internal_test" \ + "$ccenv_internal_type" \ + "$ccenv_internal_guess") + + printf '%s' "$ccenv_internal_str" \ + | eval $ccenv_cc -S -xc - -o - \ + $(printf '%s' "$ccenv_cflags") \ + > /dev/null 2>&3 \ + && ccenv_internal_size=$ccenv_internal_guess + fi + done + + ccenv_cc_bits=$ccenv_internal_size + + ccenv_attr_epilog "$ccenv_cc_bits" +} + +ccenv_set_cc_underscore() +{ + ccenv_attr_prolog 'prepended underscores' + + ccenv_fn_name='ZmYaXyWbVe_UuTnSdReQrPsOcNoNrLe' + ccenv_fn_code='int %s(void){return 0;}' + + if printf "$ccenv_fn_code" $ccenv_fn_name \ + | $ccenv_cc -xc - -S -o - \ + | grep "^_$ccenv_fn_name:" \ + > /dev/null; then + ccenv_cc_underscore='_' + ccenv_attr_epilog 'yes' + fi + + ccenv_attr_epilog 'no' + + return 0 +} + +ccenv_create_framework_executable() +{ + if [ -f $ccenv_image ]; then + mv $ccenv_image $ccenv_image.tmp + rm -f $ccenv_image.tmp + fi + + printf 'int main(void){return 0;}' \ + | $ccenv_cc -xc - \ + -o $ccenv_image \ + 2>/dev/null \ + || return 1 + + return 0 +} + +ccenv_create_freestanding_executable() +{ + if [ -f $ccenv_image ]; then + mv $ccenv_image $ccenv_image.tmp + rm -f $ccenv_image.tmp + fi + + if [ -z "ccenv_cc_underscore" ]; then + ccenv_start_fn='_start' + else + ccenv_start_fn='start' + fi + + printf 'int %s(void){return 0;}' "$ccenv_start_fn" \ + | $ccenv_cc -xc - \ + -ffreestanding \ + -nostdlib -nostartfiles \ + -o $ccenv_image \ + || return 1 + + ccenv_freestd=yes + + return 0 +} + +ccenv_set_cc_binfmt_error() +{ + ccenv_attr_epilog '(unable to create executable)' +} + +ccenv_set_cc_binfmt() +{ + ccenv_use_perk= + ccenv_use_otool= + ccenv_use_readelf= + ccenv_use_readobj= + ccenv_use_bfd_objdump= + ccenv_use_llvm_objdump= + + ccenv_attr_prolog 'binary format' + + ccenv_create_framework_executable \ + || ccenv_create_freestanding_executable \ + || ccenv_set_cc_binfmt_error \ + || return 0 + + # PE / perk + if [ -n "$ccenv_perk" ]; then + if $ccenv_perk $ccenv_image 2>&3; then + ccenv_cc_binfmt='PE' + ccenv_use_perk=yes + fi + fi + + # ELF / readelf + if [ -n "$ccenv_readelf" ] && [ -z "$ccenv_cc_binfmt" ]; then + if $ccenv_readelf -h $ccenv_image 2>&3 \ + | grep 'Magic:' | sed -e 's/[ ]*//g' \ + | grep 'Magic:7f454c46' \ + > /dev/null; then + ccenv_cc_binfmt='ELF' + ccenv_use_readelf=yes + fi + fi + + # a marble of astonishing design: + # llvm-readelf also parses PE and Mach-O + + if [ -n "$ccenv_readelf_llvm" ]; then + ccenv_readany="$ccenv_readelf_llvm" + else + ccenv_readany="$ccenv_readelf" + fi + + # PE / readelf + if [ -n "$ccenv_readany" ] && [ -z "$ccenv_cc_binfmt" ]; then + if $ccenv_readany -h $ccenv_image 2>&3 \ + | grep 'Magic:' | sed -e 's/[ ]*//g' \ + | grep 'Magic:MZ' \ + > /dev/null; then + ccenv_cc_binfmt='PE' + ccenv_use_readelf=yes + fi + fi + + # MACHO-64 / otool + if [ -n "$ccenv_otool" ] && [ -z "$ccenv_cc_binfmt" ]; then + if $ccenv_otool -hv $ccenv_image 2>&3 \ + | grep -i 'MH_MAGIC_64' \ + > /dev/null; then + ccenv_cc_binfmt='MACHO' + ccenv_use_otool=yes + fi + fi + + # MACHO-32 / otool + if [ -n "$ccenv_otool" ] && [ -z "$ccenv_cc_binfmt" ]; then + if $ccenv_otool -hv $ccenv_image 2>&3 \ + | grep -i 'MH_MAGIC' \ + > /dev/null; then + ccenv_cc_binfmt='MACHO' + ccenv_use_otool=yes + fi + fi + + # MACHO-64 / readelf + if [ -n "$ccenv_readany" ] && [ -z "$ccenv_cc_binfmt" ]; then + if $ccenv_readany -h $ccenv_image 2>&3 \ + | grep -i 'Magic:' | sed -e 's/[ ]*//g' \ + | grep -i '(0xfeedfacf)' \ + > /dev/null; then + ccenv_cc_binfmt='MACHO' + ccenv_use_readelf=yes + fi + fi + + # MACHO-32 / readelf + if [ -n "$ccenv_readany" ] && [ -z "$ccenv_cc_binfmt" ]; then + if $ccenv_readany -h $ccenv_image 2>&3 \ + | grep -i 'Magic:' | sed -e 's/[ ]*//g' \ + | grep -i '(0xcafebabe)' \ + > /dev/null; then + ccenv_cc_binfmt='MACHO' + ccenv_use_readelf=yes + fi + fi + + # MACHO / readobj + if [ -n "$ccenv_readobj" ] && [ -z "$ccenv_cc_binfmt" ]; then + if $ccenv_readobj $ccenv_image 2>&3 \ + | grep -i 'Format:' \ + | sed -e 's/ /_/g' \ + | grep -i '_Mach-O_' \ + > /dev/null; then + ccenv_cc_binfmt='MACHO' + ccenv_use_readobj=yes + fi + fi + + # MACHO / objdump (llvm) + if [ -n "$ccenv_objdump" ] && [ -z "$ccenv_cc_binfmt" ]; then + if $ccenv_objdump -section-headers $ccenv_image \ + 2>&3 \ + | grep -i 'file format Mach-O' \ + > /dev/null; then + ccenv_cc_binfmt='MACHO' + ccenv_use_objdump=yes + fi + fi + + # MACHO / objdump (bfd) + if [ -n "$ccenv_objdump" ] && [ -z "$ccenv_cc_binfmt" ]; then + $ccenv_objdump -h $ccenv_image 2>&3 \ + | grep -i 'file format Mach-O' \ + > /dev/null \ + && ccenv_cc_binfmt='MACHO' \ + && ccenv_use_objdump=yes + fi + + # PE / objdump (bfd) + if [ -n "$ccenv_objdump" ] && [ -z "$ccenv_cc_binfmt" ]; then + if $ccenv_objdump -h $ccenv_image 2>&3 \ + | grep -i 'file format pei-' \ + > /dev/null; then + ccenv_cc_binfmt='PE' + ccenv_use_bfd_objdump=yes + fi + fi + + ccenv_attr_epilog "$ccenv_cc_binfmt" +} + +ccenv_set_os_pe() +{ + if [ -n "$ccenv_freestd" ]; then + case "$ccenv_cchost" in + *-midipix | *-midipix-* ) + ccenv_os='midipix' ;; + *-mingw | *-mingw32 | *-mingw64 ) + ccenv_os='mingw' ;; + *-mingw-* | *-mingw32-* | *-mingw64 ) + ccenv_os='mingw' ;; + *-msys | *-msys2 | *-msys-* | *-msys2-* ) + ccenv_os='msys' ;; + *-cygwin | *-cygwin-* ) + ccenv_os='cygwin' ;; + esac + fi + + if [ -n "$ccenv_os" ]; then + return 0 + fi + + if [ -n "$ccenv_use_perk" ]; then + ccenv_framework=$($ccenv_perk -y $ccenv_image) + ccenv_os=${ccenv_framework#*-*-*-*} + fi + + if [ -z "$ccenv_os" ] && [ -n "$ccenv_objdump_bfd" ]; then + $ccenv_objdump_bfd -x $ccenv_image | grep -i 'DLL Name' \ + | grep 'cygwin1.dll' > /dev/null \ + && ccenv_os='cygwin' + fi + + if [ -z "$ccenv_os" ] && [ -n "$ccenv_objdump_bfd" ]; then + $ccenv_objdump_bfd -x $ccenv_image | grep -i 'DLL Name' \ + | grep 'msys-2.0.dll' > /dev/null \ + && ccenv_os='msys' + fi + + if [ -z "$ccenv_os" ] && [ -n "$ccenv_objdump_bfd" ]; then + $ccenv_objdump_bfd -x $ccenv_image \ + | grep -i 'DLL Name' | grep '.CRT' \ + > /dev/null \ + && $ccenv_objdump_bfd -x $ccenv_image \ + | grep -i 'DLL Name' | grep '.bss' \ + > /dev/null \ + && $ccenv_objdump_bfd -x $ccenv_image \ + | grep -i 'DLL Name' | grep '.tls' \ + > /dev/null \ + && ccenv_os='mingw' + fi +} + +ccenv_set_os_macho() +{ + case "$ccenv_cchost" in + *-apple-darwin* ) + ccenv_os='darwin' ;; + esac +} + +ccenv_set_os() +{ + ccenv_attr_prolog 'os name' + + case "$ccenv_cc_binfmt" in + PE ) + ccenv_set_os_pe ;; + MACHO ) + ccenv_set_os_macho ;; + esac + + if [ -n "$ccenv_os" ]; then + ccenv_attr_epilog "$ccenv_os" + return 0 + fi + + case "$ccenv_cchost" in + *-*-*-* ) + ccenv_tip=${ccenv_cchost%-*} + ccenv_os=${ccenv_tip#*-*-} + ;; + *-*-musl | *-*-gnu ) + ccenv_tip=${ccenv_cchost%-*} + ccenv_os=${ccenv_tip#*-} + ;; + *-*-* ) + ccenv_os=${ccenv_cchost#*-*-} + ;; + *-* ) + ccenv_os=${ccenv_cchost#*-} + ;; + esac + + if [ -z "$ccenv_os" ]; then + ccenv_os='anyos' + fi + + ccenv_attr_epilog "$ccenv_os" +} + +ccenv_set_os_flags() +{ + case "$ccenv_os" in + darwin ) + ccenv_cflags_os='-D_DARWIN_C_SOURCE' + ccenv_cflags_pic='-fPIC' + ;; + midipix ) + ccenv_cflags_os= + ccenv_cflags_pic='-fPIC' + ;; + cygwin ) + ccenv_cflags_os= + ccenv_cflags_pic= + ;; + msys | msys* | mingw | mingw* ) + ccenv_cflags_os='-U__STRICT_ANSI__' + ccenv_cflags_pic= + ;; + * ) + ccenv_cflags_os= + ccenv_cflags_pic='-fPIC' + ;; + esac +} + +ccenv_set_os_semantics() +{ + # binary_format - core_api - ex_api - dependency_resolution + + ccenv_attr_prolog 'os semantics' + + case "$ccenv_os" in + linux ) + ccenv_os_semantics='elf-posix-linux-ldso' + ;; + bsd ) + ccenv_os_semantics='elf-posix-bsd-ldso' + ;; + darwin ) + ccenv_os_semantics='macho-posix-osx-ldso' + ;; + midipix ) + ccenv_os_semantics='pe-posix-winnt-ldso' + ;; + cygwin ) + ccenv_os_semantics='pe-hybrid-winnt-unsafe' + ;; + msys ) + ccenv_os_semantics='pe-hybrid-winnt-unsafe' + ;; + mingw ) + ccenv_os_semantics='pe-win32-winnt-unsafe' + ;; + esac + + if [ -n "$ccenv_os_semantics" ]; then + ccenv_attr_epilog "$ccenv_os_semantics" + return 0 + fi + + if [ -n "$ccenv_cc_binfmt" ]; then + ccenv_os_semantics_pattern='%s-posix-anyos-unknown' + ccenv_os_semantics=$(printf \ + "$ccenv_os_semantics_pattern" \ + "$ccenv_cc_binfmt" \ + | tr '[:upper:]' '[:lower:]') + else + ccenv_os_semantics='unknown-posix-anyos-unknown' + fi + + ccenv_attr_epilog "$ccenv_os_semantics" +} + +ccenv_set_os_dso_format() +{ + ccenv_attr_prolog 'os dso format' + + case "$ccenv_cc_arfmt" in + common ) + ccenv_cc_sofmt="$ccenv_cc_binfmt" + ;; + + bigaf ) + ccenv_libgcc_s_a_header=$(od -b -N8 \ + $($ccenv_cc -print-file-name=libgcc_s.a) \ + 2>/dev/null \ + | head -n1) + + ccenv_libgcc_s_so_header=$(od -b -N8 \ + $($ccenv_cc -print-file-name=libgcc_s.so) \ + 2>/dev/null \ + | head -n1) + + if [ "$ccenv_libgcc_s_a_header" = "$ccenv_bigaf_header" ]; then + ccenv_cc_sofmt='bigaf' + elif [ "$ccenv_libgcc_s_so_header" = "$ccenv_bigaf_header" ]; then + ccenv_cc_sofmt='bigaf' + else + ccenv_cc_sofmt="$ccenv_cc_binfmt" + fi + ;; + + aiaff ) + ccenv_libgcc_s_a_header=$(od -b -N8 \ + $($ccenv_cc -print-file-name=libgcc_s.a) \ + | head -n1) + + ccenv_libgcc_s_so_header=$(od -b -N8 \ + $($ccenv_cc -print-file-name=libgcc_s.so) \ + | head -n1) + + if [ "$ccenv_libgcc_s_a_header" = "$ccenv_aiaff_header" ]; then + ccenv_cc_sofmt='aiaff' + elif [ "$ccenv_libgcc_s_so_header" = "$ccenv_aiaff_header" ]; then + ccenv_cc_sofmt='aiaff' + else + ccenv_cc_sofmt="$ccenv_cc_binfmt" + fi + ;; + esac + + if [ "$ccenv_cfgtype" = 'host' ]; then + case "$ccenv_cc_sofmt" in + bigaf | aiaff ) + mb_shared_lib_cmd='$(AR) -rcs' + mb_shared_lib_ldflags= + ;; + + * ) + mb_shared_lib_cmd='$(CC) -shared -o' + mb_shared_lib_ldflags='$(LDFLAGS_SHARED)' + ;; + esac + fi + + ccenv_attr_epilog "$ccenv_cc_sofmt" +} + +ccenv_set_os_dso_exrules() +{ + ccenv_attr_prolog 'os dso exrules' + + case "$ccenv_os" in + midipix ) + ccenv_os_dso_exrules='pe-mdso' + ;; + * ) + if [ "$ccenv_cc_binfmt" = 'PE' ]; then + ccenv_os_dso_exrules='pe-dlltool' + else + ccenv_os_dso_exrules='default' + fi + esac + + ccenv_attr_epilog "$ccenv_os_dso_exrules" +} + +ccenv_set_os_dso_linkage() +{ + # todo: PIC, PIE, and friends + ccenv_attr_prolog 'os linkage' + ccenv_os_dso_linkage='default' + ccenv_attr_epilog "$ccenv_os_dso_linkage" +} + +ccenv_set_os_dso_patterns_darwin() +{ + ccenv_os_app_prefix= + ccenv_os_app_suffix= + + ccenv_os_lib_prefix=lib + ccenv_os_lib_suffix=.dylib + + ccenv_os_implib_ext=.invalid + ccenv_os_libdef_ext=.invalid + + ccenv_os_archive_ext=.a + ccenv_os_soname=symlink + + ccenv_os_lib_prefixed_suffix= + ccenv_os_lib_suffixed_suffix='$(OS_LIB_SUFFIX)' +} + +ccenv_set_os_dso_patterns_mdso() +{ + ccenv_os_app_prefix= + ccenv_os_app_suffix= + + ccenv_os_lib_prefix=lib + ccenv_os_lib_suffix=.so + + ccenv_os_implib_ext=.lib.a + ccenv_os_libdef_ext=.so.def + + ccenv_os_archive_ext=.a + ccenv_os_soname=symlink + + ccenv_os_lib_prefixed_suffix='$(OS_LIB_SUFFIX)' + ccenv_os_lib_suffixed_suffix= +} + +ccenv_set_os_dso_patterns_dlltool() +{ + ccenv_os_app_prefix= + ccenv_os_app_suffix=.exe + + ccenv_os_lib_prefix=lib + ccenv_os_lib_suffix=.dll + + ccenv_os_implib_ext=.dll.a + ccenv_os_libdef_ext=.def + + ccenv_os_archive_ext=.a + ccenv_os_soname=copy + + ccenv_os_lib_prefixed_suffix='$(OS_LIB_SUFFIX)' + ccenv_os_lib_suffixed_suffix= +} + +ccenv_set_os_dso_patterns_default() +{ + ccenv_os_app_prefix= + ccenv_os_app_suffix= + + ccenv_os_lib_prefix=lib + ccenv_os_lib_suffix=.so + + ccenv_os_implib_ext=.invalid + ccenv_os_libdef_ext=.invalid + + ccenv_os_archive_ext=.a + ccenv_os_soname=symlink + + ccenv_os_lib_prefixed_suffix='$(OS_LIB_SUFFIX)' + ccenv_os_lib_suffixed_suffix= +} + +ccenv_set_os_dso_patterns() +{ + # sover: .so.x.y.z + # verso: .x.y.z.so + + case "$ccenv_os" in + darwin ) + ccenv_set_os_dso_patterns_darwin + ;; + midipix ) + ccenv_set_os_dso_patterns_mdso + ;; + cygwin | msys | mingw ) + ccenv_set_os_dso_patterns_dlltool + ;; + * ) + ccenv_set_os_dso_patterns_default + ;; + esac +} + +ccenv_set_os_pe_switches() +{ + if [ "$ccenv_cc_binfmt" = 'PE' ] && [ -z "$ccenv_pe_subsystem" ]; then + case "$ccenv_os" in + midipix | mingw ) + ccenv_pe_subsystem='windows' + ;; + * ) + ccenv_pe_subsystem='console' + ;; + esac + fi +} + +ccenv_output_defs() +{ + ccenv_in="$mb_project_dir/sofort/ccenv/ccenv.in" + ccenv_mk="$mb_pwd/ccenv/$ccenv_cfgtype.mk" + ccenv_tmp= + + if [ "$ccenv_cc_binfmt" = 'PE' ]; then + ccenv_pe="$mb_project_dir/sofort/ccenv/pedefs.in" + ccenv_in="$ccenv_in $ccenv_pe" + fi + + if [ $ccenv_cfgtype = 'native' ]; then + + ccenv_tmp=$(mktemp ./tmp_XXXXXXXXXXXXXXXX) + + sed \ + -e 's/^[[:space:]]*$/@/g' \ + -e 's/^/NATIVE_/' \ + -e 's/NATIVE_@//g' \ + -e 's/NATIVE_#/#/g' \ + -e 's/ =/=/g' \ + -e 's/ +=/+=/g' \ + $(printf '%s ' $ccenv_in) \ + > "$ccenv_tmp" + + ccenv_in="$ccenv_tmp" + else + unset ccenv_tmp + fi + + ccenv_var_defs= + ccenv_sed_substs= + + ccenv_vars=$(cut -d'=' -f1 "$mb_project_dir/sofort/ccenv/ccenv.vars" \ + | grep -v '^#'); + + ccenv_exvars="ccenv_cfgtype ccenv_makevar_prefix" + + for __var in $(printf '%s' "$ccenv_vars $ccenv_exvars"); do + ccenv_sed_subst=$(printf '%s %s%s%s' \ + '-e' "'s^@$__var@" \ + "^___${__var}___" \ + "^g'") + + ccenv_sed_substs="$ccenv_sed_substs $ccenv_sed_subst" + + ccenv_var_def=$(printf '%s%s="${%s}"' "-D" "___${__var}___" "${__var}") + eval ccenv_var_defs='"$ccenv_var_defs "$ccenv_var_def' + done + + eval sed $ccenv_sed_substs $(printf '%s ' $ccenv_in) \ + | eval m4 $ccenv_var_defs - \ + | sed -e 's/[[:blank:]]*$//g' \ + > "$ccenv_mk" + + if [ "$ccenv_cfgtype" = 'host' ]; then + for __var in $(printf '%s' "$ccenv_vars"); do + ccenv_src_var=$__var + ccenv_dst_var=mb_${__var#*ccenv_} + ccenv_var_expr='${'$ccenv_src_var':-}' + eval $ccenv_dst_var=$ccenv_var_expr + + done + + mb_host=$ccenv_host + mb_cchost=$ccenv_cchost + else + for __var in $(printf '%s' "$ccenv_vars"); do + ccenv_src_var=$__var + ccenv_dst_var=mb_native_${__var#*ccenv_} + ccenv_var_expr='${'$ccenv_src_var':-}' + eval "$ccenv_dst_var=$ccenv_var_expr" + done + + mb_native_host=$ccenv_host + mb_native_cchost=$ccenv_cchost + fi + + if [ -n "${ccenv_tmp:-}" ]; then + rm -f "$ccenv_tmp" + unset ccenv_tmp + fi +} + +ccenv_dso_verify() +{ + ccenv_str='int foo(int x){return ++x;}' + ccenv_cmd="$ccenv_cc -xc - -shared -o a.out" + + rm -f a.out + + printf '%s' "$ccenv_str" | $(printf %s "$ccenv_cmd") \ + > /dev/null 2>&3 \ + || mb_disable_shared=yes + + rm -f a.out +} + +ccenv_clean_up() +{ + rm -f $ccenv_image +} + +ccenv_common_init() +{ + . "$mb_project_dir/sofort/ccenv/ccenv.vars" + + ccenv_cfgtype=$1 + ccenv_cfgfile="$mb_pwd/ccenv/$ccenv_cfgtype.mk" + ccenv_freestd= + ccenv_cchost= + + if [ $ccenv_cfgtype = 'native' ]; then + ccenv_makevar_prefix='NATIVE_' + ccenv_image='./ccenv/native.a.out' + else + ccenv_makevar_prefix= + ccenv_image='./ccenv/host.a.out' + fi + + if [ $ccenv_cfgtype = 'native' ]; then + ccenv_prefixes= + elif [ -n "$mb_cross_compile" ]; then + ccenv_prefixes="$mb_cross_compile" + elif [ -n "$mb_host" ]; then + ccenv_prefixes="$mb_host-" + else + ccenv_prefixes= + fi + + if [ $ccenv_cfgtype = 'host' ]; then + ccenv_tflags= + ccenv_cflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" \ + OS_DSO_EXRULES=default \ + OS_SONAME=symlink \ + OS_ARCHIVE_EXT='.a' \ + .cflags-host) + + ccenv_cflags="${ccenv_cflags#*: }" + + ccenv_cc="$mb_user_cc" + ccenv_cpp="$mb_user_cpp" + ccenv_cxx="$mb_user_cxx" + + ccenv_pe_subsystem="$mb_pe_subsystem" + ccenv_pe_image_base="$mb_pe_image_base" + else + ccenv_tflags= + ccenv_cflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" \ + OS_DSO_EXRULES=default \ + OS_SONAME=symlink \ + OS_ARCHIVE_EXT='.a' \ + .cflags-native) + + ccenv_cflags="${ccenv_cflags#*: }" + + ccenv_cc="$mb_native_cc" + ccenv_cpp="$mb_native_cpp" + ccenv_cxx="$mb_native_cxx" + + ccenv_pe_subsystem="$mb_native_pe_subsystem" + ccenv_pe_image_base="$mb_native_pe_image_base" + fi +} + +ccenv_set_characteristics() +{ + ccenv_set_cc_host + ccenv_set_cc_bits + ccenv_set_cc_binfmt + ccenv_set_cc_underscore +} + +ccenv_set_toolchain_variables() +{ + ccenv_common_init $1 + ccenv_set_cc + ccenv_set_cpp + ccenv_set_cxx + ccenv_set_primary_tools + ccenv_set_tool_variants + ccenv_set_characteristics + + ccenv_set_os + ccenv_set_os_flags + ccenv_set_os_semantics + ccenv_set_os_dso_format + ccenv_set_os_dso_exrules + ccenv_set_os_dso_linkage + ccenv_set_os_dso_patterns + ccenv_set_os_pe_switches + + ccenv_output_defs + ccenv_clean_up + + eval 'ccenv_'${ccenv_cfgtype}'_cc'=\'$ccenv_cc\' +} + +ccenv_set_host_variables() +{ + output_script_status ${mb_script} \ + 'detect and query host (targeted) system' + + ccenv_set_toolchain_variables 'host' + ccenv_dso_verify +} + +ccenv_set_native_variables() +{ + output_script_status ${mb_script} \ + 'detect and query native (local build) system' + + if [ _$mb_ccenv_skip_native != _yes ]; then + ccenv_set_toolchain_variables 'native' + fi +} diff --git a/sofort/ccenv/ccenv.usage b/sofort/ccenv/ccenv.usage new file mode 100644 index 0000000..8eab780 --- /dev/null +++ b/sofort/ccenv/ccenv.usage @@ -0,0 +1,78 @@ +A few words on sofort's tool-finding logic +========================================== + +# the goals of sofort's tool-finding logic are: +- follow a clear, transparent, and consistent logic +- allow users to easily specify per-build preferences +- allow distros to easily and cleanly use site-wide settings + + +# three-way terminology: +- native machine: where make(1) will be running. +- host machine: where the package's program or libraries will execute. +- target machine: where code generated by the host package will execute. + +! NOTE, however, that the host/target distinction is only relevant + when building a code-generating utility (e.g. a compiler), and that + the two are otherwise rather synonymous. Moreover, in practice it + is much more common to see configure scripts being invoked with a + --target= argument specifying the host, than with a + --host= argument. + + +# invocation and names of binary tools: +- agnostic names (ar, nm, objdump, ...) +- branded names (llvm-ar, llvm-nm, llvm-objdump, ...) +- machine-prefixed agnostic names (x86_64-nt64-midipix-ar, ...) +- machine-prefixed branded names (x86_64-linux-gnu-gcc-ar, ...) +- machine-specifying branded tools, as in + llvm-ar --target=x86_64-linux. + + +# cross-compilation: default search order: +- machine-prefixed agnostic tools +- machine-prefixed branded tools, starting with the prefix + most commonly associated with the selected compiler (that is, + ``gcc'' when using gcc, and ``llvm'' when using clang) +- (machine-specifying) agnostic tools +- (machine-speficying) branded tools, starting once again with the + prefix most commonly associated with the selected compiler + + +# native builds: default search order: +- agnostic tools +- machine-prefixed agnostic tools +- machine-prefixed branded tools +- branded tools + + +# using an alternate search order: +- --toolchain= (e.g. --toolchain=llvm) --> search for tools + that begin with before searching for agnostic tools + + +# restricting which tools may be searched: +- --zealous --> only search for agnostic tools +- --zealous= --> only search for -branded tools + + +# per-tool overrides, by example of the ``ar'' tool: +- AR=ar --> set AR to $(command -v ar) +- AR=/path/to/ar --> set AR to the specified absolute path + + +# host generated config file and variable names: +- ccenv/host.mk +- AR, NM, OBJDUMP, ... + + +# native generated config file and variable names: +- ccenv/native.mk +- NATIVE_AR, NATIVE_NM, NATIVE_OBJDUMP, ... + + +# distro: site-wide preferences +- --ccenv=/path/to/site-specific/ccenv +- use the above to create ccenv as a symlink to + /path/to/site-specific/ccenv, and to accordingly + skip configure's tool-finding step. diff --git a/sofort/ccenv/ccenv.vars b/sofort/ccenv/ccenv.vars new file mode 100644 index 0000000..07552af --- /dev/null +++ b/sofort/ccenv/ccenv.vars @@ -0,0 +1,88 @@ +# system flavor +ccenv_os= +ccenv_os_semantics= + +ccenv_os_dso_exrules= +ccenv_os_dso_linkage= + +ccenv_os_app_prefix= +ccenv_os_app_suffix= + +ccenv_os_lib_prefix= +ccenv_os_lib_suffix= + +ccenv_os_implib_ext= +ccenv_os_libdef_ext= + +ccenv_os_archive_ext= +ccenv_os_soname= + +ccenv_os_lib_prefixed_suffix= +ccenv_os_lib_suffixed_suffix= + +# characteristics +ccenv_cc_host= +ccenv_cc_bits= + +ccenv_cc_arfmt= +ccenv_cc_sofmt= +ccenv_cc_binfmt= +ccenv_cc_underscore= + +ccenv_cc_arch_bfd= +ccenv_cc_arch_llvm= + +# incompatible tool variants +ccenv_as_asm= +ccenv_as_ll= +ccenv_as_mc= + +ccenv_ld_bfd= +ccenv_ld_gold= +ccenv_ld_lld= + +ccenv_objdump_bfd= +ccenv_objdump_llvm= + +ccenv_readelf_bfd= +ccenv_readelf_llvm= + +# tool variables +ccenv_cc= +ccenv_cpp= +ccenv_cxx= + +ccenv_as= +ccenv_ld= + +ccenv_ar= +ccenv_nm= +ccenv_objdump= +ccenv_ranlib= +ccenv_size= +ccenv_strip= +ccenv_strings= + +ccenv_addr2line= +ccenv_cov= +ccenv_cxxfilt= +ccenv_objcopy= + +ccenv_elfedit= +ccenv_readelf= +ccenv_readobj= + +ccenv_perk= +ccenv_mdso= +ccenv_dlltool= + +ccenv_windmc= +ccenv_windrc= + +# cflags +ccenv_cflags_os= +ccenv_cflags_pic= + +# pe +ccenv_pe_subsystem= +ccenv_pe_image_base= diff --git a/sofort/ccenv/pedefs.in b/sofort/ccenv/pedefs.in new file mode 100644 index 0000000..300d990 --- /dev/null +++ b/sofort/ccenv/pedefs.in @@ -0,0 +1,4 @@ +# @ccenv_cfgtype@ pe switches +PE_SUBSYSTEM = @ccenv_pe_subsystem@ +PE_IMAGE_BASE = @ccenv_pe_image_base@ + diff --git a/sofort/cfgtest/cfgtest.sh b/sofort/cfgtest/cfgtest.sh new file mode 100644 index 0000000..9c13b67 --- /dev/null +++ b/sofort/cfgtest/cfgtest.sh @@ -0,0 +1,564 @@ +# cfgtest.sh: sofort's config test framework, +# for use from within a project's custom cfgdefs.sh. + +# this file is covered by COPYING.SOFORT. + +# in the common scenario, host-specific tests are preceded +# by a single invocation of cfgtest_host_section, whereas +# native (build) system tests are preceded by the invocation +# of cfgtest_native_section. + +# cfgdefs fraework variables: +# mb_cfgtest_cc: the compiler used for the current test +# mb_cfgtest_cflags: the compiler flags used for the current test +# mb_cfgtest_cfgtype: the type of the current test (host/native) +# mb_cfgtest_makevar: the make variable affected by the current test +# mb_cfgtest_headers: headers for ad-hoc inclusion with the current test + + +cfgtest_newline() +{ + printf '\n' >> $mb_pwd/cfgdefs.mk +} + + +cfgtest_comment() +{ + mb_internal_str='#' + + for mb_internal_arg ; do + mb_internal_str="$mb_internal_str $mb_internal_arg" + done + + printf '%s\n' "$mb_internal_str" >> $mb_pwd/cfgdefs.mk +} + + +cfgtest_host_section() +{ + mb_cfgtest_cc="$ccenv_host_cc" + mb_cfgtest_cfgtype='host' + mb_cfgtest_cflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" .cflags-host) + mb_cfgtest_cflags="${mb_cfgtest_cflags#*: }" + + mb_cfgtest_ldflags="$mb_ldflags_cmdline" + mb_cfgtest_ldflags="$mb_cfgtest_ldflags $mb_ldflags_debug" + mb_cfgtest_ldflags="$mb_cfgtest_ldflags $mb_ldflags_common" + mb_cfgtest_ldflags="$mb_cfgtest_ldflags $mb_ldflags_strict" + mb_cfgtest_ldflags="$mb_cfgtest_ldflags $mb_ldflags_config" + mb_cfgtest_ldflags="$mb_cfgtest_ldflags $mb_ldflags_sysroot" + mb_cfgtest_ldflags="$mb_cfgtest_ldflags $mb_ldflags_path" + mb_cfgtest_ldflags="$mb_cfgtest_ldflags $mb_ldflags_last" + + cfgtest_comment 'host-specific tests' +} + + +cfgtest_native_section() +{ + mb_cfgtest_cc="$mb_native_cc" + mb_cfgtest_cfgtype='native' + mb_cfgtest_cflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" .cflags-native) + mb_cfgtest_cflags="${mb_cfgtest_cflags#*: }" + mb_cfgtest_ldflags="$mb_native_ldflags" + + cfgtest_comment 'native system tests' +} + + +cfgtest_prolog() +{ + cfgtest_line_dots='.......................' + cfgtest_line_dots="${cfgtest_line_dots}${cfgtest_line_dots}" + cfgtest_tool_desc=" == trying ${mb_cfgtest_cfgtype} ${1}: ${2}" + cfgtest_tool_dlen="${#cfgtest_line_dots}" + + printf '\n%s\n' '________________________' >&3 + printf "cfgtest: probing for ${mb_cfgtest_cfgtype} ${1}: ${2}\n\n" >&3 + printf "%${cfgtest_tool_dlen}.${cfgtest_tool_dlen}s" \ + "${cfgtest_tool_desc} ${mb_line_dots}" +} + + +cfgtest_epilog() +{ + cfgtest_line_dots='.......................' + cfgtest_tool_dlen="$((${#cfgtest_line_dots} - ${#2}))" + + printf "%${cfgtest_tool_dlen}.${cfgtest_tool_dlen}s %s.\n" \ + "${cfgtest_line_dots}" "${2}" + + if [ "${2}" = '-----' ]; then + printf '\n\ncfgtest: %s is missing or cannot be found.\n' "${1}" >&3 + printf '%s\n' '------------------------' >&3 + return 1 + elif [ "${1}" = 'size-of-type' ] && [ "${2}" = '(error)' ]; then + printf '\n\ncfgtest: could not determine size of type.\n' >&3 + printf '%s\n' '------------------------' >&3 + return 1 + elif [ "${2}" = '(error)' ]; then + printf '\n\ncfgtest: %s is not defined or cannot be used.\n' "${1}" >&3 + printf '%s\n' '------------------------' >&3 + return 1 + fi +} + + +cfgtest_entity_size_prolog() +{ + cfgtest_line_dots='.......................' + cfgtest_line_dots="${cfgtest_line_dots}${cfgtest_line_dots}" + cfgtest_tool_desc=" == checking size of ${mb_cfgtest_cfgtype} type: ${@}" + cfgtest_tool_dlen="${#cfgtest_line_dots}" + + printf '\n%s\n' '________________________' >&3 + printf "cfgtest: checking size of ${mb_cfgtest_cfgtype} type: ${@}\n\n" >&3 + + printf "%${cfgtest_tool_dlen}.${cfgtest_tool_dlen}s" \ + "${cfgtest_tool_desc} ${mb_line_dots}" +} + + +cfgtest_makevar_append() +{ + mb_internal_str='+=' + + for mb_internal_arg ; do + if ! [ -z "$mb_internal_arg" ]; then + mb_internal_str="$mb_internal_str $mb_internal_arg" + fi + done + + printf '%-24s%s\n' "$mb_cfgtest_makevar" "$mb_internal_str" \ + >> $mb_pwd/cfgdefs.mk + + unset cfgtest_internal_unit_test +} + + +cfgtest_cflags_append() +{ + if [ $mb_cfgtest_cfgtype = 'host' ]; then + mb_internal_makevar='CFLAGS_CONFIG' + else + mb_internal_makevar='NATIVE_CFLAGS' + fi + + mb_cfgtest_makevar_saved=$mb_cfgtest_makevar + mb_cfgtest_makevar=$mb_internal_makevar + + cfgtest_makevar_append "$@" + mb_cfgtest_makevar=$mb_cfgtest_makevar_saved +} + + +cfgtest_ldflags_append() +{ + if [ $mb_cfgtest_cfgtype = 'host' ]; then + mb_internal_makevar='LDFLAGS_CONFIG' + else + mb_internal_makevar='NATIVE_LDFLAGS' + fi + + mb_cfgtest_makevar_saved=$mb_cfgtest_makevar + mb_cfgtest_makevar=$mb_internal_makevar + + cfgtest_makevar_append "$@" + mb_cfgtest_makevar=$mb_cfgtest_makevar_saved +} + + +cfgtest_header_presence() +{ + cfgtest_prolog 'header' "${1}" + + printf '%s -E -xc - \\\n' "$mb_cfgtest_cc" >&3 + + for cfgtest_cflag in $mb_cfgtest_cflags; do + printf '\t%s \\\n' "$cfgtest_cflag" >&3 + done + + printf '\t%s\n\n' '--include='"${1}" >&3 + + cfgtest_cmd=$(printf '%s -E -xc - %s %s' \ + "$mb_cfgtest_cc" "$mb_cfgtest_cflags" \ + '--include='"${1}") + + eval $(printf '%s' "$cfgtest_cmd") \ + < /dev/null \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'header' '-----' \ + || return + + mb_internal_str=$(printf '%s%s' '-DHAVE_' "${1}" \ + | sed -e 's/\./_/g' -e 's@/@_@g' \ + | tr "[:lower:]" "[:upper:]") + + if [ -z ${cfgtest_internal_unit_test:-} ]; then + cfgtest_cflags_append "$mb_internal_str" + else + cfgtest_makevar_append "$mb_internal_str" + fi + + printf 'cfgtest: %s header <%s> was found and may be included.\n' \ + "$mb_cfgtest_cfgtype" "${1}" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'header' "${1}" +} + + +cfgtest_header_absence() +{ + cfgtest_prolog 'header absence' "${1}" + + printf '%s -E -xc - \\\n' "$mb_cfgtest_cc" >&3 + + for cfgtest_cflag in $mb_cfgtest_cflags; do + printf '\t%s \\\n' "$cfgtest_cflag" >&3 + done + + printf '\t%s\n\n' '--include='"${1}" >&3 + + cfgtest_cmd=$(printf '%s -E -xc - %s %s' \ + "$mb_cfgtest_cc" "$mb_cfgtest_cflags" \ + '--include='"${1}") + + eval $(printf '%s' "$cfgtest_cmd") \ + < /dev/null \ + > /dev/null 2>&3 \ + && cfgtest_epilog 'header' "${1}" \ + && return + + mb_internal_str=$(printf '%s%s' '-DHAVE_NO_' "$@" \ + | sed -e 's/\./_/g' -e 's@/@_@g' \ + | tr "[:lower:]" "[:upper:]") + + if [ -z ${cfgtest_internal_unit_test:-} ]; then + cfgtest_cflags_append "$mb_internal_str" + else + cfgtest_makevar_append "$mb_internal_str" + fi + + printf 'cfgtest: %s header <%s> may not be included.\n' \ + "$mb_cfgtest_cfgtype" "${1}" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'header' '-----' +} + + +cfgtest_interface_presence() +{ + cfgtest_prolog 'interface' "${1}" + + mb_internal_cflags= + + for mb_header in $mb_cfgtest_headers; do + mb_internal_cflags="$mb_internal_cflags --include=$mb_header" + done + + cfgtest_code_snippet=$(printf 'void * addr = &%s;' "${1}") + + printf 'printf %s "%s" \\\n' "'%s'" "$cfgtest_code_snippet" >&3 + printf '| %s -S -xc - -o -' "$mb_cfgtest_cc" >&3 + + for cfgtest_cflag in $mb_cfgtest_cflags; do + printf ' \\\n\t%s' "$cfgtest_cflag" >&3 + done + + for cfgtest_cflag in $mb_internal_cflags; do + printf ' \\\n\t%s' "$cfgtest_cflag" >&3 + done + + printf '\n\n' >&3 + + cfgtest_cmd=$(printf '%s -S -xc - -o - %s %s' \ + "$mb_cfgtest_cc" "$mb_cfgtest_cflags" \ + "$mb_internal_cflags") + + printf '%s' "$cfgtest_code_snippet" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'interface' '(error)' \ + || return + + mb_internal_str=$(printf '%s%s' '-DHAVE_' "$@" \ + | sed -e 's/\./_/g' \ + | tr "[:lower:]" "[:upper:]") + + if [ -z ${cfgtest_internal_unit_test:-} ]; then + cfgtest_cflags_append "$mb_internal_str" + else + cfgtest_makevar_append "$mb_internal_str" + fi + + printf 'cfgtest: %s interface `%s'"'"' is available.\n' \ + "$mb_cfgtest_cfgtype" "${1}" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'interface' "${1}" + + return 0 +} + + +cfgtest_decl_presence() +{ + cfgtest_prolog 'decl' "${1}" + + mb_internal_cflags= + + for mb_header in $mb_cfgtest_headers; do + mb_internal_cflags="$mb_internal_cflags --include=$mb_header" + done + + cfgtest_code_snippet=$(printf 'void * any = (void *)(%s);' "${1}") + + printf 'printf %s "%s" \\\n' "'%s'" "$cfgtest_code_snippet" >&3 + printf '| %s -S -xc - -o -' "$mb_cfgtest_cc" >&3 + + for cfgtest_cflag in $mb_cfgtest_cflags; do + printf ' \\\n\t%s' "$cfgtest_cflag" >&3 + done + + for cfgtest_cflag in $mb_internal_cflags; do + printf ' \\\n\t%s' "$cfgtest_cflag" >&3 + done + + printf '\n\n' >&3 + + cfgtest_cmd=$(printf '%s -S -xc - -o - %s %s' \ + "$mb_cfgtest_cc" "$mb_cfgtest_cflags" \ + "$mb_internal_cflags") + + printf '%s' "$cfgtest_code_snippet" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'decl' '(error)' \ + || return + + # does the argument solely consist of the macro or enum member name? + mb_internal_str=$(printf '%s' "$@" | tr -d '[a-z][A-Z][0-9][_]') + + if [ -n "$mb_internal_str" ]; then + cfgtest_epilog 'decl' '(defined)' + return 0 + fi + + mb_internal_str=$(printf '%s%s' '-DHAVE_DECL_' "$@" \ + | sed -e 's/\./_/g' \ + | tr "[:lower:]" "[:upper:]") + + if [ -z ${cfgtest_internal_unit_test:-} ]; then + cfgtest_cflags_append "$mb_internal_str" + else + cfgtest_makevar_append "$mb_internal_str" + fi + + printf 'cfgtest: `%s'"'"' is defined for the %s system.\n' \ + "${1}" "$mb_cfgtest_cfgtype" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'decl' '(defined)' + + return 0 +} + + +cfgtest_type_size() +{ + cfgtest_entity_size_prolog "$@" + + mb_internal_cflags='' + mb_internal_size='' + mb_internal_test='char x[(sizeof(%s) == %s) ? 1 : -1];' + + for mb_header in $mb_cfgtest_headers; do + mb_internal_cflags="$mb_internal_cflags --include=$mb_header" + done + + for mb_internal_guess in 8 4 2 1 16 32 64 128; do + if [ -z $mb_internal_size ]; then + mb_internal_type="$@" + + mb_internal_str=$(printf "$mb_internal_test" \ + "$mb_internal_type" \ + "$mb_internal_guess") + + printf '%s' "$mb_internal_str" \ + | eval $mb_cfgtest_cc -S -xc - -o - \ + $mb_cfgtest_cflags \ + $mb_internal_cflags \ + > /dev/null 2>/dev/null \ + && mb_internal_size=$mb_internal_guess + fi + done + + # unrecognized type, or type size not within range + if [ -z $mb_internal_size ]; then + cfgtest_epilog 'size-of-type' '(error)' + return 1 + fi + + # -DSIZEOF_TYPE=SIZE + mb_internal_str=$(printf '%s%s=%s' '-DSIZEOF_' \ + "$mb_internal_type" \ + "$mb_internal_size" \ + | sed -e 's/\ /_/g' -e 's/*/P/g' \ + | tr "[:lower:]" "[:upper:]") + + if [ -z ${cfgtest_internal_unit_test:-} ]; then + cfgtest_cflags_append "$mb_internal_str" + else + cfgtest_makevar_append "$mb_internal_str" + fi + + printf 'cfgtest: size of type `%s'"'"' determined to be %s\n' \ + "${@}" "$mb_internal_size" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'size-of-type' "$mb_internal_size" + + return 0 +} + + +cfgtest_code_snippet() +{ + mb_internal_cflags='' + mb_internal_test="$@" + + for mb_header in $mb_cfgtest_headers; do + mb_internal_cflags="$mb_internal_cflags --include=$mb_header" + done + + printf '%s' "$mb_internal_test" \ + | eval $mb_cfgtest_cc -S -xc - -o - \ + $mb_cfgtest_cflags \ + $mb_internal_cflags \ + > /dev/null 2>/dev/null \ + || return 1 + + return 0 +} + + +cfgtest_code_snippet_asm() +{ + mb_internal_cflags='' + mb_internal_test="$@" + + cfgtest_tmp=$(mktemp ./tmp_XXXXXXXXXXXXXXXX) + cfgtest_ret=1 + + for mb_header in $mb_cfgtest_headers; do + mb_internal_cflags="$mb_internal_cflags --include=$mb_header" + done + + printf '%s' "$mb_internal_test" \ + | eval $mb_cfgtest_cc -c -xc - \ + -o $cfgtest_tmp \ + $mb_cfgtest_cflags \ + $mb_internal_cflags \ + > /dev/null 2>/dev/null \ + && cfgtest_ret=0 + + rm -f "$cfgtest_tmp" + unset cfgtest_tmp + + return $cfgtest_ret +} + + +cfgtest_library_presence() +{ + cfgtest_libs= + cfgtest_spc= + + for cfgtest_lib in ${@}; do + cfgtest_libs="$cfgtest_libs$cfgtest_spc$cfgtest_lib" + cfgtest_spc=' ' + done + + if [ "${1}" = "$cfgtest_libs" ]; then + cfgtest_prolog 'library' "${1#*-l}" + else + cfgtest_prolog 'lib module' '(see config.log)' + fi + + cfgtest_code_snippet='int main(void){return 0;}' + + printf 'printf %s "%s" \\\n' "'%s'" "$cfgtest_code_snippet" >&3 + printf '| %s -o a.out -xc -' "$mb_cfgtest_cc" >&3 + + for cfgtest_cflag in $mb_cfgtest_cflags; do + printf ' \\\n\t%s' "$cfgtest_cflag" >&3 + done + + for cfgtest_lib in ${@}; do + printf ' \\\n\t%s' "$cfgtest_lib" >&3 + done + + printf '\n\n' >&3 + + cfgtest_cmd=$(printf '%s -o a.out -xc - %s %s %s' \ + "$mb_cfgtest_cc" "$mb_cfgtest_cflags" \ + "$mb_cfgtest_ldflags" "$cfgtest_libs") + + printf '%s' "$cfgtest_code_snippet" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'library' '-----' \ + || return 1 + + rm -f a.out + + printf 'cfgtest: `%s'"'"' was accepted by the linker driver.\n' \ + "$cfgtest_libs" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'library' '(present)' + + return 0 +} + + +cfgtest_unit_header_presence() +{ + cfgtest_internal_unit_test='unit_test' + cfgtest_header_presence "$@" || return 1 + return 0 +} + + +cfgtest_unit_header_absence() +{ + cfgtest_internal_unit_test='unit_test' + cfgtest_header_absence "$@" || return 1 + return 0 +} + + +cfgtest_unit_interface_presence() +{ + cfgtest_internal_unit_test='unit_test' + cfgtest_interface_presence "$@" || return 1 + return 0 +} + + +cfgtest_unit_decl_presence() +{ + cfgtest_internal_unit_test='unit_test' + cfgtest_decl_presence "$@" || return 1 + return 0 +} + + +cfgtest_unit_type_size() +{ + cfgtest_internal_unit_test='unit_test' + cfgtest_type_size "$@" || return 1 + return 0 +} diff --git a/sofort/config/cfgdefs.in b/sofort/config/cfgdefs.in new file mode 100644 index 0000000..fd4b947 --- /dev/null +++ b/sofort/config/cfgdefs.in @@ -0,0 +1,6 @@ +# changes made to this file will be gone the next time +# you run ./configure. + +# for persistent post-configure, ad-hoc changes to the +# build project, use usrdefs.mk instead. + diff --git a/sofort/config/config.vars b/sofort/config/config.vars new file mode 100644 index 0000000..903abd5 --- /dev/null +++ b/sofort/config/config.vars @@ -0,0 +1,143 @@ +package +nickname +project_dir +source_dir +git_reference_index +custom_install_headers +avoid_version + +ccenv +ccenv_create_log +ccenv_skip_native + +pkgname +pkgdesc +pkgusrc +pkgrepo +pkgpsrc +pkgdurl +pkgbugs +pkghome +pkgdefs +pkglibs + +srcinfo +srcsite + +pgprkey +pgpskey + +rawball +rawball_url +rawball_sha256 +modball +modball_url +modball_sha256 +srcball +srcball_url +srcball_sha256 + + +make +makefile +makemode + +build +host +cchost +cfghost +target +arch +compiler +toolchain +zealous +sysroot +cross_compile +shell + +prefix +exec_prefix +bindir +sbindir +libdir +includedir +oldincludedir +mandir +docdir +libexecdir + +sysconfdir +sharedstatedir +localstatedir +runstatedir +datarootdir +datadir +infodir +localedir +htmldir +dvidir +pdfdir +psdir + +cflags +cflags_common +cflags_debug +cflags_cmdline +cflags_config +cflags_sysroot +cflags_os +cflags_site +cflags_path +cflags_strict +cflags_util +cflags_last +cflags_once + +ldflags +ldflags_common +ldflags_debug +ldflags_cmdline +ldflags_config +ldflags_sysroot +ldflags_path +ldflags_strict +ldflags_util +ldflags_last +ldflags_once + +cc +cpp +cxx + +user_cc +user_cpp +user_cxx + +pe_subsystem +pe_image_base + +native_cc +native_cpp +native_cxx + +native_host +native_cfghost +native_cflags +native_ldflags + +native_pe_subsystem +native_pe_image_base + +all_shared +all_static +disable_frontend +disable_shared +disable_static + +use_custom_cfgdefs +use_custom_cfginit +use_custom_cfgfini +use_custom_usrdefs + +shared_lib_cmd +shared_lib_ldflags diff --git a/sofort/config/flag.vars b/sofort/config/flag.vars new file mode 100644 index 0000000..4229e3e --- /dev/null +++ b/sofort/config/flag.vars @@ -0,0 +1,25 @@ +# configure +mb_config +mb_debug + +mb_ccstrict +mb_ldstrict + +mb_program_prefix +mb_require_source_dir + +mb_prefix_set +mb_bindir_set +mb_exec_prefix_set + +mb_bindir_basename + +# ccenv +mb_agnostic + +# cfgtest +mb_cfgtest_cc +mb_cfgtest_cflags +mb_cfgtest_cfgtype +mb_cfgtest_makevar +mb_cfgtest_headers diff --git a/sofort/config/opt.vars b/sofort/config/opt.vars new file mode 100644 index 0000000..e71ea56 --- /dev/null +++ b/sofort/config/opt.vars @@ -0,0 +1,9 @@ +version_opt + +shared_library_opt +static_library_opt + +app_frontend_opt +app_linking_opt + +install_headers_opt diff --git a/sofort/core/_flavor/flavor_app_frontend_disabled.mk b/sofort/core/_flavor/flavor_app_frontend_disabled.mk new file mode 100644 index 0000000..31ad23a --- /dev/null +++ b/sofort/core/_flavor/flavor_app_frontend_disabled.mk @@ -0,0 +1,6 @@ +# flavor_app_frontend_disabled.mk: handling of frontend build options. +# this file is covered by COPYING.SOFORT. + +app-tag: +package-install-app: +package-install-extras: diff --git a/sofort/core/_flavor/flavor_app_frontend_enabled.mk b/sofort/core/_flavor/flavor_app_frontend_enabled.mk new file mode 100644 index 0000000..ebbc256 --- /dev/null +++ b/sofort/core/_flavor/flavor_app_frontend_enabled.mk @@ -0,0 +1,6 @@ +# flavor_app_frontend_enabled.mk: handling of frontend build options. +# this file is covered by COPYING.SOFORT. + +app-tag: package-app app.tag +package-install-app: install-app +package-install-extras: install-extras diff --git a/sofort/core/_flavor/flavor_app_linking_all_shared.mk b/sofort/core/_flavor/flavor_app_linking_all_shared.mk new file mode 100644 index 0000000..fe89318 --- /dev/null +++ b/sofort/core/_flavor/flavor_app_linking_all_shared.mk @@ -0,0 +1,7 @@ +# flavor_app_linking_all_shared.mk: handling of frontend linking options. +# this file is covered by COPYING.SOFORT. + +PACKAGE_APP = $(SHARED_APP) + +package-app: shared-app +app.tag: $(SHARED_APP) diff --git a/sofort/core/_flavor/flavor_app_linking_all_static.mk b/sofort/core/_flavor/flavor_app_linking_all_static.mk new file mode 100644 index 0000000..7a5f620 --- /dev/null +++ b/sofort/core/_flavor/flavor_app_linking_all_static.mk @@ -0,0 +1,7 @@ +# flavor_app_linking_all_static.mk: handling of frontend linking options. +# this file is covered by COPYING.SOFORT. + +PACKAGE_APP = $(STATIC_APP) + +package-app: static-app +app.tag: $(STATIC_APP) diff --git a/sofort/core/_flavor/flavor_app_linking_default.mk b/sofort/core/_flavor/flavor_app_linking_default.mk new file mode 100644 index 0000000..b0c1d34 --- /dev/null +++ b/sofort/core/_flavor/flavor_app_linking_default.mk @@ -0,0 +1,7 @@ +# flavor_app_linking_default.mk: handling of frontend linking options. +# this file is covered by COPYING.SOFORT. + +PACKAGE_APP = $(DEFAULT_APP) + +package-app: default-app +app.tag: $(DEFAULT_APP) diff --git a/sofort/core/_flavor/flavor_install_headers_custom.mk b/sofort/core/_flavor/flavor_install_headers_custom.mk new file mode 100644 index 0000000..4f8da97 --- /dev/null +++ b/sofort/core/_flavor/flavor_install_headers_custom.mk @@ -0,0 +1,4 @@ +# flavor_install_headers_custom.mk: handling of header installation option. +# this file is covered by COPYING.SOFORT. + +install-headers:install-headers-custom diff --git a/sofort/core/_flavor/flavor_install_headers_default.mk b/sofort/core/_flavor/flavor_install_headers_default.mk new file mode 100644 index 0000000..f8b49c4 --- /dev/null +++ b/sofort/core/_flavor/flavor_install_headers_default.mk @@ -0,0 +1,4 @@ +# flavor_install_headers_default.mk: handling of header installation option. +# this file is covered by COPYING.SOFORT. + +install-headers:install-headers-default diff --git a/sofort/core/_flavor/flavor_shared_library_disabled.mk b/sofort/core/_flavor/flavor_shared_library_disabled.mk new file mode 100644 index 0000000..9846e1b --- /dev/null +++ b/sofort/core/_flavor/flavor_shared_library_disabled.mk @@ -0,0 +1,5 @@ +# flavor_shared_library_disabled.mk: handling of shared library dependencies. +# this file is covered by COPYING.SOFORT. + +package-shared: +package-install-shared: diff --git a/sofort/core/_flavor/flavor_shared_library_enabled.mk b/sofort/core/_flavor/flavor_shared_library_enabled.mk new file mode 100644 index 0000000..2e54d21 --- /dev/null +++ b/sofort/core/_flavor/flavor_shared_library_enabled.mk @@ -0,0 +1,5 @@ +# flavor_shared_library_enabled.mk: handling of shared library dependencies. +# this file is covered by COPYING.SOFORT. + +package-shared: shared +package-install-shared: install-shared diff --git a/sofort/core/_flavor/flavor_static_library_disabled.mk b/sofort/core/_flavor/flavor_static_library_disabled.mk new file mode 100644 index 0000000..e46d186 --- /dev/null +++ b/sofort/core/_flavor/flavor_static_library_disabled.mk @@ -0,0 +1,5 @@ +# flavor_static_library_disabled.mk: handling of static library dependencies. +# this file is covered by COPYING.SOFORT. + +package-static: +package-install-static: diff --git a/sofort/core/_flavor/flavor_static_library_enabled.mk b/sofort/core/_flavor/flavor_static_library_enabled.mk new file mode 100644 index 0000000..20d4bd8 --- /dev/null +++ b/sofort/core/_flavor/flavor_static_library_enabled.mk @@ -0,0 +1,5 @@ +# flavor_static_library_enabled.mk: handling of static library dependencies. +# this file is covered by COPYING.SOFORT. + +package-static: static +package-install-static: install-static diff --git a/sofort/core/_infer/infer_modern.mk b/sofort/core/_infer/infer_modern.mk new file mode 100644 index 0000000..aaf3361 --- /dev/null +++ b/sofort/core/_infer/infer_modern.mk @@ -0,0 +1,22 @@ +# infer_modern.mk: modern make target- and inference rules. +# this file is covered by COPYING.SOFORT. + +src/%.ao: $(SOURCE_DIR)/src/%.c + $(CC) -c -o $@ $< $(CFLAGS_APP) + +src/%.lo: $(SOURCE_DIR)/src/%.c + $(CC) -c -o $@ $< $(CFLAGS_SHARED) + +src/%.o: $(SOURCE_DIR)/src/%.c + $(CC) -c -o $@ $< $(CFLAGS_STATIC) + +$(SHARED_LIB): + $(SHARED_LIB_CMD) $@ $^ $(SHARED_LIB_LDFLAGS) $(LDFLAGS_IMPLIB) + +lib/%$(OS_ARCHIVE_EXT): + mkdir -p lib + rm -f $@ + $(AR) rcs $@ $^ + +srcs.tag: + touch $@ diff --git a/sofort/core/_infer/infer_posix.mk b/sofort/core/_infer/infer_posix.mk new file mode 100644 index 0000000..ae990e8 --- /dev/null +++ b/sofort/core/_infer/infer_posix.mk @@ -0,0 +1,27 @@ +# infer_posix.mk: posix make target- and inference rules. +# this file is covered by COPYING.SOFORT. + +.c.ao: + $(CC) -c -o $@ $< $(CFLAGS_APP) + +.c.lo: + $(CC) -c -o $@ $< $(CFLAGS_SHARED) + +.c.o: + $(CC) -c -o $@ $< $(CFLAGS_STATIC) + +$(SHARED_LIB): + $(SHARED_LIB_CMD) $@ $(SHARED_OBJS) $(SHARED_LIB_LDFLAGS) $(LDFLAGS_IMPLIB) + +$(STATIC_LIB): + mkdir -p lib + rm -f $@ + $(AR) rcs $@ $(STATIC_OBJS) + +srcs.tag: tree.tag + +srcs.tag: + $(PROJECT_DIR)/sofort/tools/srctree.sh \ + --srctree=$(SOURCE_DIR) -- \ + $(COMMON_SRCS) $(APP_SRCS) + touch $@ diff --git a/sofort/core/_version/_soname/version_soname_copy.mk b/sofort/core/_version/_soname/version_soname_copy.mk new file mode 100644 index 0000000..c176d5a --- /dev/null +++ b/sofort/core/_version/_soname/version_soname_copy.mk @@ -0,0 +1,8 @@ +# version_soname_copy.mk: handling of shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +install-soname: install-lib + cp $(SHARED_LIB) $(DESTDIR)$(LIBDIR)/$(DSO_SONAME) + +$(SHARED_SONAME): $(SHARED_LIB) + cp $(SHARED_LIB) $(SHARED_SONAME) diff --git a/sofort/core/_version/_soname/version_soname_symlink.mk b/sofort/core/_version/_soname/version_soname_symlink.mk new file mode 100644 index 0000000..963b891 --- /dev/null +++ b/sofort/core/_version/_soname/version_soname_symlink.mk @@ -0,0 +1,12 @@ +# version_soname_symlink.mk: handling of shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +$(SHARED_SONAME): $(SHARED_LIB) + rm -f $@.tmp + ln -s $(DSO_VER) $@.tmp + mv $@.tmp $@ + +install-soname: install-lib + rm -f $(SHARED_SONAME).tmp + ln -s $(DSO_VER) $(SHARED_SONAME).tmp + mv $(SHARED_SONAME).tmp $(DESTDIR)$(LIBDIR)/$(DSO_SONAME) diff --git a/sofort/core/_version/version_none.mk b/sofort/core/_version/version_none.mk new file mode 100644 index 0000000..d8fc570 --- /dev/null +++ b/sofort/core/_version/version_none.mk @@ -0,0 +1,10 @@ +# version_none.mk: handling of shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +VER_XYZ = +VER_SONAME = + +package-shared-soname: +package-shared-solink: +package-install-soname: +package-install-solink: diff --git a/sofort/core/_version/version_used.mk b/sofort/core/_version/version_used.mk new file mode 100644 index 0000000..4724cee --- /dev/null +++ b/sofort/core/_version/version_used.mk @@ -0,0 +1,26 @@ +# version_used.mk: handling of shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +VER_XYZ = .$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) +VER_SONAME = .$(VER_MAJOR) + +package-shared-soname: shared-soname +package-shared-solink: shared-solink +package-install-soname: install-soname +package-install-solink: install-solink + + + +# libfoo.so (common) +install-solink: install-lib + rm -f $(SHARED_SOLINK).tmp + ln -s $(DSO_VER) $(SHARED_SOLINK).tmp + mv $(SHARED_SOLINK).tmp $(DESTDIR)$(LIBDIR)/$(DSO_SOLINK) + +$(SHARED_SOLINK): $(SHARED_LIB) + rm -f $@.tmp + ln -s $(DSO_VER) $@.tmp + mv $@.tmp $@ + +# libfoo.so.x (symlink or copy) +include $(PROJECT_DIR)/sofort/core/_version/_soname/version_soname_$(OS_SONAME).mk diff --git a/sofort/core/defs.mk b/sofort/core/defs.mk new file mode 100644 index 0000000..2622cff --- /dev/null +++ b/sofort/core/defs.mk @@ -0,0 +1,66 @@ +SHARED_LIB_DEPS += +SHARED_APP_DEPS += +STATIC_APP_DEPS += + +COMMON_LOBJS += $(COMMON_SRCS:.c=.lo) +COMMON_OBJS += $(COMMON_SRCS:.c=.o) + +ARCH_LOBJS += $(ARCH_SRCS:.c=.lo) +ARCH_OBJS += $(ARCH_SRCS:.c=.o) + +APP_LOBJS += $(APP_SRCS:.c=.lo) +APP_OBJS += $(APP_SRCS:.c=.ao) + +SHARED_OBJS += $(COMMON_LOBJS) $(ARCH_LOBJS) +STATIC_OBJS += $(COMMON_OBJS) $(ARCH_OBJS) + +STATIC_LIB_NAME = $(OS_LIB_PREFIX)$(PACKAGE)$(OS_ARCHIVE_EXT) +STATIC_LIB = lib/$(STATIC_LIB_NAME) + +DSO_VER = $(OS_LIB_PREFIX)$(PACKAGE)$(OS_LIB_PREFIXED_SUFFIX)$(VER_XYZ)$(OS_LIB_SUFFIXED_SUFFIX) +DSO_SONAME = $(OS_LIB_PREFIX)$(PACKAGE)$(OS_LIB_PREFIXED_SUFFIX)$(VER_SONAME)$(OS_LIB_SUFFIXED_SUFFIX) +DSO_SOLINK = $(OS_LIB_PREFIX)$(PACKAGE)$(OS_LIB_SUFFIX) + +SHARED_LIB = lib/$(DSO_VER) +SHARED_SONAME = lib/$(DSO_SONAME) +SHARED_SOLINK = lib/$(DSO_SOLINK) + +IMP_DEF = $(OS_LIB_PREFIX)$(PACKAGE)$(VER_XYZ)$(OS_LIBDEF_EXT) +IMP_VER = $(OS_LIB_PREFIX)$(PACKAGE)$(VER_XYZ)$(OS_IMPLIB_EXT) +IMP_SONAME = $(OS_LIB_PREFIX)$(PACKAGE)$(VER_SONAME)$(OS_IMPLIB_EXT) +IMP_SOLINK = $(OS_LIB_PREFIX)$(PACKAGE)$(OS_IMPLIB_EXT) + +IMPLIB_DEF = lib/$(IMP_DEF) +IMPLIB_VER = lib/$(IMP_VER) +IMPLIB_SONAME = lib/$(IMP_SONAME) +IMPLIB_SOLINK = lib/$(IMP_SOLINK) + +APP = bin/$(OS_APP_PREFIX)$(NICKNAME)$(OS_APP_SUFFIX) +DEFAULT_APP = bin/$(OS_APP_PREFIX)$(NICKNAME)-default$(OS_APP_SUFFIX) +SHARED_APP = bin/$(OS_APP_PREFIX)$(NICKNAME)-shared$(OS_APP_SUFFIX) +STATIC_APP = bin/$(OS_APP_PREFIX)$(NICKNAME)-static$(OS_APP_SUFFIX) + +CFLAGS = $(CFLAGS_DEBUG) $(CFLAGS_CONFIG) $(CFLAGS_SYSROOT) \ + $(CFLAGS_COMMON) $(CFLAGS_CMDLINE) $(CFLAGS_HOST) \ + $(CFLAGS_PATH) $(CFLAGS_OS) $(CFLAGS_SITE) \ + $(CFLAGS_VERSION) $(CFLAGS_STRICT) \ + $(CFLAGS_LAST) $(CFLAGS_ONCE) + +CFLAGS_SHARED = $(CFLAGS) $(CFLAGS_PIC) $(CFLAGS_SHARED_ATTR) +CFLAGS_STATIC = $(CFLAGS) $(CFLAGS_OBJ) $(CFLAGS_STATIC_ATTR) +CFLAGS_APP = $(CFLAGS) $(CFLAGS_OBJ) $(CFLAGS_APP_ATTR) $(CFLAGS_UTIL) + +LDFLAGS_SHARED = $(LDFLAGS_DEBUG) $(LDFLAGS_CONFIG) $(LDFLAGS_SYSROOT) \ + $(LDFLAGS_COMMON) $(LDFLAGS_CMDLINE) $(LDFLAGS_HOST) \ + $(LDFLAGS_PATH) $(SHARED_LIB_DEPS) $(LDFLAGS_STRICT) \ + $(LDFLAGS_LAST) $(LDFLAGS_ONCE) + +LDFLAGS_APP = $(LDFLAGS_DEBUG) $(LDFLAGS_CONFIG) $(LDFLAGS_SYSROOT) \ + $(LDFLAGS_COMMON) $(LDFLAGS_CMDLINE) $(LDFLAGS_HOST) \ + $(LDFLAGS_PATH) $(SHARED_APP_DEPS) $(LDFLAGS_STRICT) \ + $(LDFLAGS_UTIL) $(LDFLAGS_LAST) $(LDFLAGS_ONCE) + +LDFLAGS_STATIC = $(LDFLAGS_DEBUG) $(LDFLAGS_CONFIG) $(LDFLAGS_SYSROOT) \ + $(LDFLAGS_COMMON) $(LDFLAGS_CMDLINE) $(LDFLAGS_HOST) \ + $(LDFLAGS_PATH) $(STATIC_APP_DEPS) $(LDFLAGS_STRICT) \ + $(LDFLAGS_LAST) $(LDFLAGS_ONCE) diff --git a/sofort/core/flavor.mk b/sofort/core/flavor.mk new file mode 100644 index 0000000..6a7c97a --- /dev/null +++ b/sofort/core/flavor.mk @@ -0,0 +1,12 @@ +# flavor.mk: top-level handling of build flavors. +# this file is covered by COPYING.SOFORT. + +include $(PROJECT_DIR)/sofort/exrules/$(OS_DSO_EXRULES).mk + +include $(PROJECT_DIR)/sofort/core/_flavor/flavor_static_library_$(STATIC_LIBRARY_OPT).mk +include $(PROJECT_DIR)/sofort/core/_flavor/flavor_shared_library_$(SHARED_LIBRARY_OPT).mk + +include $(PROJECT_DIR)/sofort/core/_flavor/flavor_app_frontend_$(APP_FRONTEND_OPT).mk +include $(PROJECT_DIR)/sofort/core/_flavor/flavor_app_linking_$(APP_LINKING_OPT).mk + +include $(PROJECT_DIR)/sofort/core/_flavor/flavor_install_headers_$(INSTALL_HEADERS_OPT).mk diff --git a/sofort/core/infer.mk b/sofort/core/infer.mk new file mode 100644 index 0000000..8a1c6dd --- /dev/null +++ b/sofort/core/infer.mk @@ -0,0 +1,4 @@ +# infer.mk: top-level handling of inference rules. +# this file is covered by COPYING.SOFORT. + +include $(PROJECT_DIR)/sofort/core/_infer/infer_$(MAKEMODE).mk diff --git a/sofort/core/pkgconf.mk b/sofort/core/pkgconf.mk new file mode 100644 index 0000000..5ada069 --- /dev/null +++ b/sofort/core/pkgconf.mk @@ -0,0 +1,39 @@ +# pkgconf.mk: rules for pkgconf manifest generation. +# this file is covered by COPYING.SOFORT. + +PKGCONF_VERSION = $(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) + +.pkgconf: + +build/$(PACKAGE).pc: .pkgconf dirs.tag + +build/$(PACKAGE).pc: + @touch $@ + @chmod 0644 $@ + PKGCONF_NAME='$(PKGNAME)' \ + PKGCONF_DESC='$(PKGDESC)' \ + PKGCONF_USRC='$(PKGUSRC)' \ + PKGCONF_REPO='$(PKGREPO)' \ + PKGCONF_PSRC='$(PKGPSRC)' \ + PKGCONF_DURL='$(PKGDURL)' \ + PKGCONF_BUGS='$(PKGBUGS)' \ + PKGCONF_HOME='$(PKGHOME)' \ + PKGCONF_DEFS='$(PKGDEFS)' \ + PKGCONF_LIBS='$(PKGLIBS)' \ + \ + PKGCONF_EXEC_PREFIX='$(EXEC_PREFIX)' \ + PKGCONF_PREFIX='$(PREFIX)' \ + PKGCONF_LIBDIR='$(LIBDIR)' \ + PKGCONF_INCLUDEDIR='$(INCLUDEDIR)' \ + PKGCONF_VERSION='$(PKGCONF_VERSION)' \ + $(PROJECT_DIR)/sofort/tools/pkgconf.sh > $@ + +install-pkgconf: build/$(PACKAGE).pc + mkdir -p $(DESTDIR)$(LIBDIR)/pkgconfig + cp -p build/$(PACKAGE).pc $(DESTDIR)$(LIBDIR)/pkgconfig + +install-shared: install-pkgconf + +install-static: install-pkgconf + +.PHONY: .pkgconf install-pkgconf diff --git a/sofort/core/version.mk b/sofort/core/version.mk new file mode 100644 index 0000000..ad693ab --- /dev/null +++ b/sofort/core/version.mk @@ -0,0 +1,10 @@ +# version.mk: handling of shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +include $(PROJECT_DIR)/project/tagver.mk + +CFLAGS_VERSION += -D$(VER_NAMESPACE)_TAG_VER_MAJOR=$(VER_MAJOR) +CFLAGS_VERSION += -D$(VER_NAMESPACE)_TAG_VER_MINOR=$(VER_MINOR) +CFLAGS_VERSION += -D$(VER_NAMESPACE)_TAG_VER_PATCH=$(VER_PATCH) + +include $(PROJECT_DIR)/sofort/core/_version/version_$(VERSION_OPT).mk diff --git a/sofort/exrules/_pe/pe_mdso_version_none.mk b/sofort/exrules/_pe/pe_mdso_version_none.mk new file mode 100644 index 0000000..cf5e350 --- /dev/null +++ b/sofort/exrules/_pe/pe_mdso_version_none.mk @@ -0,0 +1,2 @@ +# pe_mdso_version_none.mk: PE shared library rules for targets using mdso. +# this file is covered by COPYING.SOFORT. diff --git a/sofort/exrules/_pe/pe_mdso_version_used.mk b/sofort/exrules/_pe/pe_mdso_version_used.mk new file mode 100644 index 0000000..fac0246 --- /dev/null +++ b/sofort/exrules/_pe/pe_mdso_version_used.mk @@ -0,0 +1,5 @@ +# pe_mdso_version_used.mk: PE shared library rules for targets using mdso. +# this file is covered by COPYING.SOFORT. + +$(IMPLIB_SONAME): $(IMPLIB_DEF) + $(MDSO) -m $(CC_BITS) -i $(IMPLIB_SONAME) -n $(DSO_SONAME) $(IMPLIB_DEF) diff --git a/sofort/exrules/_pe/pe_version_none.mk b/sofort/exrules/_pe/pe_version_none.mk new file mode 100644 index 0000000..df33976 --- /dev/null +++ b/sofort/exrules/_pe/pe_version_none.mk @@ -0,0 +1,7 @@ +# pe_version_none.mk: handling of PE shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +package-implib-soname: +package-implib-solink: +package-install-implib-soname: +package-install-implib-solink: diff --git a/sofort/exrules/_pe/pe_version_used.mk b/sofort/exrules/_pe/pe_version_used.mk new file mode 100644 index 0000000..8710dae --- /dev/null +++ b/sofort/exrules/_pe/pe_version_used.mk @@ -0,0 +1,23 @@ +# pe_version_used.mk: handling of PE shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +package-implib-soname: implib-soname +package-implib-solink: implib-solink +package-install-implib-soname: install-implib-soname +package-install-implib-solink: install-implib-solink + + +$(IMPLIB_SOLINK): $(IMPLIB_SONAME) + rm -f $(IMPLIB_SOLINK).tmp + ln -s $(IMP_SONAME) $(IMPLIB_SOLINK).tmp + mv $(IMPLIB_SOLINK).tmp $(IMPLIB_SOLINK) + +install-implib-soname: implib-soname + mkdir -p $(DESTDIR)$(LIBDIR) + cp $(IMPLIB_SONAME) $(DESTDIR)$(LIBDIR) + +install-implib-solink: implib-soname + mkdir -p $(DESTDIR)$(LIBDIR) + rm -f $(IMPLIB_SOLINK).tmp + ln -s $(IMP_SONAME) $(IMPLIB_SOLINK).tmp + mv $(IMPLIB_SOLINK).tmp $(DESTDIR)$(LIBDIR)/$(IMP_SOLINK) diff --git a/sofort/exrules/default.mk b/sofort/exrules/default.mk new file mode 100644 index 0000000..9844f37 --- /dev/null +++ b/sofort/exrules/default.mk @@ -0,0 +1,17 @@ +# default.mk: default shared library rules. +# this file is covered by COPYING.SOFORT. + +DSO_REF_VER = $(SHARED_LIB) +DSO_REF_SONAME = $(SHARED_SONAME) +DSO_REF_SOLINK = $(SHARED_SOLINK) + +LDFLAGS_SHARED += -Wl,-soname +LDFLAGS_SHARED += -Wl,$(DSO_SONAME) + +implib: + +install-implib: + +clean-implib: + +.PHONY: $(IMPLIB_DEF) $(IMPLIB_VER) $(IMPLIB_SONAME) $(IMPLIB_SOLINK) diff --git a/sofort/exrules/pe-common.mk b/sofort/exrules/pe-common.mk new file mode 100644 index 0000000..3e132a9 --- /dev/null +++ b/sofort/exrules/pe-common.mk @@ -0,0 +1,42 @@ +# pe-common.mk: common PE shared library rules. +# this file is covered by COPYING.SOFORT. + +DSO_REF_VER = $(IMPLIB_VER) +DSO_REF_SONAME = $(IMPLIB_SONAME) +DSO_REF_SOLINK = $(IMPLIB_SOLINK) + +LDFLAGS_IMPLIB += -Wl,--output-def +LDFLAGS_IMPLIB += -Wl,$(IMPLIB_DEF) + +LDFLAGS_SONAME += -Wl,-soname +LDFLAGS_SONAME += -Wl,$(DSO_SONAME) +LDFLAGS_SHARED += $(LDFLAGS_SONAME) + +DSO_LIBPATH ?= loader +PE_SUBSYSTEM ?= windows +LDFLAGS_COMMON += -Wl,--subsystem=$(PE_SUBSYSTEM) + +implib: implib-ver package-implib-soname package-implib-solink + +implib-ver: shared-lib $(IMPLIB_VER) + +implib-soname: shared-lib $(IMPLIB_SONAME) + +implib-solink: shared-lib $(IMPLIB_SOLINK) + +$(IMPLIB_DEF): shared-lib + +install-implib: install-implib-ver \ + package-install-implib-soname \ + package-install-implib-solink + +install-implib-ver: implib-ver + mkdir -p $(DESTDIR)$(LIBDIR) + cp $(IMPLIB_VER) $(DESTDIR)$(LIBDIR) + +clean-implib: + rm -f $(SHARED_LIB) + rm -f $(IMPLIB_DEF) + rm -f $(IMPLIB_VER) + rm -f $(IMPLIB_SONAME) + rm -f $(IMPLIB_SOLINK) diff --git a/sofort/exrules/pe-dlltool.mk b/sofort/exrules/pe-dlltool.mk new file mode 100644 index 0000000..0fc1adf --- /dev/null +++ b/sofort/exrules/pe-dlltool.mk @@ -0,0 +1,18 @@ +# pe-dlltool.mk: PE shared library rules for targets using dlltool. +# this file is covered by COPYING.SOFORT. + +include $(PROJECT_DIR)/sofort/exrules/pe-common.mk + +$(IMPLIB_VER): $(IMPLIB_DEF) + $(DLLTOOL) -l $(IMPLIB_VER) -d $(IMPLIB_DEF) -D $(DSO_VER) + +ifeq ($(AVOID_VERSION),yes) + +else + +$(IMPLIB_SONAME): $(IMPLIB_DEF) + $(DLLTOOL) -l $(IMPLIB_SONAME) -d $(IMPLIB_DEF) -D $(DSO_SONAME) + +endif + +include $(PROJECT_DIR)/sofort/exrules/pe-version.mk diff --git a/sofort/exrules/pe-mdso.mk b/sofort/exrules/pe-mdso.mk new file mode 100644 index 0000000..0c380e0 --- /dev/null +++ b/sofort/exrules/pe-mdso.mk @@ -0,0 +1,11 @@ +# pe-mdso.mk: PE shared library rules for targets using mdso. +# this file is covered by COPYING.SOFORT. + +include $(PROJECT_DIR)/sofort/exrules/pe-common.mk + +$(IMPLIB_VER): $(IMPLIB_DEF) + $(MDSO) -m $(CC_BITS) -i $(IMPLIB_VER) -n $(DSO_VER) -l $(DSO_LIBPATH) $(IMPLIB_DEF) + +include $(PROJECT_DIR)/sofort/exrules/_pe/pe_mdso_version_$(VERSION_OPT).mk + +include $(PROJECT_DIR)/sofort/exrules/pe-version.mk diff --git a/sofort/exrules/pe-version.mk b/sofort/exrules/pe-version.mk new file mode 100644 index 0000000..7f5b658 --- /dev/null +++ b/sofort/exrules/pe-version.mk @@ -0,0 +1,4 @@ +# pe-version.mk: handling of PE shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +include $(PROJECT_DIR)/sofort/exrules/_pe/pe_version_$(VERSION_OPT).mk diff --git a/sofort/tools/pkgconf.sh b/sofort/tools/pkgconf.sh new file mode 100755 index 0000000..a69c25b --- /dev/null +++ b/sofort/tools/pkgconf.sh @@ -0,0 +1,136 @@ +#!/bin/sh + +# pkgconf.sh: generate a pkgconf manifest file. +# this file is covered by COPYING.SOFORT. + +set -eu + +# prefix, exec_prefix +if [ "$PKGCONF_PREFIX" = "$PKGCONF_EXEC_PREFIX" ]; then + pkgconf_prefix="${PKGCONF_PREFIX}" + pkgconf_exec_prefix='${prefix}' +else + pkgconf_prefix="${PKGCONF_PREFIX}" + pkgconf_exec_prefix="${PKGCONF_EXEC_PREFIX}" +fi + + +# (relative) includedir +if [ -z "$PKGCONF_INCLUDEDIR" ]; then + pkgconf_includedir= + pkgconf_cflags= +else + prefix=$(dirname "$PKGCONF_INCLUDEDIR") + base=$(basename "$PKGCONF_INCLUDEDIR") + + if [ "$prefix" = '/' ]; then + prefix= + fi + + if [ "$prefix/$base" = "$PKGCONF_PREFIX/$base" ]; then + pkgconf_includedir='${prefix}/'"${base}" + pkgconf_cflags='-I${includedir}' + else + pkgconf_includedir="${PKGCONF_INCLUDEDIR}" + pkgconf_cflags='-I${includedir}' + fi +fi + + +# (relative) libdir (blank unless needed) +if [ -z "$PKGCONF_LIBDIR" ]; then + pkgconf_libdir= +else + prefix=$(dirname "$PKGCONF_LIBDIR") + base=$(basename "$PKGCONF_LIBDIR") + + if [ "$prefix" = '/' ]; then + prefix= + fi + + if [ "$prefix/$base" = "$PKGCONF_EXEC_PREFIX/$base" ]; then + pkgconf_libdir='${exec_prefix}/'"${base}" + else + pkgconf_libdir='${prefix}/'"${PKGCONF_LIBDIR}" + fi +fi + + +# ldflags (--libs) +if [ -n "$pkgconf_libdir" ] && [ -n "${PKGCONF_NAME}" ]; then + pkgconf_ldflags='-L${libdir}'" -l${PKGCONF_NAME}" +elif [ -n "${PKGCONF_NAME}" ]; then + pkgconf_ldflags="-l${PKGCONF_NAME}" +else + pkgconf_ldflags='-L${libdir}' +fi + + +# cflags +if [ -n "$pkgconf_cflags" ] || [ -n "${PKGCONF_DEFS}" ]; then + pkgconf_cflags="$pkgconf_cflags ${PKGCONF_DEFS}" + pkgconf_cflags=$(printf '%s' "$pkgconf_cflags" | sed -e 's/^[ \t]*//g') +fi + + +# repo (optional) +if [ -z "${PKGCONF_REPO}" ]; then + pkgconf_repo='#' +else + pkgconf_repo="Repo: ${PKGCONF_REPO}" +fi + +# patches (optional) +if [ -z "${PKGCONF_PSRC}" ]; then + pkgconf_psrc='#' +else + pkgconf_psrc="Patches: ${PKGCONF_PSRC}" +fi + +# distro (optional) +if [ -z "${PKGCONF_DURL}" ]; then + pkgconf_durl='#' +else + pkgconf_durl="Distro: ${PKGCONF_DURL}" +fi + +# bug reports (optional) +if [ -z "${PKGCONF_BUGS}" ]; then + pkgconf_bugs='#' +else + pkgconf_bugs="Bug reports: ${PKGCONF_BUGS}" +fi + +# project home page (optional) +if [ -z "${PKGCONF_HOME}" ]; then + pkgconf_home='#' +else + pkgconf_home="Home page: ${PKGCONF_HOME}" +fi + + +# output (without trailing spaces) +cat << _EOF | grep -v '^#' | sed 's/[ \t]*$//' +### +prefix=$pkgconf_prefix +exec_prefix=$pkgconf_exec_prefix +includedir=$pkgconf_includedir +libdir=$pkgconf_libdir + +Name: ${PKGCONF_NAME} +Description: ${PKGCONF_DESC} +URL: ${PKGCONF_USRC} +Version: ${PKGCONF_VERSION} +$pkgconf_repo +$pkgconf_psrc +$pkgconf_durl +$pkgconf_bugs +$pkgconf_home + +Cflags: $pkgconf_cflags +Libs: $pkgconf_ldflags +### +_EOF + +# all done +exit 0 diff --git a/sofort/tools/srctree.sh b/sofort/tools/srctree.sh new file mode 100755 index 0000000..90a1d89 --- /dev/null +++ b/sofort/tools/srctree.sh @@ -0,0 +1,83 @@ +#!/bin/sh + +# srctree.sh: support for out-of-tree builds in posix make mode. +# this file is covered by COPYING.SOFORT. + +set -eu + +usage() +{ +cat << EOF >&2 + +Usage: + --help show this HELP message + --srctree=SRCTREE set source directory + +EOF +exit 1 +} + + +# one +workdir=$(pwd -P) +srctree= +argloop= + + +for arg ; do + case "$arg" in + --help) + usage + ;; + + --srctree=*) + srctree=${arg#*=} + ;; + + --) + argloop='done' + ;; + + *) + if [ -z "$argloop" ]; then + printf 'Invalid option: %s\n' "$arg" >&2 + usage + fi + ;; + esac +done + + +# two +if [ -z "$srctree" ] ; then + usage +fi + +cd -- "$srctree" +srctree=$(pwd -P) +cd -- "$workdir" + +if [ "$srctree" = "$workdir" ]; then + exit 0 +fi + + +# three +for arg ; do + case "$arg" in + --srctree=*) + ;; + + --) + ;; + + *) + stat "$arg" > /dev/null 2>&1 \ + || ln -s -- "$srctree/$arg" "$arg" + ;; + esac +done + + +# all done +exit 0 diff --git a/sofort/tools/version.sh b/sofort/tools/version.sh new file mode 100755 index 0000000..8c49cb3 --- /dev/null +++ b/sofort/tools/version.sh @@ -0,0 +1,75 @@ +#!/bin/sh + +# version.sh: detect git repository info, output defs as a C header. +# this file is covered by COPYING.SOFORT. + +set -eu + +usage() +{ +cat << EOF >&2 + +Usage: + -h show this HELP message + -s SRCDIR set source directory + -o OUTPUT set output header + -p PREFIX set macro prefix + +EOF +exit 1 +} + + +# one +workdir=$(pwd -P) +srcdir= +output= +prefix= + + +while getopts "hs:o:p:" opt; do + case $opt in + h) + usage + ;; + s) + srcdir="$OPTARG" + ;; + o) + output="$OPTARG" + ;; + p) + prefix="$OPTARG" + ;; + \?) + printf 'Invalid option: -%s' "$OPTARG" >&2 + usage + ;; + esac +done + + +# two +if [ -z "$srcdir" ] || [ -z "$output" ] || [ -z "$prefix" ]; then + usage +fi + +cd -- "$srcdir" + +gitver=$(git rev-parse --verify HEAD 2>/dev/null) || gitver="unknown" +cvdate=$(git show -s --format=%ci $gitver 2>/dev/null) || cvdate=$(date) + +vmacro=$(printf '%s' "$prefix"'_GIT_VERSION' | tr '[:lower:]' '[:upper:]') +dmacro=$(printf '%s' "$prefix"'_GIT_DATE ' | tr '[:lower:]' '[:upper:]') + +cd -- "$workdir" + + +# three +printf '#define %s "%s"\n#define %s "%s"\n' \ + "$vmacro" "$gitver" \ + "$dmacro" "$cvdate" \ + > "$output" + +# all done +exit 0