]> git.ipfire.org Git - thirdparty/autoconf.git/commitdiff
Create a file in test program when detecting cross-compilation.
authorSteven G. Johnson <stevenj@alum.mit.edu>
Thu, 11 Jun 2009 13:07:32 +0000 (07:07 -0600)
committerEric Blake <ebb9@byu.net>
Thu, 11 Jun 2009 13:07:32 +0000 (07:07 -0600)
* lib/autoconf/lang.m4 (_AC_LANG_IO_PROGRAM): New macro, returns
program that creates a file.
(_AC_COMPILER_EXEEXT,_AC_COMPILER_EXEEXT_WORKS): Call new macro
and document why it's needed to robustly detect cross-compiling.
(AC_LANG_DEFINE): Copy implementation across similar languages.
* lib/autoconf/c.m4 (_AC_LANG_IO_PROGRAM(C)): Implement new macro.
* lib/autoconf/fortran.m4 (_AC_LANG_IO_PROGRAM(Fortran 77)):
Likewise.
* lib/autoconf/erlang.m4 (_AC_LANG_IO_PROGRAM(Erlang)): Likewise.

Signed-off-by: Eric Blake <ebb9@byu.net>
ChangeLog
lib/autoconf/c.m4
lib/autoconf/erlang.m4
lib/autoconf/fortran.m4
lib/autoconf/lang.m4

index a6974a04efa88091f6608290b68dadffab095494..f474f701ef2d967a29a92abde43265831c87097b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2009-06-11  Steven G. Johnson  <stevenj@alum.mit.edu>
+       and Eric Blake  <ebb9@byu.net>
+
+       Create a file in test program when detecting cross-compilation.
+       * lib/autoconf/lang.m4 (_AC_LANG_IO_PROGRAM): New macro, returns
+       program that creates a file.
+       (_AC_COMPILER_EXEEXT,_AC_COMPILER_EXEEXT_WORKS): Call new macro
+       and document why it's needed to robustly detect cross-compiling.
+       (AC_LANG_DEFINE): Copy implementation across similar languages.
+       * lib/autoconf/c.m4 (_AC_LANG_IO_PROGRAM(C)): Implement new macro.
+       * lib/autoconf/fortran.m4 (_AC_LANG_IO_PROGRAM(Fortran 77)):
+       Likewise.
+       * lib/autoconf/erlang.m4 (_AC_LANG_IO_PROGRAM(Erlang)): Likewise.
+
 2009-06-11  Eric Blake  <ebb9@byu.net>
 
        Simplify AC_LANG(Fortran).
index ffdbd455b0960a210c15119ac9986c1503ccc59c..33d18951bc7440c244e04f79cc6388e56ac7efcb 100644 (file)
@@ -129,6 +129,17 @@ $2
 }])
 
 
+# _AC_LANG_IO_PROGRAM(C)
+# ----------------------
+# Produce source that performs I/O, necessary for proper
+# cross-compiler detection.
+m4_define([_AC_LANG_IO_PROGRAM(C)],
+[AC_LANG_PROGRAM([@%:@include <stdio.h>],
+[FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+])])
+
+
 # AC_LANG_CALL(C)(PROLOGUE, FUNCTION)
 # -----------------------------------
 # Avoid conflicting decl of main.
index 1e4418bddef0f0d5146afaee6a5109222ce930f8..72268be09f385ce87a46b42d1aa9f658b79c0c44 100644 (file)
@@ -152,6 +152,17 @@ $2
 ])
 
 
+# _AC_LANG_IO_PROGRAM(Erlang)
+# ---------------------------
+# Produce source that performs I/O.
+m4_define([_AC_LANG_IO_PROGRAM(Erlang)],
+[AC_LANG_PROGRAM([], [dnl
+   ReturnValue = case file:write_file("conftest.out", "") of
+       {error, _} -> 1;
+       ok -> 0
+   end,
+   halt(ReturnValue)])])
+
 
 ## -------------------------------------------- ##
 ## 3. Looking for Compilers and Preprocessors.  ##
index f7947aa1202814a8fd22ef086961ac5f0fddc800..5a399e4ce4d77802a6470b0d3958498ff730358c 100644 (file)
@@ -210,6 +210,17 @@ $2
       end])
 
 
