diff options
author | midipix <writeonce@midipix.org> | 2020-01-26 16:40:49 -0500 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2020-05-23 05:59:01 +0000 |
commit | 944e2bdb67e96024a149fbdc07e5ec83bae0abe3 (patch) | |
tree | 856807fb699fe2b3570e8109233dff61d6d5e883 | |
parent | c755a5575fd437e95ea96cd10b45968562793656 (diff) | |
download | tpax-944e2bdb67e96024a149fbdc07e5ec83bae0abe3.tar.bz2 tpax-944e2bdb67e96024a149fbdc07e5ec83bae0abe3.tar.xz |
build system: created skeleton.
35 files changed, 4109 insertions, 0 deletions
diff --git a/COPYING.SOFORT b/COPYING.SOFORT new file mode 100644 index 0000000..14e1f1b --- /dev/null +++ b/COPYING.SOFORT @@ -0,0 +1,56 @@ +/*****************************************************************************/ +/* */ +/* sofort: portable software project skeleton */ +/* */ +/* Copyright (C) 2015--2020 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.usage */ +/* ./sofort/ccenv/ccenv.vars */ +/* ./sofort/ccenv/pedefs.in */ +/* ./sofort/ccenv/ccenv.sh */ +/* ./sofort/cfgtest/cfgtest.sh */ +/* ./sofort/config/cfgdefs.in */ +/* ./sofort/config/config.vars */ +/* ./sofort/config/flag.vars */ +/* ./sofort/core/defs.mk */ +/* ./sofort/core/flavor.mk */ +/* ./sofort/core/pkgconf.mk */ +/* ./sofort/core/version.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/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..aacac6a --- /dev/null +++ b/Makefile.in @@ -0,0 +1,332 @@ +# Makefile.in: primary common build logic. +# this file is covered by COPYING.SOFORT. + +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@ + +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@ + +.cflags-host: + @printf '%s' "$(CFLAGS)" + +.cflags-native: + @printf '%s' "$(NATIVE_CFLAGS)" + +.SUFFIXES: + +all: +install: +shared: +static: + +install-extras: +install-app-extras: + +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)/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 + + +$(APP_SRCS:%.c=%.o): CFLAGS_STATIC = $(CFLAGS_APP) + +src/%.lo: $(SOURCE_DIR)/src/%.c $(ALL_HEADERS) host.tag tree.tag + $(CC) -c -o $@ $< $(CFLAGS_SHARED) + +src/%.o: $(SOURCE_DIR)/src/%.c $(ALL_HEADERS) host.tag tree.tag + $(CC) -c -o $@ $< $(CFLAGS_STATIC) + +lib/%$(OS_LIB_PREFIXED_SUFFIX)$(VER_XYZ)$(OS_LIB_SUFFIXED_SUFFIX): + $(CC) -shared -o $@ $^ $(LDFLAGS_SHARED) + +lib/%$(OS_ARCHIVE_EXT): + mkdir -p lib + rm -f $@ + $(AR) rcs $@ $^ + + + +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) + + + +$(SHARED_LIB): $(SHARED_OBJS) +$(SHARED_LIB): LDFLAGS_SHARED += $(LDFLAGS_IMPLIB) + +$(STATIC_LIB): $(STATIC_OBJS) + +$(APP): $(PACKAGE_APP) + +$(DEFAULT_APP): $(STATIC_OBJS) $(APP_OBJS) + rm -f app.tag + $(CC) -o $@ $^ $(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 $@ $^ $(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 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.project b/config.project new file mode 100644 index 0000000..c921c48 --- /dev/null +++ b/config.project @@ -0,0 +1,61 @@ +# project +mb_package=tpax +mb_require_out_of_tree=no +mb_custom_install_headers=no +mb_avoid_version=no + +# config +mb_all_static= +mb_all_shared= +mb_disable_frontend=yes +mb_disable_static=yes +mb_disable_shared=yes + +# custom config step +mb_use_custom_cfgdefs=no +mb_use_custom_cfgtest=no + +# pkgconfig +mb_pkgname='tpax' +mb_pkgdesc='tpax' +mb_pkgusrc= +mb_pkgrepo='https://git.foss21.org/tpax' +mb_pkgpsrc= +mb_pkgdurl= +mb_pkgdefs= +mb_pkglibs= + +# ccenv +mb_ccenv_create_log= +mb_ccenv_skip_native= + +# switches +mb_default_cflags_common="-std=c99 -D_XOPEN_SOURCE=700" +mb_default_cflags_common="$mb_default_cflags_common -I\$(SOURCE_DIR)/src/internal" +mb_default_cflags_common="$mb_default_cflags_common -I\$(SOURCE_DIR)/include" +mb_default_cflags_common="$mb_default_cflags_common -Ibuild" + +mb_default_cflags_debug= +mb_default_cflags_cmdline= +mb_default_cflags_config= +mb_default_cflags_sysroot= +mb_default_cflags_path= +mb_default_cflags_strict= +mb_default_cflags_util= +mb_default_cflags_last= +mb_default_cflags_once= + +mb_default_ldflags_common="-Llib" +mb_default_ldflags_debug= +mb_default_ldflags_cmdline= +mb_default_ldflags_config= +mb_default_ldflags_sysroot= +mb_default_ldflags_path= +mb_default_ldflags_strict= +mb_default_ldflags_util= +mb_default_ldflags_last= +mb_default_ldflags_once= + +# native +mb_default_native_cflags="-std=c99 -D_XOPEN_SOURCE=700" +mb_default_native_ldflags= diff --git a/config.usage b/config.usage new file mode 100644 index 0000000..5074221 --- /dev/null +++ b/config.usage @@ -0,0 +1,179 @@ +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 + + --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 + + 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..62c2b11 --- /dev/null +++ b/configure @@ -0,0 +1,1130 @@ +#!/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 + + for arg in $mb_args; do + printf ' %s' "$arg" >&3 + done + + printf '\n\n' >&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_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_project_dir/config.project + else + . "$mb_config" + 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 + + + # 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=<path>," + 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 + [ -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 + + # 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" + + # 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_copy() +{ + output_step_prolog ${mb_script} 'config_copy' + + mb_vars=$(cut -d'=' -f1 $sfrt_config_vars \ + | grep -v '^#') + + mb_sed_substs=" \ + $(for __var in $(printf '%s' "$mb_vars"); do \ + printf '%s"$%s"%s' "-e 's^@$__var@^'" \ + "mb_$__var" "'^g' "; \ + done)" + + eval sed $mb_sed_substs \ + $mb_project_dir/Makefile.in \ + | 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' + + 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_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= +mb_args_space= + +for arg ; do + mb_escaped_arg=\'$(printf '%s\n' "$arg" | sed -e "s/'/'\\\\''/g")\' + mb_args="$mb_args$mb_args_space$mb_escaped_arg" + mb_args_space=' ' +done + +init_log +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#*=} + ;; + + + # 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_copy +config_ccenv +config_custom +config_cfghost +config_host +config_status + + +# all done +config_success diff --git a/include/empty.dir b/include/empty.dir new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/include/empty.dir diff --git a/project/arch.mk b/project/arch.mk new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/project/arch.mk diff --git a/project/common.mk b/project/common.mk new file mode 100644 index 0000000..4b72987 --- /dev/null +++ b/project/common.mk @@ -0,0 +1,7 @@ +API_SRCS = \ + +INTERNAL_SRCS = \ + +APP_SRCS = \ + +COMMON_SRCS = $(API_SRCS) $(INTERNAL_SRCS) diff --git a/project/depends.mk b/project/depends.mk new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/project/depends.mk diff --git a/project/extras.mk b/project/extras.mk new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/project/extras.mk diff --git a/project/headers.mk b/project/headers.mk new file mode 100644 index 0000000..9d50ee3 --- /dev/null +++ b/project/headers.mk @@ -0,0 +1,5 @@ +API_HEADERS = \ + +INTERNAL_HEADERS = \ + +ALL_HEADERS = $(API_HEADERS) $(INTERNAL_HEADERS) diff --git a/project/osforce.mk b/project/osforce.mk new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/project/osforce.mk diff --git a/project/overrides.mk b/project/overrides.mk new file mode 100644 index 0000000..4ac3b36 --- /dev/null +++ b/project/overrides.mk @@ -0,0 +1 @@ +src/$(PACKAGE).o: CFLAGS_CONFIG += -Wno-unused-parameter diff --git a/project/tagver.mk b/project/tagver.mk new file mode 100644 index 0000000..6a5d8d6 --- /dev/null +++ b/project/tagver.mk @@ -0,0 +1,5 @@ +VER_NAMESPACE = + +VER_MAJOR = 0 +VER_MINOR = 0 +VER_PATCH = 0 diff --git a/project/tree.mk b/project/tree.mk new file mode 100644 index 0000000..ed9e1f8 --- /dev/null +++ b/project/tree.mk @@ -0,0 +1,10 @@ +TREE_DIRS = bin src lib + +tree.tag: + mkdir -p $(TREE_DIRS) + touch tree.tag + +tree-distclean: + rmdir $(TREE_DIRS) 2> /dev/null || true + +distclean: tree-distclean diff --git a/sofort/ccenv/ccenv.in b/sofort/ccenv/ccenv.in new file mode 100644 index 0000000..f12c78e --- /dev/null +++ b/sofort/ccenv/ccenv.in @@ -0,0 +1,86 @@ +# @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_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..a376eb7 --- /dev/null +++ b/sofort/ccenv/ccenv.sh @@ -0,0 +1,1321 @@ +# 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}))" + + 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}))" + + 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 + if [ -z ${@:-} ]; 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" +} + +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 | 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=$($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_cpp_prefix=${ccenv_cc_cmd%-gcc*}- + ccenv_candidates="${ccenv_cpp_prefix}g++" ;; + + *-clang ) + ccenv_cpp_prefix=${ccenv_cc_cmd%-clang*}- + ccenv_candidates="${ccenv_cpp_prefix}clang++" ;; + + *cc ) + ccenv_cxx_prefix=${ccenv_cc_cmd%cc*} + ccenv_candidates="${ccenv_cpp_prefix}++" ;; + + * ) + 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" \ + | $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 \ + || 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 '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_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/^\s*$/@/g' \ + -e 's/^/NATIVE_/' \ + -e 's/NATIVE_@//g' \ + -e 's/NATIVE_#/#/g' \ + -e 's/ =/=/g' \ + -e 's/ +=/+=/g' \ + $ccenv_in > "$ccenv_tmp" + + ccenv_in="$ccenv_tmp" + else + unset ccenv_tmp + fi + + ccenv_vars=$(cut -d'=' -f1 "$mb_project_dir/sofort/ccenv/ccenv.vars" \ + | grep -v '^#') + + ccenv_exvars="ccenv_cfgtype ccenv_makevar_prefix" + + ccenv_sed_substs=" \ + $(for __var in $(printf '%s' "$ccenv_vars $ccenv_exvars"); do \ + printf '%s"$%s"%s' "-e 's/@$__var@/'" \ + "$__var" "'/g' "; \ + done)" + + eval sed $ccenv_sed_substs $ccenv_in \ + | 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=$(make -s -f "$mb_pwd/Makefile.tmp" .cflags-host) + + 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=$(make -s -f "$mb_pwd/Makefile.tmp" .cflags-native) + 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_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=<machine> argument specifying the host, than with a + --host=<machine> 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=<prefix> (e.g. --toolchain=llvm) --> search for tools + that begin with <prefix> before searching for agnostic tools + + +# restricting which tools may be searched: +- --zealous --> only search for agnostic tools +- --zealous=<prefix> --> only search for <prefix>-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..4775b37 --- /dev/null +++ b/sofort/ccenv/ccenv.vars @@ -0,0 +1,86 @@ +# 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_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/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..524b746 --- /dev/null +++ b/sofort/config/config.vars @@ -0,0 +1,133 @@ +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 + +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_usrdefs 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/core/defs.mk b/sofort/core/defs.mk new file mode 100644 index 0000000..7e120bc --- /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=.o) + +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..85c41a2 --- /dev/null +++ b/sofort/core/flavor.mk @@ -0,0 +1,73 @@ +# flavor.mk: top-level handling of build flavors. +# this file is covered by COPYING.SOFORT. + +ifneq ($(OS_DSO_EXRULES),) +include $(PROJECT_DIR)/sofort/exrules/$(OS_DSO_EXRULES).mk +endif + +ifeq ($(DISABLE_STATIC),yes) +package-static: +package-install-static: +else +package-static: static +package-install-static: install-static +endif + +ifeq ($(DISABLE_SHARED),yes) +package-shared: +package-install-shared: +else +package-shared: shared +package-install-shared: install-shared +endif + + + +ifeq ($(DISABLE_FRONTEND),yes) +app-tag: +package-install-app: +package-install-extras: +else +app-tag: package-app app.tag +package-install-app: install-app +package-install-extras: install-extras +endif + + + +ifeq ($(ALL_STATIC),yes) + +package-app: static-app +app: PACKAGE_APP = $(STATIC_APP) +app-tag: PACKAGE_APP = $(STATIC_APP) +app.tag: $(STATIC_APP) + + +else ifeq ($(ALL_SHARED),yes) + +package-app: shared-app +app: PACKAGE_APP = $(SHARED_APP) +app-tag: PACKAGE_APP = $(SHARED_APP) +app.tag: $(SHARED_APP) + + +else + +package-app: default-app +app: PACKAGE_APP = $(DEFAULT_APP) +app-tag: PACKAGE_APP = $(DEFAULT_APP) +app.tag: $(DEFAULT_APP) + +endif + + + +ifeq ($(CUSTOM_INSTALL_HEADERS),yes) + +install-headers:install-headers-custom + +else + +install-headers:install-headers-default + +endif diff --git a/sofort/core/pkgconf.mk b/sofort/core/pkgconf.mk new file mode 100644 index 0000000..0edc395 --- /dev/null +++ b/sofort/core/pkgconf.mk @@ -0,0 +1,45 @@ +# pkgconf.mk: rules for pkgconf manifest generation. +# this file is covered by COPYING.SOFORT. + +ifeq ($(PKGCONF),no) + +install-pkgconf: + +else + +PKGCONF_VERSION = $(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) + +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 + +endif diff --git a/sofort/core/version.mk b/sofort/core/version.mk new file mode 100644 index 0000000..eb6c2f2 --- /dev/null +++ b/sofort/core/version.mk @@ -0,0 +1,66 @@ +# 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) + +ifeq ($(AVOID_VERSION),yes) + +VER_XYZ = +VER_SONAME = + +package-shared-soname: +package-shared-solink: +package-install-soname: +package-install-solink: + +else + +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) +ifeq ($(OS_SONAME),symlink) +$(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) +endif + + +# libfoo.so.x (copy) +ifeq ($(OS_SONAME),copy) +install-soname: install-lib + cp $(SHARED_LIB) $(DESTDIR)$(LIBDIR)/$(DSO_SONAME) + +$(SHARED_SONAME): $(SHARED_LIB) + cp $(SHARED_LIB) $(SHARED_SONAME) +endif + +endif diff --git a/sofort/exrules/default.mk b/sofort/exrules/default.mk new file mode 100644 index 0000000..b830cd0 --- /dev/null +++ b/sofort/exrules/default.mk @@ -0,0 +1,11 @@ +# 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) + +.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..9a3b941 --- /dev/null +++ b/sofort/exrules/pe-mdso.mk @@ -0,0 +1,18 @@ +# 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) $< + +ifeq ($(AVOID_VERSION),yes) + +else + +$(IMPLIB_SONAME): $(IMPLIB_DEF) + $(MDSO) -m $(CC_BITS) -i $(IMPLIB_SONAME) -n $(DSO_SONAME) $(IMPLIB_DEF) + +endif + +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..97ad4ca --- /dev/null +++ b/sofort/exrules/pe-version.mk @@ -0,0 +1,34 @@ +# pe-version.mk: handling of PE shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +ifeq ($(AVOID_VERSION),yes) + +package-implib-soname: +package-implib-solink: +package-install-implib-soname: +package-install-implib-solink: + +else + +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) + +endif 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/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 diff --git a/src/empty.dir b/src/empty.dir new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/empty.dir |