bug-autoconf
[Top][All Lists]
Advanced

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

[sr #110294] AC_LANG_PUSH/AC_LANG_POP malfunction inside AC_DEFUN


From: Bruno Haible
Subject: [sr #110294] AC_LANG_PUSH/AC_LANG_POP malfunction inside AC_DEFUN
Date: Tue, 18 Aug 2020 12:38:29 -0400 (EDT)
User-agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0

URL:
  <https://savannah.gnu.org/support/?110294>

                 Summary: AC_LANG_PUSH/AC_LANG_POP malfunction inside AC_DEFUN
                 Project: Autoconf
            Submitted by: haible
            Submitted on: Tue 18 Aug 2020 06:38:28 PM CEST
                Category: None
                Priority: 5 - Normal
                Severity: 3 - Normal
                  Status: None
                 Privacy: Public
             Assigned to: None
        Originator Email: 
             Open/Closed: Open
         Discussion Lock: Any
        Operating System: GNU/Linux

    _______________________________________________________

Details:

With Autoconf 2.69, a wrong configure file is generated when the configure.ac
file (attached) contains
  - an AC_DEFUN,
  - an AC_LANG_PUSH([C++]) / AC_LANG_POP([C++]) pair inside the AC_DEFUN,
  - no AC_LANG_CXX invocation (because my package has optional C++ support;
invoking AC_LANG_CXX would make configure abort if no C++ compiler is found,
which is not what I want).

How to reproduce:
1. In an empty directory, save the attached configure.ac file.
2. aclocal
3. autoconf
4. touch install-sh
5. configure

The output contains:

checking for library needed for log()... 
checking whether the C++ compiler has <cuchar>... no
checking for library needed for pow()... -lm


So, autoconfiguration has correctly determined that use of pow() needs linking
with -lm. But it has incorrectly determined that use of log() does not need
linking with -lm. Why? The config.log shows it:

configure:4398: checking for library needed for log()
configure:4416: g++ -o conftest -g -O2   conftest.cpp  >&5
configure:4416: $? = 0
...
configure:4480: checking for library needed for pow()
configure:4498: gcc -o conftest -g -O2   conftest.c  >&5
/tmp/ccYm3cJH.o: In function `main':
/tmp/1/conftest.c:19: undefined reference to `log'
collect2: error: ld returned 1 exit status
configure:4498: $? = 1

You can see that it has executed the log() test with the C++ compiler! And
since libstdc++ is linked with libm (use 'ldd' to confirm this), the "g++ -o
conftest -g -O2   conftest.cpp" command succeeded.

The configure script uses a variable 'ac_compile'. See where it is being set:

$ grep -n '\(ac_compile=\|<math.h>\)' configure
1882:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
2498:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3281:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3287:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3339:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3695:ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3719:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3870:ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3991:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
4012:ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
4263:ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
4406:         #include <math.h>
4430:ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
4464:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
4488:         #include <math.h>

You can clearly see that the last assignment to ac_compile before the first
<math.h> test is in line 4263 and that it prepares for use of the C++
compiler, not of the C compiler.

The bizarre thing is that when adding an invocation of AC_PROG_CXX (at one of
the two places indicated by a comment "This fixes it!") makes the bug
disappear. Then we see

$ grep -n '\(ac_compile=\|<math.h>\)' configure
1882:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
2498:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3281:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3287:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3339:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3695:ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3719:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3870:ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3991:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
4008:ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
4259:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
4406:         #include <math.h>
4430:ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
4464:ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
4488:         #include <math.h>

Here the last assignment to ac_compile before the first <math.h> test
activates the C compiler. This is good. But as I said above, I do not want to
use AC_PROG_CXX.



    _______________________________________________________

File Attachments:


-------------------------------------------------------
Date: Tue 18 Aug 2020 06:38:28 PM CEST  Name: configure.ac  Size: 3KiB   By:
haible

<http://savannah.gnu.org/support/download.php?file_id=49686>

    _______________________________________________________

Reply to this item at:

  <https://savannah.gnu.org/support/?110294>

_______________________________________________
  Message sent via Savannah
  https://savannah.gnu.org/




reply via email to

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