From ca473068618a0b879a4ffe20910a9f827d223c6d Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Thu, 11 Jun 2009 07:07:32 -0600 Subject: [PATCH] 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. Signed-off-by: Eric Blake --- ChangeLog | 14 ++++++++++++++ lib/autoconf/c.m4 | 11 +++++++++++ lib/autoconf/erlang.m4 | 11 +++++++++++ lib/autoconf/fortran.m4 | 11 +++++++++++ lib/autoconf/lang.m4 | 32 ++++++++++++++++++++++++++------ 5 files changed, 73 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index a6974a04e..f474f701e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2009-06-11 Steven G. Johnson + and Eric Blake + + 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 Simplify AC_LANG(Fortran). diff --git a/lib/autoconf/c.m4 b/lib/autoconf/c.m4 index ffdbd455b..33d18951b 100644 --- a/lib/autoconf/c.m4 +++ b/lib/autoconf/c.m4 @@ -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 ], +[FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; +])]) + + # AC_LANG_CALL(C)(PROLOGUE, FUNCTION) # ----------------------------------- # Avoid conflicting decl of main. diff --git a/lib/autoconf/erlang.m4 b/lib/autoconf/erlang.m4 index 1e4418bdd..72268be09 100644 --- a/lib/autoconf/erlang.m4 +++ b/lib/autoconf/erlang.m4 @@ -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. ## diff --git a/lib/autoconf/fortran.m4 b/lib/autoconf/fortran.m4 index f7947aa12..5a399e4ce 100644 --- a/lib/autoconf/fortran.m4 +++ b/lib/autoconf/fortran.m4 @@ -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! diff --git a/lib/autoconf/lang.m4 b/lib/autoconf/lang.m4 index bcd037be8..efdcdd0fb 100644 --- a/lib/autoconf/lang.m4 +++ b/lib/autoconf/lang.m4 @@ -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 -- 2.47.3