From b1f973dd2709b73d954aeb5ca11cb8c065e03397 Mon Sep 17 00:00:00 2001 From: Peter Breitenlohner Date: Wed, 22 Jul 2009 16:30:51 +0200 Subject: [PATCH] Support for Objective C++ * automake.in: Register new language. (lang_objcxx_rewrite): New subroutine. (resolve_linker): Add OBJCXXLINK. (%_am_macro_for_cond): Add am__fastdepOBJCXX and AC_PROG_OBJCXX * (%-ac_macro_for_var): Add OBJCXX and OBJCXXFLAGS. * m4/depend.m4 (_AM_DEPENDENCIES): Add OBJCXX. * m4/init.m4 (AM_INIT_AUTOMAKE): Add AC_PROG_OBJCXX hook. * tests/ext.test, tests/nodep2.test: Adjust. * tests/objcxx.test, tests.objcxx2.test: New tests. * tests/Makefile.am: Adjust. * doc/automake.texi (Objective C++ Support): New node. (How the Linker is Chosen, Support for Other Languages): Adjust. * NEWS: Announce and require Autoconf 2.64 or better. Signed-off-by: Peter Breitenlohner --- NEWS | 11 +++++++++ automake.in | 29 ++++++++++++++++++++++- doc/automake.texi | 56 +++++++++++++++++++++++++++++++++++++++++++-- lib/Automake/Variable.pm | 2 + m4/depend.m4 | 1 + m4/init.m4 | 4 +++ tests/Makefile.am | 2 + tests/ext.test | 7 +++-- tests/nodep2.test | 6 +++- tests/objcxx.test | 34 ++++++++++++++++++++++++++++ tests/objcxx2.test | 33 +++++++++++++++++++++++++++ 11 files changed, 175 insertions(+), 10 deletions(-) create mode 100755 tests/objcxx.test create mode 100755 tests/objcxx2.test diff --git a/NEWS b/NEWS index 7e14ed8..9bfdde9 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,14 @@ +* Version requirements: + + - Autoconf 2.64 or greater is required. + +* Languages changes: + + - New support for Objective C++: + - Autoconf's new AC_PROG_OBJCXX looks for a ObjC++ compiler. + - A new section of the manual documents the support. + + New in 1.11a: Bugs fixed in 1.11a: diff --git a/automake.in b/automake.in index bab8c42..8a5dc92 100755 --- a/automake.in +++ b/automake.in @@ -783,6 +783,24 @@ register_language ('name' => 'objc', 'pure' => 1, 'extensions' => ['.m']); +# Objective C++. +register_language ('name' => 'objcxx', + 'Name' => 'Objective C++', + 'config_vars' => ['OBJCXX'], + 'linker' => 'OBJCXXLINK', + 'link' => '$(OBJCXXLD) $(AM_OBJCXXFLAGS) $(OBJCXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', + 'autodep' => 'OBJCXX', + 'flags' => ['OBJCXXFLAGS', 'CPPFLAGS'], + 'compile' => '$(OBJCXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCXXFLAGS) $(OBJCXXFLAGS)', + 'ccer' => 'OBJCXX', + 'compiler' => 'OBJCXXCOMPILE', + 'compile_flag' => '-c', + 'output_flag' => '-o', + 'lder' => 'OBJCXXLD', + 'ld' => '$(OBJCXX)', + 'pure' => 1, + 'extensions' => ['.mm']); + # Unified Parallel C. register_language ('name' => 'upc', 'Name' => 'Unified Parallel C', @@ -5860,6 +5878,12 @@ sub lang_objc_rewrite return &lang_sub_obj; } +# Rewrite a single Objective C++ file. +sub lang_objcxx_rewrite +{ + return &lang_sub_obj; +} + # Rewrite a single Unified Parallel C file. sub lang_upc_rewrite { @@ -6137,7 +6161,7 @@ sub resolve_linker { my (%linkers) = @_; - foreach my $l (qw(GCJLINK CXXLINK F77LINK FCLINK OBJCLINK UPCLINK)) + foreach my $l (qw(GCJLINK OBJCXXLINK CXXLINK F77LINK FCLINK OBJCLINK UPCLINK)) { return $l if defined $linkers{$l}; } @@ -6327,13 +6351,14 @@ sub make_conditional_string ($$) my %_am_macro_for_cond = ( AMDEP => "one of the compiler tests\n" - . " AC_PROG_CC, AC_PROG_CXX, AC_PROG_CXX, AC_PROG_OBJC,\n" + . " AC_PROG_CC, AC_PROG_CXX, AC_PROG_OBJC, AC_PROG_OBJCXX,\n" . " AM_PROG_AS, AM_PROG_GCJ, AM_PROG_UPC", am__fastdepCC => 'AC_PROG_CC', am__fastdepCCAS => 'AM_PROG_AS', am__fastdepCXX => 'AC_PROG_CXX', am__fastdepGCJ => 'AM_PROG_GCJ', am__fastdepOBJC => 'AC_PROG_OBJC', + am__fastdepOBJCXX => 'AC_PROG_OBJCXX', am__fastdepUPC => 'AM_PROG_UPC' ); diff --git a/doc/automake.texi b/doc/automake.texi index b3f4a76..2beec44 100644 --- a/doc/automake.texi +++ b/doc/automake.texi @@ -219,6 +219,7 @@ Building Programs and Libraries * Yacc and Lex:: Yacc and Lex support * C++ Support:: Compiling C++ sources * Objective C Support:: Compiling Objective C sources +* Objective C++ Support:: Compiling Objective C++ sources * Unified Parallel C Support:: Compiling Unified Parallel C sources * Assembly Support:: Compiling assembly sources * Fortran 77 Support:: Compiling Fortran 77 sources @@ -2906,6 +2907,11 @@ Programs, , Particular Program Checks, autoconf, The Autoconf Manual}. This is required if any Objective C source is included. @xref{Particular Programs, , Particular Program Checks, autoconf, The Autoconf Manual}. address@hidden AC_PROG_OBJCXX +This is required if any Objective C++ source is included. address@hidden Programs, , Particular Program Checks, autoconf, +The Autoconf Manual}. + @item AC_PROG_F77 This is required if any Fortran 77 source is included. This macro is distributed with Autoconf version 2.13 and later. @xref{Particular @@ -4535,6 +4541,7 @@ to build programs and libraries. * Yacc and Lex:: Yacc and Lex support * C++ Support:: Compiling C++ sources * Objective C Support:: Compiling Objective C sources +* Objective C++ Support:: Compiling Objective C++ sources * Unified Parallel C Support:: Compiling Unified Parallel C sources * Assembly Support:: Compiling assembly sources * Fortran 77 Support:: Compiling Fortran 77 sources @@ -5628,6 +5635,7 @@ maude_LINK = $(CCLD) -magic -o $@@ @itemx maude_GCJFLAGS @itemx maude_LFLAGS @itemx maude_OBJCFLAGS address@hidden maude_OBJCXXFLAGS @itemx maude_RFLAGS @itemx maude_UPCFLAGS @itemx maude_YFLAGS @@ -5645,6 +5653,7 @@ Automake. These @dfn{per-target compilation flags} are @samp{_GCJFLAGS}, @samp{_LFLAGS}, @samp{_OBJCFLAGS}, address@hidden, @samp{_RFLAGS}, @samp{_UPCFLAGS}, and @samp{_YFLAGS}. @@ -6197,6 +6206,41 @@ The command used to actually link an Objective C program. @end vtable address@hidden Objective C++ Support address@hidden Objective C++ Support + address@hidden Objective C++ support address@hidden Support for Objective C++ + +Automake includes some support for Objective C++. + +Any package including Objective C++ code must define the output variable address@hidden in @file{configure.ac}; the simplest way to do this is to +use the @code{AC_PROG_OBJCXX} macro (@pxref{Particular Programs, , +Particular Program Checks, autoconf, The Autoconf Manual}). + +A few additional variables are defined when an Objective C++ source file +is seen: + address@hidden @code address@hidden OBJCXX +The name of the Objective C++ compiler. + address@hidden OBJCXXFLAGS +Any flags to pass to the Objective C++ compiler. + address@hidden AM_OBJCXXFLAGS +The maintainer's variant of @code{OBJCXXFLAGS}. + address@hidden OBJCXXCOMPILE +The command used to actually compile an Objective C++ source file. The +file name is appended to form the complete command line. + address@hidden OBJCXXLINK +The command used to actually link an Objective C++ program. address@hidden vtable + + @node Unified Parallel C Support @section Unified Parallel C Support @@ -6463,6 +6507,9 @@ parentheses are the variables containing the link command.) @vindex GCJLINK Native Java (@code{GCJLINK}) @item address@hidden OBJCXXLINK +Objective C++ (@code{OBJCXXLINK}) address@hidden @vindex CXXLINK C++ (@code{CXXLINK}) @item @@ -6664,7 +6711,8 @@ source file. @section Support for Other Languages Automake currently only includes full support for C, C++ (@pxref{C++ -Support}), Objective C (@pxref{Objective C Support}), Fortran 77 +Support}), Objective C (@pxref{Objective C Support}), Objective C++ +(@pxref{Objective C++ Support}), Fortran 77 (@pxref{Fortran 77 Support}), Fortran 9x (@pxref{Fortran 9x Support}), and Java (@pxref{Java Support}). There is only rudimentary support for other languages, support for which will be improved based on user demand. @@ -10896,6 +10944,7 @@ flags, not appended. @cindex @code{AM_LFLAGS} and @code{LFLAGS} @cindex @code{AM_LIBTOOLFLAGS} and @code{LIBTOOLFLAGS} @cindex @code{AM_OBJCFLAGS} and @code{OBJCFLAGS} address@hidden @code{AM_OBJCXXFLAGS} and @code{OBJCXXFLAGS} @cindex @code{AM_RFLAGS} and @code{RFLAGS} @cindex @code{AM_UPCFLAGS} and @code{UPCFLAGS} @cindex @code{AM_YFLAGS} and @code{YFLAGS} @@ -10910,6 +10959,7 @@ flags, not appended. @cindex @code{LFLAGS} and @code{AM_LFLAGS} @cindex @code{LIBTOOLFLAGS} and @code{AM_LIBTOOLFLAGS} @cindex @code{OBJCFLAGS} and @code{AM_OBJCFLAGS} address@hidden @code{OBJCXXFLAGS} and @code{AM_OBJCXXFLAGS} @cindex @code{RFLAGS} and @code{AM_RFLAGS} @cindex @code{UPCFLAGS} and @code{AM_UPCFLAGS} @cindex @code{YFLAGS} and @code{AM_YFLAGS} @@ -10919,8 +10969,8 @@ mostly discuss @code{CPPFLAGS} in our examples, but actually the answer holds for all the compile flags used in Automake: @code{CCASFLAGS}, @code{CFLAGS}, @code{CPPFLAGS}, @code{CXXFLAGS}, @code{FCFLAGS}, @code{FFLAGS}, @code{GCJFLAGS}, @code{LDFLAGS}, address@hidden, @code{LIBTOOLFLAGS}, @code{OBJCFLAGS}, @code{RFLAGS}, address@hidden, and @code{YFLAGS}. address@hidden, @code{LIBTOOLFLAGS}, @code{OBJCFLAGS}, address@hidden, @code{RFLAGS}, @code{UPCFLAGS}, and @code{YFLAGS}. @code{CPPFLAGS}, @code{AM_CPPFLAGS}, and @code{mumble_CPPFLAGS} are three variables that can be used to pass flags to the C preprocessor diff --git a/lib/Automake/Variable.pm b/lib/Automake/Variable.pm index 1e24bb2..654fa5d 100644 --- a/lib/Automake/Variable.pm +++ b/lib/Automake/Variable.pm @@ -185,6 +185,8 @@ my %_ac_macro_for_var = FCFLAGS => 'AC_PROG_FC', OBJC => 'AC_PROG_OBJC', OBJCFLAGS => 'AC_PROG_OBJC', + OBJCXX => 'AC_PROG_OBJCXX', + OBJCXXFLAGS => 'AC_PROG_OBJCXX', RANLIB => 'AC_PROG_RANLIB', UPC => 'AM_PROG_UPC', UPCFLAGS => 'AM_PROG_UPC', diff --git a/m4/depend.m4 b/m4/depend.m4 index efe8643..5ec7fc7 100644 --- a/m4/depend.m4 +++ b/m4/depend.m4 @@ -34,6 +34,7 @@ AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], OBJCXX, [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) diff --git a/m4/init.m4 b/m4/init.m4 index 365c9ac..c2b02c5 100644 --- a/m4/init.m4 +++ b/m4/init.m4 @@ -99,6 +99,10 @@ AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES(OBJCXX)], + [define([AC_PROG_OBJCXX], + defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES(OBJCXX)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the diff --git a/tests/Makefile.am b/tests/Makefile.am index 62529a6..06a119e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -474,6 +474,8 @@ notrans.test \ number.test \ objc.test \ objc2.test \ +objcxx.test \ +objcxx2.test \ obsolete.test \ order.test \ outdir.test \ diff --git a/tests/ext.test b/tests/ext.test index 929afd5..8f70883 100755 --- a/tests/ext.test +++ b/tests/ext.test @@ -1,5 +1,5 @@ #! /bin/sh -# Copyright (C) 1999, 2001, 2002, 2006 Free Software Foundation, Inc. +# Copyright (C) 1999, 2001, 2002, 2006, 2009 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -22,18 +22,19 @@ cat >> configure.in << 'END' AC_PROG_F77 AC_PROG_FC AC_PROG_OBJC +AC_PROG_OBJCXX AM_PROG_UPC END cat > Makefile.am << 'END' bin_PROGRAMS = foo -foo_SOURCES = 1.f 2.for 3.f90 4.f95 5.F 6.F90 7.F95 8.r 9.m 10.upc +foo_SOURCES = 1.f 2.for 3.f90 4.f95 5.F 6.F90 7.F95 8.r 9.m 10.mm 11.upc END $ACLOCAL || Exit 1 $AUTOMAKE || Exit 1 -for ext in f for f90 f95 F F90 F95 r m upc +for ext in f for f90 f95 F F90 F95 r m mm upc do grep "^$ext\.o:" Makefile.in && Exit 1 done diff --git a/tests/nodep2.test b/tests/nodep2.test index 53bcaad..e36fb59 100755 --- a/tests/nodep2.test +++ b/tests/nodep2.test @@ -1,5 +1,5 @@ #! /bin/sh -# Copyright (C) 2006 Free Software Foundation, Inc. +# Copyright (C) 2006, 2009 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ set -e cat > Makefile.am << 'END' bin_PROGRAMS = foo -foo_SOURCES = a.c b.cpp c.m d.S e.java f.upc +foo_SOURCES = a.c b.cpp c.m cxx.mm d.S e.java f.upc END cat > configure.in << 'END' @@ -32,6 +32,7 @@ AC_CONFIG_FILES([Makefile]) AC_PROG_CC AC_PROG_CXX AC_PROG_OBJC +AC_PROG_OBJCXX AM_PROG_AS AM_PROG_GCJ AM_PROG_UPC @@ -41,6 +42,7 @@ END : > a.c : > b.cpp : > c.m +: > cxx.mm : > d.S : > e.java : > f.upc diff --git a/tests/objcxx.test b/tests/objcxx.test new file mode 100755 index 0000000..2dafeb5 --- /dev/null +++ b/tests/objcxx.test @@ -0,0 +1,34 @@ +#! /bin/sh +# Copyright (C) 2009 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test that `.mm' extension works. +# From Ralf Corsepius (for C++). + +. ./defs || Exit 1 + +cat >> configure.in << 'END' +AC_PROG_OBJCXX +END + +cat > Makefile.am << 'END' +bin_PROGRAMS = hello +hello_SOURCES = hello.mm +END + +$ACLOCAL || Exit 1 +$AUTOMAKE || Exit 1 + +grep '^\.SUFFIXES:.*\.mm' Makefile.in diff --git a/tests/objcxx2.test b/tests/objcxx2.test new file mode 100755 index 0000000..558db21 --- /dev/null +++ b/tests/objcxx2.test @@ -0,0 +1,33 @@ +#! /bin/sh +# Copyright (C) 2009 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test that Automake suggests using AC_PROG_OBJCXX if Objective C++ +# sources are used. + +. ./defs || Exit 1 + +set -e + +echo AC_PROG_CC >>configure.in + +cat >Makefile.am <<'END' +bin_PROGRAMS = hello +hello_SOURCES = hello.mm +END + +$ACLOCAL +AUTOMAKE_fails +grep AC_PROG_OBJCXX stderr -- 1.6.3.3