* Vincent Torri wrote on Sat, Feb 20, 2010 at 10:37:00AM CET: > On Fri, 12 Feb 2010, Vincent Torri wrote: > > >I restart this thread. > > > >So, what I would like to do is checking Mac OS X headers in an m4 > >macro. If the objective C compiler is installed, no problem. If it > >is not, i would like that, in the m4 macro, the test not to be > >done. > > > >I have attached a complete, and I think, minimal example > > > >In configure.ac, I call conditionnaly AC_PROG_OBJC. > > > >Before using AC_CHECK_HEADER in check.m4, I have to call > >AC_LANG_PUSH([Objective C]). It is that macro that is the problem: > > > >1) Without it and on a system without an obj c compiler, no problem. > >2) Without it and on a system with an obj c compiler, there is an error. > > > >3) With it and on a system without an obj c compiler there is an error > >4) With it and on a system with an obj c compiler, no problem > > > >as there is a failure in point 2), I must use AC_LANG_PUSH([Objective C]) > > > >What must I do, in check.m4, to disable the check of those > >headers, so that there is no problem with AC_LANG_PUSH([Objective > >C]) (point 3) ) ? > > still no idea about the problem ? I think your problem description is not right, but there is a bug in Autoconf. It is definitely not the AC_LANG_PUSH macro, or use of it, that is buggy. What is buggy however is that AC_PROG_OBJC does not work right, in the sense that it does not really check whether the compiler has the Objective C language frontend enabled (unless, as a side effect of being the first compiler check expanded, the test for $OBJEXT fails). What is also a problem is that AC_PROG_OBJCPP will unconditionally fail configure if it doesn't find a working preprocessor. The thing to note is that AC_CHECK_HEADER* will AC_REQUIRE AC_PROG_OBJCPP (or AC_PROG_CPP, depending on whether you've set the right language with AC_LANG_PUSH), and the AC_REQUIRE will push the expansion of AC_PROG_OBJCPP out to before the expansion of the EVAS_CHECK_ENGINE_DEP_QUARTZ macro (see info Autoconf 'Prerequisite Macros'), thus outside of your 'if' statement. Which, BTW, is a hack already, as ${ac_cv_objc_compiler_gnu} isn't meant to indicate whether the Objective C compiler works or not; it is meant to say whether that is the GNU Objective C compiler or not. I've hacked your code to add a macro to check if $OBJC works, and set a cache variable for this. I've put the macro at the beginning of configure.ac but you're free to move this into its own macro file, for clarity. I've then added a way to show how to hack the AC_PROG_OBJCPP from within your macro so that it is expanded inside a shell conditional. The AS_IF uses are not relevant but the AC_REQUIRE of the additional EVAS_MAYBE_GET_OBJCPP macro is. Alternatively, you could just put something like this in configure.ac, before calling EVAS_CHECK_ENGINE_DEP_QUARTZ: AS_IF([test "x${rw_cv_prog_objc_works}" = "xyes"], [AC_PROG_OBJCPP]) Hope that helps. Cheers, Ralf --- configure.ac --- # rw_PROG_OBJC_WORKS # Check whether the Objective C compiler works. AC_DEFUN([rw_PROG_OBJC_WORKS], [AC_REQUIRE([AC_PROG_OBJC])dnl AC_CACHE_CHECK([whether the Objective C compiler works], [rw_cv_prog_objc_works], [AC_LANG_PUSH([Objective C]) AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [rw_cv_prog_objc_works=yes], [rw_cv_prog_objc_works=no]) AC_LANG_POP([Objective C])]) ]) AC_INIT([test], [0.0]) AC_PREREQ([2.60]) AC_CONFIG_SRCDIR([configure.ac]) AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE([1.6 dist-bzip2]) define([AC_LIBTOOL_LANG_F77_CONFIG], [:])dnl define([AC_LIBTOOL_LANG_CXX_CONFIG], [:])dnl AC_PROG_LIBTOOL m4_ifdef([AC_PROG_OBJC], [ AC_PROG_OBJC _AM_DEPENDENCIES(OBJC) ], [ AC_CHECK_TOOL([OBJC], [gcc]) AC_SUBST([OBJC]) AC_SUBST([OBJCFLAGS]) ]) rw_PROG_OBJC_WORKS AC_PROG_CC EVAS_CHECK_ENGINE([quartz], [no], [no], [Quartz]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT --- m4/check.m4 --- dnl use: EVAS_CHECK_ENGINE_DEP_QUARTZ(engine, simple, want_static[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) AC_DEFUN([EVAS_CHECK_ENGINE_DEP_QUARTZ], [ AC_REQUIRE([EVAS_MAYBE_GET_OBJCPP]) have_dep="no" evas_engine_[]$1[]_cflags="" evas_engine_[]$1[]_libs="" AS_IF([test "x${rw_cv_prog_objc_works}" = "xyes"], [ AC_LANG_PUSH([Objective C]) AC_CHECK_HEADERS([/System/Library/Frameworks/Cocoa.framework/Headers/Cocoa.h], [ have_dep="yes" evas_engine_[]$1[]_libs="-framework Cocoa" ], [have_dep="no"]) AC_LANG_POP([Objective C]) ]) if test "x${have_dep}" = "xyes" ; then m4_default([$4], [:]) else m4_default([$5], [:]) fi ]) dnl use: EVAS_CHECK_ENGINE(engine, want_engine, simple, description) AC_DEFUN([EVAS_CHECK_ENGINE], [ m4_pushdef([UP], m4_translit([$1], [-a-z], [_A-Z]))dnl m4_pushdef([DOWN], m4_translit([$1], [-A-Z], [_a-z]))dnl want_engine="$2" want_static_engine="no" have_engine="no" have_evas_engine_[]DOWN="no" if test "x${want_engine}" = "xyes" ; then m4_default([EVAS_CHECK_ENGINE_DEP_]m4_defn([UP]))(DOWN, $3, ${want_engine}, [have_engine="yes"], [have_engine="no"]) fi m4_popdef([UP]) m4_popdef([DOWN]) ]) AC_DEFUN([EVAS_MAYBE_GET_OBJCPP], [AS_IF([test "x${rw_cv_prog_objc_works}" = "xyes"], [AC_PROG_OBJCPP]) ]) _______________________________________________ Autoconf mailing list Autoconf@xxxxxxx http://lists.gnu.org/mailman/listinfo/autoconf