>From 692e25444aa4b58e31711753de2326cfe1dc3a7c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 12 Oct 2010 12:26:39 -0700 Subject: [PATCH] Add support for the Go programming language. * lib/autoconf/go.m4: New file. * lib/autoconf/autoconf.m4: Include autoconf/go.m4. * lib/autoconf/Makefile.am (dist_autoconflib_DATA): Add go.m4. * lib/freeze.mk (autoconf_m4f_dependencies): Add $(src_libdir)/autoconf/go.m4. * doc/autoconf.texi: Rebuild menus. (Preset Output Variables): Mention Go. Document GOFLAGS. (Libraries): Mention Go. (Go Compiler): New subsection. (Language Choice): Mention Go. (Generating Sources): Likewise. (Running the Preprocessor): Likewise. * tests/go.at: New file. * tests/suite.at: Include go.at and acgo.at. * tests/local.at (_AT_CHECK_ENV): Add GOC and GOFLAGS. * tests/Makefile.am (TESTSUITE_GENERATED_AT): Add $(srcdir)/acgo.at. (TESTSUITE_HAND_AT): Add go.at. (AUTOCONF_FILES): Add $(autoconfdir)/go.m4. * NEWS: Update. --- ChangeLog | 23 ++++++ NEWS | 3 + doc/autoconf.texi | 57 +++++++++++++--- lib/autoconf/Makefile.am | 2 +- lib/autoconf/autoconf.m4 | 1 + lib/autoconf/go.m4 | 177 ++++++++++++++++++++++++++++++++++++++++++++++ lib/freeze.mk | 1 + tests/Makefile.am | 4 +- tests/go.at | 35 +++++++++ tests/local.at | 1 + tests/suite.at | 2 + 11 files changed, 295 insertions(+), 11 deletions(-) create mode 100644 lib/autoconf/go.m4 create mode 100644 tests/go.at diff --git a/ChangeLog b/ChangeLog index 6f0b93d..cf124e2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2011-02-13 Ian Lance Taylor + + * lib/autoconf/go.m4: New file. + * lib/autoconf/autoconf.m4: Include autoconf/go.m4. + * lib/autoconf/Makefile.am (dist_autoconflib_DATA): Add go.m4. + * lib/freeze.mk (autoconf_m4f_dependencies): Add + $(src_libdir)/autoconf/go.m4. + * doc/autoconf.texi: Rebuild menus. + (Preset Output Variables): Mention Go. Document GOFLAGS. + (Libraries): Mention Go. + (Go Compiler): New subsection. + (Language Choice): Mention Go. + (Generating Sources): Likewise. + (Running the Preprocessor): Likewise. + * tests/go.at: New file. + * tests/suite.at: Include go.at and acgo.at. + * tests/local.at (_AT_CHECK_ENV): Add GOC and GOFLAGS. + * tests/Makefile.am (TESTSUITE_GENERATED_AT): Add + $(srcdir)/acgo.at. + (TESTSUITE_HAND_AT): Add go.at. + (AUTOCONF_FILES): Add $(autoconfdir)/go.m4. + * NEWS: Update. + 2011-02-12 Giulio Paci (tiny change) Ralf Wildenhues diff --git a/NEWS b/NEWS index c485f22..3edebd8 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ GNU Autoconf NEWS - User visible changes. * Noteworthy changes in release ?.? (????-??-??) [?] +** Support for the Go programming language has been added. The new macro + AC_LANG_GO sets variables GOC and GOFLAGS. + ** AS_LITERAL_IF again treats '=' as a literal. Regression introduced in 2.66. diff --git a/doc/autoconf.texi b/doc/autoconf.texi index badf11d..508352a 100644 --- a/doc/autoconf.texi +++ b/doc/autoconf.texi @@ -413,6 +413,7 @@ Compilers and Preprocessors * Objective C++ Compiler:: Likewise * Erlang Compiler and Interpreter:: Likewise * Fortran Compiler:: Likewise +* Go Compiler:: Likewise Writing Tests @@ -2605,7 +2606,7 @@ programs to test for Fortran 77 features. Options for the linker. If it is not set in the environment when @command{configure} runs, the default value is empty. @command{configure} uses this variable when linking programs to test for -C, C++, Objective C, Objective C++, and Fortran features. +C, C++, Objective C, Objective C++, Fortran, and Go features. This variable's contents should contain options like @option{-s} and @option{-L} that affect only the behavior of the linker. Please see the @@ -2623,7 +2624,7 @@ Don't use this variable to pass library names but some Autoconf macros may prepend extra libraries to this variable if those libraries are found and provide necessary functions, see @ref{Libraries}. @command{configure} uses this variable when linking -programs to test for C, C++, Objective C, Objective C++, and Fortran +programs to test for C, C++, Objective C, Objective C++, Fortran, and Go features. @end defvar @@ -2641,6 +2642,13 @@ Debugging and optimization options for the Objective C++ compiler. It acts like @code{CXXFLAGS}, but for Objective C++ instead of C++. @end defvar address@hidden GOFLAGS address@hidden GOFLAGS address@hidden GOFLAGS +Debugging and optimization options for the Go compiler. It acts like address@hidden, but for Go instead of C. address@hidden defvar + @defvar builddir @ovindex builddir Rigorously equal to @samp{.}. Added for symmetry only. @@ -4435,8 +4443,8 @@ a variable name mapped to underscores. @section Library Files @cindex Library, checking -The following macros check for the presence of certain C, C++, or Fortran -library archive files. +The following macros check for the presence of certain C, C++, Fortran, +or Go library archive files. @anchor{AC_CHECK_LIB} @defmac AC_CHECK_LIB (@var{library}, @var{function}, @ @@ -6989,6 +6997,7 @@ compiling. * Objective C++ Compiler:: Likewise * Erlang Compiler and Interpreter:: Likewise * Fortran Compiler:: Likewise +* Go Compiler:: Likewise @end menu @node Specific Compiler Characteristics @@ -8238,6 +8247,32 @@ message). @end defmac address@hidden Go Compiler address@hidden Go Compiler Characteristics address@hidden Go + +Autoconf provides basic support for the Go programming language when +using the @code{gccgo} compiler (there is currently no support for the address@hidden and @code{8g} compilers). + address@hidden AC_PROG_GO (@ovar{compiler-search-list}) +Find the Go compiler to use. Check whether the environment variable address@hidden is set; if so, then set output variable @code{GOC} to its +value. + +Otherwise, if the macro is invoked without an argument, then search for +a Go compiler named @code{gccgo}. If it is not found, then as a last +resort set @code{GOC} to @code{gccgo}. + +This macro may be invoked with an optional first argument which, if +specified, must be a blank-separated list of Go compilers to search for. + +If output variable @code{GOFLAGS} was not already set, set it to address@hidden -O2}. If your package does not like this default, address@hidden may be set before @code{AC_PROG_GO}. address@hidden defmac + + @node System Services @section System Services @@ -8628,6 +8663,10 @@ Do compilation tests using @code{OBJCXX} and @code{OBJCXXCPP} and use extension @file{.mm} for test programs. Use compilation flags: @code{CPPFLAGS} with @code{OBJCXXCPP}, and both @code{CPPFLAGS} and @code{OBJCXXFLAGS} with @code{OBJCXX}. + address@hidden Go +Do compilation tests using @code{GOC} and use extension @file{.go} for +test programs. Use compilation flags @code{GOFLAGS}. @end table @end defmac @@ -8871,9 +8910,9 @@ on a system with @command{gcc} installed, results in: const char hw[] = "Hello, World\n"; @end example -When the test language is Fortran or Erlang, the @code{AC_DEFINE} definitions -are not automatically translated into constants in the source code by this -macro. +When the test language is Fortran, Erlang, or Go, the @code{AC_DEFINE} +definitions are not automatically translated into constants in the +source code by this macro. @defmac AC_LANG_PROGRAM (@var{prologue}, @var{body}) @acindex{LANG_PROGRAM} @@ -8995,8 +9034,8 @@ temptation of following the easiest path. Nevertheless, if you need to run the preprocessor, then use @code{AC_PREPROC_IFELSE}. -The macros described in this section cannot be used for tests in Erlang or -Fortran, since those languages require no preprocessor. +The macros described in this section cannot be used for tests in Erlang, +Fortran, or Go, since those languages require no preprocessor. @anchor{AC_PREPROC_IFELSE} @defmac AC_PREPROC_IFELSE (@var{input}, @ovar{action-if-true}, @ diff --git a/lib/autoconf/Makefile.am b/lib/autoconf/Makefile.am index ed2d4e9..6390590 100644 --- a/lib/autoconf/Makefile.am +++ b/lib/autoconf/Makefile.am @@ -22,7 +22,7 @@ dist_autoconflib_DATA = \ general.m4 status.m4 oldnames.m4 specific.m4 \ autoheader.m4 autoupdate.m4 autotest.m4 autoscan.m4 \ lang.m4 c.m4 erlang.m4 fortran.m4 \ - functions.m4 headers.m4 types.m4 libs.m4 programs.m4 + functions.m4 go.m4 headers.m4 types.m4 libs.m4 programs.m4 nodist_autoconflib_DATA = autoconf.m4f CLEANFILES = $(nodist_autoconflib_DATA) diff --git a/lib/autoconf/autoconf.m4 b/lib/autoconf/autoconf.m4 index 32a6248..897639c 100644 --- a/lib/autoconf/autoconf.m4 +++ b/lib/autoconf/autoconf.m4 @@ -42,6 +42,7 @@ m4_include([autoconf/lang.m4]) m4_include([autoconf/c.m4]) m4_include([autoconf/erlang.m4]) m4_include([autoconf/fortran.m4]) +m4_include([autoconf/go.m4]) m4_include([autoconf/functions.m4]) m4_include([autoconf/headers.m4]) m4_include([autoconf/types.m4]) diff --git a/lib/autoconf/go.m4 b/lib/autoconf/go.m4 new file mode 100644 index 0000000..0539d99 --- /dev/null +++ b/lib/autoconf/go.m4 @@ -0,0 +1,177 @@ +# This file is part of Autoconf. -*- Autoconf -*- +# Go language support. +# Copyright (C) 2011 Free Software Foundation, Inc. + +# This file is part of Autoconf. 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 3 of the License, 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. +# +# Under Section 7 of GPL version 3, you are granted additional +# permissions described in the Autoconf Configure Script Exception, +# version 3.0, as published by the Free Software Foundation. +# +# You should have received a copy of the GNU General Public License +# and a copy of the Autoconf Configure Script Exception along with +# this program; see the files COPYINGv3 and COPYING.EXCEPTION +# respectively. If not, see . + +# Go support contributed by Ian Lance Taylor. + +# This currently only supports gccgo, not 6g/8g/5g. + +# ------------------- # +# Language selection. +# ------------------- # + +# AC_LANG(Go) +# ----------- +AC_LANG_DEFINE([Go], [go], [GO], [GOC], [], +[ac_ext=go +ac_compile='$GOC -c $GOFLAGS conftest.$ac_ext >&AS_MESSAGE_LOG_FD' +ac_link='$GOC -o conftest$ac_exeext $GOFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&AS_MESSAGE_LOG_FD' +ac_compiler_gnu=yes +]) + +# AC_LANG_GO +# ---------- +AU_DEFUN([AC_LANG_GO], [AC_LANG(Go)]) + +# ------------------- # +# Producing programs. +# ------------------- # + +# AC_LANG_PROGRAM(Go)([PROLOGUE], [BODY]) +# --------------------------------------- +m4_define([AC_LANG_PROGRAM(Go)], +[package main +$1 +func main() { +$2 +}]) + +# _AC_LANG_IO_PROGRAM(Go) +# ----------------------- +# Produce source that performs I/O. +m4_define([_AC_LANG_IO_PROGRAM(Go)], +[AC_LANG_PROGRAM([import ( "fmt"; "os" )], +[f, err := os.Open("conftest.out", os.O_CREATE|os.O_WRONLY, 0777) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + if err = f.Close(); err != nil { + fmt.Println(err) + os.Exit(1) + } + os.Exit(0) +])]) + +# AC_LANG_CALL(Go)(PROLOGUE, FUNCTION) +# ------------------------------------ +# Avoid conflicting decl of main. +m4_define([AC_LANG_CALL(Go)], +[AC_LANG_PROGRAM([$1 +m4_if([$2], [main], , +[func $2()])],[$2()])]) + +# AC_LANG_FUNC_LINK_TRY(Go)(FUNCTION) +# ----------------------------------- +# Try to link a program which calls FUNCTION. +m4_define([AC_LANG_FUNC_LINK_TRY(Go)], +[AC_LANG_PROGRAM( +[func $1() int +var f = $1 +], [return f()])]) + +# AC_LANG_BOOL_COMPILE_TRY(Go)(PROLOGUE, EXPRESSION) +# -------------------------------------------------- +# Return a program which is valid if EXPRESSION is nonzero. +m4_define([AC_LANG_BOOL_COMPILE_TRY(Go)], +[AC_LANG_PROGRAM([$1], [var test_array @<:@1 - 2 * !($2)@:>@int +test_array @<:@0@:>@ = 0 +])]) + +# AC_LANG_INT_SAVE(Go)(PROLOGUE, EXPRESSION) +# ------------------------------------------ +m4_define([AC_LANG_INT_SAVE(Go)], +[AC_LANG_PROGRAM([$1 +import ( + "fmt" + "os" +) +], +[f, err := os.Open("conftest.val", os.O_CREATE|os.O_WRONLY, 0777) + if err != nil { + os.Exit(1) + } + if $2 < 0 { + int64 i = int64($2) + if i != $2 { + os.Exit(1) + } + if _, err := fmt.Print(f, i); err != nil { + os.Exit(1) + } + } else { + uint64 i = uint64($2) + if i != $2 { + os.Exit(1) + } + if _, err := fmt.Print(f, i); err != nil { + os.Exit(1) + } + } + if err = f.Close(); err != nil { + os.Exit(1) + } + os.Exit(0); +])]) + +# ---------------------- # +# Looking for compilers. # +# ---------------------- # + +# AC_LANG_COMPILER(Go) +# -------------------- +AC_DEFUN([AC_LANG_COMPILER(Go)], +[AC_REQUIRE([AC_PROG_GO])]) + +# AC_PROG_GO +# ---------- +AN_MAKEVAR([GOC], [AC_PROG_GO]) +AN_PROGRAM([gccgo], [AC_PROG_GO]) +AC_DEFUN([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +m4_ifval([$1], + [AC_CHECK_TOOLS(GOC, [$1])], +[AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [$ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, , , false) +fi +]) + +# Provide some information about the compiler. +_AS_ECHO_LOG([checking for _AC_LANG compiler version]) +set X $ac_compile +ac_compiler=$[2] +_AC_DO_LIMIT([$ac_compiler --version >&AS_MESSAGE_LOG_FD]) +m4_expand_once([_AC_COMPILER_EXEEXT])[]dnl +m4_expand_once([_AC_COMPILER_OBJEXT])[]dnl +GOFLAGS="-g -O2" +AC_LANG_POP(Go)dnl +])# AC_PROG_GO diff --git a/lib/freeze.mk b/lib/freeze.mk index 31a946e..bf7de4d 100644 --- a/lib/freeze.mk +++ b/lib/freeze.mk @@ -88,6 +88,7 @@ autoconf_m4f_dependencies = \ $(src_libdir)/autoconf/c.m4 \ $(src_libdir)/autoconf/fortran.m4 \ $(src_libdir)/autoconf/erlang.m4 \ + $(src_libdir)/autoconf/go.m4 \ $(src_libdir)/autoconf/functions.m4 \ $(src_libdir)/autoconf/headers.m4 \ $(src_libdir)/autoconf/types.m4 \ diff --git a/tests/Makefile.am b/tests/Makefile.am index d068a10..265a749 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -84,6 +84,7 @@ TESTSUITE_GENERATED_AT = \ $(srcdir)/aclang.at \ $(srcdir)/acc.at \ $(srcdir)/acfortran.at \ + $(srcdir)/acgo.at \ $(srcdir)/acgeneral.at \ $(srcdir)/acstatus.at \ $(srcdir)/acautoheader.at \ @@ -99,7 +100,7 @@ TESTSUITE_HAND_AT = \ suite.at \ m4sugar.at m4sh.at autotest.at \ base.at tools.at torture.at \ - compile.at c.at erlang.at fortran.at \ + compile.at c.at erlang.at fortran.at go.at \ semantics.at \ autoscan.at \ foreign.at @@ -169,6 +170,7 @@ AUTOCONF_FILES = $(autoconfdir)/general.m4 \ $(autoconfdir)/c.m4 \ $(autoconfdir)/erlang.m4 \ $(autoconfdir)/fortran.m4 \ + $(autoconfdir)/go.m4 \ $(autoconfdir)/headers.m4 \ $(autoconfdir)/libs.m4 \ $(autoconfdir)/types.m4 \ diff --git a/tests/go.at b/tests/go.at new file mode 100644 index 0000000..6bad32d --- /dev/null +++ b/tests/go.at @@ -0,0 +1,35 @@ +# -*- Autotest -*- + +AT_BANNER([Go low level compiling and utility macros.]) + +# Copyright (C) 2011 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 3 of the License, 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + + +# Since the macros which compile are required by most tests, check +# them first. But remember that looking for a compiler is even more +# primitive, so check those first. + + +## ------------- ## +## Go Compiler. ## +## ------------- ## + +AT_CHECK_MACRO([Go], +[[AC_LANG(Go) +AC_LANG_COMPILER +]]) diff --git a/tests/local.at b/tests/local.at index 8e20ec3..bfd124f 100644 --- a/tests/local.at +++ b/tests/local.at @@ -307,6 +307,7 @@ if test -f state-env.before && test -f state-env.after; then [ERLANG_LIB_DIR_.*|ERLANG_LIB_VER_.*|ERLANG_INSTALL_LIB_DIR], [ERLANG_INSTALL_LIB_DIR_.*|ERLANG_ERTS_VER|OBJC|OBJCPP|OBJCFLAGS], [OBJCXX|OBJCXXCPP|OBJCXXFLAGS], + [GOC|GOFLAGS], [OPENMP_CFLAGS], [LIBS|LIB@&address@hidden|LTLIBOBJS|LDFLAGS], [INSTALL(_(DATA|PROGRAM|SCRIPT))?], diff --git a/tests/suite.at b/tests/suite.at index 24685a0..9a23d60 100644 --- a/tests/suite.at +++ b/tests/suite.at @@ -52,6 +52,8 @@ m4_include([acc.at]) m4_include([fortran.at]) m4_include([acfortran.at]) m4_include([erlang.at]) +m4_include([go.at]) +m4_include([acgo.at]) # Checking that AC_CHECK_FOO macros work properly. m4_include([semantics.at]) -- 1.7.4.1.26.g00e6e