diff options
Diffstat (limited to 'subr.ex/ex_rtl_configure.subr')
-rw-r--r-- | subr.ex/ex_rtl_configure.subr | 350 |
1 files changed, 350 insertions, 0 deletions
diff --git a/subr.ex/ex_rtl_configure.subr b/subr.ex/ex_rtl_configure.subr new file mode 100644 index 00000000..f68a0ecb --- /dev/null +++ b/subr.ex/ex_rtl_configure.subr @@ -0,0 +1,350 @@ +# +# Copyright (c) 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 LucĂa Andrea Illanes Albornoz <lucia@luciaillanes.de> +# set +o errexit -o noglob -o nounset is assumed. +# +# Package {configure,make} command execution +# + +# +# ex_rtl_configure() - run configure script +# @_ar: ar(1) command name or pathname +# @_cc: C compiler command name or pathname +# @_configure: configure script command name or pathname +# @_cxx: C++ compiler command name or pathname +# @_ld: ld(1) command name or pathname +# @_libtool: libtool(1) command name or pathname or "none" +# @_pkg_config: pkg-config(1) command name or pathname +# @_python: python command name or pathname +# @_ranlib: ranlib(1) command name or pathname +# @--: (ignored) +# @_flags: configure script flags as a whitespace-separated list +# @_flags_extra: extra configure script flags as a whitespace-separated likst +# @_flags_list: configure script flags as a :-separated list +# @_flags_extra_list: extra configure script flags as a :-separated list +# @--: (ignored) +# @_cflags: $CFLAGS +# @_cflags_extra: extra $CFLAGS +# @_cppflags: $CPPFLAGS +# @_cppflags_extra: extra $CPPFLAGS +# @_cxxflags: $CXXFLAGS +# @_cxxflags_extra: extra $CXXFLAGS +# @_ldflags: $LDFLAGS +# @_ldflags_extra: extra $LDFLAGS +# @_pkg_config_libdir: pkg-config(1) search directory +# +# Returns: zero (0) on success, non-zero (>0) on failure +# +ex_rtl_configure() { + local _erc_ar="${1}" _erc_cc="${2}" _erc_configure="${3}" _erc_cxx="${4}" _erc_ld="${5}" \ + _erc_libtool="${6}" _erc_pkg_config="${7}" _erc_python="${8}" _erc_ranlib="${9}" \ + _erc_ignored="${10}" \ + _erc_flags="${11}" _erc_flags_extra="${12}" \ + _erc_flags_list="${13}" _erc_flags_extra_list="${14}" \ + _erc_ignored="${15}" \ + _erc_cflags="${16}" _erc_cflags_extra="${17}" _erc_cppflags="${18}" \ + _erc_cppflags_extra="${19}" _erc_cxxflags="${20}" _erc_cxxflags_extra="${21}" \ + _erc_ldflags="${22}" _erc_ldflags_extra="${23}" _erc_pkg_config_libdir="${24}" \ + _erc_rc=0; + + case "${_erc_libtool:-}" in + none) _erc_libtool=""; ;; + esac; + + [ "${_erc_cflags_extra:+1}" = 1 ] && _erc_cflags="${_erc_cflags:+${_erc_cflags} }${_erc_cflags_extra}"; + [ "${_erc_cppflags_extra:+1}" = 1 ] && _erc_cppflags="${_erc_cppflags:+${_erc_cppflags} }${_erc_cppflags_extra}"; + [ "${_erc_cxxflags_extra:+1}" = 1 ] && _erc_cxxflags="${_erc_cxxflags:+${_erc_cxxflags} }${_erc_cxxflags_extra}"; + [ "${_erc_ldflags_extra:+1}" = 1 ] && _erc_ldflags="${_erc_ldflags:+${_erc_ldflags} }${_erc_ldflags_extra}"; + +( + if [ "${_erc_libtool:+1}" = 1 ]; then + export MAKE="make LIBTOOL=${_erc_libtool}"; + fi; + + [ "${_erc_ar:+1}" = 1 ] && export AR="${_erc_ar}"; + [ "${_erc_cc:+1}" = 1 ] && export CC="${_erc_cc}"; + [ "${_erc_cxx:+1}" = 1 ] && export CXX="${_erc_cxx}"; + [ "${_erc_ld:+1}" = 1 ] && export LD="${_erc_ld}"; + [ "${_erc_libtool:+1}" = 1 ] && export LIBTOOL="${_erc_libtool}"; + [ "${_erc_pkg_config:+1}" = 1 ] && export PKG_CONFIG="${_erc_pkg_config}"; + [ "${_erc_python:+1}" = 1 ] && export PYTHON="${_erc_python}"; + [ "${_erc_ranlib:+1}" = 1 ] && export RANLIB="${_erc_ranlib}"; + + [ "${_erc_cflags:+1}" = 1 ] && export CFLAGS="${_erc_cflags}"; + [ "${_erc_cppflags:+1}" = 1 ] && export CPPFLAGS="${_erc_cppflags}"; + [ "${_erc_cxxflags:+1}" = 1 ] && export CXXFLAGS="${_erc_cxxflags}"; + [ "${_erc_ldflags:+1}" = 1 ] && export LDFLAGS="${_erc_ldflags}"; + [ "${_erc_pkg_config_libdir:+1}" = 1 ] && export PKG_CONFIG_LIBDIR="${_erc_pkg_config_libdir}"; + + if [ "${_erc_flags_list:+1}" = 1 ]; then + rtl_run_cmdlineV ":" "${_erc_configure}" \ + "${_erc_flags_list}" \ + "${_erc_flags_extra_list:-}" \ + ; + exit "${?}"; + elif [ "${_erc_flags_extra_list:+1}" = 1 ]; then + rtl_run_cmdlineV ":" "${_erc_configure}" \ + ${_erc_flags:-} \ + "${_erc_flags_extra_list:-}" \ + ; + exit "${?}"; + else + rtl_run_cmdlineV ":" "${_erc_configure}" \ + ${_erc_flags:-} \ + ${_erc_flags_extra:-} \ + ; + exit "${?}"; + fi; +); + _erc_rc="${?}"; + + return "${_erc_rc}"; +}; + +# +# ex_rtl_configure_cmake() - run configure script +# @_ar: ar(1) command name or pathname +# @_cc: C compiler command name or pathname +# @_ccache: ccache(1) command name or pathname or "" +# @_cmake: CMake command name or pathname +# @_cxx: C++ compiler command name or pathname +# @_ld: ld(1) command name or pathname +# @_pkg_config: pkg-config(1) command name or pathname +# @_python: python command name or pathname +# @_ranlib: ranlib(1) command name or pathname +# @--: (ignored) +# @_build_type: CMake build type (host, cross, native) +# @_cmake_args: additional CMake arguments as a whitespace-separated list +# @_cmake_args_extra: additional CMake extra arguments as a whitespace-separated likst +# @_prefix: build prefix pathname +# @_subdir: CMake build directory pathname +# @_system_name: CMake system name +# @_system_processor: CMake system processor +# @--: (ignored) +# @_cflags: $CFLAGS +# @_cflags_extra: extra $CFLAGS +# @_cppflags: $CPPFLAGS +# @_cppflags_extra: extra $CPPFLAGS +# @_cxxflags: $CXXFLAGS +# @_cxxflags_extra: extra $CXXFLAGS +# @_ldflags: $LDFLAGS +# @_ldflags_extra: extra $LDFLAGS +# @_pkg_config_libdir: pkg-config(1) search directory +# +# Returns: zero (0) on success, non-zero (>0) on failure +# +ex_rtl_configure_cmake() { + local _ercc_ar="${1}" _ercc_cc="${2}" _ercc_ccache="${3}" _ercc_cmake="${4}" \ + _ercc_cxx="${5}" _ercc_ld="${6}" _ercc_pkg_config="${7}" _ercc_python="${8}" \ + _ercc_ranlib="${9}" \ + _ercc_ignored="${10}" \ + _ercc_build_type="${11}" \ + _ercc_cmake_args="${12}" _ercc_cmake_args_extra="${13}" \ + _ercc_prefix="${14}" _ercc_subdir="${15}" \ + _ercc_system_name="${16}" _ercc_system_processor="${17}" \ + _ercc_ignored="${18}" \ + _ercc_cflags="${19}" _ercc_cflags_extra="${20}" _ercc_cppflags="${21}" \ + _ercc_cppflags_extra="${22}" _ercc_cxxflags="${23}" _ercc_cxxflags_extra="${24}" \ + _ercc_ldflags="${25}" _ercc_ldflags_extra="${26}" _ercc_pkg_config_libdir="${27}" \ + _ercc_cmd_name="" _ercc_cmake_args_auto="" _ercc_rc=0 _ercc_vname="" _ercc_vval="" + + [ "${_ercc_cflags_extra:+1}" = 1 ] && _ercc_cflags="${_ercc_cflags:+${_ercc_cflags} }${_ercc_cflags_extra}"; + [ "${_ercc_cppflags_extra:+1}" = 1 ] && _ercc_cppflags="${_ercc_cppflags:+${_ercc_cppflags} }${_ercc_cppflags_extra}"; + [ "${_ercc_cxxflags_extra:+1}" = 1 ] && _ercc_cxxflags="${_ercc_cxxflags:+${_ercc_cxxflags} }${_ercc_cxxflags_extra}"; + [ "${_ercc_ldflags_extra:+1}" = 1 ] && _ercc_ldflags="${_ercc_ldflags:+${_ercc_ldflags} }${_ercc_ldflags_extra}"; + +( + [ "${_ercc_pkg_config:+1}" = 1 ] && export PKG_CONFIG="${_ercc_pkg_config}"; + [ "${_ercc_pkg_config_libdir:+1}" = 1 ] && export PKG_CONFIG_LIBDIR="${_ercc_pkg_config_libdir}"; + [ "${_ercc_python:+1}" = 1 ] && export PYTHON="${_ercc_python}"; + + for _ercc_vname in ar cc cxx ld pkg_config ranlib; do + case "${_ercc_vname}" in + cc|cxx) + _ercc_vname="_ercc_${_ercc_vname}"; + if [ "${_ercc_ccache:+1}" = 1 ]; then + eval ${_ercc_vname}="\${${_ercc_vname}#${_ercc_ccache} }"; + fi; + ;; + + *) + _ercc_vname="_ercc_${_ercc_vname}"; + ;; + esac; + + if eval [ '"${'"${_ercc_vname}"':+1}"' = 1 ]\ + && eval [ '"${'"${_ercc_vname}"'#/}"' = '"${'"${_ercc_vname}"'}"' ]; then + eval _ercc_cmd_name="\${${_ercc_vname}% *}"; + eval _ercc_vval="\${${_ercc_vname}#* }"; + eval ${_ercc_vname}='$(which "${_ercc_cmd_name}")' || return 1; + fi; + done; + + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_AR=${_ercc_ar}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_BUILD_TYPE=${_ercc_build_type}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_C_COMPILER=${_ercc_cc}" ":"; + if [ "${_ercc_ccache:+1}" = 1 ]; then + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_C_COMPILER_LAUNCHER=${_ercc_ccache}" ":"; + fi; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_C_FLAGS=${_ercc_cflags}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_CPP_FLAGS=${_ercc_cppflags}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_CXX_COMPILER=${_ercc_cxx}" ":"; + if [ "${_ercc_ccache:+1}" = 1 ]; then + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_CXX_COMPILER_LAUNCHER=${_ercc_ccache}" ":"; + fi; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_CXX_FLAGS=${_ercc_cxxflags}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_EXE_LINKER_FLAGS=${_ercc_ldflags}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_FIND_ROOT_PATH=${_ercc_prefix}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_INSTALL_PREFIX=" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_LINKER=${_ercc_ld}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_MODULE_LINKER_FLAGS=${_ercc_ldflags}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_RANLIB=${_ercc_ranlib}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_SHARED_LINKER_FLAGS=${_ercc_ldflags}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_SYSTEM_PROCESSOR=${_ercc_system_processor}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DPKG_CONFIG_EXECUTABLE=${_ercc_pkg_config}" ":"; + + case "${_ercc_build_type}" in + native) + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_SYSROOT=${_ercc_prefix}" ":"; + rtl_lconcat \$_ercc_cmake_args_auto "-DCMAKE_SYSTEM_NAME=${_ercc_system_name}" ":"; + ;; + esac; + + rtl_run_cmdlineV ":" "${_ercc_cmake}" \ + "${_ercc_cmake_args_auto}" \ + ${_ercc_cmake_args:-} \ + ${_ercc_cmake_args_extra:-} \ + "${_ercc_subdir}"; + exit "${?}"; +); + _ercc_rc="${?}"; + + return "${_ercc_rc}"; +}; + +# +# ex_rtl_configure_prepare() - prepare configure script for running +# @_build_type: build type (host, native) +# @_builddir: build directory pathname +# @_config_cache: optional configuration cache directives +# @_config_cache_local: optional local configuration cache directives +# @_config_cache_extra: optional extra configuration cache directives +# @_config_guess_fname: config.guess file pathname +# @_config_sub_global_fname: global config.sub file pathname +# @_copy_config_guess: copy config.guess (copy) or keep local config.guess (keep) +# @_force_autoreconf: 1 to force reconfiguration if already configured, 0 otherwise +# @_subdir: subdirectory pathname +# @_pkg_config: pkg-config(1) command name or pathname +# @_pkg_config_libdir: pkg-config(1) search directory +# @_prefix: prefix pathname +# +# Returns: zero (0) on success, non-zero (>0) on failure +# +ex_rtl_configure_prepare() { + local _ercp_build_type="${1}" _ercp_builddir="${2}" _ercp_config_cache="${3}" \ + _ercp_config_cache_local="${4}" _ercp_config_cache_extra="${5}" \ + _ercp_config_guess_fname="${6}" _ercp_config_sub_global_fname="${7}" \ + _ercp_copy_config_guess=="${8}" _ercp_force_autoreconf="${9}" \ + _ercp_subdir="${10}" _ercp_pkg_config="${11}" _ercp_pkg_config_libdir="${12}" \ + _ercp_prefix="${13}"; + + if rtl_exists_any "${_ercp_subdir}" \ + "configure.ac" \ + "configure.in" \ + "configure"; + then + rtl_export_vars \ + PKG_CONFIG "${_ercp_pkg_config}" \ + PKG_CONFIG_LIBDIR "${_ercp_pkg_config_libdir}"; + + if [ "${_ercp_force_autoreconf:-0}" -eq 1 ]\ + && ! (cd "${_ercp_subdir}" && autoreconf -fiv); then + return 1; + fi; + + if [ -e "${_ercp_subdir}/configure.ac" ]\ + && [ ! -e "${_ercp_subdir}/configure" ]; then + for _ercp_fname in bootstrap bootstrap.sh autogen.sh; do + if [ -e "${_ercp_subdir}/${_ercp_fname}" ]; then + for _ercp_subdir_tgt in \ + "${_ercp_subdir}/build-aux" \ + "${_ercp_subdir}"; + do if [ -e "${_ercp_subdir_tgt}" ]; then + if ! rtl_fileop install -m 0700 \ + "${_ercp_config_sub_global_fname}" \ + "${_ercp_subdir_tgt}/config.sub"; then + return 1; + fi; + + if [ "${_ercp_copy_config_guess}" = "copy" ]; then + if ! rtl_fileop install -m 0700 \ + "${_ercp_config_guess_fname}" \ + "${_ercp_subdir_tgt}/config.guess"; then + return 1; + else + break; + fi; + fi; + fi; + done; + + if ! (rtl_fileop cd "${_ercp_subdir}" && \ + /bin/sh "${_ercp_fname}"); then + return 1; + else + break; + fi; + fi; + done; + + if ! (rtl_fileop cd "${_ercp_subdir}" && autoconf); then + return 1; + fi; + fi; + + for _ercp_fname in $(find "${_ercp_subdir}" -name config.sub); do + if ! rtl_fileop mv "${_ercp_fname}" "${_ercp_fname}.orig"\ + || ! rtl_fileop install -m 0700 "${_ercp_config_sub_global_fname}" "${_ercp_fname}"; then + return 1; + fi; + done; + + if [ "${_ercp_copy_config_guess}" = "copy" ]; then + for _ercp_fname in $(find "${_ercp_subdir}" -name config.guess); do + if ! rtl_fileop mv "${_ercp_fname}" "${_ercp_fname}.orig"\ + || ! rtl_fileop install -m 0700 "${_ercp_config_guess_fname}" "${_ercp_fname}"; then + return 1; + fi; + done; + fi; + + if [ "${_ercp_build_type}" != host ]; then + if ! rtl_fileop touch "${_ercp_builddir}/config.cache"; then + return 1; + else + for _ercp_config_cache in \ + "${_ercp_config_cache:-}" \ + "${_ercp_config_cache_local:-}" \ + "${_ercp_config_cache_extra:-}"; + do + if [ "${_ercp_config_cache:+1}" = 1 ]\ + && ! printf "%s\n" "${_ercp_config_cache}" |\ + tr " " "\n" >> "${_ercp_builddir}/config.cache"; then + return 1; + fi; + done; + + if ! sed -i"" "s,%PREFIX%,${_ercp_prefix},g" "${_ercp_builddir}/config.cache"; then + return 1; + fi; + fi; + fi; + + rtl_export_vars -u \ + PKG_CONFIG "${_ercp_pkg_config}" \ + PKG_CONFIG_LIBDIR "${_ercp_pkg_config_libdir}"; + fi; + + return 0; +}; + +# vim:filetype=sh textwidth=0 |