diff options
author | Stefano Lattarini <stefano.lattarini@gmail.com> | 2013-01-09 23:16:53 +0100 |
---|---|---|
committer | Stefano Lattarini <stefano.lattarini@gmail.com> | 2013-01-11 19:56:41 +0100 |
commit | 34001a987a6defdb70f6f3c17cce9d9c665fe6e8 (patch) | |
tree | 9d9dd5720fe8e4fd773d2e22378e10db90103058 /m4/init.m4 | |
parent | 1ab8fb6d0e8497c0b86a1453b901dda29ba9d9f6 (diff) | |
download | automake-34001a987a6defdb70f6f3c17cce9d9c665fe6e8.tar.gz |
compile: use 'compile' script when "-c -o" is used with losing compilers
Do so seen when only source files in the "current" directory are present.
This commit is part of a series of related changes addressing automake
bug#13378 (see also the plan 'PLANS/subdir-objects.txt').
Before this change, Automake-generated C compilation rules mistakenly
passed the "-c -o" options combination unconditionally (even to losing
compiler) when the 'subdir-objects' was used but sources were only
present in the top-level directory. Issue spotted by Nick Bowler:
<http://debbugs.gnu.org/cgi/bugreport.cgi?bug=13378#35>
<http://debbugs.gnu.org/cgi/bugreport.cgi?bug=13378#44>
We fix this by having Automake redefine AC_PROG_CC to take over the role
of AM_PROG_CC_C_O and to require the 'compile' script unconditionally
(albeit that will continue to be invoked only when inferior compilers
are detected).
Among other things, this means AM_PROG_CC_C_O explicitly is no longer
required; that macro is still supported for backward-compatibility, but
calling it is basically a no-op now.
This change has some pros and some cons (obviously, we believe the former
outweighs the latter). Here are the most relevant ones:
+ Pros 1:
Some logic in the Automake script has been simplified.
+ Pros 2:
That simplification has automatically fixed an actual bug (see
Nick's mails referenced above; admittedly, that was present only in
corner-case situations, but still); the test 't/ccnoco4.sh', which
demonstrated the bug and has been failing so far, now passes.
+ Pros 3:
Things works more "automagically" now (no need to manually add the
AM_PROG_CC_C_O macro to configure.ac anymore).
* Cons 1:
The 'compile' script will be required in all projects using C
compilation; this will only be a problem for packages not using
'--add-missing'. However, such packages are definitely more rare
than the ones using '--add-missing', and adjusting them will be
trivial -- just copy the compile script over from the new Automake
installation.
* Cons 2:
The copy & paste of autoconf internals hack this change has introduced
in our "rewrite" of AC_PROG_CC is really an egregious abomination. It
can only be justified with the fact that we expect future versions of
autoconf to implement the semantics we need directly in AC_PROG_CC, so
that we'll be able to leverage that (since Automake 1.14 will require
the latest Autoconf version released).
Now, the detailed list of file-by-file changes ...
* automake.in ($seen_cc_c_o): Remove this global variable.
(scan_autoconf_traces): Don't set it, and do not trace the
'AM_PROG_CC_C_O' m4 macro.
(lang_c_rewrite): Remove, no longer needed.
* doc/automake.texi: Adjust expected "autoreconf --install" output
in the amhello example. Remove statements about the need for the
AM_PROG_CC_C_O macro. Report it is obsolete now.
* m4/init.m4: Re-write AC_PROG_CC to append checks about whether the
C compiler supports "-c -o" together. These checks have basically
been ripped out (with adaptations) from the 'AC_PROG_CC_C_O' macro
of Autoconf and ...
* m4/minuso.m4 (AM_PROG_CC_C_O): ... this macro of ours, which has
thus basically become a no-op.
* t/ax/am-test-lib.sh (am_setup_testdir): Also copy the 'compile'
script in the test directory; if we don't do so, every test using
AC_PROG_CC should call automake with the "--add-missing" option, or
copy the 'compile' script itself.
* t/cond11.sh: No need to create a dummy 'compile' script: that is
already brought in by 'am_setup_testdir()', that is automatically
invoked when 'test-lib.sh' is sourced.
* t/add-missing.tap: Adjust: we expect the 'compile' script to be
required by a mere AC_PROG_CC call now.
* t/dist-auxdir-many-subdirs.sh: Likewise.
* t/specflg6.sh: Likewise.
* t/subobj4.sh: Likewise.
* t/cxx-lt-demo.sh: Likewise, and update comments to match.
* t/distcom2.sh: Enhance a little.
* t/dollarvar2.sh: Adjust.
* t/extra-portability.sh: Likewise.
* t/libobj19.sh: Likewise.
* t/per-target-flags.sh: Likewise.
* t/repeated-options.sh: Likewise.
* t/subobj.sh: Likewise, and enhance a little.
* t/ccnoco2.sh: Remove as obsolete.
* t/list-of-tests.mk (handwritten_TESTS): Adjust.
(XFAIL_TESTS): Remove 't/ccnoco4.sh'.
* NEWS: Update.
Signed-off-by: Stefano Lattarini <stefano.lattarini@gmail.com>
Diffstat (limited to 'm4/init.m4')
-rw-r--r-- | m4/init.m4 | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/m4/init.m4 b/m4/init.m4 index 44b24819a..c5af65cce 100644 --- a/m4/init.m4 +++ b/m4/init.m4 @@ -125,6 +125,51 @@ dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) +dnl We have to redefine AC_PROG_CC to allow our compile rules to use +dnl "-c -o" together also with losing compilers. +dnl FIXME: Add references to the original discussion and bug report. +dnl FIXME: Shameless copy & paste from Autoconf internals, since trying to +dnl play smart among tangles of AC_REQUIRE, m4_defn, m4_provide and +dnl other tricks was proving too difficult, and in the end, likely +dnl more brittle too. And this should anyway be just a temporary +dnl band-aid, until Autoconf provides the semantics and/or hooks we +dnl need (hint hint, nudge nudge) ... +AC_DEFUN([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +dnl FIXME The following abomination is expected to disappear in +dnl Automake 1.14. +AC_MSG_CHECKING([whether $CC understands -c and -o together]) +set dummy $CC; am__cc=`AS_ECHO(["$[2]"]) | \ + sed 's/[[^a-zA-Z0-9_]]/_/g;s/^[[0-9]]/_/'` +AC_CACHE_VAL([am_cv_prog_cc_${am__cc}_c_o], +[AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&AS_MESSAGE_LOG_FD' +rm -f conftest2.* +if _AC_DO_VAR(ac_try) && test -f conftest2.$ac_objext +then + eval am_cv_prog_cc_${am__cc}_c_o=yes +else + eval am_cv_prog_cc_${am__cc}_c_o=no +fi +rm -f core conftest* +])dnl +if eval test \"\$am_cv_prog_cc_${am__cc}_c_o\" = yes; then + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) + # Losing compiler, so wrap it with the 'compile' script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header |