+# _AC_LANG_IO_PROGRAM(Fortran 77)
+# -------------------------------
+# Produce source that performs I/O.
+m4_define([_AC_LANG_IO_PROGRAM(Fortran 77)],
+[AC_LANG_PROGRAM([],
+[dnl
+      open(unit=9,file='conftest.out')
+      close(unit=9)
+])])
+
+
 # AC_LANG_CALL(Fortran 77)(PROLOGUE, FUNCTION)
 # --------------------------------------------
 # FIXME: This is a guess, help!
index bcd037be8ea4541ffebf6586028f1c1e751a70df..efdcdd0fb4aca36c0ecd75a107a8aecb10f1633b 100644 (file)
@@ -1,6 +1,6 @@
 # This file is part of Autoconf.                       -*- Autoconf -*-
 # Programming languages support.
-# Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008 Free
+# Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free
 # Software Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
@@ -200,7 +200,8 @@ m4_define([AC_LANG_DEFINE],
 [m4_copy([AC_LANG_CALL($4)], [AC_LANG_CALL($1)])]
 [m4_copy([AC_LANG_FUNC_LINK_TRY($4)], [AC_LANG_FUNC_LINK_TRY($1)])]
 [m4_copy([AC_LANG_BOOL_COMPILE_TRY($4)], [AC_LANG_BOOL_COMPILE_TRY($1)])]
-[m4_copy([AC_LANG_INT_SAVE($4)], [AC_LANG_INT_SAVE($1)])])])
+[m4_copy([AC_LANG_INT_SAVE($4)], [AC_LANG_INT_SAVE($1)])]
+[m4_copy([_AC_LANG_IO_PROGRAM($4)], [_AC_LANG_IO_PROGRAM($1)])])])
 
 ## ----------------------- ##
 ## 2. Producing programs.  ##
@@ -248,6 +249,15 @@ AC_DEFUN([AC_LANG_PROGRAM],
 [AC_LANG_SOURCE([_AC_LANG_DISPATCH([$0], _AC_LANG, $@)])])
 
 
+# _AC_LANG_IO_PROGRAM
+# -----------------------------------
+# Produce valid source for the current language that creates
+# a file.  (This is used when detecting whether executables
+# work, e.g. to detect cross-compiling.)
+AC_DEFUN([_AC_LANG_IO_PROGRAM],
+[AC_LANG_SOURCE([_AC_LANG_DISPATCH([$0], _AC_LANG, $@)])])
+
+
 # AC_LANG_CALL(PROLOGUE, FUNCTION)
 # --------------------------------
 # Call the FUNCTION.
@@ -556,11 +566,19 @@ ac_exeext=$ac_cv_exeext
 
 # _AC_COMPILER_EXEEXT_WORKS
 # -------------------------
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+#
+# It is not sufficient to run a no-op program -- this succeeds and gives
+# a false negative when cross-compiling for the compute nodes on the
+# IBM Blue Gene/L.  Instead, _AC_COMPILER_EXEEXT calls _AC_LANG_IO_PROGRAM
+# to create a program that writes to a file, which is sufficient to
+# detect cross-compiling on Blue Gene.  Note also that AC_COMPUTE_INT
+# requires programs that create files when not cross-compiling, so it
+# is safe and not a bad idea to check for this capability in general.
 m4_define([_AC_COMPILER_EXEEXT_WORKS],
 [# Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
 AC_MSG_CHECKING([whether the _AC_LANG compiler works])
-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
 # If not cross compiling, check that we can run a simple program.
 if test "$cross_compiling" != yes; then
   if _AC_DO_TOKENS([./$ac_file]); then
@@ -629,13 +647,15 @@ AC_MSG_RESULT([$ac_cv_exeext])
 #
 # Do not rename this macro; Automake decides whether EXEEXT is used
 # by checking whether `_AC_COMPILER_EXEEXT' has been expanded.
+#
+# See _AC_COMPILER_EXEEXT_WORKS for why we call _AC_LANG_IO_PROGRAM.
 m4_define([_AC_COMPILER_EXEEXT],
-[AC_LANG_CONFTEST([AC_LANG_PROGRAM()])
+[AC_LANG_CONFTEST([_AC_LANG_IO_PROGRAM])
 ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out"
 _AC_COMPILER_EXEEXT_DEFAULT
 _AC_COMPILER_EXEEXT_WORKS
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out
 ac_clean_files=$ac_clean_files_save
 _AC_COMPILER_EXEEXT_CROSS
 _AC_COMPILER_EXEEXT_O