autoconf
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Multiple subdirectories with non-similar configure needs


From: Jim Galarowicz
Subject: Re: Multiple subdirectories with non-similar configure needs
Date: Thu, 5 May 2011 10:38:52 -0500

Hi all,

I'm writing to see if the patch that Christian developed will become a part of 
the mainline autoconf.

My team members do not want to use a non-mainstream method to configure.   Is 
there is a possibility of this becoming mainstream?

Thanks again!   This does work great with no side effects that I can tell.

Jim G

Attachment: AC_CONFIG_SUBDIR_CUSTOM.patch
Description: Binary data

On Apr 5, 2011, at 12:55 PM, Jim Galarowicz wrote:

> Hi Christian, all,
> 
> I've applied the patch to autoconf-2.65 and it works wonderfully!! Thanks so 
> much to you and all who have participated in this discussion and action.
> 
> Since the email thread started we have two more subdirectories.  My 
> configure.ac file now has these 5 AC_CONFIG_SUBDIR_CUSTOM lines in it:
> 
> AC_CONFIG_SUBDIR_CUSTOM([libcbtf], [--prefix=$CBTF_PREFIX 
> --with-boost=$CBTF_BOOST_PREFIX --with-boost-libdir=$CBTF_BOOST_PREFIX_LIB])
> 
> AC_CONFIG_SUBDIR_CUSTOM([libcbtf-xml], [--prefix=$CBTF_PREFIX 
> --with-cbtf=$CBTF_PREFIX --with-libxerces-c-prefix=$CBTF_XERCESC_PREFIX])
> 
> AC_CONFIG_SUBDIR_CUSTOM([libcbtf-mrnet], [--prefix=$CBTF_PREFIX 
> --with-cbtf=$CBTF_PREFIX --with-cbtf-xml=$CBTF_PREFIX 
> --with-libxerces-c-prefix=$CBTF_XERCESC_PREFIX 
> --with-mrnet=$CBTF_MRNET_PREFIX])
> 
> AC_CONFIG_SUBDIR_CUSTOM([messages], [--prefix=$CBTF_PREFIX 
> --with-cbtf=$CBTF_PREFIX --with-mrnet=$CBTF_MRNET_PREFIX 
> --with-libxerces-c-prefix=$CBTF_XERCESC_PREFIX --with-cbtf-xml=$CBTF_PREFIX 
> --with-cbtf-mrnet=$CBTF_PREFIX])
> 
> AC_CONFIG_SUBDIR_CUSTOM([services], [ --prefix=$CBTF_PREFIX 
> --with-mrnet=$CBTF_MRNET_PREFIX --with-cbtf-messages=$CBTF_PREFIX 
> --with-libmonitor=$CBTF_ROOT --with-libunwind=$CBTF_ROOT 
> --with-papi=$CBTF_ROOT  --with-tls=implicit  --with-binutils=$CBTF_ROOT 
> --with-cbtf=$CBTF_PREFIX])
> 
> I'm able to bootstrap, configure --prefix=$CBTF_PREFIX at the top level and 
> have each of the subdirectories configure with their respective configure 
> lines.   Very cool indeed!
> 
> Thanks again!
> 
> Will this make it into the main line release?
> 
> Jim G.
> 
> 
> On 04/01/2011 09:56 AM, Christian Rössel wrote:
>> Hi Jim, hi Ralf, hi all,
>> 
>> On 03/29/2011 08:35 AM, Ralf Wildenhues wrote:
>>> >  Hello Jim,
>>> >
>>> >  * Jim Galarowicz wrote on Mon, Mar 28, 2011 at 09:08:02PM CEST:
>>>> >>  I was wondering if anyone can point me to any information on how to
>>>> >>  configure from a top-level directory multiple sub-directories with
>>>> >>  different configure requirements.
>>> >
>>> >  Well, you can just write code yourself that calls the sub configure
>>> >  scripts with the arguments you intend for it.  Basically your own
>>> >  version of AC_CONFIG_SUBDIRS, if you like.
>> I wrote a macro (AC_CONFIG_SUBDIR_CUSTOM, patch applied) to pass
>> different arguments to different sub-configures. Like AC_CONFIG_SUBDIRS
>> it preserves
>>  * --cache-file
>>  * --silent
>> and passes always
>>  * --srcdir
>>  * --prefix
>>  * --disable-option-checking
>> 
>> AC_CONFIG_SUBDIR_CUSTOM takes at least two arguments, the directory
>> where the sub-configure resides and the additional arguments to be
>> passed to this specific sub-configure. An optional third parameter
>> controls if the sub-configure is recognized by a configure --help=recursive.
>> 
>> 
>>> >  GCC does this in its own tree (except the code is partly in the
>>> >  makefile, not only the toplevel configure script).
>>> >
>>> >  For simple things, it often suffices to adjust $ac_configure_args during
>>> >  configure (beware of the eval quoting though!).
>>> >
>>> >  However, you haven't written what kind of adjustments you need at all,
>>> >  so it's not clear how to help more.
>>> >
>>>> >>  My subdirectories are: libcbtf, libcbtf-xml, libcbtf-mrnet.  Each
>>>> >>  subdirectory has different package requirements and has been set up
>>>> >>  to use autoconf, automake, libtool, m4, etc..
>> Jim, you would use it like this in your toplevel configure.ac:
>> 
>> AC_CONFIG_SUBDIR_CUSTOM([libcbtf], [$arguments_to_libcbtf])
>> AC_CONFIG_SUBDIR_CUSTOM([libcbtf-xml], [$arguments_to_libcbtf-xml])
>> AC_CONFIG_SUBDIR_CUSTOM([libcbtf-mrnet], [$arguments_to_libcbtf-mrnet])
>> 
>> Cheers,
>> Christian
>> 
>> ------------------------------------------------------------------------------------------------
>> ------------------------------------------------------------------------------------------------
>> Forschungszentrum Juelich GmbH
>> 52425 Juelich
>> Sitz der Gesellschaft: Juelich
>> Eingetragen im Handelsregister des Amtsgerichts Dueren Nr. HR B 3498
>> Vorsitzender des Aufsichtsrats: MinDirig Dr. Karl Eugen Huthmacher
>> Geschaeftsfuehrung: Prof. Dr. Achim Bachem (Vorsitzender),
>> Dr. Ulrich Krafft (stellv. Vorsitzender), Prof. Dr.-Ing. Harald Bolt,
>> Prof. Dr. Sebastian M. Schmidt
>> ------------------------------------------------------------------------------------------------
>> ------------------------------------------------------------------------------------------------
>> 
>> Besuchen Sie uns auf unserem neuen Webauftritt unterwww.fz-juelich.de
>> 
>> 
>> AC_CONFIG_SUBDIR_CUSTOM.patch
>> 
>> 
>> diff --git a/lib/autoconf/status.m4 b/lib/autoconf/status.m4
>> index 46a0341..d028ede 100644
>> --- a/lib/autoconf/status.m4
>> +++ b/lib/autoconf/status.m4
>> @@ -191,7 +191,7 @@ m4_define([_AC_CONFIG_DEPENDENCY_DEFAULT],
>> 
>>  # _AC_CONFIG_UNIQUE(MODE, DEST)
>>  # -----------------------------
>> -# MODE is `FILES', `HEADERS', `LINKS', `COMMANDS', or `SUBDIRS'.
>> +# MODE is `FILES', `HEADERS', `LINKS', `COMMANDS', `SUBDIRS' or 
>> CONFIG_SUBDIR_CUSTOM.
>>  #
>>  # Verify that there is no double definition of an output file.
>>  #
>> @@ -1097,7 +1097,7 @@ m4_define([AC_OUTPUT_COMMANDS_POST])
>>  AC_DEFUN([AC_CONFIG_SUBDIRS],
>>  [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])]dnl
>>  [AC_REQUIRE([AC_DISABLE_OPTION_CHECKING])]dnl
>> -[m4_map_args_w([$1], [_AC_CONFIG_UNIQUE([SUBDIRS],
>> +[m4_map_args_w([$1], [_AC_CONFIG_UNIQUE([SUBDIRS or CONFIG_SUBDIR_CUSTOM],
>>    _AC_CONFIG_COMPUTE_DEST(], [))])]dnl
>>  [m4_append([_AC_LIST_SUBDIRS], [$1], [
>>  ])]dnl
>> @@ -1106,6 +1106,41 @@ AC_DEFUN([AC_CONFIG_SUBDIRS],
>>  [AC_SUBST([subdirs], ["$subdirs m4_normalize([$1])"])])
>> 
>> 
>> +# AC_CONFIG_SUBDIR_CUSTOM(DIR, ARGUMENTS [, DISABLE_HELP_RECURSIVE])
>> +# ------------------------------------------------------------------
>> +# Build a list custom_subdirs of tuples (DIR, ARGUMENTS) where DIR is
>> +# unique in _AC_LIST_CUSTOM_SUBDIRS and _AC_LIST_SUBDIRS. This list is used 
>> in
>> +# _AC_OUTPUT_SUBDIRS to invoke nested configures in directory DIR with
>> +# arguments ARGUMENTS. The arguments are modified as in the 
>> AC_CONFIG_SUBDIRS
>> +# case, see _AC_SUB_CONFIGURE_ARGS. If the third argument
>> +# DISABLE_HELP_RECURSIVE is given, configure --help=recursive will omit DIR.
>> +AC_DEFUN([AC_CONFIG_SUBDIR_CUSTOM],
>> +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])]dnl
>> +[AC_REQUIRE([AC_DISABLE_OPTION_CHECKING])]dnl
>> +[m4_foreach_w([_AC_Sub], [$1],
>> +          [_AC_CONFIG_UNIQUE([SUBDIRS or CONFIG_SUBDIR_CUSTOM],
>> +                                 m4_bpatsubst(m4_defn([_AC_Sub]), 
>> [:.*]))])]dnl
>> +
>> +# build a list of (directory,arguments) tuples that will be processed in 
>> _AC_OUTPUT_SUBDIRS
>> +[if test -z "$custom_subdirs"; then
>> +  
>> custom_subdirs="custom_sub_configure_dir=\"m4_normalize([$1])\";custom_sub_configure_args=\"m4_normalize([$2])\""
>> +else
>> +  
>> custom_subdirs="$custom_subdirs|custom_sub_configure_dir=\"m4_normalize([$1])\";custom_sub_configure_args=\"m4_normalize([$2])\""
>> +fi]
>> +
>> +# per default, enable --help=recursive in directory $1.
>> +[m4_ifval([$3],
>> +          [],
>> +          [m4_append([_AC_LIST_SUBDIRS], [$1], [
>> +])dnl
>> +])]dnl
>> +[AS_LITERAL_IF([$1], [],
>> +           [AC_DIAGNOSE([syntax], [$0: you should use literals])])]dnl
>> +[AC_SUBST([subdirs_custom], ["$subdirs_custom m4_normalize([$1])"])]dnl
>> +)
>> +# AC_CONFIG_SUBDIR_CUSTOM
>> +
>> +
>>  # _AC_OUTPUT_SUBDIRS
>>  # ------------------
>>  # This is a subroutine of AC_OUTPUT, but it does not go into
>> @@ -1116,12 +1151,50 @@ m4_define([_AC_OUTPUT_SUBDIRS],
>>  # CONFIG_SUBDIRS section.
>>  #
>>  if test "$no_recursion" != yes; then
>> +  ac_popdir=`pwd`
>> +
>> +  # call configures in list $custom_subdirs with directory-specific 
>> arguments.
>> +  OIFS=$IFS
>> +  IFS='|'
>> +  list=$custom_subdirs
>> +  for dir_and_args in $list; do
>> +    IFS=$OIFS
>> +    eval $dir_and_args
>> +    if test "x$custom_sub_configure_dir" = x; then continue; fi
>> +    ac_custom_sub_configure_args=
>> +    _AC_SUB_CONFIGURE_ARGS([$custom_sub_configure_args],
>> +                           [ac_custom_sub_configure_args])
>> +    _AC_SUB_CONFIGURE([$custom_sub_configure_dir],
>> +                      [$ac_custom_sub_configure_args])
>> +    cd "$ac_popdir"
>> +    IFS='|'
>> +  done
>> +  IFS=$OIFS
>> +
>> +  # call configures in $subdirs with fixed arguments.
>> +  ac_sub_configure_args=
>> +  _AC_SUB_CONFIGURE_ARGS([$ac_configure_args],
>> +                         [ac_sub_configure_args])
>> +  for ac_dir in : $subdirs; do test "x$ac_dir" = x:&&  continue
>> +     echo "ac_dir(inside): $ac_dir"
>> +    _AC_SUB_CONFIGURE([$ac_dir],
>> +                      [$ac_sub_configure_args])
>> +    cd "$ac_popdir"
>> +  done
>> +fi
>> +])# _AC_OUTPUT_SUBDIRS
>> 
>> +
>> +# _AC_SUB_CONFIGURE_ARGS(ARGUMENTS_IN, ARGUMENTS_OUT)
>> +# ---------------------------------------------------
>> +# Create ARGUMENTS_OUT from ARGUMENTS_IN for use in nested configure calls.
>> +m4_define([_AC_SUB_CONFIGURE_ARGS],
>> +[
>>    # Remove --cache-file, --srcdir, and --disable-option-checking arguments
>>    # so they do not pile up.
>>    ac_sub_configure_args=
>>    ac_prev=
>> -  eval "set x $ac_configure_args"
>> +  eval "set x $1"
>>    shift
>>    for ac_arg
>>    do
>> @@ -1153,7 +1226,7 @@ if test "$no_recursion" != yes; then
>>        case $ac_arg in
>>        *\'*) ac_arg=`AS_ECHO(["$ac_arg"]) | sed "s/'/'\\\\\\\\''/g"` ;;
>>        esac
>> -      AS_VAR_APPEND([ac_sub_configure_args], [" '$ac_arg'"]) ;;
>> +      AS_VAR_APPEND([$2], [" '$ac_arg'"]) ;;
>>      esac
>>    done
>> 
>> @@ -1163,66 +1236,68 @@ if test "$no_recursion" != yes; then
>>    case $ac_arg in
>>    *\'*) ac_arg=`AS_ECHO(["$ac_arg"]) | sed "s/'/'\\\\\\\\''/g"` ;;
>>    esac
>> -  ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
>> +  $2="'$ac_arg' $$2"
>> 
>>    # Pass --silent
>>    if test "$silent" = yes; then
>> -    ac_sub_configure_args="--silent $ac_sub_configure_args"
>> +    $2="--silent $$2"
>>    fi
>> 
>>    # Always prepend --disable-option-checking to silence warnings, since
>>    # different subdirs can have different --enable and --with options.
>> -  ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args"
>> +  $2="--disable-option-checking $$2"
>> +])# _AC_SUB_CONFIGURE_ARGS
>> 
>> -  ac_popdir=`pwd`
>> -  for ac_dir in : $subdirs; do test "x$ac_dir" = x:&&  continue
>> 
>> -    # Do not complain, so a configure script can configure whichever
>> -    # parts of a large source tree are present.
>> -    test -d "$srcdir/$ac_dir" || continue
>> -
>> -    ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
>> -    _AS_ECHO_LOG([$ac_msg])
>> -    _AS_ECHO([$ac_msg])
>> -    AS_MKDIR_P(["$ac_dir"])
>> -    _AC_SRCDIRS(["$ac_dir"])
>> -
>> -    cd "$ac_dir"
>> -
>> -    # Check for guested configure; otherwise get Cygnus style configure.
>> -    if test -f "$ac_srcdir/configure.gnu"; then
>> -      ac_sub_configure=$ac_srcdir/configure.gnu
>> -    elif test -f "$ac_srcdir/configure"; then
>> -      ac_sub_configure=$ac_srcdir/configure
>> -    elif test -f "$ac_srcdir/configure.in"; then
>> -      # This should be Cygnus configure.
>> -      ac_sub_configure=$ac_aux_dir/configure
>> -    else
>> -      AC_MSG_WARN([no configuration information is in $ac_dir])
>> -      ac_sub_configure=
>> -    fi
>> -
>> -    # The recursion is here.
>> -    if test -n "$ac_sub_configure"; then
>> -      # Make the cache file name correct relative to the subdirectory.
>> -      case $cache_file in
>> -      [[\\/]]* | ?:[[\\/]]* ) ac_sub_cache_file=$cache_file ;;
>> -      *) # Relative name.
>> -    ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
>> -      esac
>> -
>> -      AC_MSG_NOTICE([running $SHELL $ac_sub_configure 
>> $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir])
>> -      # The eval makes quoting arguments work.
>> -      eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
>> -       --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
>> -    AC_MSG_ERROR([$ac_sub_configure failed for $ac_dir])
>> -    fi
>> +# _AC_SUB_CONFIGURE(DIR, ARGUMENTS)
>> +# ---------------------------------
>> +# Call nested configure in DIR with arguments ARGUMENTS.
>> +m4_define([_AC_SUB_CONFIGURE],
>> +[
>> +  sub_configure_dir=$1
>> +  sub_configure_args=$2
>> +
>> +  # Do not complain, so a configure script can configure whichever
>> +  # parts of a large source tree are present.
>> +  test -d "$srcdir/$sub_configure_dir" || continue
>> +
>> +  ac_msg="=== configuring in $sub_configure_dir (`pwd`/$sub_configure_dir)"
>> +  _AS_ECHO_LOG([$ac_msg])
>> +  _AS_ECHO([$ac_msg])
>> +  AS_MKDIR_P(["$sub_configure_dir"])
>> +  _AC_SRCDIRS(["$sub_configure_dir"])
>> +
>> +  cd "$sub_configure_dir"
>> +
>> +  # Check for guested configure; otherwise get Cygnus style configure.
>> +  if test -f "$ac_srcdir/configure.gnu"; then
>> +    ac_sub_configure=$ac_srcdir/configure.gnu
>> +  elif test -f "$ac_srcdir/configure"; then
>> +    ac_sub_configure=$ac_srcdir/configure
>> +  elif test -f "$ac_srcdir/configure.in"; then
>> +    # This should be Cygnus configure.
>> +    ac_sub_configure=$ac_aux_dir/configure
>> +  else
>> +    AC_MSG_WARN([no configuration information is in $sub_configure_dir])
>> +    ac_sub_configure=
>> +  fi
>> 
>> -    cd "$ac_popdir"
>> -  done
>> -fi
>> -])# _AC_OUTPUT_SUBDIRS
>> +  # The recursion is here.
>> +  if test -n "$ac_sub_configure"; then
>> +    # Make the cache file name correct relative to the subdirectory.
>> +    case $cache_file in
>> +    [[\\/]]* | ?:[[\\/]]* ) ac_sub_cache_file=$cache_file ;;
>> +    *) # Relative name.
>> +      ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
>> +    esac
>> 
>> +    AC_MSG_NOTICE([running $SHELL $ac_sub_configure $sub_configure_args 
>> --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir])
>> +    # The eval makes quoting arguments work.
>> +    eval "\$SHELL \"\$ac_sub_configure\" $sub_configure_args \
>> +     --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
>> +      AC_MSG_ERROR([$ac_sub_configure failed for $sub_configure_dir])
>> +  fi
>> +])# _AC_SUB_CONFIGURE
>> 
>> 
>> 
>> @@ -1304,7 +1379,10 @@ if test "$no_create" != yes; then
>>    $ac_cs_success || AS_EXIT([1])
>>  fi
>>  dnl config.status should not do recursion.
>> -AC_PROVIDE_IFELSE([AC_CONFIG_SUBDIRS], [_AC_OUTPUT_SUBDIRS()])dnl
>> +AC_PROVIDE_IFELSE([AC_CONFIG_SUBDIRS],
>> +                  [_AC_OUTPUT_SUBDIRS()],
>> +                  [AC_PROVIDE_IFELSE([AC_CONFIG_SUBDIR_CUSTOM],
>> +                                     [_AC_OUTPUT_SUBDIRS()])])dnl
>>  if test -n "$ac_unrecognized_opts"&&  test "$enable_option_checking" != no; 
>> then
>>    AC_MSG_WARN([unrecognized options: $ac_unrecognized_opts])
>>  fi
>> 
>> 
>> 
>> _______________________________________________
>> Autoconf mailing list
>> address@hidden
>> http://lists.gnu.org/mailman/listinfo/autoconf
> 
> _______________________________________________
> Autoconf mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/autoconf


reply via email to

[Prev in Thread] Current Thread [Next in Thread]