diff --git a/sofort/ccenv/ccenv.sh b/sofort/ccenv/ccenv.sh index 26270f4..d98e87e 100644 --- a/sofort/ccenv/ccenv.sh +++ b/sofort/ccenv/ccenv.sh @@ -1489,6 +1489,7 @@ ccenv_output_defs() 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_switch_vars() diff --git a/sofort/cfgtest/cfgtest.sh b/sofort/cfgtest/cfgtest.sh index 80ef06d..53d7cb8 100644 --- a/sofort/cfgtest/cfgtest.sh +++ b/sofort/cfgtest/cfgtest.sh @@ -10,6 +10,7 @@ # 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 @@ -37,6 +38,7 @@ cfgtest_comment() 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:-} @@ -62,6 +64,7 @@ cfgtest_host_section() 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:-} @@ -128,7 +131,7 @@ cfgtest_epilog() return 1 fi - if [ "${2}" = '-----' ]; then + 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 @@ -641,6 +644,128 @@ cfgtest_library_presence() } +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