diff options
72 files changed, 2724 insertions, 447 deletions
@@ -0,0 +1,8 @@ +Bugs and issues pertaining to _mdso_ may be reported either by using +the project's official issue tracker, or on the project's irc channel. + +# Issue Tracker: +* https://dev.midipix.org/cross/mdso/issues + +# IRC Channel: +* ircs://irc.libera.chat/#midipix diff --git a/COPYING.MDSO b/COPYING.MDSO index 1491abb..a1b6f65 100644 --- a/COPYING.MDSO +++ b/COPYING.MDSO @@ -2,7 +2,7 @@ /* */ /* mdso: midipix dso scavenger */ /* */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* */ /* This program is free software: you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ diff --git a/COPYING.SOFORT b/COPYING.SOFORT index 14e1f1b..75a98e1 100644 --- a/COPYING.SOFORT +++ b/COPYING.SOFORT @@ -2,7 +2,7 @@ /* */ /* sofort: portable software project skeleton */ /* */ -/* Copyright (C) 2015--2020 Z. Gilboa */ +/* Copyright (C) 2015--2023 SysDeer Technologies, LLC */ /* */ /* sofort provides a build system that can be incorporated into Works */ /* which may or may not be covered by a copyleft license. THE FOLLOWING */ @@ -14,24 +14,50 @@ /* ./Makefile.in */ /* */ /* ./sofort/ccenv/ccenv.in */ +/* ./sofort/ccenv/ccenv.sh */ /* ./sofort/ccenv/ccenv.usage */ /* ./sofort/ccenv/ccenv.vars */ +/* ./sofort/ccenv/ccswitch.strs */ /* ./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/config/opt.vars */ +/* ./sofort/core/_flavor/flavor_app_frontend_disabled.mk */ +/* ./sofort/core/_flavor/flavor_app_frontend_enabled.mk */ +/* ./sofort/core/_flavor/flavor_app_linking_all_shared.mk */ +/* ./sofort/core/_flavor/flavor_app_linking_all_static.mk */ +/* ./sofort/core/_flavor/flavor_app_linking_default.mk */ +/* ./sofort/core/_flavor/flavor_install_headers_custom.mk */ +/* ./sofort/core/_flavor/flavor_install_headers_default.mk */ +/* ./sofort/core/_flavor/flavor_shared_library_disabled.mk */ +/* ./sofort/core/_flavor/flavor_shared_library_enabled.mk */ +/* ./sofort/core/_flavor/flavor_static_library_disabled.mk */ +/* ./sofort/core/_flavor/flavor_static_library_enabled.mk */ +/* ./sofort/core/_infer/infer_modern.mk */ +/* ./sofort/core/_infer/infer_posix.mk */ +/* ./sofort/core/_version/_soname/version_soname_copy.mk */ +/* ./sofort/core/_version/_soname/version_soname_symlink.mk */ +/* ./sofort/core/_version/version_none.mk */ +/* ./sofort/core/_version/version_used.mk */ /* ./sofort/core/defs.mk */ /* ./sofort/core/flavor.mk */ +/* ./sofort/core/infer.mk */ +/* ./sofort/core/modern.m4 */ /* ./sofort/core/pkgconf.mk */ /* ./sofort/core/version.mk */ +/* ./sofort/exrules/_pe/pe_mdso_version_none.mk */ +/* ./sofort/exrules/_pe/pe_mdso_version_used.mk */ +/* ./sofort/exrules/_pe/pe_version_none.mk */ +/* ./sofort/exrules/_pe/pe_version_used.mk */ /* ./sofort/exrules/default.mk */ /* ./sofort/exrules/pe-common.mk */ /* ./sofort/exrules/pe-dlltool.mk */ /* ./sofort/exrules/pe-mdso.mk */ /* ./sofort/exrules/pe-version.mk */ /* ./sofort/tools/pkgconf.sh */ +/* ./sofort/tools/srctree.sh */ /* ./sofort/tools/version.sh */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ diff --git a/Makefile.in b/Makefile.in index aacac6a..5ad6ff0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,6 +1,10 @@ # Makefile.in: primary common build logic. # this file is covered by COPYING.SOFORT. +.POSIX: + +.SUFFIXES: .a .c .s .o .lo .ao + PACKAGE = @package@ NICKNAME = @nickname@ PROJECT_DIR = @project_dir@ @@ -36,6 +40,9 @@ SRCBALL = @srcball@ SRCBALL_URL = @srcball_url@ SRCBALL_SHA256 = @srcball_sha256@ +MAKE = @make@ +MAKEMODE = @makemode@ + BUILD = @build@ HOST = @host@ CCHOST = @cchost@ @@ -77,7 +84,6 @@ 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@ @@ -114,13 +120,19 @@ DISABLE_STATIC = @disable_static@ USE_CUSTOM_CFGDEFS = @use_custom_cfgdefs@ USE_CUSTOM_USRDEFS = @use_custom_usrdefs@ -.cflags-host: - @printf '%s' "$(CFLAGS)" +SHARED_LIB_CMD = @shared_lib_cmd@ +SHARED_LIB_LDFLAGS = @shared_lib_ldflags@ -.cflags-native: - @printf '%s' "$(NATIVE_CFLAGS)" +VERSION_OPT = @version_opt@ + +SHARED_LIBRARY_OPT = @shared_library_opt@ +STATIC_LIBRARY_OPT = @static_library_opt@ + +APP_FRONTEND_OPT = @app_frontend_opt@ +APP_LINKING_OPT = @app_linking_opt@ + +INSTALL_HEADERS_OPT = @install_headers_opt@ -.SUFFIXES: all: install: @@ -130,6 +142,19 @@ static: install-extras: install-app-extras: +.cflags-host: + @true : $(CFLAGS) + +.cflags-native: + @true : $(NATIVE_CFLAGS) + +.ldflags-host: + @true : $(LDFLAGS_APP) + +.ldflags-native: + @true : $(NATIVE_LDFLAGS) + + include ./ccenv/host.mk include ./ccenv/native.mk @@ -140,6 +165,7 @@ include $(PROJECT_DIR)/sofort/core/defs.mk include $(PROJECT_DIR)/sofort/core/pkgconf.mk include $(PROJECT_DIR)/sofort/core/version.mk include $(PROJECT_DIR)/sofort/core/flavor.mk +include $(PROJECT_DIR)/sofort/core/infer.mk include $(PROJECT_DIR)/project/osforce.mk include $(PROJECT_DIR)/project/tree.mk @@ -151,24 +177,6 @@ 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 @@ -241,8 +249,18 @@ app-objs: dirs $(APP_OBJS) +$(APP_SRCS): srcs.tag + +$(COMMON_SRCS): srcs.tag + +$(APP_OBJS): $(ALL_HEADERS) host.tag tree.tag + +$(SHARED_OBJS): $(ALL_HEADERS) host.tag tree.tag + +$(STATIC_OBJS): $(ALL_HEADERS) host.tag tree.tag + + $(SHARED_LIB): $(SHARED_OBJS) -$(SHARED_LIB): LDFLAGS_SHARED += $(LDFLAGS_IMPLIB) $(STATIC_LIB): $(STATIC_OBJS) @@ -250,7 +268,7 @@ $(APP): $(PACKAGE_APP) $(DEFAULT_APP): $(STATIC_OBJS) $(APP_OBJS) rm -f app.tag - $(CC) -o $@ $^ $(LDFLAGS_APP) + $(CC) -o $@ $(STATIC_OBJS) $(APP_OBJS) $(LDFLAGS_APP) $(SHARED_APP): $(DSO_REF_SOLINK) $(APP_OBJS) $(SHARED_SOLINK) rm -f app.tag @@ -258,7 +276,7 @@ $(SHARED_APP): $(DSO_REF_SOLINK) $(APP_OBJS) $(SHARED_SOLINK) $(STATIC_APP): $(STATIC_OBJS) $(APP_OBJS) rm -f app.tag - $(CC) -static -o $@ $^ $(LDFLAGS_STATIC) + $(CC) -static -o $@ $(STATIC_OBJS) $(APP_OBJS) $(LDFLAGS_STATIC) dirs: dirs.tag @@ -269,8 +287,9 @@ dirs.tag: mkdir -p lib touch dirs.tag -host.tag: Makefile - $(CC) $(CFLAGS) -dumpmachine > host.tmp +host.tag: @makefile@ + rm -f host.tmp + touch host.tmp mv host.tmp host.tag version.tag: $(GIT_REFERENCE_INDEX) dirs.tag @@ -286,11 +305,12 @@ distclean: clean rm -f cfgdefs.mk rm -f usrdefs.mk rm -f config.log - rm -f Makefile + rm -f @makefile@ rmdir build ccenv bin lib 2>&1 || true clean: clean-implib rm -f tree.tag + rm -f srcs.tag rm -f dirs.tag rm -f host.tag rm -f host.tmp diff --git a/config.project b/config.project index d95c715..62e108b 100644 --- a/config.project +++ b/config.project @@ -1,6 +1,7 @@ # project mb_package=mdso mb_require_out_of_tree=no +mb_require_source_dir=no mb_custom_install_headers=no mb_avoid_version=no @@ -13,13 +14,20 @@ mb_disable_shared= # custom config step mb_use_custom_cfgdefs=no +mb_use_custom_cfginit=no +mb_use_custom_cfgfini=no mb_use_custom_cfgtest=no +# advanced make options +mb_make= +mb_makefile= +mb_makemode= + # pkgconfig mb_pkgname='mdso' mb_pkgdesc='mdso' mb_pkgusrc= -mb_pkgrepo='git://midipix.org/mdso' +mb_pkgrepo='https://git.foss21.org/mdso' mb_pkgpsrc= mb_pkgdurl= mb_pkgdefs= @@ -29,8 +37,12 @@ mb_pkglibs= mb_ccenv_create_log= mb_ccenv_skip_native= +# compilation environment +mb_hosted= +mb_freestanding= + # switches -mb_default_cflags_common="-std=c99 -D_XOPEN_SOURCE=700" +mb_default_cflags_common="\$(_CFLAGS_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)/src/internal/perk" mb_default_cflags_common="$mb_default_cflags_common -I\$(SOURCE_DIR)/include" @@ -58,5 +70,5 @@ mb_default_ldflags_last= mb_default_ldflags_once= # native -mb_default_native_cflags="-std=c99 -D_XOPEN_SOURCE=700" +mb_default_native_cflags="\$(_NATIVE_CFLAGS_std_c99) -D_XOPEN_SOURCE=700" mb_default_native_ldflags= diff --git a/config.usage b/config.usage index 5074221..41fe629 100644 --- a/config.usage +++ b/config.usage @@ -59,6 +59,9 @@ supported switches: --pdfdir --psdir + --make + --makemode + --build --host --cchost @@ -72,6 +75,9 @@ supported switches: --shell --debug + --pkgconf + --pkgconfig + --strict --ccstrict --ldstrict @@ -124,6 +130,9 @@ supported variables: CPP CXX + MAKE + MAKEMODE + BUILD HOST CCHOST @@ -134,7 +143,10 @@ supported variables: TOOLCHAIN SYSROOT CROSS_COMPILE - SHELL + CONFIG_SHELL + + PKGCONF + PKGCONFIG CFLAGS CFLAGS_DEBUG @@ -174,6 +186,9 @@ supported variables: NATIVE_CFLAGS NATIVE_LDFLAGS + NATIVE_PKGCONF + NATIVE_PKGCONFIG + NATIVE_OS NATIVE_OS_BITS NATIVE_OS_UNDERSCORE @@ -33,7 +33,12 @@ usage() " ___________________________________________" \ "__________________________________" - cat "$mb_project_dir"/project/config/cfgdefs.usage + if [ -f "$mb_project_dir"/project/config/cfgdefs.usage ]; then + cat "$mb_project_dir"/project/config/cfgdefs.usage + else + printf '%s\n\n' \ + "[ info: this project does not provide a project-specific cfgdefs.usage file. ]" + fi fi exit 0 @@ -53,10 +58,10 @@ output_step_prolog() { mb_line_dots='.................................' mb_line_dots="${mb_line_dots}.${mb_line_dots}" - mb_step_desc="${mb_package} : ${1##*/} : ${2}() " + mb_step_desc="${mb_package} : ${1##*/} : ${2} " mb_step_dlen="$((${#mb_line_dots} - ${#mb_step_desc}))" - printf "configure step: ${2}()\n" >&3 + printf "configure step: ${2}\n" >&3 printf "%s%${mb_step_dlen}.${mb_step_dlen}s " "${mb_step_desc}" "${mb_line_dots}" } @@ -100,12 +105,6 @@ init_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() @@ -135,6 +134,7 @@ init_vars() sfrt_core_dir=$sfrt_impl_dir/core sfrt_config_vars=$sfrt_config_dir/config.vars sfrt_flag_vars=$sfrt_config_dir/flag.vars + sfrt_opt_vars=$sfrt_config_dir/opt.vars sfrt_cfgdefs_in=$sfrt_config_dir/cfgdefs.in mb_make_vars=$(< "$sfrt_config_vars" \ @@ -156,6 +156,9 @@ init_vars() eval "$mb_expr" done + # cfgtest + . $mb_project_dir/sofort/cfgtest/cfgtest.sh + # ccenv . $mb_project_dir/sofort/ccenv/ccenv.sh @@ -169,9 +172,57 @@ init_vars() # config.project if [ -z "$mb_config" ]; then - . $mb_project_dir/config.project - else - . "$mb_config" + mb_config="$mb_project_dir/config.project" + fi + + . "$mb_config" + + # config.project make preferences + if [ -z "${MAKE}" ]; then + MAKE="$mb_make" + fi + + if [ -z "${MAKEMODE}" ]; then + MAKEMODE="$mb_makemode" + fi + + + if [ -z "$mb_makefile" ]; then + mb_makefile='Makefile' + fi + + # pkgconf (host) + if [ -z "${PKGCONF}" ]; then + PKGCONF="$mb_pkgconf" + fi + + if [ -z "${PKGCONF}" ]; then + PKGCONF="${PKGCONFIG}" + fi + + # pkgconf (native) + if [ -z "${NATIVE_PKGCONF}" ]; then + NATIVE_PKGCONF="$mb_native_pkgconf" + fi + + if [ -z "${NATIVE_PKGCONF}" ]; then + NATIVE_PKGCONF="${NATIVE_PKGCONFIG}" + fi + + # project-specific initialization + if [ _$mb_use_custom_cfginit = _yes ]; then + . "$mb_project_dir/project/config/cfginit.sh" + fi + + # package + if [ -z "$mb_package" ]; then + error_msg "$mb_script: incomplete information in $mb_config." + error_msg "$mb_script: \$mb_package not set." + exit 1 + fi + + if [ -z "${NICKNAME}" ]; then + NICKNAME="$mb_nickname" fi # srcinfo @@ -179,6 +230,11 @@ init_vars() mb_source_dir_set=yes fi + # cchost + if [ -n "$CCHOST" ]; then + mb_cchost_set=yes + fi + # step prolog output_step_prolog ${mb_script} 'init_vars' @@ -211,6 +267,9 @@ init_vars() mb_pdfdir=$PDFDIR mb_psdir=$PSDIR + # make + mb_make=$MAKE + mb_makemode=$MAKEMODE # build mb_build=$BUILD @@ -221,7 +280,10 @@ init_vars() mb_toolchain=$TOOLCHAIN mb_sysroot=$SYSROOT mb_cross_compile=$CROSS_COMPILE - mb_shell=$SHELL + mb_shell=$CONFIG_SHELL + + # pkgconf + mb_pkgconf=$PKGCONF # switches mb_cflags=$CFLAGS @@ -267,6 +329,8 @@ init_vars() mb_native_cflags=$NATIVE_CFLAGS mb_native_ldflags=$NATIVE_LDFLAGS + mb_native_pkgconf=$NATIVE_PKGCONF + mb_native_pe_subsystem=$NATIVE_PE_SUBSYSTEM mb_native_pe_image_base=$NATIVE_PE_IMAGE_BASE @@ -289,7 +353,14 @@ verify_build_directory() fi fi - rm -f Makefile Makefile.host Makefile.tmp Makefile.failed + if [ -f "$mb_pwd/Makefile.common" ]; then + error_msg + error_msg "$mb_package: the file-name Makefile.common is reserved for bootstrapping projects." + error_msg "$mb_package: please remove or rename the file manually and then re-run configure." + exit 1 + fi + + rm -f Makefile Makefile.host Makefile.tmp Makefile.failed $mb_makefile output_step_epilog } @@ -526,7 +597,7 @@ common_defaults() [ -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_docdir" ] || mb_docdir=$mb_datarootdir/doc/'$(PACKAGE)' [ -n "$mb_libexecdir" ] || mb_libexecdir=$mb_exec_prefix/libexec [ -n "$mb_sysconfdir" ] || mb_sysconfdir=$mb_exec_prefix/etc @@ -585,21 +656,39 @@ common_defaults() # sysroot if [ -n "$mb_sysroot" ]; then if [ -z "$mb_cflags_sysroot" ]; then - mb_cflags_sysroot="--sysroot=$mb_sysroot" + mb_cflags_sysroot='$(_CFLAGS_SYSROOT)' fi if [ -z "$mb_ldflags_sysroot" ]; then - mb_ldflags_sysroot="--sysroot=$mb_sysroot" + mb_ldflags_sysroot='$(_LDFLAGS_SYSROOT)' fi fi # debug if [ _$mb_debug = _yes ]; then if [ -z "$mb_cflags_debug" ]; then - mb_cflags_debug='-g3 -O0' + mb_cflags_debug='$(_CFLAGS_g3) $(_CFLAGS_O0)' fi fi + # make + if [ -z "$mb_make" ]; then + mb_make='make' + fi + + if [ -z "$mb_makemode" ]; then + mb_makemode='posix' + + printf '%s\n%s\n%s\n\n%s\n\n' \ + 'ifeq (a,b)' \ + 'VAR = val' \ + 'endif' \ + 'all:' \ + | ${mb_make} -s -f - 2>/dev/null \ + && mb_makemode='modern' + + fi + # shell if [ -z "$mb_shell" ]; then mb_shell='/bin/sh' @@ -629,12 +718,12 @@ config_flags() # ccstrict if [ _$mb_ccstrict = _yes ]; then - mb_cflags_strict='-Wall -Werror -Wextra -Wundef' + mb_cflags_strict='$(_CFLAGS_Wall) $(_CFLAGS_Werror) $(_CFLAGS_Wextra) $(_CFLAGS_Wundef) $(_CFLAGS_Wpedantic)' fi # ldstrict if [ _$mb_ldstrict = _yes ]; then - mb_ldflags_strict='-Wl,--no-undefined' + mb_ldflags_strict='$(_CFLAGS_Wl___no_undefined)' fi # step epilog @@ -642,23 +731,76 @@ config_flags() } +config_opts() +{ + if [ "$mb_avoid_version" = 'yes' ]; then + mb_version_opt='none' + else + mb_version_opt='used' + fi + + if [ "$mb_custom_install_headers" = 'yes' ]; then + mb_install_headers_opt='custom' + else + mb_install_headers_opt='default' + fi + + if [ "$mb_disable_static" = 'yes' ]; then + mb_static_library_opt='disabled' + else + mb_static_library_opt='enabled' + fi + + if [ "$mb_disable_shared" = 'yes' ]; then + mb_shared_library_opt='disabled' + else + mb_shared_library_opt='enabled' + fi + + if [ "$mb_disable_frontend" = 'yes' ]; then + mb_app_frontend_opt='disabled' + else + mb_app_frontend_opt='enabled' + fi + + if [ "$mb_all_static" = 'yes' ]; then + mb_app_linking_opt='all_static' + + elif [ "$mb_all_shared" = 'yes' ]; then + mb_app_linking_opt='all_shared' + + else + mb_app_linking_opt='default' + fi +} + config_copy() { output_step_prolog ${mb_script} 'config_copy' - mb_vars=$(cut -d'=' -f1 $sfrt_config_vars \ - | grep -v '^#') + mb_var_defs= + mb_sed_substs= + mb_template="${1:-$mb_project_dir/Makefile.in}" + + mb_vars=$(cut -d'=' -f1 "$sfrt_config_vars" "$sfrt_opt_vars" \ + | grep -v '^#'); + + for __var in $(printf '%s' "$mb_vars"); do + mb_sed_subst=$(printf '%s %s%s%s' \ + '-e' "'s^@$__var@" \ + "^___${__var}___" \ + "^g'") - mb_sed_substs=" \ - $(for __var in $(printf '%s' "$mb_vars"); do \ - printf '%s"$%s"%s' "-e 's^@$__var@^'" \ - "mb_$__var" "'^g' "; \ - done)" + mb_sed_substs="$mb_sed_substs $mb_sed_subst" - eval sed $mb_sed_substs \ - $mb_project_dir/Makefile.in \ - | sed -e 's/[[:blank:]]*$//g' \ - > $mb_pwd/Makefile.tmp + mb_var_def=$(printf '%s%s="${%s}"' "-D" "___${__var}___" "mb_${__var}") + eval mb_var_defs='"$mb_var_defs "$mb_var_def' + done + + eval sed $mb_sed_substs $mb_template \ + | eval m4 $mb_var_defs - \ + | sed -e 's/[[:blank:]]*$//g' \ + > $mb_pwd/Makefile.tmp output_step_epilog } @@ -676,6 +818,36 @@ config_ccenv() output_section_break ccenv_set_native_variables + # implicit --sysroot for use with pkgconf and friends + if [ -z "$mb_sysroot" ]; then + mb_sysroot="$ccenv_host_sysroot" + fi + + # require --sysroot when cross-compiling + if [ "$mb_cchost" != "$mb_native_cchost" ] \ + && [ "$ccenv_host_cc" != "$ccenv_native_cc" ] \ + && [ -z "$mb_sysroot" ]; then + mb_pretty=$(printf "%-${#mb_package}s" '') + + error_msg ' !!' + error_msg "$mb_package: host machine: $mb_cchost" + error_msg "$mb_package: host compiler: $ccenv_host_cc" + + error_msg ' !!' + error_msg "$mb_package: native machine: $mb_native_cchost" + error_msg "$mb_package: native compiler: $ccenv_native_cc" + + error_msg ' !!' + error_msg "$mb_package: detected host machine and native machine differ, assuming cross-compilation." + + error_msg ' !!' + error_msg "$mb_package: native compilation mode can be forced via --cchost=$mb_native_cchost" + error_msg "${mb_pretty} or otherwise by setting the NATIVE_CC environment variable to '$ccenv_host_cc'," + error_msg "${mb_pretty} however that should almost never be necessary; then again," + error_msg "${mb_pretty} forcing native mode when cross-building is strictly prohibited." + fi + + # re-generate Makefile.tmp output_section_break config_copy } @@ -695,6 +867,12 @@ config_custom() eval config_custom_cfgdefs "$mb_custom_cfgdefs_args" output_section_break + + if [ -f "$mb_project_dir/project/config/Makefile.in" ]; then + config_copy "$mb_project_dir/project/config/Makefile.in" + mv $mb_pwd/Makefile.tmp Makefile + fi + config_copy fi @@ -722,7 +900,7 @@ config_cfghost() $mb_pwd/Makefile.tmp > $mb_pwd/Makefile.host rm $mb_pwd/Makefile.tmp - mv $mb_pwd/Makefile.host $mb_pwd/Makefile + mv $mb_pwd/Makefile.host $mb_pwd/$mb_makefile output_step_epilog } @@ -730,12 +908,70 @@ config_cfghost() config_host() { + # init output_step_prolog ${mb_script} 'config_host' - make -s host.tag \ - && output_step_epilog \ - && return 0 + mb_cfghost_cc="$ccenv_host_cc" + mb_cfghost_tmpname='ccenv/c3RyaWN0X21vZGUK.c' + + mb_cfghost_cflags=$(${mb_make} -n -f "$mb_makefile" \ + .cflags-host) + + mb_cfghost_cflags="${mb_cfghost_cflags#*: }" + + if [ "$mb_cc_environment" = 'freestanding' ]; then + if [ -z "mb_cc_underscore" ]; then + mb_cfghost_start_fn='_start' + else + mb_cfghost_start_fn='start' + fi + + printf 'int %s(void){return 0;}' "$mb_cfghost_start_fn" \ + > "$mb_cfghost_tmpname" + + mb_cfghost_cflags="$mb_cfghost_cflags -ffreestanding" + mb_cfghost_cflags="$mb_cfghost_cflags -nostdlib" + else + printf 'int main(void){return 0;}\n' \ + > "$mb_cfghost_tmpname" + fi + + # log + printf '\n' >&3 + + printf '%s\n' \ + '#' \ + '# verify that that following combination of' \ + '# host compiler and host cflags is working.' \ + '#' \ + >&3 + + printf '\n%s' "$mb_cfghost_cc $ccenv_tmpname -o a.out" >&3 + + for mb_cfghost_cflag in $(printf '%s' "$mb_cfghost_cflags"); do + printf ' \\\n\t%s' "$mb_cfghost_cflag" >&3 + done + + printf '\n\n' >&3 + + # execute + if eval $mb_cfghost_cc "$ccenv_tmpname" -o a.out \ + $(printf '%s' "$mb_cfghost_cflags") \ + 2>&3; then + rm a.out + rm $mb_cfghost_tmpname + mb_cfghost_ret=0 + else + mb_cfghost_ret=1 + fi + if [ $mb_cfghost_ret = 0 ]; then + output_step_epilog + return 0 + fi + + # should never happen + error_msg 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." @@ -743,6 +979,15 @@ config_host() } +config_fini() +{ + # project-specific post-configuration steps + if [ _$mb_use_custom_cfgfini = _yes ]; then + . "$mb_project_dir/project/config/cfgfini.sh" + fi +} + + config_status() { output_script_status ${mb_script} \ @@ -772,16 +1017,37 @@ config_success() # one: init -mb_args= -mb_args_space= +mb_args_defs= +mb_args_text= +mb_args_idx=0 + +init_log 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=' ' + mb_args_idx=$((mb_args_idx+1)) + + mb_arg_def=$(printf '%s%s="${%s}"' "-D_" "${mb_args_idx}" "${mb_args_idx}") + eval mb_args_defs='"$mb_args_defs "$mb_arg_def' + + mb_args_text="$mb_args_text '_$((mb_args_idx))'" done -init_log +printf "$mb_args_text\n\n" | eval m4 $mb_args_defs - >&3 + +if [ $mb_args_idx -gt 1 ]; then + printf '$ %s' "$mb_script" >&3 + + mb_args_idx=0 + mb_args_text= + + for arg; do + mb_args_idx=$((mb_args_idx+1)) + mb_args_text="$mb_args_text"$(printf ' \\\\\n\t%s_%d%s' "'" "$mb_args_idx" "'") + done + + printf "$mb_args_text\n\n" | eval m4 $mb_args_defs - >&3 +fi + init_vars verify_build_directory @@ -887,6 +1153,23 @@ for arg ; do mb_psdir=${arg#*=} ;; + #make + --make=*) + mb_make=${arg#*=} + ;; + + --makemode=*) + mb_makemode=${arg#*=} + ;; + + #pkgconf[ig] + --pkgconf=*) + mb_pkgconf=${arg#*=} + ;; + + --pkgconfig=*) + mb_pkgconf=${arg#*=} + ;; # build --build=*) @@ -897,6 +1180,7 @@ for arg ; do ;; --cchost=*) mb_cchost=${arg#*=} + mb_cchost_set=yes ;; --cfghost=*) mb_cfghost=${arg#*=} @@ -1118,11 +1402,13 @@ common_defaults # five: config config_flags +config_opts config_copy config_ccenv config_custom config_cfghost config_host +config_fini config_status diff --git a/project/overrides.mk b/project/overrides.mk index 4ac3b36..e69de29 100644 --- a/project/overrides.mk +++ b/project/overrides.mk @@ -1 +0,0 @@ -src/$(PACKAGE).o: CFLAGS_CONFIG += -Wno-unused-parameter diff --git a/sofort/ccenv/ccenv.in b/sofort/ccenv/ccenv.in index f12c78e..0daff84 100644 --- a/sofort/ccenv/ccenv.in +++ b/sofort/ccenv/ccenv.in @@ -1,86 +1,96 @@ # @ccenv_cfgtype@ system flavor -OS = @ccenv_os@ -OS_SEMANTICS = @ccenv_os_semantics@ +OS = @ccenv_os@ +OS_SEMANTICS = @ccenv_os_semantics@ -OS_DSO_EXRULES = @ccenv_os_dso_exrules@ -OS_DSO_LINKAGE = @ccenv_os_dso_linkage@ +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_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_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_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_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@ +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_HOST = @ccenv_cc_host@ +CC_BITS = @ccenv_cc_bits@ -CC_BINFMT = @ccenv_cc_binfmt@ -CC_UNDERSCORE = @ccenv_cc_underscore@ +CC_ARFMT = @ccenv_cc_arfmt@ +CC_SOFMT = @ccenv_cc_sofmt@ +CC_BINFMT = @ccenv_cc_binfmt@ +CC_UNDERSCORE = @ccenv_cc_underscore@ +CC_ENVIRONMENT = @ccenv_cc_environment@ -CC_ARCH_BFD = @ccenv_cc_arch_bfd@ -CC_ARCH_LLVM = @ccenv_cc_arch_llvm@ +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@ +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@ +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@ +OBJDUMP_BFD = @ccenv_objdump_bfd@ +OBJDUMP_LLVM = @ccenv_objdump_llvm@ -READELF_BFD = @ccenv_readelf_bfd@ -READELF_LLVM = @ccenv_readelf_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@ +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@ + +PKGCONF = @ccenv_pkgconf@ # @ccenv_cfgtype@ secondary tools # note: the direct use of $(@ccenv_makevar_prefix@LD) is highly discouraged -AS = @ccenv_as@ -LD = @ccenv_ld@ +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@ +# @ccenv_cfgtype@ visibility attributes +CFLAGS_ATTR_VISIBILITY_DEFAULT = -D_ATTR_VISIBILITY_DEFAULT=@ccenv_attr_visibility_default@ +CFLAGS_ATTR_VISIBILITY_HIDDEN = -D_ATTR_VISIBILITY_HIDDEN=@ccenv_attr_visibility_hidden@ +CFLAGS_ATTR_VISIBILITY_INTERNAL = -D_ATTR_VISIBILITY_INTERNAL=@ccenv_attr_visibility_internal@ +CFLAGS_ATTR_VISIBILITY_PROTECTED = -D_ATTR_VISIBILITY_PROTECTED=@ccenv_attr_visibility_protected@ +# @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 index a376eb7..d975c6b 100644 --- a/sofort/ccenv/ccenv.sh +++ b/sofort/ccenv/ccenv.sh @@ -1,3 +1,4 @@ + # ccenv.sh: sofort's tool-finding bits, # invoked from within the project-agnostic configure script. @@ -24,6 +25,13 @@ # ccenv_cflags: the comprehensive cflags for the host being tested # ccenv_cchost: the host being tested, as reported by -dumpmachine +# variables available to cfgdefs.sh and cfgfini.sh: +# ccenv_host_cflags: expanded cflags, valid for the host compiler +# ccenv_host_ldflags: expanded ldflags, valid for the host compiler +# ccenv_host_sysroot: host sysroot, as reported by the host compiler +# ccenv_native_cflags: expanded cflags, valid for the native compiler +# ccenv_native_ldflags: expanded ldflags, valid for the native compiler +# ccenv_native_sysroot: native sysroot, as reported by the native compiler ccenv_usage() { @@ -68,6 +76,11 @@ ccenv_tool_epilog() ccenv_line_dots='................................' ccenv_tool_dlen="$((${#ccenv_line_dots} - ${#1}))" + case ${ccenv_tool_dlen} in + 0 | -* ) + ccenv_tool_dlen='3' ;; + esac + printf "%${ccenv_tool_dlen}.${ccenv_tool_dlen}s %s.\n" \ "${ccenv_line_dots}" "${1}" @@ -110,6 +123,11 @@ ccenv_attr_epilog() ccenv_line_dots='................................' ccenv_tool_dlen="$((${#ccenv_line_dots} - 1 - ${#1}))" + case ${ccenv_tool_dlen} in + 0 | -* ) + ccenv_tool_dlen='3' ;; + esac + printf "%${ccenv_tool_dlen}.${ccenv_tool_dlen}s %s.\n" \ "${ccenv_line_dots}" "${1}" @@ -122,7 +140,9 @@ ccenv_find_tool() { if [ -z "$ccenv_prefixes" ]; then for ccenv_candidate in $(printf '%s' "$ccenv_candidates"); do - if [ -z ${@:-} ]; then + ccenv_cmd_args="${@:-}" + + if [ -z "$ccenv_cmd_args" ]; then if command -v "$ccenv_candidate" > /dev/null; then ccenv_tool="$ccenv_candidate" return 0 @@ -169,7 +189,7 @@ 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" + ccenv_peep_tools="perk mdso dlltool windmc windres pkgconf" for __tool in $(printf '%s' "$ccenv_core_tools $ccenv_hack_tools $ccenv_peep_tools"); do ccenv_tool_prolog "$__tool" @@ -196,6 +216,9 @@ ccenv_set_primary_tools() ccenv_candidates="$ccenv_candidates gcc-$__tool" ccenv_candidates="$ccenv_candidates llvm-$__tool" + elif [ "$__tool" = 'pkgconf' ]; then + ccenv_candidates="$__tool pkg-config" + else ccenv_candidates="$__tool" ccenv_candidates="$ccenv_candidates gcc-$__tool" @@ -208,12 +231,14 @@ ccenv_set_primary_tools() ccenv_var_prefix='mb_native_' fi + ccenv_tool= 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" + ccenv_tool="$ccenv_var_val" else ccenv_find_tool eval ccenv_$__tool="$ccenv_tool" @@ -224,6 +249,63 @@ ccenv_set_primary_tools() # windrc ccenv_windrc="$ccenv_windres" + + # archive format preamble + if [ -n "$ccenv_dumpmachine_switch" ]; then + ccenv_libgcc_path=$($ccenv_cc -print-file-name=libgcc.a \ + 2>/dev/null) + + if [ -n "$ccenv_libgcc_path" ]; then + ccenv_libgcc_a_header=$(od -b -N8 \ + $($ccenv_cc -print-file-name=libgcc.a) \ + | head -n1) + else + ccenv_libgcc_a_header= + fi + else + ccenv_libgcc_a_header= + fi + + # ar (default) + ccenv_cc_arfmt='common' + + # ar (big) + ccenv_bigaf_header=$(printf '%s\n' '<bigaf>' | od -b | head -n1) + + if [ "$ccenv_libgcc_a_header" = "$ccenv_bigaf_header" ]; then + ccenv_cc_arfmt='bigaf' + + for __tool in $(printf '%s' "$ccenv_core_tools"); do + ccenv_var_name=ccenv_$__tool + ccenv_var_expr='${'$ccenv_var_name':-}' + eval ccenv_var_val="$ccenv_var_expr" + + if [ "$ccenv_var_val" != false ]; then + ccenv_var_val="$ccenv_var_val -X64" + ccenv_var_expr='${ccenv_var_val:-}' + eval ccenv_$__tool="$ccenv_var_expr" + fi + done + fi + + # ar (small) + ccenv_aiaff_header=$(printf '%s\n' '<aiaff>' | od -b | head -n1) + + if [ "$ccenv_libgcc_a_header" = "$ccenv_aiaff_header" ]; then + ccenv_cc_arfmt='aiaff' + + for __tool in $(printf '%s' "$ccenv_core_tools"); do + ccenv_var_name=ccenv_$__tool + ccenv_var_expr='${'$ccenv_var_name':-}' + eval ccenv_var_val="$ccenv_var_expr" + + if [ "$ccenv_var_val" != false ]; then + ccenv_var_val="$ccenv_var_val -X32" + ccenv_var_expr='${ccenv_var_val:-}' + eval ccenv_$__tool="$ccenv_var_expr" + fi + done + fi } ccenv_set_tool_variants() @@ -236,7 +318,7 @@ ccenv_set_tool_variants() if [ "$ccenv_tool" = false ]; then ccenv_as_asm= else - $ccenv_tool --help | grep -i '.bc assembler' \ + $ccenv_tool --help 2>&1 | grep -i '.bc assembler' \ || ccenv_as_asm="$ccenv_tool" fi @@ -386,7 +468,7 @@ ccenv_set_c_compiler_candidates() ccenv_candidates="$mb_toolchain c99 c11 cc gcc clang" else - ccenv_candidates="c99 c11 cc gcc clang" + ccenv_candidates="cc gcc clang c99 c11" fi } @@ -397,24 +479,77 @@ ccenv_set_cc() if [ -z "$ccenv_cc" ]; then ccenv_set_c_compiler_candidates - ccenv_find_tool -dumpmachine + ccenv_find_tool ccenv_cc="$ccenv_tool" fi + if [ "$ccenv_cc" = false ] && [ -n "$mb_compiler" ]; then ccenv_cc="$mb_compiler" fi + ccenv_tool_epilog "$ccenv_cc" + + + if [ $ccenv_cfgtype = 'host' ]; then + ccenv_host_cc="$ccenv_cc" + cfgtest_host_section + ccenv_host_cc= + else + ccenv_native_cc="$ccenv_cc" + cfgtest_native_section + ccenv_native_cc= + fi + + cfgtest_silent='yes' + + if cfgtest_compiler_switch -dumpmachine ; then + ccenv_dumpmachine_switch='-dumpmachine' + else + ccenv_dumpmachine_switch= + fi + + if cfgtest_code_snippet_asm 'typedef int dummy;' ; then + eval ccenv_${ccenv_cfgtype}_stdin_input='yes' + else + eval ccenv_${ccenv_cfgtype}_stdin_input='no' + fi + + unset cfgtest_silent + ccenv_cc_cmd="$ccenv_cc" ccenv_errors= if [ "$ccenv_cfgtype" = 'native' ]; then - ccenv_host=$($ccenv_cc $(printf '%s' "$ccenv_cflags") -dumpmachine 2>&3) + ccenv_host= + + if [ -n "$mb_native_host" ]; then + ccenv_host="$mb_native_host" + + elif [ -n "$ccenv_dumpmachine_switch" ]; then + ccenv_host=$(eval $ccenv_cc $(printf '%s' "$ccenv_cflags") \ + $ccenv_dumpmachine_switch 2>&3) + + elif command -v slibtool > /dev/null 2>&1; then + ccenv=$(slibtool --dumpmachine 2>/dev/null || true) + fi + + if [ -z "$ccenv_host" ]; then + ccenv_machine=$(uname -m 2>/dev/null) + ccenv_system=$(uname -s 2>/dev/null) + + ccenv_machine="${ccenv_machine:-unknown}" + ccenv_system="${ccenv_system:-anyos}" + + ccenv_host=$(printf '%s' "${ccenv_machine}-unknown-${ccenv_system}" \ + | tr '[[:upper:]]' '[[:lower:]]') + fi + 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 @@ -423,10 +558,31 @@ ccenv_set_cc() ccenv_host= fi - if [ -z "$ccenv_host" ]; then - ccenv_host=$($ccenv_cc $(printf '%s' "$ccenv_cflags") -dumpmachine 2>&3) + if [ -z "$ccenv_host" ] && [ -n "$ccenv_dumpmachine_switch" ]; then + ccenv_host=$(eval $ccenv_cc $(printf '%s' "$ccenv_cflags") \ + $ccenv_dumpmachine_switch 2>&3) ccenv_cchost=$ccenv_host - else + + elif [ -z "$ccenv_host" ]; then + # no -dumpmachine support and no --host argument implies native build + if command -v slibtool > /dev/null 2>&1; then + ccenv=$(slibtool --dumpmachine 2>/dev/null || true) + fi + + if [ -z "$ccenv_host" ]; then + ccenv_machine=$(uname -m 2>/dev/null) + ccenv_system=$(uname -s 2>/dev/null) + + ccenv_machine="${ccenv_machine:-unknown}" + ccenv_system="${ccenv_system:-anyos}" + + ccenv_host=$(printf '%s' "${ccenv_machine}-unknown-${ccenv_system}" \ + | tr '[[:upper:]]' '[[:lower:]]') + fi + + ccenv_cchost=$ccenv_host + + elif [ -n "$ccenv_dumpmachine_switch" ]; then ccenv_tmp=$(mktemp ./tmp_XXXXXXXXXXXXXXXX) ccenv_cmd="$ccenv_cc --target=$ccenv_host -E -xc -" @@ -437,8 +593,10 @@ ccenv_set_cc() ccenv_errors=$(cat "$ccenv_tmp") if [ -z "$ccenv_errors" ]; then + ccenv_tool_prolog 'C compiler for host' ccenv_tflags="--target=$ccenv_host" ccenv_cc="$ccenv_cc $ccenv_tflags" + ccenv_tool_epilog "$ccenv_cc" else printf '%s' "$ccenv_errors" >&3 fi @@ -447,10 +605,14 @@ ccenv_set_cc() rm -f "$ccenv_tmp" unset ccenv_tmp - ccenv_cchost=$($ccenv_cc $(printf '%s' "$ccenv_cflags") -dumpmachine 2>&3) + ccenv_cchost=$(eval $ccenv_cc $(printf '%s' "$ccenv_cflags") \ + $ccenv_dumpmachine_switch 2>&3) fi - if [ "$ccenv_cchost" != "$ccenv_host" ]; then + if [ -z "$ccenv_dumpmachine_switch" ] && [ -n "$ccenv_host" ]; then + ccenv_cchost="$ccenv_host" + + elif [ "$ccenv_cchost" != "$ccenv_host" ]; then printf 'error!\n' >&2 printf 'ccenv:\n' >&2 printf 'ccenv: ccenv_host: %s \n' $ccenv_host >&2 @@ -476,8 +638,6 @@ ccenv_set_cc() return 2 fi - - ccenv_tool_epilog "$ccenv_cc" } ccenv_set_cpp() @@ -550,16 +710,25 @@ ccenv_set_cxx() ccenv_candidates="clang++" ;; *-gcc ) - ccenv_cpp_prefix=${ccenv_cc_cmd%-gcc*}- - ccenv_candidates="${ccenv_cpp_prefix}g++" ;; + ccenv_cxx_prefix=${ccenv_cc_cmd%-gcc*}- + ccenv_candidates="${ccenv_cxx_prefix}g++" ;; *-clang ) - ccenv_cpp_prefix=${ccenv_cc_cmd%-clang*}- - ccenv_candidates="${ccenv_cpp_prefix}clang++" ;; + ccenv_cxx_prefix=${ccenv_cc_cmd%-clang*}- + ccenv_candidates="${ccenv_cxx_prefix}clang++" ;; - *cc ) - ccenv_cxx_prefix=${ccenv_cc_cmd%cc*} - ccenv_candidates="${ccenv_cpp_prefix}++" ;; + /*cc | /*c99 | /*c11 ) + ccenv_cxx_prefix=${ccenv_cc_cmd%/*} + ccenv_candidates="${ccenv_cxx_prefix}/cxx" + ccenv_candidates="${ccenv_candidates} ${ccenv_cxx_prefix}/c++" ;; + + /*gcc ) + ccenv_cxx_prefix=${ccenv_cc_cmd%/*} + ccenv_candidates="${ccenv_cxx_prefix}/g++" ;; + + /*clang ) + ccenv_cxx_prefix=${ccenv_cc_cmd%/*} + ccenv_candidates="${ccenv_cxx_prefix}/clang++" ;; * ) ccenv_cxx="$ccenv_cc -xc++" @@ -596,16 +765,32 @@ ccenv_set_cc_bits() 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 + 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 + ccenv_expr='ccenv_stdin_input=$ccenv_'${ccenv_cfgtype}'_stdin_input' + eval ${ccenv_expr} + + if [ "$ccenv_stdin_input" = 'yes' ]; then + printf '%s' "$ccenv_internal_str" \ + | eval $ccenv_cc -S -xc - -o - \ + $(printf '%s' "$ccenv_cflags") \ + > /dev/null 2>&3 \ + && ccenv_internal_size=$ccenv_internal_guess + else + ccenv_tmpname='ccenv/c3RyaWN0X21vZGUK.c' + + printf '%s' "$ccenv_internal_str" \ + > "$ccenv_tmpname" + + $ccenv_cc -c "$ccenv_tmpname" -o a.out \ + > /dev/null 2>&3 \ + && ccenv_internal_size=$ccenv_internal_guess + + rm "$ccenv_tmpname" + fi fi done @@ -621,32 +806,58 @@ ccenv_set_cc_underscore() 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_tmpname='ccenv/c3RyaWN0X21vZGUK.c' + + printf "$ccenv_fn_code" $ccenv_fn_name \ + > "$ccenv_tmpname" + + $ccenv_cc -c "$ccenv_tmpname" -o a.out \ + > /dev/null 2>&3 + + if "$ccenv_nm" a.out | grep \ + -e "^_$ccenv_fn_name" \ + -e " _$ccenv_fn_name" \ + > /dev/null; then ccenv_cc_underscore='_' ccenv_attr_epilog 'yes' + else + ccenv_attr_epilog 'no' fi - ccenv_attr_epilog 'no' + rm "$ccenv_tmpname" + rm a.out return 0 } ccenv_create_framework_executable() { + if [ "$ccenv_cfgtype" = 'host' ]; then + if [ "$mb_freestanding" = 'yes' ]; then + return 1 + fi + fi + if [ -f $ccenv_image ]; then mv $ccenv_image $ccenv_image.tmp rm -f $ccenv_image.tmp fi + ccenv_tmpname='ccenv/c3RyaWN0X21vZGUK.c' + printf 'int main(void){return 0;}' \ - | $ccenv_cc -xc - \ - -o $ccenv_image \ - || return 1 + > "$ccenv_tmpname" - return 0 + if $ccenv_cc "$ccenv_tmpname" -o $ccenv_image 2>&3; then + ccenv_ret=0 + ccenv_cc_environment='hosted' + else + ccenv_ret=1 + fi + + rm "$ccenv_tmpname" + + return $ccenv_ret } ccenv_create_freestanding_executable() @@ -662,16 +873,25 @@ ccenv_create_freestanding_executable() 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_tmpname='ccenv/c3RyaWN0X21vZGUK.c' - ccenv_freestd=yes + printf 'int %s(void){return 0;}' "$ccenv_start_fn" \ + > "$ccenv_tmpname" - return 0 + if $ccenv_cc "$ccenv_tmpname" \ + -ffreestanding \ + -nostdlib -nostartfiles \ + -o $ccenv_image \ + 2>&3; then + ccenv_ret=0 + ccenv_cc_environment='freestanding' + else + ccenv_ret=1 + fi + + rm "$ccenv_tmpname" + + return $ccenv_ret } ccenv_set_cc_binfmt_error() @@ -779,7 +999,8 @@ ccenv_set_cc_binfmt() # 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 'Format:' \ + | sed -e 's/ /_/g' \ | grep -i '_Mach-O_' \ > /dev/null; then ccenv_cc_binfmt='MACHO' @@ -822,7 +1043,7 @@ ccenv_set_cc_binfmt() ccenv_set_os_pe() { - if [ -n "$ccenv_freestd" ]; then + if [ "$ccenv_cc_environment" = 'freestanding' ]; then case "$ccenv_cchost" in *-midipix | *-midipix-* ) ccenv_os='midipix' ;; @@ -897,14 +1118,20 @@ ccenv_set_os() fi case "$ccenv_cchost" in - *-*-*-* ) - ccenv_tip=${ccenv_cchost%-*} - ccenv_os=${ccenv_tip#*-*-} - ;; *-*-musl | *-*-gnu ) ccenv_tip=${ccenv_cchost%-*} ccenv_os=${ccenv_tip#*-} ;; + *-*-solaris* ) + ccenv_os='solaris' + ;; + *-*-*bsd* | *-*-dragonfly* ) + ccenv_os='bsd' + ;; + *-*-*-* ) + ccenv_tip=${ccenv_cchost%-*} + ccenv_os=${ccenv_tip#*-*-} + ;; *-*-* ) ccenv_os=${ccenv_cchost#*-*-} ;; @@ -994,6 +1221,71 @@ ccenv_set_os_semantics() ccenv_attr_epilog "$ccenv_os_semantics" } +ccenv_set_os_dso_format() +{ + ccenv_attr_prolog 'os dso format' + + case "$ccenv_cc_arfmt" in + common ) + ccenv_cc_sofmt="$ccenv_cc_binfmt" + ;; + + bigaf ) + ccenv_libgcc_s_a_header=$(od -b -N8 \ + $($ccenv_cc -print-file-name=libgcc_s.a) \ + 2>/dev/null \ + | head -n1) + + ccenv_libgcc_s_so_header=$(od -b -N8 \ + $($ccenv_cc -print-file-name=libgcc_s.so) \ + 2>/dev/null \ + | head -n1) + + if [ "$ccenv_libgcc_s_a_header" = "$ccenv_bigaf_header" ]; then + ccenv_cc_sofmt='bigaf' + elif [ "$ccenv_libgcc_s_so_header" = "$ccenv_bigaf_header" ]; then + ccenv_cc_sofmt='bigaf' + else + ccenv_cc_sofmt="$ccenv_cc_binfmt" + fi + ;; + + aiaff ) + ccenv_libgcc_s_a_header=$(od -b -N8 \ + $($ccenv_cc -print-file-name=libgcc_s.a) \ + | head -n1) + + ccenv_libgcc_s_so_header=$(od -b -N8 \ + $($ccenv_cc -print-file-name=libgcc_s.so) \ + | head -n1) + + if [ "$ccenv_libgcc_s_a_header" = "$ccenv_aiaff_header" ]; then + ccenv_cc_sofmt='aiaff' + elif [ "$ccenv_libgcc_s_so_header" = "$ccenv_aiaff_header" ]; then + ccenv_cc_sofmt='aiaff' + else + ccenv_cc_sofmt="$ccenv_cc_binfmt" + fi + ;; + esac + + if [ "$ccenv_cfgtype" = 'host' ]; then + case "$ccenv_cc_sofmt" in + bigaf | aiaff ) + mb_shared_lib_cmd='$(AR) -rcs' + mb_shared_lib_ldflags= + ;; + + * ) + mb_shared_lib_cmd='$(CC) -shared -o' + mb_shared_lib_ldflags='$(LDFLAGS_SHARED)' + ;; + esac + fi + + ccenv_attr_epilog "$ccenv_cc_sofmt" +} + ccenv_set_os_dso_exrules() { ccenv_attr_prolog 'os dso exrules' @@ -1126,6 +1418,42 @@ ccenv_set_os_pe_switches() ;; esac fi + + if [ "$ccenv_cc_binfmt" = 'PE' ]; then + if ! cfgtest_macro_definition '__PE__'; then + ccenv_cflags_os="${ccenv_cflags_os} -D__PE__" + fi + + if ! cfgtest_macro_definition '__dllexport'; then + ccenv_cflags_os="${ccenv_cflags_os} -D__dllexport=__attribute__\(\(__dllexport__\)\)" + fi + + if ! cfgtest_macro_definition '__dllimport'; then + ccenv_cflags_os="${ccenv_cflags_os} -D__dllimport=__attribute__\(\(__dllimport__\)\)" + fi + fi +} + +ccenv_set_os_gate_switches() +{ + if [ "$ccenv_os" = 'solaris' ]; then + if ! cfgtest_macro_definition 'AT_FDCWD'; then + ccenv_cflags_os="${ccenv_cflags_os} -D__EXTENSIONS__" + fi + fi +} + +ccenv_set_os_bsd_switches() +{ + if [ "$ccenv_os" = 'bsd' ]; then + mb_cfgtest_headers='sys/mman.h' + + if ! cfgtest_macro_definition 'MAP_ANON'; then + ccenv_cflags_os="${ccenv_cflags_os} -D__BSD_VISIBLE" + fi + + mb_cfgtest_headers= + fi } ccenv_output_defs() @@ -1143,33 +1471,44 @@ ccenv_output_defs() 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" + sed \ + -e 's/^[[:space:]]*$/@/g' \ + -e 's/^/NATIVE_/' \ + -e 's/NATIVE_@//g' \ + -e 's/NATIVE_#/#/g' \ + -e 's/ =/=/g' \ + -e 's/ +=/+=/g' \ + $(printf '%s ' $ccenv_in) \ + > "$ccenv_tmp" ccenv_in="$ccenv_tmp" else unset ccenv_tmp fi + ccenv_var_defs= + ccenv_sed_substs="-e s/@ccenv_cfgtype@/${ccenv_cfgtype}/g" + ccenv_vars=$(cut -d'=' -f1 "$mb_project_dir/sofort/ccenv/ccenv.vars" \ - | grep -v '^#') + | grep -v '^#'); - ccenv_exvars="ccenv_cfgtype ccenv_makevar_prefix" + ccenv_exvars="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)" + for __var in $(printf '%s' "$ccenv_vars $ccenv_exvars"); do + ccenv_sed_subst=$(printf '%s %s%s%s' \ + '-e' "'s^@$__var@" \ + "^___${__var}___" \ + "^g'") - eval sed $ccenv_sed_substs $ccenv_in \ - | sed -e 's/[[:blank:]]*$//g' \ + ccenv_sed_substs="$ccenv_sed_substs $ccenv_sed_subst" + + ccenv_var_def=$(printf '%s%s="${%s}"' "-D" "___${__var}___" "${__var}") + eval ccenv_var_defs='"$ccenv_var_defs "$ccenv_var_def' + done + + eval sed $ccenv_sed_substs $(printf '%s ' $ccenv_in) \ + | eval m4 $ccenv_var_defs - \ + | sed -e 's/[[:blank:]]*$//g' \ > "$ccenv_mk" if [ "$ccenv_cfgtype" = 'host' ]; then @@ -1199,6 +1538,181 @@ ccenv_output_defs() rm -f "$ccenv_tmp" unset ccenv_tmp fi + + + if [ "${ccenv_cfgtype}" = 'host' ]; then + ccenv_cflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" .cflags-host) + ccenv_ldflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" .ldflags-host) + else + ccenv_cflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" .cflags-native) + ccenv_ldflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" .ldflags-native) + fi + + ccenv_cflags="${ccenv_cflags#*: }" + ccenv_ldflags="${ccenv_ldflags#*: }" + + ccenv_sysroot=$(eval $ccenv_cc $(printf '%s' "$ccenv_cflags") \ + -print-sysroot 2>/dev/null || true) + + eval 'ccenv_'${ccenv_cfgtype}'_cflags'=\'$ccenv_cflags\' + eval 'ccenv_'${ccenv_cfgtype}'_ldflags'=\'$ccenv_ldflags\' + eval 'ccenv_'${ccenv_cfgtype}'_sysroot'=\'$ccenv_sysroot\' + + eval 'ccenv_'${ccenv_cfgtype}'_cc'=\'$ccenv_cc\' + eval 'ccenv_'${ccenv_cfgtype}'_cc_environment'=\'$ccenv_cc_environment\' + eval 'ccenv_'${ccenv_cfgtype}'_dumpmachine_switch'=\'$ccenv_dumpmachine_switch\' + eval 'ccenv_'${ccenv_cfgtype}'_pkgconf'=\'$ccenv_pkgconf\' + +} + +ccenv_set_cc_sysroot_vars() +{ + if [ "$ccenv_cfgtype" = 'native' ] || [ -z "$mb_sysroot" ]; then + return 0 + fi + + cfgtest_host_section + ccenv_switch_var="--sysroot=${mb_sysroot}" + + if cfgtest_compiler_switch_arg "${ccenv_switch_var}"; then + printf '\n# %s sysroot: cflags and ldflags\n' "$ccenv_cfgtype" \ + >> "$ccenv_mk" + + for ccenv_make_var in '_CFLAGS_SYSROOT' '_LDFLAGS_SYSROOT'; do + printf '%-40s= %s\n' "${ccenv_make_var}" "${ccenv_switch_var}" \ + >> "$ccenv_mk" + done + else + printf '\n# %s sysroot: cflags and ldflags %s\n' "$ccenv_cfgtype" \ + '(not supported: see config.log)' \ + >> "$ccenv_mk" + + for ccenv_make_var in '_CFLAGS_SYSROOT' '_LDFLAGS_SYSROOT'; do + printf '%-40s=\n' "${ccenv_make_var}" \ + >> "$ccenv_mk" + done + fi +} + +ccenv_set_cc_switch_vars() +{ + printf '\n# %s cflags: supported compiler switches\n' "$ccenv_cfgtype" \ + >> "$ccenv_mk" + + if [ -f $mb_project_dir/project/config/ccswitch.strs ]; then + ccenv_switch_vars=$(cat \ + $mb_project_dir/sofort/ccenv/ccswitch.strs \ + $mb_project_dir/project/config/ccswitch.strs \ + | grep -v -e '^#' -e '^-Wl,' \ + | sort -u) + else + ccenv_switch_vars=$(grep -v -e '^#' -e '^-Wl,' \ + $mb_project_dir/sofort/ccenv/ccswitch.strs \ + | sort -u) + fi + + if [ $ccenv_cfgtype = 'host' ]; then + ccenv_makevar_prefix='_CFLAGS_' + cfgtest_host_section + else + ccenv_makevar_prefix='_NATIVE_CFLAGS_' + cfgtest_native_section + fi + + for ccenv_switch_var in $(printf '%s' "$ccenv_switch_vars"); do + ccenv_make_var=${ccenv_switch_var%=} + ccenv_make_var=${ccenv_make_var%,} + + ccenv_make_var=${ccenv_make_var##---} + ccenv_make_var=${ccenv_make_var##--} + ccenv_make_var=${ccenv_make_var##-} + + ccenv_make_var=$(printf '%s' "$ccenv_make_var" \ + | sed -e 's/=/_/g' -e 's/-/_/g' -e 's/,/_/g') + + ccenv_make_var="${ccenv_makevar_prefix}${ccenv_make_var}" + + if cfgtest_compiler_switch "$ccenv_switch_var"; then + ccenv_switch_var=${ccenv_switch_var%=} + ccenv_switch_var=${ccenv_switch_var%,} + + printf '%-40s= %s\n' "${ccenv_make_var}" "${ccenv_switch_var}" \ + >> "$ccenv_mk" + else + printf '%-40s=\n' "${ccenv_make_var}" \ + >> "$ccenv_mk" + fi + done +} + +ccenv_set_cc_linker_switch_vars() +{ + printf '\n# %s ldflags: supported compiler switches\n' "$ccenv_cfgtype" \ + >> "$ccenv_mk" + + if [ -f $mb_project_dir/project/config/ccswitch.strs ]; then + ccenv_switch_vars=$(cat \ + $mb_project_dir/sofort/ccenv/ccswitch.strs \ + $mb_project_dir/project/config/ccswitch.strs \ + | grep -e '^-Wl,' \ + | sort -u) + else + ccenv_switch_vars=$(grep -e '^-Wl,' \ + $mb_project_dir/sofort/ccenv/ccswitch.strs \ + | sort -u) + fi + + if [ $ccenv_cfgtype = 'host' ]; then + ccenv_makevar_prefix='_LDFLAGS_' + cfgtest_host_section + else + ccenv_makevar_prefix='_NATIVE_LDFLAGS_' + cfgtest_native_section + fi + + for ccenv_switch_var in $(printf '%s' "$ccenv_switch_vars"); do + ccenv_make_var=${ccenv_switch_var%=} + ccenv_make_var=${ccenv_make_var%,} + + ccenv_make_var=${ccenv_make_var##---} + ccenv_make_var=${ccenv_make_var##--} + ccenv_make_var=${ccenv_make_var##-} + + ccenv_make_var=$(printf '%s' "$ccenv_make_var" \ + | sed -e 's/=/_/g' -e 's/-/_/g' -e 's/,/_/g') + + ccenv_make_var="${ccenv_makevar_prefix}${ccenv_make_var}" + + if cfgtest_compiler_switch "$ccenv_switch_var"; then + ccenv_switch_var=${ccenv_switch_var%=} + ccenv_switch_var=${ccenv_switch_var%,} + + printf '%-40s= %s\n' "${ccenv_make_var}" "${ccenv_switch_var}" \ + >> "$ccenv_mk" + else + printf '%-40s=\n' "${ccenv_make_var}" \ + >> "$ccenv_mk" + fi + done +} + +ccenv_set_cc_attr_visibility_vars() +{ + if cfgtest_attr_visibility 'default'; then + ccenv_attr_visibility_default="$mb_cfgtest_attr" + fi + + if cfgtest_attr_visibility 'hidden'; then + ccenv_attr_visibility_hidden="$mb_cfgtest_attr" + fi + + if cfgtest_attr_visibility 'internal'; then + ccenv_attr_visibility_internal="$mb_cfgtest_attr" + fi + + if cfgtest_attr_visibility 'protected'; then + ccenv_attr_visibility_protected="$mb_cfgtest_attr" + fi } ccenv_dso_verify() @@ -1226,7 +1740,6 @@ ccenv_common_init() ccenv_cfgtype=$1 ccenv_cfgfile="$mb_pwd/ccenv/$ccenv_cfgtype.mk" - ccenv_freestd= ccenv_cchost= if [ $ccenv_cfgtype = 'native' ]; then @@ -1249,7 +1762,13 @@ ccenv_common_init() if [ $ccenv_cfgtype = 'host' ]; then ccenv_tflags= - ccenv_cflags=$(make -s -f "$mb_pwd/Makefile.tmp" .cflags-host) + ccenv_cflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" \ + OS_DSO_EXRULES=default \ + OS_SONAME=symlink \ + OS_ARCHIVE_EXT='.a' \ + .cflags-host) + + ccenv_cflags="${ccenv_cflags#*: }" ccenv_cc="$mb_user_cc" ccenv_cpp="$mb_user_cpp" @@ -1259,7 +1778,14 @@ ccenv_common_init() ccenv_pe_image_base="$mb_pe_image_base" else ccenv_tflags= - ccenv_cflags=$(make -s -f "$mb_pwd/Makefile.tmp" .cflags-native) + ccenv_cflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" \ + OS_DSO_EXRULES=default \ + OS_SONAME=symlink \ + OS_ARCHIVE_EXT='.a' \ + .cflags-native) + + ccenv_cflags="${ccenv_cflags#*: }" + ccenv_cc="$mb_native_cc" ccenv_cpp="$mb_native_cpp" ccenv_cxx="$mb_native_cxx" @@ -1290,15 +1816,21 @@ ccenv_set_toolchain_variables() ccenv_set_os ccenv_set_os_flags ccenv_set_os_semantics + ccenv_set_os_dso_format ccenv_set_os_dso_exrules ccenv_set_os_dso_linkage ccenv_set_os_dso_patterns ccenv_set_os_pe_switches + ccenv_set_os_gate_switches + ccenv_set_os_bsd_switches + ccenv_set_cc_attr_visibility_vars ccenv_output_defs ccenv_clean_up - eval 'ccenv_'${ccenv_cfgtype}'_cc'=\'$ccenv_cc\' + ccenv_set_cc_sysroot_vars + ccenv_set_cc_switch_vars + ccenv_set_cc_linker_switch_vars } ccenv_set_host_variables() diff --git a/sofort/ccenv/ccenv.vars b/sofort/ccenv/ccenv.vars index 4775b37..054b638 100644 --- a/sofort/ccenv/ccenv.vars +++ b/sofort/ccenv/ccenv.vars @@ -24,8 +24,11 @@ ccenv_os_lib_suffixed_suffix= ccenv_cc_host= ccenv_cc_bits= +ccenv_cc_arfmt= +ccenv_cc_sofmt= ccenv_cc_binfmt= ccenv_cc_underscore= +ccenv_cc_environment= ccenv_cc_arch_bfd= ccenv_cc_arch_llvm= @@ -77,6 +80,14 @@ ccenv_dlltool= ccenv_windmc= ccenv_windrc= +ccenv_pkgconf= + +# visibility attributes +ccenv_attr_visibility_default= +ccenv_attr_visibility_hidden= +ccenv_attr_visibility_internal= +ccenv_attr_visibility_protected= + # cflags ccenv_cflags_os= ccenv_cflags_pic= diff --git a/sofort/ccenv/ccswitch.strs b/sofort/ccenv/ccswitch.strs new file mode 100644 index 0000000..277e02e --- /dev/null +++ b/sofort/ccenv/ccswitch.strs @@ -0,0 +1,51 @@ +# ccswitch.strs: project-agnostic list of compiler switches, +# for which support is tested by default. + +# when -foo is supported by the host or native compiler, add +# ``CFLAGS_foo = -foo'' to the respective ccenv variable file +# (that is, ccenv/host.mk or ccenv/native.mk). + +# the make variable prefix is _CFLAGS_ or _NATIVE_CFLAGS_ +# (_LDFLAGS_ or _NATIVE_LDFLAGS for -Wl, linker options), +# to which the compiler-switch, minus leading dashes and +# trailing equal-sign or comma, is appended; non-leading +# dashes and non-trailing equal-signs and commas are then +# substituted with underscores. + +# the project-agnostic list below can be supplemented by a +# project-specific one, named project/config/ccswitch.strs. + +# toolchain switches +-dumpmachine +-print-file-name= + +# flavors and variants +-std=c89 +-std=c99 +-std=c11 + +# linker switches +-Wl,--print-map +-Wl,--no-undefined +-Wl,--verbose + +# errors and warnings +-Wall +-Werror +-Wextra +-Wundef +-Wpedantic + +# debugging +-g +-g0 +-g1 +-g2 +-g3 + +# optimization +-O0 +-O1 +-O2 +-O3 +-Os diff --git a/sofort/ccenv/pedefs.in b/sofort/ccenv/pedefs.in index 300d990..008b271 100644 --- a/sofort/ccenv/pedefs.in +++ b/sofort/ccenv/pedefs.in @@ -1,4 +1,4 @@ # @ccenv_cfgtype@ pe switches -PE_SUBSYSTEM = @ccenv_pe_subsystem@ -PE_IMAGE_BASE = @ccenv_pe_image_base@ +PE_SUBSYSTEM = @ccenv_pe_subsystem@ +PE_IMAGE_BASE = @ccenv_pe_image_base@ diff --git a/sofort/cfgtest/cfgtest.sh b/sofort/cfgtest/cfgtest.sh new file mode 100644 index 0000000..8e1db07 --- /dev/null +++ b/sofort/cfgtest/cfgtest.sh @@ -0,0 +1,939 @@ +# cfgtest.sh: sofort's config test framework, +# for use from within a project's custom cfgdefs.sh. + +# this file is covered by COPYING.SOFORT. + +# in the common scenario, host-specific tests are preceded +# by a single invocation of cfgtest_host_section, whereas +# native (build) system tests are preceded by the invocation +# of cfgtest_native_section. + +# cfgdefs fraework variables: +# mb_cfgtest_cc: the compiler used for the current test +# mb_cfgtest_pkgconf: the pkgconf utility used for the current test +# mb_cfgtest_cflags: the compiler flags used for the current test +# mb_cfgtest_cfgtype: the type of the current test (host/native) +# mb_cfgtest_makevar: the make variable affected by the current test +# mb_cfgtest_headers: headers for ad-hoc inclusion with the current test +# mb_cfgtest_attr: if supported, the compiler-specific attribute definition + + +cfgtest_newline() +{ + printf '\n' >> $mb_pwd/cfgdefs.mk +} + + +cfgtest_comment() +{ + mb_internal_str='#' + + for mb_internal_arg ; do + mb_internal_str="$mb_internal_str $mb_internal_arg" + done + + printf '%s\n' "$mb_internal_str" >> $mb_pwd/cfgdefs.mk +} + + +cfgtest_host_section() +{ + mb_cfgtest_cc="$ccenv_host_cc" + mb_cfgtest_pkgconf="${ccenv_host_pkgconf:-false}" + mb_cfgtest_cfgtype='host' + mb_cfgtest_stdin_input=${ccenv_host_stdin_input:-} + mb_cfgtest_environment=${ccenv_host_cc_environment:-} + + mb_cfgtest_cflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" \ + OS_DSO_EXRULES=default \ + OS_SONAME=symlink \ + OS_ARCHIVE_EXT='.a' \ + .cflags-host) + + mb_cfgtest_cflags="${mb_cfgtest_cflags#*: }" + + mb_cfgtest_ldflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" \ + OS_DSO_EXRULES=default \ + OS_SONAME=symlink \ + OS_ARCHIVE_EXT='.a' \ + .ldflags-host) + + mb_cfgtest_ldflags="${mb_cfgtest_ldflags#*: }" +} + + +cfgtest_native_section() +{ + mb_cfgtest_cc="$ccenv_native_cc" + mb_cfgtest_pkgconf="${ccenv_native_pkgconf:-false}" + mb_cfgtest_cfgtype='native' + mb_cfgtest_stdin_input=${ccenv_native_stdin_input:-} + mb_cfgtest_environment=${ccenv_native_cc_environment:-} + + mb_cfgtest_cflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" \ + OS_DSO_EXRULES=default \ + OS_SONAME=symlink \ + OS_ARCHIVE_EXT='.a' \ + .cflags-native) + + mb_cfgtest_cflags="${mb_cfgtest_cflags#*: }" + + mb_cfgtest_ldflags=$(${mb_make} -n -f "$mb_pwd/Makefile.tmp" \ + OS_DSO_EXRULES=default \ + OS_SONAME=symlink \ + OS_ARCHIVE_EXT='.a' \ + .ldflags-native) + + mb_cfgtest_ldflags="${mb_cfgtest_ldflags#*: }" +} + + +cfgtest_prolog() +{ + cfgtest_line_dots='...........................' + cfgtest_line_dots="${cfgtest_line_dots}${cfgtest_line_dots}" + cfgtest_tool_desc=" == trying ${mb_cfgtest_cfgtype} ${1}: ${2}" + cfgtest_tool_dlen="${#cfgtest_line_dots}" + + printf '\n%s\n' '________________________' >&3 + printf "cfgtest: probing for ${mb_cfgtest_cfgtype} ${1}: ${2}\n\n" >&3 + + if [ "${cfgtest_silent:-}" != 'yes' ]; then + printf "%${cfgtest_tool_dlen}.${cfgtest_tool_dlen}s" \ + "${cfgtest_tool_desc} ${mb_line_dots}" + fi +} + + +cfgtest_epilog() +{ + cfgtest_line_dots='...............' + cfgtest_tool_dlen="$((${#cfgtest_line_dots} - ${#2}))" + + if [ "${cfgtest_silent:-}" != 'yes' ]; then + printf "%${cfgtest_tool_dlen}.${cfgtest_tool_dlen}s %s.\n" \ + "${cfgtest_line_dots}" "${2}" + fi + + if [ "${1}" = 'snippet' ] && [ -f 'a.out' ]; then + rm -f 'a.out' + fi + + if [ "$mb_cfgtest_stdin_input" = 'no' ]; then + rm 'cfgtest_c3RyaWN0X21vZGUK.c' + fi + + if [ "${1}" = 'snippet' ] && [ "${2}" = '(error)' ]; then + printf '\n\ncfgtest: the %s compiler %s %s.\n' \ + "$mb_cfgtest_cfgtype" \ + 'failed to compile the above code' \ + "${1}" >&3 + printf '%s\n' '------------------------' >&3 + return 1 + fi + + if [ "${1}" = 'attr' ] && [ "${2}" = '(error)' ]; then + printf '\n\ncfgtest: the %s compiler %s %s_ attribute.\n' \ + "$mb_cfgtest_cfgtype" \ + 'does not appear to support the _' \ + "${3}" >&3 + printf '%s\n' '------------------------' >&3 + return 1 + fi + + if [ "${2}" = '-----' ] || [ "${2}" = '(missing)' ]; then + printf '\n\ncfgtest: %s %s is missing or cannot be found.\n' "${1}" "${3}" >&3 + printf '%s\n' '------------------------' >&3 + return 1 + elif [ "${1}" = 'size-of-type' ] && [ "${2}" = '(error)' ]; then + printf '\n\ncfgtest: could not determine size of type `%s.\n' "${3}'" >&3 + printf '%s\n' '------------------------' >&3 + return 1 + elif [ "${1}" = 'switch' ] && [ "${2}" = '(error)' ]; then + printf '\n\ncfgtest: the switch `%s is not supported by the %s compiler.\n' \ + "${3}'" "$mb_cfgtest_cfgtype" >&3 + printf '%s\n' '------------------------' >&3 + return 1 + elif [ "${2}" = '(error)' ]; then + printf '\n\ncfgtest: %s `%s is not defined or cannot be used.\n' "${1}" "${3}'" >&3 + printf '%s\n' '------------------------' >&3 + return 1 + fi +} + + +cfgtest_entity_size_prolog() +{ + cfgtest_line_dots='.......................' + cfgtest_line_dots="${cfgtest_line_dots}${cfgtest_line_dots}" + cfgtest_tool_desc=" == checking size of ${mb_cfgtest_cfgtype} type: ${@}" + cfgtest_tool_dlen="${#cfgtest_line_dots}" + + printf '\n%s\n' '________________________' >&3 + printf "cfgtest: checking size of ${mb_cfgtest_cfgtype} type: ${@}\n\n" >&3 + + printf "%${cfgtest_tool_dlen}.${cfgtest_tool_dlen}s" \ + "${cfgtest_tool_desc} ${mb_line_dots}" +} + + +cfgtest_makevar_set() +{ + if [ -n "${@}" ]; then + mb_internal_str='= ' + else + mb_internal_str='=' + fi + + printf '%-25s%s%s\n' "$mb_cfgtest_makevar" "$mb_internal_str" "${@}" \ + >> $mb_pwd/cfgdefs.mk + + unset cfgtest_internal_unit_test +} + + +cfgtest_makevar_append() +{ + mb_internal_str='+=' + + for mb_internal_arg ; do + if ! [ -z "$mb_internal_arg" ]; then + mb_internal_str="$mb_internal_str $mb_internal_arg" + fi + done + + printf '%-24s%s\n' "$mb_cfgtest_makevar" "$mb_internal_str" \ + >> $mb_pwd/cfgdefs.mk + + unset cfgtest_internal_unit_test +} + + +cfgtest_cflags_append() +{ + if [ $mb_cfgtest_cfgtype = 'host' ]; then + mb_internal_makevar='CFLAGS_CONFIG' + else + mb_internal_makevar='NATIVE_CFLAGS' + fi + + mb_cfgtest_makevar_saved=$mb_cfgtest_makevar + mb_cfgtest_makevar=$mb_internal_makevar + + cfgtest_makevar_append "$@" + mb_cfgtest_makevar=$mb_cfgtest_makevar_saved +} + + +cfgtest_ldflags_append() +{ + if [ $mb_cfgtest_cfgtype = 'host' ]; then + mb_internal_makevar='LDFLAGS_CONFIG' + else + mb_internal_makevar='NATIVE_LDFLAGS' + fi + + mb_cfgtest_makevar_saved=$mb_cfgtest_makevar + mb_cfgtest_makevar=$mb_internal_makevar + + cfgtest_makevar_append "$@" + mb_cfgtest_makevar=$mb_cfgtest_makevar_saved +} + + +cfgtest_common_init() +{ + # cfgtest variables + cfgtest_type="${1:-}" + + if [ "$mb_cfgtest_stdin_input" = 'no' ]; then + if [ "$cfgtest_type" = 'lib' ]; then + cfgtest_fmt='%s cfgtest_c3RyaWN0X21vZGUK.c -o a.out' + elif [ "$cfgtest_type" = 'ldflag' ]; then + cfgtest_fmt='%s cfgtest_c3RyaWN0X21vZGUK.c -o a.out' + else + cfgtest_fmt='%s -c cfgtest_c3RyaWN0X21vZGUK.c -o a.out' + fi + elif [ "$cfgtest_type" = 'asm' ]; then + cfgtest_fmt='%s -c -xc - -o a.out' + elif [ "$cfgtest_type" = 'attr' ]; then + cfgtest_fmt='%s -c -xc - -o a.out -Werror' + elif [ "$cfgtest_type" = 'lib' ]; then + cfgtest_fmt='%s -xc - -o a.out' + elif [ "$cfgtest_type" = 'ldflag' ]; then + cfgtest_fmt='%s -xc - -o a.out' + else + cfgtest_fmt='%s -S -xc - -o -' + fi + + + if [ "$cfgtest_type" = 'lib' ]; then + cfgtest_cmd=$(printf "$cfgtest_fmt %s %s %s" \ + "$mb_cfgtest_cc" \ + "$mb_cfgtest_cflags" \ + "$mb_cfgtest_ldflags" \ + "$cfgtest_libs") + + elif [ "$cfgtest_type" = 'ldflag' ]; then + cfgtest_cmd=$(printf "$cfgtest_fmt %s %s %s" \ + "$mb_cfgtest_cc" \ + "$mb_cfgtest_cflags" \ + "$mb_cfgtest_ldflags" \ + "$cfgtest_switches") + + elif [ "$cfgtest_type" = 'switch' ]; then + cfgtest_cmd=$(printf "$cfgtest_fmt %s %s" \ + "$mb_cfgtest_cc" \ + "$mb_cfgtest_cflags" \ + "$cfgtest_switches") + else + cfgtest_cmd=$(printf "$cfgtest_fmt %s" \ + "$mb_cfgtest_cc" \ + "$mb_cfgtest_cflags") + fi + + + if [ -n "$mb_cfgtest_headers" ]; then + cfgtest_inc=$(printf '#include <%s>\n' $mb_cfgtest_headers) + cfgtest_src=$(printf '%s\n_\n' "$cfgtest_inc" \ + | m4 -D_="$cfgtest_code_snippet") + else + cfgtest_inc= + cfgtest_src="$cfgtest_code_snippet" + fi + + + # config.log + printf "$cfgtest_fmt" "$mb_cfgtest_cc" >&3 + + for cfgtest_cflag in $(printf '%s' "$mb_cfgtest_cflags"); do + printf ' \\\n\t%s' "$cfgtest_cflag" >&3 + done + + for cfgtest_ldflag in $(printf '%s' "$mb_cfgtest_ldflags"); do + printf ' \\\n\t%s' "$cfgtest_ldflag" >&3 + done + + if [ "$cfgtest_type" = 'lib' ]; then + for cfgtest_lib in $(printf '%s' "$cfgtest_libs"); do + printf ' \\\n\t%s' "$cfgtest_lib" >&3 + done + + elif [ "$cfgtest_type" = 'switch' ] || [ "$cfgtest_type" = 'ldflag' ]; then + for cfgtest_switch in $(printf '%s' "$cfgtest_switches"); do + printf ' \\\n\t%s' "$cfgtest_switch" >&3 + done + fi + + printf ' \\\n' >&3 + printf '<< _SRCEOF\n%s\n' "$cfgtest_src" >&3 + printf '_SRCEOF\n\n\n' >&3 + + if [ "$mb_cfgtest_stdin_input" = 'no' ]; then + printf '%s' "$cfgtest_src" > 'cfgtest_c3RyaWN0X21vZGUK.c' + cfgtest_src= + fi +} + + +cfgtest_header_presence() +{ + #init + cfgtest_prolog 'header' "${1}" + + cfgtest_code_snippet=$(printf '#include <%s>\n' "${1}") + cfgtest_code_onedecl='int fn(void){return 0;}' + + cfgtest_code_snippet=$(printf '%s\n%s\n' \ + "$cfgtest_code_snippet" \ + "$cfgtest_code_onedecl") + + cfgtest_common_init + + # execute + printf '%s\n' "$cfgtest_src" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'header' '-----' "<${1}>" \ + || return + + # result + mb_internal_str=$(printf '%s%s' '-DHAVE_' "${1}" \ + | sed -e 's/\./_/g' -e 's@/@_@g' \ + | tr "[:lower:]" "[:upper:]") + + if [ -z ${cfgtest_internal_unit_test:-} ]; then + cfgtest_cflags_append "$mb_internal_str" + else + cfgtest_makevar_append "$mb_internal_str" + fi + + printf 'cfgtest: %s header <%s> was found and may be included.\n' \ + "$mb_cfgtest_cfgtype" "${1}" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'header' "${1}" +} + + +cfgtest_header_absence() +{ + #init + cfgtest_prolog 'header absence' "${1}" + + cfgtest_code_snippet=$(printf '#include <%s>\n' "${1}") + cfgtest_code_onedecl='int fn(void){return 0;}' + + cfgtest_code_snippet=$(printf '%s\n%s\n' \ + "$cfgtest_code_snippet" \ + "$cfgtest_code_onedecl") + + cfgtest_common_init + + # execute + printf '%s\n' "$cfgtest_src" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + && printf 'cfgtest: %s header <%s>: no error.' \ + "$mb_cfgtest_cfgtype" "${1}" >&3 \ + && cfgtest_epilog 'header' "${1}" \ + && return + + # result + mb_internal_str=$(printf '%s%s' '-DHAVE_NO_' "$@" \ + | sed -e 's/\./_/g' -e 's@/@_@g' \ + | tr "[:lower:]" "[:upper:]") + + if [ -z ${cfgtest_internal_unit_test:-} ]; then + cfgtest_cflags_append "$mb_internal_str" + else + cfgtest_makevar_append "$mb_internal_str" + fi + + printf 'cfgtest: %s header <%s> may not be included.\n' \ + "$mb_cfgtest_cfgtype" "${1}" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'header' '-----' "${1}" +} + + +cfgtest_interface_presence() +{ + # init + cfgtest_prolog 'interface' "${1}" + + cfgtest_code_snippet=$(printf 'void * addr = &%s;\n' "${1}") + + cfgtest_common_init + + # execute + printf '%s\n' "$cfgtest_src" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'interface' '(error)' "${1}" \ + || return + + # result + mb_internal_str=$(printf '%s%s' '-DHAVE_' "$@" \ + | sed -e 's/\./_/g' \ + | tr "[:lower:]" "[:upper:]") + + if [ -z ${cfgtest_internal_unit_test:-} ]; then + cfgtest_cflags_append "$mb_internal_str" + else + cfgtest_makevar_append "$mb_internal_str" + fi + + printf 'cfgtest: %s interface `%s'"'"' is available.\n' \ + "$mb_cfgtest_cfgtype" "${1}" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'interface' "${1}" + + return 0 +} + + +cfgtest_decl_presence() +{ + # init + cfgtest_prolog 'decl' "${1}" + + cfgtest_code_snippet=$(printf 'void * any = (void *)(%s);' "${1}") + + cfgtest_common_init + + # execute + printf '%s\n' "$cfgtest_src" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'decl' '(error)' "${1}" \ + || return + + # does the argument solely consist of the macro or enum member name? + mb_internal_str=$(printf '%s' "$@" | tr -d '[a-z][A-Z][0-9][_]') + + if [ -n "$mb_internal_str" ]; then + cfgtest_epilog 'decl' '(defined)' + return 0 + fi + + # result + mb_internal_str=$(printf '%s%s' '-DHAVE_DECL_' "$@" \ + | sed -e 's/\./_/g' \ + | tr "[:lower:]" "[:upper:]") + + if [ -z ${cfgtest_internal_unit_test:-} ]; then + cfgtest_cflags_append "$mb_internal_str" + else + cfgtest_makevar_append "$mb_internal_str" + fi + + printf 'cfgtest: `%s'"'"' is defined for the %s system.\n' \ + "${1}" "$mb_cfgtest_cfgtype" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'decl' '(defined)' + + return 0 +} + + +cfgtest_type_size() +{ + cfgtest_entity_size_prolog "$@" + + mb_internal_size='' + mb_internal_test='char x[(sizeof(%s) == %s) ? 1 : -1];' + + for mb_internal_guess in 8 4 2 1 16 32 64 128; do + if [ -z $mb_internal_size ]; then + printf '# guess %s ===>\n' "$mb_internal_guess" >&3 + + mb_internal_type="$@" + + cfgtest_code_snippet=$(printf "$mb_internal_test" \ + "$mb_internal_type" "$mb_internal_guess") + + cfgtest_common_init + + printf '%s\n' "$cfgtest_src" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + && mb_internal_size=$mb_internal_guess + + printf '\n' >&3 + fi + done + + # unrecognized type, or type size not within range + if [ -z $mb_internal_size ]; then + cfgtest_epilog 'size-of-type' '(error)' "@" + return 1 + fi + + # -DSIZEOF_TYPE=SIZE + mb_internal_str=$(printf '%s%s=%s' '-DSIZEOF_' \ + "$mb_internal_type" \ + "$mb_internal_size" \ + | sed -e 's/\ /_/g' -e 's/*/P/g' \ + | tr "[:lower:]" "[:upper:]") + + if [ -z ${cfgtest_internal_unit_test:-} ]; then + cfgtest_cflags_append "$mb_internal_str" + else + cfgtest_makevar_append "$mb_internal_str" + fi + + printf 'cfgtest: size of type `%s'"'"' determined to be %s\n' \ + "${@}" "$mb_internal_size" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'size-of-type' "$mb_internal_size" + + return 0 +} + + +cfgtest_attr_visibility() +{ + # init + cfgtest_prolog 'compiler visibility attr' "${1}" + + cfgtest_attr_syntax='__attribute__((__visibility__("'"${1}"'")))' + cfgtest_code_snippet="$cfgtest_attr_syntax"' int f_'"${1}"'(void);' + + cfgtest_common_init 'attr' + + # execute + cfgtest_ret=1 + + printf '%s\n' "$cfgtest_src" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'attr' '(error)' "${1}" \ + || return + + # result + mb_cfgtest_attr=$(printf '__attribute__\\(\\(__visibility__\\(\\"%s\\"\\)\\)\\)' "${1}") + + cfgtest_ret=0 + + printf 'cfgtest: %s compiler: above attribute is supported; see also ccenv/%s.mk.\n\n' \ + "$mb_cfgtest_cfgtype" "$mb_cfgtest_cfgtype" >&3 + + cfgtest_epilog 'attr' '(ok)' + + return 0 +} + + +cfgtest_code_snippet_asm() +{ + # init + cfgtest_prolog 'support of code snippet' '<...>' + + cfgtest_code_snippet="$@" + + cfgtest_common_init 'asm' + + # execute + cfgtest_ret=1 + + printf '%s\n' "$cfgtest_src" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'snippet' '(error)' \ + || return + + # result + cfgtest_ret=0 + + printf 'cfgtest: %s compiler: above code snippet compiled successfully.\n\n' \ + "$mb_cfgtest_cfgtype" >&3 + + cfgtest_epilog 'snippet' '(ok)' + + return 0 +} + + +cfgtest_macro_definition() +{ + # init + cfgtest_prolog 'macro definition' "${1}" + + cfgtest_code_snippet=$(printf '%s\n' \ + "#ifndef ${1}" \ + "#error macro ${1} is not defined." \ + "#endif") + + cfgtest_common_init 'macro' + + # execute + cfgtest_ret=1 + + printf '%s\n' "$cfgtest_src" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'macro' '(error)' "${1}" \ + || return + + # result + cfgtest_ret=0 + + printf 'cfgtest: %s compiler: above macro definition test compiled successfully.\n\n' \ + "$mb_cfgtest_cfgtype" >&3 + + cfgtest_epilog 'macro' '(defined)' + + return 0 +} + + +cfgtest_library_presence() +{ + # init + cfgtest_libs= + cfgtest_spc= + + for cfgtest_lib in ${@}; do + cfgtest_libs="$cfgtest_libs$cfgtest_spc$cfgtest_lib" + cfgtest_spc=' ' + done + + if [ "${1}" = "$cfgtest_libs" ]; then + cfgtest_prolog 'library' "${1#*-l}" + else + cfgtest_prolog 'lib module' '(see config.log)' + fi + + if [ "$mb_cfgtest_environment" = 'freestanding' ]; then + if [ -z "ccenv_cc_underscore" ]; then + cfgtest_code_snippet='int start(void){return 0;}' + else + cfgtest_code_snippet='int _start(void){return 0;}' + fi + else + cfgtest_code_snippet='int main(void){return 0;}' + fi + + cfgtest_common_init 'lib' + + # execute + printf '%s\n' "$cfgtest_src" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'library' '-----' "$@" \ + || return 1 + + # result + printf 'cfgtest: `%s'"'"' was accepted by the linker driver.\n' \ + "$cfgtest_libs" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'library' '(present)' + + return 0 +} + + +cfgtest_package_exists() +{ + # init + cfgtest_pkg= + + for cfgtest_arg in ${@}; do + case "$cfgtest_arg" in + -*) + ;; + + *) + cfgtest_pkg="$cfgtest_arg" + ;; + esac + done + + cfgtest_prolog 'package' "$cfgtest_pkg" + + # execute + "$mb_cfgtest_pkgconf" "${@}" \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'package' '(missing)' "$cfgtest_pkg" \ + || return 1 + + # result + printf 'cfgtest: package `%s'"'"' was found.\n' \ + "$cfgtest_pkg" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'package' '(exists)' "$cfgtest_pkg" + + return 0 +} + + +cfgtest_package_config() +{ + # init + if ! cfgtest_package_exists "${@}"; then + return 0 + fi + + cfgtest_pkg= + + for cfgtest_arg in ${@}; do + case "$cfgtest_arg" in + -*) + ;; + + *) + cfgtest_pkg="$cfgtest_arg" + ;; + esac + done + + cfgtest_makevar_prefix= + cfgtest_pkgconf_prefix= + + if [ "$mb_cfgtest_cfgtype" = 'native' ]; then + cfgtest_makevar_prefix='_NATIVE' + else + if [ -n "${mb_sysroot}" ]; then + cfgtest_pkgconf_prefix="--define-variable=prefix=${mb_sysroot}" + fi + fi + + cfgtest_newline + cfgtest_comment 'package config:' "$cfgtest_pkg" + + # foo.pc + cfgtest_pkgconf_path=$("$mb_cfgtest_pkgconf" \ + --path "${@}" \ + 2>/dev/null || true) + + if [ -z "$cfgtest_pkgconf_path" ]; then + cfgtest_pkgconf_path=$("$mb_cfgtest_pkgconf" \ + --debug "${@}" 2>&1 \ + | grep ".pc'$" \ + | head -n1 \ + || true) + + cfgtest_pkgconf_path="${cfgtest_pkgconf_path##* \'}" + cfgtest_pkgconf_path="${cfgtest_pkgconf_path%%\'}" + fi + + mb_cfgtest_makevar=$(printf '%s_PKGCONF_%s' \ + "$cfgtest_makevar_prefix" "$cfgtest_pkg" \ + | tr '[[:lower:]]' '[[:upper:]]' \ + | sed -e 's/-/_/g') + + cfgtest_makevar_set "$cfgtest_pkgconf_path" + + # --cflags + cfgtest_pkgconf_path=$("$mb_cfgtest_pkgconf" \ + "$cfgtest_pkgconf_prefix" \ + --cflags "${@}" \ + | sed 's/[ \t]*$//') + + mb_cfgtest_makevar=$(printf '%s_CFLAGS_%s' \ + "$cfgtest_makevar_prefix" "$cfgtest_pkg" \ + | tr '[[:lower:]]' '[[:upper:]]' \ + | sed -e 's/-/_/g') + + cfgtest_makevar_set "$cfgtest_pkgconf_path" + + # --ldflags + cfgtest_pkgconf_path=$("$mb_cfgtest_pkgconf" \ + "$cfgtest_pkgconf_prefix" \ + --libs "${@}" \ + | sed 's/[ \t]*$//') + + mb_cfgtest_makevar=$(printf '%s_LDFLAGS_%s' \ + "$cfgtest_makevar_prefix" "$cfgtest_pkg" \ + | tr '[[:lower:]]' '[[:upper:]]' \ + | sed -e 's/-/_/g') + + cfgtest_makevar_set "$cfgtest_pkgconf_path" + + return 0 +} + + +cfgtest_compiler_switch() +{ + # init + cfgtest_switches= + cfgtest_spc= + + for cfgtest_switch in $(printf '%s' "${@}"); do + cfgtest_switches="$cfgtest_switches$cfgtest_spc$cfgtest_switch" + cfgtest_spc=' ' + done + + if [ -n "${cfgtest_switch_arg:-}" ]; then + cfgtest_prolog 'compiler switch' "${cfgtest_switches%=*}" + + elif [ "${1}" = "$cfgtest_switches" ]; then + cfgtest_prolog 'compiler switch' "$cfgtest_switches" + + else + cfgtest_prolog 'compiler switch combination' "$cfgtest_switches" + fi + + case "${1}" in + -Wl,*) + if [ "$mb_cfgtest_environment" = 'freestanding' ]; then + cfgtest_switches="$cfgtest_switches -nostdlib -nostartfiles" + + if [ -z "ccenv_cc_underscore" ]; then + cfgtest_code_snippet='int start(void){return 0;}' + else + cfgtest_code_snippet='int _start(void){return 0;}' + fi + else + cfgtest_code_snippet='int main(void){return 0;}' + fi + + cfgtest_common_init 'ldflag' + ;; + + *) + cfgtest_code_snippet='int fn(void){return 0;}' + cfgtest_common_init 'switch' + ;; + esac + + # execute + printf '%s\n' "$cfgtest_src" \ + | eval $(printf '%s' "$cfgtest_cmd") \ + > /dev/null 2>&3 \ + || cfgtest_epilog 'switch' '(error)' "$@" \ + || return 1 + + # result + printf 'cfgtest: the switch `%s was accepted by the compiler.\n' \ + "$cfgtest_switches'" >&3 + printf '%s\n' '------------------------' >&3 + + cfgtest_epilog 'switch' '(accepted)' + + return 0 +} + + +cfgtest_compiler_switch_arg() +{ + cfgtest_switch_arg='yes' + + if cfgtest_compiler_switch "${@}"; then + cfgtest_ret=0 + else + cfgtest_ret=1 + fi + + unset cfgtest_switch_arg + + return $cfgtest_ret +} + + +cfgtest_unit_header_presence() +{ + cfgtest_internal_unit_test='unit_test' + cfgtest_header_presence "$@" || return 1 + return 0 +} + + +cfgtest_unit_header_absence() +{ + cfgtest_internal_unit_test='unit_test' + cfgtest_header_absence "$@" || return 1 + return 0 +} + + +cfgtest_unit_interface_presence() +{ + cfgtest_internal_unit_test='unit_test' + cfgtest_interface_presence "$@" || return 1 + return 0 +} + + +cfgtest_unit_decl_presence() +{ + cfgtest_internal_unit_test='unit_test' + cfgtest_decl_presence "$@" || return 1 + return 0 +} + + +cfgtest_unit_type_size() +{ + cfgtest_internal_unit_test='unit_test' + cfgtest_type_size "$@" || return 1 + return 0 +} diff --git a/sofort/config/config.vars b/sofort/config/config.vars index 524b746..38d5616 100644 --- a/sofort/config/config.vars +++ b/sofort/config/config.vars @@ -37,6 +37,11 @@ srcball srcball_url srcball_sha256 + +make +makefile +makemode + build host cchost @@ -47,9 +52,14 @@ compiler toolchain zealous sysroot +freestanding cross_compile +config_shell shell +pkgconf +pkgconfig + prefix exec_prefix bindir @@ -120,6 +130,9 @@ native_cfghost native_cflags native_ldflags +native_pkgconf +native_pkgconfig + native_pe_subsystem native_pe_image_base @@ -130,4 +143,9 @@ disable_shared disable_static use_custom_cfgdefs +use_custom_cfginit +use_custom_cfgfini use_custom_usrdefs + +shared_lib_cmd +shared_lib_ldflags diff --git a/sofort/config/opt.vars b/sofort/config/opt.vars new file mode 100644 index 0000000..e71ea56 --- /dev/null +++ b/sofort/config/opt.vars @@ -0,0 +1,9 @@ +version_opt + +shared_library_opt +static_library_opt + +app_frontend_opt +app_linking_opt + +install_headers_opt diff --git a/sofort/core/_flavor/flavor_app_frontend_disabled.mk b/sofort/core/_flavor/flavor_app_frontend_disabled.mk new file mode 100644 index 0000000..31ad23a --- /dev/null +++ b/sofort/core/_flavor/flavor_app_frontend_disabled.mk @@ -0,0 +1,6 @@ +# flavor_app_frontend_disabled.mk: handling of frontend build options. +# this file is covered by COPYING.SOFORT. + +app-tag: +package-install-app: +package-install-extras: diff --git a/sofort/core/_flavor/flavor_app_frontend_enabled.mk b/sofort/core/_flavor/flavor_app_frontend_enabled.mk new file mode 100644 index 0000000..ebbc256 --- /dev/null +++ b/sofort/core/_flavor/flavor_app_frontend_enabled.mk @@ -0,0 +1,6 @@ +# flavor_app_frontend_enabled.mk: handling of frontend build options. +# this file is covered by COPYING.SOFORT. + +app-tag: package-app app.tag +package-install-app: install-app +package-install-extras: install-extras diff --git a/sofort/core/_flavor/flavor_app_linking_all_shared.mk b/sofort/core/_flavor/flavor_app_linking_all_shared.mk new file mode 100644 index 0000000..fe89318 --- /dev/null +++ b/sofort/core/_flavor/flavor_app_linking_all_shared.mk @@ -0,0 +1,7 @@ +# flavor_app_linking_all_shared.mk: handling of frontend linking options. +# this file is covered by COPYING.SOFORT. + +PACKAGE_APP = $(SHARED_APP) + +package-app: shared-app +app.tag: $(SHARED_APP) diff --git a/sofort/core/_flavor/flavor_app_linking_all_static.mk b/sofort/core/_flavor/flavor_app_linking_all_static.mk new file mode 100644 index 0000000..7a5f620 --- /dev/null +++ b/sofort/core/_flavor/flavor_app_linking_all_static.mk @@ -0,0 +1,7 @@ +# flavor_app_linking_all_static.mk: handling of frontend linking options. +# this file is covered by COPYING.SOFORT. + +PACKAGE_APP = $(STATIC_APP) + +package-app: static-app +app.tag: $(STATIC_APP) diff --git a/sofort/core/_flavor/flavor_app_linking_default.mk b/sofort/core/_flavor/flavor_app_linking_default.mk new file mode 100644 index 0000000..b0c1d34 --- /dev/null +++ b/sofort/core/_flavor/flavor_app_linking_default.mk @@ -0,0 +1,7 @@ +# flavor_app_linking_default.mk: handling of frontend linking options. +# this file is covered by COPYING.SOFORT. + +PACKAGE_APP = $(DEFAULT_APP) + +package-app: default-app +app.tag: $(DEFAULT_APP) diff --git a/sofort/core/_flavor/flavor_install_headers_custom.mk b/sofort/core/_flavor/flavor_install_headers_custom.mk new file mode 100644 index 0000000..4f8da97 --- /dev/null +++ b/sofort/core/_flavor/flavor_install_headers_custom.mk @@ -0,0 +1,4 @@ +# flavor_install_headers_custom.mk: handling of header installation option. +# this file is covered by COPYING.SOFORT. + +install-headers:install-headers-custom diff --git a/sofort/core/_flavor/flavor_install_headers_default.mk b/sofort/core/_flavor/flavor_install_headers_default.mk new file mode 100644 index 0000000..f8b49c4 --- /dev/null +++ b/sofort/core/_flavor/flavor_install_headers_default.mk @@ -0,0 +1,4 @@ +# flavor_install_headers_default.mk: handling of header installation option. +# this file is covered by COPYING.SOFORT. + +install-headers:install-headers-default diff --git a/sofort/core/_flavor/flavor_shared_library_disabled.mk b/sofort/core/_flavor/flavor_shared_library_disabled.mk new file mode 100644 index 0000000..9846e1b --- /dev/null +++ b/sofort/core/_flavor/flavor_shared_library_disabled.mk @@ -0,0 +1,5 @@ +# flavor_shared_library_disabled.mk: handling of shared library dependencies. +# this file is covered by COPYING.SOFORT. + +package-shared: +package-install-shared: diff --git a/sofort/core/_flavor/flavor_shared_library_enabled.mk b/sofort/core/_flavor/flavor_shared_library_enabled.mk new file mode 100644 index 0000000..2e54d21 --- /dev/null +++ b/sofort/core/_flavor/flavor_shared_library_enabled.mk @@ -0,0 +1,5 @@ +# flavor_shared_library_enabled.mk: handling of shared library dependencies. +# this file is covered by COPYING.SOFORT. + +package-shared: shared +package-install-shared: install-shared diff --git a/sofort/core/_flavor/flavor_static_library_disabled.mk b/sofort/core/_flavor/flavor_static_library_disabled.mk new file mode 100644 index 0000000..e46d186 --- /dev/null +++ b/sofort/core/_flavor/flavor_static_library_disabled.mk @@ -0,0 +1,5 @@ +# flavor_static_library_disabled.mk: handling of static library dependencies. +# this file is covered by COPYING.SOFORT. + +package-static: +package-install-static: diff --git a/sofort/core/_flavor/flavor_static_library_enabled.mk b/sofort/core/_flavor/flavor_static_library_enabled.mk new file mode 100644 index 0000000..20d4bd8 --- /dev/null +++ b/sofort/core/_flavor/flavor_static_library_enabled.mk @@ -0,0 +1,5 @@ +# flavor_static_library_enabled.mk: handling of static library dependencies. +# this file is covered by COPYING.SOFORT. + +package-static: static +package-install-static: install-static diff --git a/sofort/core/_infer/infer_modern.mk b/sofort/core/_infer/infer_modern.mk new file mode 100644 index 0000000..aaf3361 --- /dev/null +++ b/sofort/core/_infer/infer_modern.mk @@ -0,0 +1,22 @@ +# infer_modern.mk: modern make target- and inference rules. +# this file is covered by COPYING.SOFORT. + +src/%.ao: $(SOURCE_DIR)/src/%.c + $(CC) -c -o $@ $< $(CFLAGS_APP) + +src/%.lo: $(SOURCE_DIR)/src/%.c + $(CC) -c -o $@ $< $(CFLAGS_SHARED) + +src/%.o: $(SOURCE_DIR)/src/%.c + $(CC) -c -o $@ $< $(CFLAGS_STATIC) + +$(SHARED_LIB): + $(SHARED_LIB_CMD) $@ $^ $(SHARED_LIB_LDFLAGS) $(LDFLAGS_IMPLIB) + +lib/%$(OS_ARCHIVE_EXT): + mkdir -p lib + rm -f $@ + $(AR) rcs $@ $^ + +srcs.tag: + touch $@ diff --git a/sofort/core/_infer/infer_posix.mk b/sofort/core/_infer/infer_posix.mk new file mode 100644 index 0000000..ae990e8 --- /dev/null +++ b/sofort/core/_infer/infer_posix.mk @@ -0,0 +1,27 @@ +# infer_posix.mk: posix make target- and inference rules. +# this file is covered by COPYING.SOFORT. + +.c.ao: + $(CC) -c -o $@ $< $(CFLAGS_APP) + +.c.lo: + $(CC) -c -o $@ $< $(CFLAGS_SHARED) + +.c.o: + $(CC) -c -o $@ $< $(CFLAGS_STATIC) + +$(SHARED_LIB): + $(SHARED_LIB_CMD) $@ $(SHARED_OBJS) $(SHARED_LIB_LDFLAGS) $(LDFLAGS_IMPLIB) + +$(STATIC_LIB): + mkdir -p lib + rm -f $@ + $(AR) rcs $@ $(STATIC_OBJS) + +srcs.tag: tree.tag + +srcs.tag: + $(PROJECT_DIR)/sofort/tools/srctree.sh \ + --srctree=$(SOURCE_DIR) -- \ + $(COMMON_SRCS) $(APP_SRCS) + touch $@ diff --git a/sofort/core/_version/_soname/version_soname_copy.mk b/sofort/core/_version/_soname/version_soname_copy.mk new file mode 100644 index 0000000..c176d5a --- /dev/null +++ b/sofort/core/_version/_soname/version_soname_copy.mk @@ -0,0 +1,8 @@ +# version_soname_copy.mk: handling of shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +install-soname: install-lib + cp $(SHARED_LIB) $(DESTDIR)$(LIBDIR)/$(DSO_SONAME) + +$(SHARED_SONAME): $(SHARED_LIB) + cp $(SHARED_LIB) $(SHARED_SONAME) diff --git a/sofort/core/_version/_soname/version_soname_symlink.mk b/sofort/core/_version/_soname/version_soname_symlink.mk new file mode 100644 index 0000000..963b891 --- /dev/null +++ b/sofort/core/_version/_soname/version_soname_symlink.mk @@ -0,0 +1,12 @@ +# version_soname_symlink.mk: handling of shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +$(SHARED_SONAME): $(SHARED_LIB) + rm -f $@.tmp + ln -s $(DSO_VER) $@.tmp + mv $@.tmp $@ + +install-soname: install-lib + rm -f $(SHARED_SONAME).tmp + ln -s $(DSO_VER) $(SHARED_SONAME).tmp + mv $(SHARED_SONAME).tmp $(DESTDIR)$(LIBDIR)/$(DSO_SONAME) diff --git a/sofort/core/_version/version_none.mk b/sofort/core/_version/version_none.mk new file mode 100644 index 0000000..d8fc570 --- /dev/null +++ b/sofort/core/_version/version_none.mk @@ -0,0 +1,10 @@ +# version_none.mk: handling of shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +VER_XYZ = +VER_SONAME = + +package-shared-soname: +package-shared-solink: +package-install-soname: +package-install-solink: diff --git a/sofort/core/_version/version_used.mk b/sofort/core/_version/version_used.mk new file mode 100644 index 0000000..4724cee --- /dev/null +++ b/sofort/core/_version/version_used.mk @@ -0,0 +1,26 @@ +# version_used.mk: handling of shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +VER_XYZ = .$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH) +VER_SONAME = .$(VER_MAJOR) + +package-shared-soname: shared-soname +package-shared-solink: shared-solink +package-install-soname: install-soname +package-install-solink: install-solink + + + +# libfoo.so (common) +install-solink: install-lib + rm -f $(SHARED_SOLINK).tmp + ln -s $(DSO_VER) $(SHARED_SOLINK).tmp + mv $(SHARED_SOLINK).tmp $(DESTDIR)$(LIBDIR)/$(DSO_SOLINK) + +$(SHARED_SOLINK): $(SHARED_LIB) + rm -f $@.tmp + ln -s $(DSO_VER) $@.tmp + mv $@.tmp $@ + +# libfoo.so.x (symlink or copy) +include $(PROJECT_DIR)/sofort/core/_version/_soname/version_soname_$(OS_SONAME).mk diff --git a/sofort/core/defs.mk b/sofort/core/defs.mk index 7e120bc..2622cff 100644 --- a/sofort/core/defs.mk +++ b/sofort/core/defs.mk @@ -9,7 +9,7 @@ ARCH_LOBJS += $(ARCH_SRCS:.c=.lo) ARCH_OBJS += $(ARCH_SRCS:.c=.o) APP_LOBJS += $(APP_SRCS:.c=.lo) -APP_OBJS += $(APP_SRCS:.c=.o) +APP_OBJS += $(APP_SRCS:.c=.ao) SHARED_OBJS += $(COMMON_LOBJS) $(ARCH_LOBJS) STATIC_OBJS += $(COMMON_OBJS) $(ARCH_OBJS) diff --git a/sofort/core/flavor.mk b/sofort/core/flavor.mk index 85c41a2..6a7c97a 100644 --- a/sofort/core/flavor.mk +++ b/sofort/core/flavor.mk @@ -1,73 +1,12 @@ # 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 +include $(PROJECT_DIR)/sofort/core/_flavor/flavor_static_library_$(STATIC_LIBRARY_OPT).mk +include $(PROJECT_DIR)/sofort/core/_flavor/flavor_shared_library_$(SHARED_LIBRARY_OPT).mk -ifeq ($(DISABLE_SHARED),yes) -package-shared: -package-install-shared: -else -package-shared: shared -package-install-shared: install-shared -endif +include $(PROJECT_DIR)/sofort/core/_flavor/flavor_app_frontend_$(APP_FRONTEND_OPT).mk +include $(PROJECT_DIR)/sofort/core/_flavor/flavor_app_linking_$(APP_LINKING_OPT).mk - - -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 +include $(PROJECT_DIR)/sofort/core/_flavor/flavor_install_headers_$(INSTALL_HEADERS_OPT).mk diff --git a/sofort/core/infer.mk b/sofort/core/infer.mk new file mode 100644 index 0000000..8a1c6dd --- /dev/null +++ b/sofort/core/infer.mk @@ -0,0 +1,4 @@ +# infer.mk: top-level handling of inference rules. +# this file is covered by COPYING.SOFORT. + +include $(PROJECT_DIR)/sofort/core/_infer/infer_$(MAKEMODE).mk diff --git a/sofort/core/modern.m4 b/sofort/core/modern.m4 new file mode 100644 index 0000000..ad75ca9 --- /dev/null +++ b/sofort/core/modern.m4 @@ -0,0 +1,117 @@ +dnl modern.m4: a modern and simple framework for using the m4 macro language +dnl +dnl This file is covered by COPYING.SOFORT. +dnl +dnl 1) make all standard m4 builtins m4_ prefixed. +dnl 2) set the left-bracket and right-bracket symbols the begin-quote and end-quote strings. +dnl 3) make a single underscore symbol the equivalent of the standard dnl builtin. +dnl 4) provide the m4_toupper(), m4_tolower(), and m4_pathvar() macros. +dnl 5) provide the m4_srclist() and m4_srcitem() macros. +dnl 6) provide the m4_fillerdots(), m4_fillerdash(), and m4_fillerline() macros. +dnl 7) provide the m4_whitespace() and m4_spacealign() macros. +dnl 8) provide the m4_alignlen(), m4_leftalign(), and m4_rightalign() macros. +dnl 9) provide the m4_tab(), m4_tabtab(), and m4_tabtabtab() macros. +dnl +divert(-1) + +define(m4_changecom,defn(`changecom')) +define(m4_changequote,defn(`changequote')) +define(m4_decr,defn(`decr')) +define(m4_define,defn(`define')) +define(m4_defn,defn(`defn')) +define(m4_divert,defn(`divert')) +define(m4_divnum,defn(`divnum')) +define(m4_dnl,defn(`dnl')) +define(m4_dumpdef,defn(`dumpdef')) +define(m4_errprint,defn(`errprint')) +define(m4_eval,defn(`eval')) +define(m4_ifdef,defn(`ifdef')) +define(m4_ifelse,defn(`ifelse')) +define(m4_include,defn(`include')) +define(m4_incr,defn(`incr')) +define(m4_index,defn(`index')) +define(m4_len,defn(`len')) +define(m4_m4exit,defn(`m4exit')) +define(m4_m4wrap,defn(`m4wrap')) +define(m4_maketemp,defn(`maketemp')) +define(m4_mkstemp,defn(`mkstemp')) +define(m4_popdef,defn(`popdef')) +define(m4_pushdef,defn(`pushdef')) +define(m4_shift,defn(`shift')) +define(m4_sinclude,defn(`sinclude')) +define(m4_substr,defn(`substr')) +define(m4_syscmd,defn(`syscmd')) +define(m4_sysval,defn(`sysval')) +define(m4_traceoff,defn(`traceoff')) +define(m4_traceon,defn(`traceon')) +define(m4_translit,defn(`translit')) +define(m4_undefine,defn(`undefine')) +define(m4_undivert,defn(`undivert')) + +m4_changequote([,]) + +m4_undefine([changecom]) +m4_undefine([changequote]) +m4_undefine([decr]) +m4_undefine([define]) +m4_undefine([defn]) +m4_undefine([divert]) +m4_undefine([divnum]) +m4_undefine([dnl]) +m4_undefine([dumpdef]) +m4_undefine([errprint]) +m4_undefine([eval]) +m4_undefine([ifdef]) +m4_undefine([ifelse]) +m4_undefine([include]) +m4_undefine([incr]) +m4_undefine([index]) +m4_undefine([len]) +m4_undefine([m4exit]) +m4_undefine([m4wrap]) +m4_undefine([maketemp]) +m4_undefine([mkstemp]) +m4_undefine([popdef]) +m4_undefine([pushdef]) +m4_undefine([shift]) +m4_undefine([sinclude]) +m4_undefine([substr]) +m4_undefine([syscmd]) +m4_undefine([sysval]) +m4_undefine([traceoff]) +m4_undefine([traceon]) +m4_undefine([translit]) +m4_undefine([undefine]) +m4_undefine([undivert]) + +m4_define([_],m4_defn([m4_dnl])) + +m4_define([m4_toupper],[m4_translit([[$1]],[[abcdefghijklmnopqrstuvwxyz]],[[ABCDEFGHIJKLMNOPQRSTUVWXYZ]])]) +m4_define([m4_tolower],[m4_translit([[$1]],[[ABCDEFGHIJKLMNOPQRSTUVWXYZ]],[[abcdefghijklmnopqrstuvwxyz]])]) +m4_define([m4_pathvar],[m4_translit(m4_toupper([[$1]]),[/-],[__])]) + +m4_define([m4_srclist],[[$1] = \]) +m4_define([m4_srcitem],[m4_tab[$1] \]) + +m4_define([m4_fillerdots],[................................]) +m4_define([m4_fillerdash],[--------------------------------]) +m4_define([m4_fillerline],[m4_fillerdots[]m4_fillerdots[]m4_fillerdots[]]) + +m4_define([m4_whitespace],[m4_translit(m4_fillerdots,[[.]],[[ ]])]) +m4_define([m4_spacealign],[m4_translit(m4_fillerline,[[.]],[[ ]])]) + +m4_define([m4_alignlen],[m4_eval([$1]-m4_len([$2]))]) +m4_define([m4_leftalign],[m4_substr(m4_spacealign,0,m4_alignlen([$1],[$2]))[$2]]) +m4_define([m4_rightalign],[[$2]m4_substr(m4_spacealign,0,m4_alignlen([$1],[$2]))]) + + +m4_define([m4_tab],_ + [$1])) + +m4_define([m4_tabtab],_ + [$1]) + +m4_define([m4_tabtabtab],_ + [$1]) + +m4_divert(0)_ diff --git a/sofort/core/pkgconf.mk b/sofort/core/pkgconf.mk index 0edc395..5ada069 100644 --- a/sofort/core/pkgconf.mk +++ b/sofort/core/pkgconf.mk @@ -1,14 +1,10 @@ # 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) +.pkgconf: + build/$(PACKAGE).pc: .pkgconf dirs.tag build/$(PACKAGE).pc: @@ -41,5 +37,3 @@ 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 index eb6c2f2..ad693ab 100644 --- a/sofort/core/version.mk +++ b/sofort/core/version.mk @@ -7,60 +7,4 @@ 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 +include $(PROJECT_DIR)/sofort/core/_version/version_$(VERSION_OPT).mk diff --git a/sofort/exrules/_pe/pe_mdso_version_none.mk b/sofort/exrules/_pe/pe_mdso_version_none.mk new file mode 100644 index 0000000..cf5e350 --- /dev/null +++ b/sofort/exrules/_pe/pe_mdso_version_none.mk @@ -0,0 +1,2 @@ +# pe_mdso_version_none.mk: PE shared library rules for targets using mdso. +# this file is covered by COPYING.SOFORT. diff --git a/sofort/exrules/_pe/pe_mdso_version_used.mk b/sofort/exrules/_pe/pe_mdso_version_used.mk new file mode 100644 index 0000000..fac0246 --- /dev/null +++ b/sofort/exrules/_pe/pe_mdso_version_used.mk @@ -0,0 +1,5 @@ +# pe_mdso_version_used.mk: PE shared library rules for targets using mdso. +# this file is covered by COPYING.SOFORT. + +$(IMPLIB_SONAME): $(IMPLIB_DEF) + $(MDSO) -m $(CC_BITS) -i $(IMPLIB_SONAME) -n $(DSO_SONAME) $(IMPLIB_DEF) diff --git a/sofort/exrules/_pe/pe_version_none.mk b/sofort/exrules/_pe/pe_version_none.mk new file mode 100644 index 0000000..df33976 --- /dev/null +++ b/sofort/exrules/_pe/pe_version_none.mk @@ -0,0 +1,7 @@ +# pe_version_none.mk: handling of PE shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +package-implib-soname: +package-implib-solink: +package-install-implib-soname: +package-install-implib-solink: diff --git a/sofort/exrules/_pe/pe_version_used.mk b/sofort/exrules/_pe/pe_version_used.mk new file mode 100644 index 0000000..8710dae --- /dev/null +++ b/sofort/exrules/_pe/pe_version_used.mk @@ -0,0 +1,23 @@ +# pe_version_used.mk: handling of PE shared library versioning schemes. +# this file is covered by COPYING.SOFORT. + +package-implib-soname: implib-soname +package-implib-solink: implib-solink +package-install-implib-soname: install-implib-soname +package-install-implib-solink: install-implib-solink + + +$(IMPLIB_SOLINK): $(IMPLIB_SONAME) + rm -f $(IMPLIB_SOLINK).tmp + ln -s $(IMP_SONAME) $(IMPLIB_SOLINK).tmp + mv $(IMPLIB_SOLINK).tmp $(IMPLIB_SOLINK) + +install-implib-soname: implib-soname + mkdir -p $(DESTDIR)$(LIBDIR) + cp $(IMPLIB_SONAME) $(DESTDIR)$(LIBDIR) + +install-implib-solink: implib-soname + mkdir -p $(DESTDIR)$(LIBDIR) + rm -f $(IMPLIB_SOLINK).tmp + ln -s $(IMP_SONAME) $(IMPLIB_SOLINK).tmp + mv $(IMPLIB_SOLINK).tmp $(DESTDIR)$(LIBDIR)/$(IMP_SOLINK) diff --git a/sofort/exrules/default.mk b/sofort/exrules/default.mk index b830cd0..9844f37 100644 --- a/sofort/exrules/default.mk +++ b/sofort/exrules/default.mk @@ -8,4 +8,10 @@ DSO_REF_SOLINK = $(SHARED_SOLINK) LDFLAGS_SHARED += -Wl,-soname LDFLAGS_SHARED += -Wl,$(DSO_SONAME) +implib: + +install-implib: + +clean-implib: + .PHONY: $(IMPLIB_DEF) $(IMPLIB_VER) $(IMPLIB_SONAME) $(IMPLIB_SOLINK) diff --git a/sofort/exrules/pe-mdso.mk b/sofort/exrules/pe-mdso.mk index 9a3b941..0c380e0 100644 --- a/sofort/exrules/pe-mdso.mk +++ b/sofort/exrules/pe-mdso.mk @@ -3,16 +3,9 @@ include $(PROJECT_DIR)/sofort/exrules/pe-common.mk -$(IMPLIB_VER): $(IMPLIB_DEF) - $(MDSO) -m $(CC_BITS) -i $(IMPLIB_VER) -n $(DSO_VER) -l $(DSO_LIBPATH) $< +$(IMPLIB_VER): $(IMPLIB_DEF) + $(MDSO) -m $(CC_BITS) -i $(IMPLIB_VER) -n $(DSO_VER) -l $(DSO_LIBPATH) $(IMPLIB_DEF) -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/pe_mdso_version_$(VERSION_OPT).mk include $(PROJECT_DIR)/sofort/exrules/pe-version.mk diff --git a/sofort/exrules/pe-version.mk b/sofort/exrules/pe-version.mk index 97ad4ca..7f5b658 100644 --- a/sofort/exrules/pe-version.mk +++ b/sofort/exrules/pe-version.mk @@ -1,34 +1,4 @@ # 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 +include $(PROJECT_DIR)/sofort/exrules/_pe/pe_version_$(VERSION_OPT).mk diff --git a/sofort/tools/srctree.sh b/sofort/tools/srctree.sh new file mode 100755 index 0000000..90a1d89 --- /dev/null +++ b/sofort/tools/srctree.sh @@ -0,0 +1,83 @@ +#!/bin/sh + +# srctree.sh: support for out-of-tree builds in posix make mode. +# this file is covered by COPYING.SOFORT. + +set -eu + +usage() +{ +cat << EOF >&2 + +Usage: + --help show this HELP message + --srctree=SRCTREE set source directory + +EOF +exit 1 +} + + +# one +workdir=$(pwd -P) +srctree= +argloop= + + +for arg ; do + case "$arg" in + --help) + usage + ;; + + --srctree=*) + srctree=${arg#*=} + ;; + + --) + argloop='done' + ;; + + *) + if [ -z "$argloop" ]; then + printf 'Invalid option: %s\n' "$arg" >&2 + usage + fi + ;; + esac +done + + +# two +if [ -z "$srctree" ] ; then + usage +fi + +cd -- "$srctree" +srctree=$(pwd -P) +cd -- "$workdir" + +if [ "$srctree" = "$workdir" ]; then + exit 0 +fi + + +# three +for arg ; do + case "$arg" in + --srctree=*) + ;; + + --) + ;; + + *) + stat "$arg" > /dev/null 2>&1 \ + || ln -s -- "$srctree/$arg" "$arg" + ;; + esac +done + + +# all done +exit 0 diff --git a/src/archive/mdso_argen_common.c b/src/archive/mdso_argen_common.c index a2553c0..26283c2 100644 --- a/src/archive/mdso_argen_common.c +++ b/src/archive/mdso_argen_common.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ @@ -138,10 +138,6 @@ int mdso_argen_common( objlen += sizeof(uint32_t) * (1 + mapstrsnum); objlen += mapstrslen; - objlen += 15; - objlen |= 15; - objlen ^= 15; - /* archive meta info, in-memory mapping */ if (vobj->addr && (vobj->size < objlen)) return MDSO_BUFFER_ERROR(dctx); diff --git a/src/crc/mdso_crc32.c b/src/crc/mdso_crc32.c index 69ba162..15f60fb 100644 --- a/src/crc/mdso_crc32.c +++ b/src/crc/mdso_crc32.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/crc/mdso_crc64.c b/src/crc/mdso_crc64.c index 9502230..6c599cc 100644 --- a/src/crc/mdso_crc64.c +++ b/src/crc/mdso_crc64.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/driver/mdso_amain.c b/src/driver/mdso_amain.c index c0d0824..4b2ba34 100644 --- a/src/driver/mdso_amain.c +++ b/src/driver/mdso_amain.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/driver/mdso_driver_ctx.c b/src/driver/mdso_driver_ctx.c index 30d1ba7..0f4ea56 100644 --- a/src/driver/mdso_driver_ctx.c +++ b/src/driver/mdso_driver_ctx.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ @@ -240,6 +240,8 @@ int mdso_get_driver_ctx( entry->arg, optv,meta); + break; + case TAG_VERSION: cctx.drvflags |= MDSO_DRIVER_VERSION; break; @@ -376,6 +378,9 @@ static void mdso_free_driver_ctx_impl(struct mdso_driver_ctx_alloc * ictx) close(ictx->ctx.fddst); if (ictx->ctx.fdtmpin >= 0) + unlink(ictx->ctx.tmpname); + + if (ictx->ctx.fdtmpin >= 0) close(ictx->ctx.fdtmpin); if (ictx->ctx.asmbase) diff --git a/src/driver/mdso_unit_ctx.c b/src/driver/mdso_unit_ctx.c index d14beed..fdbfbd6 100644 --- a/src/driver/mdso_unit_ctx.c +++ b/src/driver/mdso_unit_ctx.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ @@ -42,7 +42,7 @@ static int mdso_stdin_to_tmp(const struct mdso_driver_ctx * dctx) ssize_t cnt; char * ch; char buf[4096]; - char template[] = "/tmp/mdso_stdin_to_tmp_XXXXXX"; + char tmpname[] = "/tmp/mdso_stdin_to_tmp_XXXXXX"; addr = (uintptr_t)dctx - offsetof(struct mdso_driver_ctx_impl,ctx); ictx = (struct mdso_driver_ctx_impl *)addr; @@ -50,14 +50,17 @@ static int mdso_stdin_to_tmp(const struct mdso_driver_ctx * dctx) if (ictx->fdtmpin >= 0) return dup(ictx->fdtmpin); - if ((fdtmp = mkstemp(template)) < 0) + if ((fdtmp = mkstemp(tmpname)) < 0) return -1; if ((ictx->fdtmpin = dup(fdtmp)) < 0) { close(fdtmp); + unlink(tmpname); return -1; } + strcpy(ictx->tmpname,tmpname); + for (;;) { ret = read(0,buf,sizeof(buf)-1); diff --git a/src/helper/mdso_create_output.c b/src/helper/mdso_create_output.c index 9d95d10..bb1cfe9 100644 --- a/src/helper/mdso_create_output.c +++ b/src/helper/mdso_create_output.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/helper/mdso_map_input.c b/src/helper/mdso_map_input.c index ab4607f..c899b42 100644 --- a/src/helper/mdso_map_input.c +++ b/src/helper/mdso_map_input.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ @@ -48,12 +48,11 @@ int mdso_map_input( if (st.st_size == 0) { map->size = 0; map->addr = 0; - return 0; + } else { + map->size = st.st_size; + map->addr = mmap(0,map->size,prot,MAP_PRIVATE,fd,0); } - map->size = st.st_size; - map->addr = mmap(0,map->size,prot,MAP_PRIVATE,fd,0); - if (fnew) close(fd); diff --git a/src/internal/argv/argv.h b/src/internal/argv/argv.h index 8f43ed8..0be1d0e 100644 --- a/src/internal/argv/argv.h +++ b/src/internal/argv/argv.h @@ -1,6 +1,6 @@ /****************************************************************************/ /* argv.h: a thread-safe argument vector parser and usage screen generator */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************************/ @@ -83,6 +83,7 @@ enum argv_error { ARGV_ERROR_INTERNAL, ARGV_ERROR_SHORT_OPTION, ARGV_ERROR_LONG_OPTION, + ARGV_ERROR_VENDOR_OPTION, ARGV_ERROR_OPTARG_NONE, ARGV_ERROR_OPTARG_REQUIRED, ARGV_ERROR_OPTARG_PARADIGM, @@ -150,6 +151,12 @@ static void argv_usage( const struct argv_option **, const char * mode); +static void argv_usage_plain( + int fd, + const char * header, + const struct argv_option **, + const char * mode); + static struct argv_meta * argv_get( char **, const struct argv_option **, @@ -392,7 +399,11 @@ static void argv_scan( fval = ch; } } else { - ferr = ARGV_ERROR_SHORT_OPTION; + if ((ch == &parg[0][1]) && (ch[0] == 'W') && ch[1]) { + ferr = ARGV_ERROR_VENDOR_OPTION; + } else { + ferr = ARGV_ERROR_SHORT_OPTION; + } } } else if (!fnoscan && (fhybrid || is_long_option(ch))) { @@ -407,49 +418,72 @@ static void argv_scan( ch = *parg; } - if (fhybrid && !(option->flags & ARGV_OPTION_HYBRID_SWITCH)) + /* now verify the proper setting of option values */ + if (fhybrid && !(option->flags & ARGV_OPTION_HYBRID_SWITCH)) { ferr = ARGV_ERROR_HYBRID_NONE; - else if (!fhybrid && (option->flags & ARGV_OPTION_HYBRID_ONLY)) + + } else if (!fhybrid && (option->flags & ARGV_OPTION_HYBRID_ONLY)) { ferr = ARGV_ERROR_HYBRID_ONLY; - else if (option->optarg == ARGV_OPTARG_NONE) { + + } else if (option->optarg == ARGV_OPTARG_NONE) { if (val[0]) { ferr = ARGV_ERROR_OPTARG_NONE; ctx->errch = val + 1; - } else + } else { fval = false; + } + } else if (val[0] && (option->flags & ARGV_OPTION_HYBRID_JOINED)) { fval = true; ch = val; - } else if (fhybrid && !val[0] && !(option->flags & ARGV_OPTION_HYBRID_SPACE)) - ferr = ARGV_ERROR_HYBRID_SPACE; - else if (fhybrid && (val[0]=='=') && !(option->flags & ARGV_OPTION_HYBRID_EQUAL)) + + } else if (fhybrid && !val[0] && !(option->flags & ARGV_OPTION_HYBRID_SPACE)) { + if (option->optarg == ARGV_OPTARG_OPTIONAL) { + fval = false; + + } else { + ferr = ARGV_ERROR_HYBRID_SPACE; + } + + } else if (fhybrid && (val[0]=='=') && !(option->flags & ARGV_OPTION_HYBRID_EQUAL)) { ferr = ARGV_ERROR_HYBRID_EQUAL; - else if (fhybrid && (val[0]==',') && !(option->flags & ARGV_OPTION_HYBRID_COMMA)) + + } else if (fhybrid && (val[0]==',') && !(option->flags & ARGV_OPTION_HYBRID_COMMA)) { ferr = ARGV_ERROR_HYBRID_COMMA; - else if (!fhybrid && (val[0]==',')) + + } else if (!fhybrid && (val[0]==',')) { ferr = ARGV_ERROR_HYBRID_COMMA; - else if (val[0] && !val[1]) + + } else if (val[0] && !val[1]) { ferr = ARGV_ERROR_OPTARG_REQUIRED; - else if (val[0] && val[1]) { + + } else if (val[0] && val[1]) { fval = true; ch = ++val; + } else if (option->optarg == ARGV_OPTARG_REQUIRED) { - if (!val[0] && !*parg) + if (!val[0] && !*parg) { ferr = ARGV_ERROR_OPTARG_REQUIRED; - else if (*parg && is_short_option(*parg)) + + } else if (*parg && is_short_option(*parg)) { ferr = ARGV_ERROR_OPTARG_REQUIRED; - else if (*parg && is_long_option(*parg)) + + } else if (*parg && is_long_option(*parg)) { ferr = ARGV_ERROR_OPTARG_REQUIRED; - else if (*parg && is_last_option(*parg)) + + } else if (*parg && is_last_option(*parg)) { ferr = ARGV_ERROR_OPTARG_REQUIRED; - else + + } else { fval = true; + } } else { /* ARGV_OPTARG_OPTIONAL */ fval = val[0]; } - } else + } else { ferr = ARGV_ERROR_LONG_OPTION; + } } if (ferr == ARGV_ERROR_OK) @@ -525,7 +559,11 @@ static const char * argv_program_name(const char * program_path) static void argv_show_error(int fd, struct argv_ctx * ctx) { - char opt_short_name[2] = {0,0}; + const char * src; + char * dst; + char * cap; + char opt_vendor_buf[256]; + char opt_short_name[2] = {0,0}; if (ctx->erropt && ctx->erropt->short_name) opt_short_name[0] = ctx->erropt->short_name; @@ -541,6 +579,27 @@ static void argv_show_error(int fd, struct argv_ctx * ctx) argv_dprintf(fd,"'--%s' is not a valid long option\n",ctx->errch); break; + case ARGV_ERROR_VENDOR_OPTION: + src = ctx->errch; + dst = opt_vendor_buf; + cap = &opt_vendor_buf[sizeof(opt_vendor_buf)]; + + for (; src && *src && dst<cap; ) { + if ((*src == '=') || (*src == ',') || (*src == ':')) { + src = 0; + } else { + *dst++ = *src++; + } + } + + if (dst == cap) + dst--; + + *dst = '\0'; + + argv_dprintf(fd,"'-%s' is not a valid vendor option\n",opt_vendor_buf); + break; + case ARGV_ERROR_OPTARG_NONE: argv_dprintf(fd,"'%s' is not a valid option value for [%s%s%s%s%s] " "(option values may not be specified)\n", @@ -557,7 +616,9 @@ static void argv_show_error(int fd, struct argv_ctx * ctx) opt_short_name[0] ? "-" : "", opt_short_name, opt_short_name[0] ? "," : "", - ctx->erropt->long_name ? "--" : "", + ctx->erropt->long_name + ? (ctx->erropt->flags & ARGV_OPTION_HYBRID_ONLY) ? "-" : "--" + : "", ctx->erropt->long_name, ctx->erropt->paradigm ? "one of the following values:" : "a value", ctx->erropt->paradigm ? "{" : "", @@ -763,11 +824,12 @@ static void argv_free(struct argv_meta * xmeta) } } -static void argv_usage( +static void argv_usage_impl( int fd, const char * header, const struct argv_option ** options, - const char * mode) + const char * mode, + int fcolor) { const struct argv_option ** optv; const struct argv_option * option; @@ -789,12 +851,13 @@ static void argv_usage( const char cblue [] = "\x1b[34m"; const char ccyan [] = "\x1b[36m"; const char * color = ccyan; - bool fcolor; + + (void)argv_usage; + (void)argv_usage_plain; fshort = mode ? !strcmp(mode,"short") : 0; flong = fshort ? 0 : mode && !strcmp(mode,"long"); fboth = !fshort && !flong; - fcolor = isatty(fd); if (fcolor) argv_dprintf(fd,"%s%s",cbold,cgreen); @@ -936,6 +999,24 @@ static void argv_usage( argv_dprintf(fd,creset); } +static void argv_usage( + int fd, + const char * header, + const struct argv_option ** options, + const char * mode) +{ + argv_usage_impl(fd,header,options,mode,isatty(fd)); +} + +static void argv_usage_plain( + int fd, + const char * header, + const struct argv_option ** options, + const char * mode) +{ + argv_usage_impl(fd,header,options,mode,0); +} + #endif #endif diff --git a/src/internal/mdso_driver_impl.h b/src/internal/mdso_driver_impl.h index dc37a66..02234f7 100644 --- a/src/internal/mdso_driver_impl.h +++ b/src/internal/mdso_driver_impl.h @@ -59,6 +59,7 @@ struct mdso_driver_ctx_impl { struct mdso_error_info** erricap; struct mdso_error_info * erriptr[64]; struct mdso_error_info erribuf[64]; + char tmpname[32]; }; struct mdso_unit_ctx_impl { diff --git a/src/internal/mdso_errinfo_impl.c b/src/internal/mdso_errinfo_impl.c index 37ef64a..d7ea6ae 100644 --- a/src/internal/mdso_errinfo_impl.c +++ b/src/internal/mdso_errinfo_impl.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/internal/mdso_errinfo_impl.h b/src/internal/mdso_errinfo_impl.h index 13aa0c3..4b4b693 100644 --- a/src/internal/mdso_errinfo_impl.h +++ b/src/internal/mdso_errinfo_impl.h @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/internal/mdso_object_impl.h b/src/internal/mdso_object_impl.h index b329ef9..3442856 100644 --- a/src/internal/mdso_object_impl.h +++ b/src/internal/mdso_object_impl.h @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/internal/perk/perk_structs.h b/src/internal/perk/perk_structs.h index 4dd2ffc..b1823b4 100644 --- a/src/internal/perk/perk_structs.h +++ b/src/internal/perk/perk_structs.h @@ -326,13 +326,13 @@ struct pe_raw_coff_symbol_name { unsigned char cs_zeroes [0x04]; /* 0x00 */ unsigned char cs_offset [0x04]; /* 0x04 */ } long_name; - }; + } cs_u; }; struct pe_raw_coff_strtbl { unsigned char cst_size [0x04]; /* 0x00 */ - unsigned char cst_data[]; /* 0x04 */ + unsigned char cst_data [0x01]; /* 0x04 */ }; diff --git a/src/logic/mdso_asmgen_dsometa.c b/src/logic/mdso_asmgen_dsometa.c index 7c0b5ba..497b2e2 100644 --- a/src/logic/mdso_asmgen_dsometa.c +++ b/src/logic/mdso_asmgen_dsometa.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/logic/mdso_asmgen_symentry.c b/src/logic/mdso_asmgen_symentry.c index ef38182..28785ed 100644 --- a/src/logic/mdso_asmgen_symentry.c +++ b/src/logic/mdso_asmgen_symentry.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ @@ -1,12 +1,15 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ #include <mdso/mdso.h> +#define MDSO_UNUSED_PARAMETER(p) (void)p + int main(int argc, char ** argv, char ** envp) { + MDSO_UNUSED_PARAMETER(argc); return mdso_main(argv,envp,0); } diff --git a/src/object/mdso_objgen_dsometa.c b/src/object/mdso_objgen_dsometa.c index 388e296..1d3725e 100644 --- a/src/object/mdso_objgen_dsometa.c +++ b/src/object/mdso_objgen_dsometa.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/object/mdso_objgen_symentry.c b/src/object/mdso_objgen_symentry.c index 159f924..22adfbb 100644 --- a/src/object/mdso_objgen_symentry.c +++ b/src/object/mdso_objgen_symentry.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/output/mdso_output_error.c b/src/output/mdso_output_error.c index 6a382b7..cc97c18 100644 --- a/src/output/mdso_output_error.c +++ b/src/output/mdso_output_error.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/output/mdso_output_export_symbols.c b/src/output/mdso_output_export_symbols.c index 6f36a6d..fefb6ce 100644 --- a/src/output/mdso_output_export_symbols.c +++ b/src/output/mdso_output_export_symbols.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/output/mdso_output_expsyms_crc.c b/src/output/mdso_output_expsyms_crc.c index 45ff702..5b42ee8 100644 --- a/src/output/mdso_output_expsyms_crc.c +++ b/src/output/mdso_output_expsyms_crc.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2019 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/util/mdso_create_implib_archive.c b/src/util/mdso_create_implib_archive.c index a7e5cfe..00014c4 100644 --- a/src/util/mdso_create_implib_archive.c +++ b/src/util/mdso_create_implib_archive.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/util/mdso_create_implib_objects.c b/src/util/mdso_create_implib_objects.c index d310ff8..4e92a66 100644 --- a/src/util/mdso_create_implib_objects.c +++ b/src/util/mdso_create_implib_objects.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ diff --git a/src/util/mdso_create_implib_sources.c b/src/util/mdso_create_implib_sources.c index 317f2c8..df36eff 100644 --- a/src/util/mdso_create_implib_sources.c +++ b/src/util/mdso_create_implib_sources.c @@ -1,6 +1,6 @@ /****************************************************************/ /* mdso: midipix dso scavenger */ -/* Copyright (C) 2015--2017 Z. Gilboa */ +/* Copyright (C) 2015--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.MDSO. */ /****************************************************************/ |