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: Tue, 05 Apr 2011 12:55:54 -0500
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100430 Fedora/3.0.4-2.fc11 Thunderbird/3.0.4

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



reply via email to

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