Hi,
On Mon, May 17, 2010 at 03:37:37PM -0700, Natalie Tasman wrote:
> I've created a separate configure.ac and Makefile.in for the "native"
> project. However, when invoking configuration from the top-level
> (cross-compiled) project, AC_CONFIG_SUBDIRS passes various options,
> including directives to use the top-level cache as well as the "--host"
> cross-compile directive.
Normally I just generate a toplevel Makefile that creates subdirectories
and calls the sub-configure explicitly, but I've always thought of that
as slightly suboptimal. Since I needed it for a work project anyway I
thought I could spend an hour of company time on it.
The attached acinclude.m4 fragment defines
SJR_CONFIG_NATIVE_SUBDIRS(...)
which allows you to list sub-directories, allowed anywhere before the
output bits, and
SJR_OUTPUT_NATIVE_SUBDIRS
which invokes the sub-configure, and should be used after AC_OUTPUT.
> Do you know how to cause the subproject to be ./configured as a truly
> independent project, without passing cached config data as well as options
> from the top level?
I do filter the option list, but most options go through. I think it
might be an idea to map CC_FOR_BUILD to CC etc.
> BTW, the autoconf list bounced me back here :)
Well, they are wrong. :)
Simon
AC_DEFUN([SJR_CONFIG_NATIVE_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],
_AC_CONFIG_COMPUTE_DEST(], [))])]dnl
[m4_append([_SJR_LIST_NATIVE_SUBDIRS], [$1], [
])]dnl
[AS_LITERAL_IF([$1], [],
[AC_DIAGNOSE([syntax], [$0: you should use literals])])]dnl
[AC_SUBST([native_subdirs], ["$native_subdirs m4_normalize([$1])"])])
AC_DEFUN([SJR_OUTPUT_NATIVE_SUBDIRS],
[
if test "$no_recursion" != yes; then
# Remove --cache-file, --srcdir, and --disable-option-checking arguments
# so they do not pile up. Also, set --host to --build
ac_sub_configure_args=
ac_prev=
eval "set x $ac_configure_args"
shift
for ac_arg
do
case x$ac_prev in
xbuild) ac_arg="--build=$ac_arg"; ac_prev= ;;
x) ;;
*) ac_prev=; continue ;;
esac
case $ac_arg in
-cache-file | --cache-file | --cache-fil | --cache-fi \
| --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
ac_prev=cache_file ;;
-cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
| --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
| --c=*)
;;
--config-cache | -C)
;;
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
ac_prev=srcdir ;;
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
;;
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
ac_prev=prefix ;;
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
;;
--disable-option-checking)
;;
--host | --hos | --ho)
ac_prev=host ;;
--host=* | --hos=* | --ho=*)
;;
host_alias=*)
;;
--build | --buil | --bui | --bu)
ac_prev=build ;;
--build=* | --buil=* | --bui=* | --bu=*)
ac_arg=`AS_ECHO(["$ac_arg"]) | sed
"s/--bu\(i\(ld\?\)\?\)\?=\(.*\)/--build=\3 --host=\3/"`
AS_VAR_APPEND([ac_sub_configure_args], [" '$ac_arg'"]) ;;
*)
case $ac_arg in
*\'*) ac_arg=`AS_ECHO(["$ac_arg"]) | sed "s/'/'\\\\\\\\''/g"` ;;
esac
AS_VAR_APPEND([ac_sub_configure_args], [" '$ac_arg'"]) ;;
esac
done
# Always prepend --prefix to ensure using the same prefix
# in subdir configurations.
ac_arg="--prefix=$prefix"
case $ac_arg in
*\'*) ac_arg=`AS_ECHO(["$ac_arg"]) | sed "s/'/'\\\\\\\\''/g"` ;;
esac
ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
# Pass --silent
if test "$silent" = yes; then
ac_sub_configure_args="--silent $ac_sub_configure_args"
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"
ac_popdir=`pwd`
for ac_dir in : $native_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 for native build 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
AC_MSG_NOTICE([running $SHELL $ac_sub_configure $ac_sub_configure_args
--srcdir=$ac_srcdir])
# The eval makes quoting arguments work.
eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
--srcdir=\"\$ac_srcdir\"" ||
AC_MSG_ERROR([$ac_sub_configure failed for $ac_dir])
fi
cd "$ac_popdir"
done
fi
])