diff --git a/config/aclocal_subcfg.m4 b/config/aclocal_subcfg.m4 index a87fc086a0..41954599be 100644 --- a/config/aclocal_subcfg.m4 +++ b/config/aclocal_subcfg.m4 @@ -73,33 +73,47 @@ AC_DEFUN([PAC_CONFIG_SUBDIR_ARGS],[ --disable-option-checking) ;; *) - # MPICH note: this is a more robust version of the "precious - # variable" propagation code that was present in the previous - # incarnation of this macro + # strip out precious variables from ac_configure_args, + # which will include precious variables that are currently + # set and were set on the command line or in the + # environment at the time configure was invoked. Instead, + # we add all precious variables which have been tagged as + # set, so that we can more closely control the environment + # of sub-configures. + is_precious=0 for pac_pvar in $ac_precious_vars ; do # check if configure argument token contains the # precious variable, i.e. "name_of_prec_var=". if ( echo $pac_arg | grep "^$pac_pvar=" >/dev/null 2>&1 ) ; then - # check if current precious variable is set in env - eval pvar_set=\${$pac_pvar+set} - if test "$pvar_set" = "set" ; then - # Append 'name_of_prec_var=value_of_prec_var' - # to the subconfigure arguments list, where - # value_of_prec_var is fetched from the env. - # this also overrides any value set on the command line - eval pac_pval=\${$pac_pvar} - pac_arg="$pac_pvar=$pac_pval" - break - fi + is_precious=1 + break fi done - case $pac_arg in - *\'*) pac_arg=`AS_ECHO(["$pac_arg"]) | sed "s/'/'\\\\\\\\''/g"` ;; - esac - AS_VAR_APPEND([pac_sub_configure_args], [" '$pac_arg'"]) ;; + if test $is_precious -eq 0; then + case $pac_arg in + *\'*) pac_arg=`AS_ECHO(["$pac_arg"]) | sed "s/'/'\\\\\\\\''/g"` ;; + esac + AS_VAR_APPEND([pac_sub_configure_args], [" '$pac_arg'"]) + fi ;; esac done + # add all precious values with a set token to the configure + # args. If the caller hasn't artificially manipulated the + # environment, this will simply be any precious variables as + # they were originally specified on the top-level configure + # line (or in the environment at start of configure). + # However, callers may manipulate that environment, preferably + # with the OPAL_SUBDIR_ENV macros. + for temp_var in $ac_precious_vars; do + eval temp_var_set=\$ac_env_${temp_var}_set + if test "$temp_var_set" = "set" ; then + eval temp_val=\$$temp_var + temp_arg="$temp_var=$temp_val" + AS_VAR_APPEND([pac_sub_configure_args], [" '$temp_arg'"]) + fi + done + # Always prepend --prefix to ensure using the same prefix # in subdir configurations. # MPICH note: see tt#983 for an example of why this is necessary diff --git a/config/ompi_setup_prrte.m4 b/config/ompi_setup_prrte.m4 index 56bb39fbf6..c17ea37397 100644 --- a/config/ompi_setup_prrte.m4 +++ b/config/ompi_setup_prrte.m4 @@ -49,7 +49,7 @@ AC_DEFUN([OMPI_SETUP_PRRTE],[ ]) AC_DEFUN([OMPI_SETUP_PRRTE_INTERNAL], [ - OPAL_VAR_SCOPE_PUSH([internal_prrte_args internal_prrte_extra_libs internal_prrte_happy deprecated_prefix_by_default print_prrte_warning]) + OPAL_VAR_SCOPE_PUSH([internal_prrte_args internal_prrte_extra_libs internal_prrte_happy deprecated_prefix_by_default print_prrte_warning internal_prrte_CPPFLAGS]) opal_show_subtitle "Configuring PRRTE" @@ -91,6 +91,7 @@ AC_DEFUN([OMPI_SETUP_PRRTE_INTERNAL], [ AS_IF([test "$enable_internal_rte" = "no"], [internal_prrte_happy="no"]) + internal_prrte_CPPFLAGS= internal_prrte_args="--with-proxy-version-string=$OPAL_VERSION --with-proxy-package-name=\"Open MPI\" --with-proxy-bugreport=\"https://www.open-mpi.org/community/help/\"" internal_prrte_libs= @@ -105,14 +106,17 @@ AC_DEFUN([OMPI_SETUP_PRRTE_INTERNAL], [ AS_IF([test "$opal_libevent_mode" = "internal"], [internal_prrte_args="$internal_prrte_args --with-libevent-header=$opal_libevent_header" + internal_prrte_CPPFLAGS="$internal_prrte_CPPFLAGS $opal_libevent_CPPFLAGS" internal_prrte_libs="$internal_prrte_libs $opal_libevent_LIBS"]) AS_IF([test "$opal_hwloc_mode" = "internal"], [internal_prrte_args="$internal_prrte_args --with-hwloc-header=$opal_hwloc_header" + internal_prrte_CPPFLAGS="$internal_prrte_CPPFLAGS $opal_hwloc_CPPFLAGS" internal_prrte_libs="$internal_prrte_libs $opal_hwloc_LIBS"]) AS_IF([test "$opal_pmix_mode" = "internal"], [internal_prrte_args="$internal_prrte_args --with-pmix-header=$opal_pmix_header" + internal_prrte_CPPFLAGS="$internal_prrte_CPPFLAGS $opal_pmix_CPPFLAGS" internal_prrte_libs="$internal_prrte_libs $opal_pmix_LIBS"]) AS_IF([test "$internal_prrte_happy" = "yes"], @@ -143,13 +147,16 @@ dnl [internal_prrte_args="$internal_prrte_args --with-platform=$with_prrt # picks up how to build an internal HWLOC, libevent, and PMIx, plus # picks up any user-specified compiler flags from the master # configure run. - export CFLAGS CPPFLAGS LDFLAGS + OPAL_SUBDIR_ENV_CLEAN([opal_prrte_configure]) + AS_IF([test -n "$internal_prrte_CPPFLAGS"], + [OPAL_SUBDIR_ENV_APPEND([CPPFLAGS], [$internal_prrte_CPPFLAGS])]) PAC_CONFIG_SUBDIR_ARGS([3rd-party/prrte], [$internal_prrte_args], [[--with-libevent=internal], [--with-hwloc=internal], [--with-libevent=external], [--with-hwloc=external], [--with-pmix=internal], [--with-pmix=external], [--with-platform=[[^ ]]*]], [], [internal_prrte_happy="no"]) + OPAL_SUBDIR_ENV_RESTORE([opal_prrte_configure]) OPAL_3RDPARTY_DIST_SUBDIRS="$OPAL_3RDPARTY_DIST_SUBDIRS prrte" AS_IF([test "$internal_prrte_happy" = "no" -a "$enable_internal_rte" != "no"], diff --git a/config/opal_config_hwloc.m4 b/config/opal_config_hwloc.m4 index 389ffb6c9a..cbcbb5ed21 100644 --- a/config/opal_config_hwloc.m4 +++ b/config/opal_config_hwloc.m4 @@ -154,8 +154,10 @@ AC_DEFUN([_OPAL_CONFIG_HWLOC_INTERNAL], [ # Note: To update the version of hwloc shipped, update the # constant in autogen.pl. OPAL_EXPAND_TARBALL([3rd-party/hwloc_tarball], [3rd-party/hwloc_directory], [configure]) + OPAL_SUBDIR_ENV_CLEAN([opal_hwloc_configure]) PAC_CONFIG_SUBDIR_ARGS([3rd-party/hwloc_directory], [], [], [subconfig_happy=1], [subconfig_happy=0]) + OPAL_SUBDIR_ENV_RESTORE([opal_hwloc_configure]) AS_IF([test "$subconfig_happy" = "1"], [internal_hwloc_location="3rd-party/hwloc_directory" diff --git a/config/opal_config_libevent.m4 b/config/opal_config_libevent.m4 index 43787c9b61..954d56e04c 100644 --- a/config/opal_config_libevent.m4 +++ b/config/opal_config_libevent.m4 @@ -183,9 +183,11 @@ AC_DEFUN([_OPAL_CONFIG_LIBEVENT_INTERNAL], [ # Libevent, so we will never actually fix said warnnings and 2) # some of the warning options cause failures with compilers that # fake being GCC (I'm looking at you, PGI). + OPAL_SUBDIR_ENV_CLEAN([opal_libevent_configure]) PAC_CONFIG_SUBDIR_ARGS([3rd-party/libevent_directory], [--disable-dns --disable-http --disable-rpc --disable-openssl --enable-thread-support --disable-evport --disable-gcc-warnings], [], [subconfig_happy=1], [subconfig_happy=0]) + OPAL_SUBDIR_ENV_RESTORE([opal_libevent_configure]) AS_IF([test "$subconfig_happy" = "1"], [internal_libevent_location="3rd-party/libevent_directory" diff --git a/config/opal_config_pmix.m4 b/config/opal_config_pmix.m4 index e25f2ca564..165d3ea991 100644 --- a/config/opal_config_pmix.m4 +++ b/config/opal_config_pmix.m4 @@ -57,7 +57,7 @@ dnl LD_LIBRARY_PATH. dnl * CPPFLAGS, LDFLAGS - Updated opal_pmix_CPPFLAGS and dnl opal_pmix_LDFLAGS. AC_DEFUN([OPAL_CONFIG_PMIX], [ - OPAL_VAR_SCOPE_PUSH([external_pmix_happy internal_pmix_happy internal_pmix_args internal_pmix_libs]) + OPAL_VAR_SCOPE_PUSH([external_pmix_happy internal_pmix_happy internal_pmix_args internal_pmix_libs internal_pmix_CPPFLAGS]) opal_show_subtitle "Configuring PMIx" @@ -71,13 +71,16 @@ AC_DEFUN([OPAL_CONFIG_PMIX], [ # make dist always works. internal_pmix_args="--without-tests-examples --disable-pmix-binaries --disable-pmix-backward-compatibility --disable-visibility" internal_pmix_libs= + internal_pmix_CPPFLAGS= AS_IF([test "$opal_libevent_mode" = "internal"], [internal_pmix_args="$internal_pmix_args --with-libevent=cobuild" + internal_pmix_CPPFLAGS="$internal_pmix_CPPFLAGS $opal_libevent_CPPFLAGS" internal_pmix_libs="$internal_pmix_libs $opal_libevent_LIBS"]) AS_IF([test "$opal_hwloc_mode" = "internal"], [internal_pmix_args="$internal_pmix_args --with-hwloc=cobuild" + internal_pmix_CPPFLAGS="$internal_pmix_CPPFLAGS $opal_hwloc_CPPFLAGS" internal_pmix_libs="$internal_pmix_libs $opal_hwloc_LIBS"]) AS_IF([test ! -z "$internal_pmix_libs"], @@ -87,12 +90,15 @@ AC_DEFUN([OPAL_CONFIG_PMIX], [ # picks up how to build an internal HWLOC and libevent, plus # picks up any user-specified compiler flags from the master # configure run. - export CFLAGS CPPFLAGS LDFLAGS + OPAL_SUBDIR_ENV_CLEAN([opal_pmix_configure]) + AS_IF([test -n "$internal_pmix_CPPFLAGS"], + [OPAL_SUBDIR_ENV_APPEND([CPPFLAGS], [$internal_pmix_CPPFLAGS])]) PAC_CONFIG_SUBDIR_ARGS([3rd-party/openpmix], [$internal_pmix_args], [[--with-libevent=internal], [--with-hwloc=internal], [--with-libevent=external], [--with-hwloc=external], [--with-pmix=[[^ ]]*], [--with-platform=[[^ ]]*]], [internal_pmix_happy=1]) + OPAL_SUBDIR_ENV_RESTORE([opal_pmix_configure]) OPAL_3RDPARTY_DIST_SUBDIRS="$OPAL_3RDPARTY_DIST_SUBDIRS openpmix"]) # unless internal specifically requested by the user, try to find diff --git a/config/opal_subdir_env.m4 b/config/opal_subdir_env.m4 new file mode 100644 index 0000000000..805aa5f3d7 --- /dev/null +++ b/config/opal_subdir_env.m4 @@ -0,0 +1,89 @@ +dnl -*- autoconf -*- +dnl +dnl Copyright (c) 2020 Amazon.com, Inc. or its affiliates. All Rights +dnl reserved. +dnl $COPYRIGHT$ +dnl +dnl Additional copyrights may follow +dnl +dnl $HEADER$ +dnl + +dnl OPAL_SUBDIR_ENV_CLEAN([prefix]) +dnl +dnl Save all precious variables with the specified prefix and reset +dnl all precious variables to their state at the start of configure. +dnl That is, if a precious variable (say CPPFLAGS) was set on the +dnl configure command line or in the environment at the start of +dnl configure, it will be reset to that stored value. Otherwise, it +dnl will be unset. The current state is recorded so that it can be +dnl restored with OPAL_SUBDIR_ENV_RESTORE. Useful for wrapping calles +dnl to subconfigure scripts. +AC_DEFUN([OPAL_SUBDIR_ENV_CLEAN], [ + for temp_var in $ac_precious_vars; do + # save all set variables, with a __set and + # __value format. _set will always be saved, + # _value if _set evaluates to "set". + # + # Because we may modify the environment with + # OPAL_SUBDIR_ENV_APPEND, also store the original values of + # ac_env__set in _ac_env__set + eval temp_var_set=\${${temp_var}+set} + eval $1_${temp_var}_set=$temp_var_set + eval $1_ac_env_${temp_var}_set=\$ac_env_${temp_var}_set + if test "$temp_var_set" = "set" ; then + eval $1_${temp_var}_value=\$${temp_var} + fi + unset tmp_var_set + + # restore the variables that were set at the start of + # configure and unset the ones that were not. + eval temp_var_orig_set=\$ac_env_${temp_var}_set + if test "$temp_var_set" = "set" ; then + eval ${temp_var}=\$ac_env_${temp_var}_value + else + unset $temp_var + fi + done +]) + +dnl OPAL_SUBDIR_ENV_RESTORE([prefix]) +dnl +dnl Match with call to OPAL_SUBDIR_ENV_CLEAN. Restore will return all +dnl precious variables to their state at the time that +dnl OPAL_SUBDIR_ENV_CLEAN was called. If a variable was set at that +dnl time, it will be set to that value. Otherwise, it will be unset. +dnl +dnl The state of the ac_env__set value is also restored to its +dnl value from when OPAL_SUBDIR_ENV_CLEAN is called. The +dnl ac_env__set variables may be manipulated by +dnl OPAL_SUBDIR_ENV_APPEND. +AC_DEFUN([OPAL_SUBDIR_ENV_RESTORE], [ + for temp_var in $ac_precious_vars; do + # always restore the value of ac_env__set + eval ac_env_${temp_var}_set=\$$1_ac_env_${temp_var}_set + + # conditionally restore any variable values that were set at + # CLEAN time + eval temp_var_set=\$$1_${temp_var}_set + if test "$temp_var_set" = "set" ; then + eval ${temp_var}=\$$1_${temp_var}_value + fi + + unset $1_${temp_var}_value + unset $1_${temp_var}_set + unset $1_ac_env_${temp_var}_set + done +]) + +dnl OPAL_SUBDIR_ENV_APPEND([precious variable], [append value]) +dnl +dnl Append the contents of [append value] to precious variable +dnl [precious variable] and set the ac_env__set variable so +dnl that PAC_CONFIG_SUBDIR_ARGS can pick up the variables for +dnl subconfigure runs. Most useful between a call to +dnl OPAL_SUBDIR_ENV_CLEAN and OPAL_SUBDIR_ENV_RESTORE +AC_DEFUN([OPAL_SUBDIR_ENV_APPEND], [ + ac_env_$1_set="set" + AS_IF([test -z "$$1"], [$1=$2], [$1="$$1 $2"]) +])