This patch adds support for the Go programming language to autoconf. The Go programming language is described at http://golang.org/ .
This is fairly basic support. It only works with gccgo, the Go frontend to gcc. It has no special features. However, it is enough to write AC_PROG_GO and have the GCCGO and GOFLAGS variables set for use in a Makefile. Please let me know what steps I should take to get this into the mainline of autoconf. Thanks. Ian >From 99fd973c63943a039dc5ed36415230b89588fe92 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor <[email protected]> Date: Tue, 12 Oct 2010 12:35:13 -0700 Subject: [PATCH 2/2] Add ChangeLog entry. --- ChangeLog | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) diff --git a/ChangeLog b/ChangeLog index 609846a..7757ec9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,23 @@ +2010-10-12 Ian Lance Taylor <[email protected]> + + * 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 GCCGO and GOFLAGS. + * tests/Makefile.am (TESTSUITE_HAND_AT): Add go.at. + (AUTOCONF_FILES): Add $(autoconfdir)/go.m4. + 2010-10-08 Eric Blake <[email protected]> AS_LITERAL_IF: Treat raw = as literal again. -- 1.7.1
>From 4de9d8afef42a50e96a29257b6cec39781f17821 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor <[email protected]> Date: Tue, 12 Oct 2010 12:26:39 -0700 Subject: [PATCH 1/2] Add support for the Go programming language. --- doc/autoconf.texi | 91 ++++++++++++++++++------ lib/autoconf/Makefile.am | 2 +- lib/autoconf/autoconf.m4 | 1 + lib/autoconf/go.m4 | 177 ++++++++++++++++++++++++++++++++++++++++++++++ lib/freeze.mk | 1 + tests/Makefile.am | 3 +- tests/go.at | 35 +++++++++ tests/local.at | 1 + tests/suite.at | 2 + 9 files changed, 289 insertions(+), 24 deletions(-) create mode 100644 lib/autoconf/go.m4 create mode 100644 tests/go.at diff --git a/doc/autoconf.texi b/doc/autoconf.texi index b957083..06ed494 100644 --- a/doc/autoconf.texi +++ b/doc/autoconf.texi @@ -341,7 +341,7 @@ Substitutions in Makefiles * Preset Output Variables:: Output variables that are always set * Installation Directory Variables:: Other preset output variables -* Changed Directory Variables:: Warnings about @file{datarootdir} +* Changed Directory Variables:: Warnings about @file{datarootdir} * Build Directories:: Supporting multiple concurrent compiles * Automatic Remaking:: Makefile rules for configuring @@ -414,6 +414,7 @@ Compilers and Preprocessors * Objective C++ Compiler:: Likewise * Erlang Compiler and Interpreter:: Likewise * Fortran Compiler:: Likewise +* Go Compiler:: Likewise Writing Tests @@ -453,13 +454,6 @@ Programming in M4 * Programming in M4sugar:: Convenient pure M4 macros * Debugging via autom4te:: Figuring out what M4 was doing -Programming in M4sh - -* Common Shell Constructs:: Portability layer for common shell constructs -* Polymorphic Variables:: Support for indirect variable names -* Initialization Macros:: Macros to establish a sane shell environment -* File Descriptor Macros:: File descriptor macros for input and output - M4 Quotation * Active Characters:: Characters that change the behavior of M4 @@ -489,6 +483,13 @@ Programming in M4sugar * Set manipulation Macros:: Set manipulation in M4 * Forbidden Patterns:: Catching unexpanded macros +Programming in M4sh + +* Common Shell Constructs:: Portability layer for common shell constructs +* Polymorphic Variables:: Support for indirect variable names +* Initialization Macros:: Macros to establish a sane shell environment +* File Descriptor Macros:: File descriptor macros for input and output + Writing Autoconf Macros * Macro Definitions:: Basic format of an Autoconf macro @@ -560,6 +561,14 @@ Portable C and C++ Programming * Floating Point Portability:: Portable floating-point arithmetic * Exiting Portably:: Exiting and the exit status +Integer Overflow + +* Integer Overflow Basics:: Why integer overflow is a problem +* Signed Overflow Examples:: Examples of code assuming wraparound +* Optimization and Wraparound:: Optimizations that break uses of wraparound +* Signed Overflow Advice:: Practical advice for signed overflow issues +* Signed Integer Division:: @code{INT_MIN / -1} and @code{INT_MIN % -1} + Manual Configuration * Specifying Target Triplets:: Specifying target triplets @@ -2408,7 +2417,7 @@ makefiles. @menu * Preset Output Variables:: Output variables that are always set * Installation Directory Variables:: Other preset output variables -* Changed Directory Variables:: Warnings about @file{datarootdir} +* Changed Directory Variables:: Warnings about @file{datarootdir} * Build Directories:: Supporting multiple concurrent compiles * Automatic Remaking:: Makefile rules for configuring @end menu @@ -2595,7 +2604,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 @@ -2613,7 +2622,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 @@ -2631,6 +2640,13 @@ Debugging and optimization options for the Objective C++ compiler. It acts like @code{CXXFLAGS}, but for Objective C++ instead of C++. @end defvar +...@defvar GOFLAGS +...@evindex GOFLAGS +...@ovindex GOFLAGS +Debugging and optimization options for the Go compiler. It acts like +...@code{cflags}, but for Go instead of C. +...@end defvar + @defvar builddir @ovindex builddir Rigorously equal to @samp{.}. Added for symmetry only. @@ -4425,8 +4441,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}, @ @@ -6958,6 +6974,7 @@ compiling. * Objective C++ Compiler:: Likewise * Erlang Compiler and Interpreter:: Likewise * Fortran Compiler:: Likewise +* Go Compiler:: Likewise @end menu @node Specific Compiler Characteristics @@ -8207,6 +8224,32 @@ message). @end defmac +...@node Go Compiler +...@subsection Go Compiler Characteristics +...@cindex Go + +Autoconf provides basic support for the Go programming language when +using the @code{gccgo} compiler (there is currently no support for the +...@code{6g} and @code{8g} compilers). + +...@defmac AC_PROG_GO (@ovar{compiler-search-list}) +Find the Go compiler to use. Check whether the environment variable +...@code{gccgo} is set; if so, then set output variable @code{GCCGO} 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{GCCGO} 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 +...@option{-g -O2}. If your package does not like this default, +...@code{goflags} may be set before @code{AC_PROG_GO}. +...@end defmac + + @node System Services @section System Services @@ -8597,6 +8640,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}. + +...@item Go +Do compilation tests using @code{GCCGO} and use extension @file{.go} for +test programs. Use compilation flags @code{GOFLAGS}. @end table @end defmac @@ -8840,9 +8887,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} @@ -8964,8 +9011,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}, @ @@ -20273,11 +20320,11 @@ signed integer remainder, the C standard requires overflow behavior that is commonly not implemented. @menu -* Integer Overflow Basics:: Why integer overflow is a problem -* Signed Overflow Examples:: Examples of code assuming wraparound +* Integer Overflow Basics:: Why integer overflow is a problem +* Signed Overflow Examples:: Examples of code assuming wraparound * Optimization and Wraparound:: Optimizations that break uses of wraparound -* Signed Overflow Advice:: Practical advice for signed overflow issues -* Signed Integer Division:: @code{INT_MIN / -1} and @code{INT_MIN % -1} +* Signed Overflow Advice:: Practical advice for signed overflow issues +* Signed Integer Division:: @code{INT_MIN / -1} and @code{INT_MIN % -1} @end menu @node Integer Overflow Basics diff --git a/lib/autoconf/Makefile.am b/lib/autoconf/Makefile.am index a40ce16..abbbfe5 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 33f6019..550afeb 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..e98114e --- /dev/null +++ b/lib/autoconf/go.m4 @@ -0,0 +1,177 @@ +# This file is part of Autoconf. -*- Autoconf -*- +# Go language support. +# Copyright (C) 2010 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 <http://www.gnu.org/licenses/>. + +# 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], [GCCGO], [], +[ac_ext=go +ac_compile='$GCCGO -c $GOFLAGS conftest.$ac_ext >&AS_MESSAGE_LOG_FD' +ac_link='$GCCGO -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([GCCGO], [AC_PROG_GO]) +AN_PROGRAM([gccgo], [AC_PROG_GO]) +AC_DEFUN([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GCCGO], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +m4_ifval([$1], + [AC_CHECK_TOOLS(GCCGO, [$1])], +[AC_CHECK_TOOL(GCCGO, gccgo) +if test -z "$GCCGO"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GCCGO, [${ac_tool_prefix}gccgo], [$ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GCCGO"; then + AC_CHECK_PROG(GCCGO, gccgo, gccgo, , , gccgo) +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 fdd07f2..fccb3e1 100644 --- a/lib/freeze.mk +++ b/lib/freeze.mk @@ -89,6 +89,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 669e603..80f0432 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -100,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 @@ -170,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..9ed5430 --- /dev/null +++ b/tests/go.at @@ -0,0 +1,35 @@ +# -*- Autotest -*- + +AT_BANNER([Go low level compiling and utility macros.]) + +# Copyright (C) 2010 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 d1a4890..0d0e0e5 100644 --- a/tests/local.at +++ b/tests/local.at @@ -308,6 +308,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], + [GCCGO|GOFLAGS], [OPENMP_CFLAGS], [LIBS|LIB@&t...@objs|LTLIBOBJS|LDFLAGS], [INSTALL(_(DATA|PROGRAM|SCRIPT))?], diff --git a/tests/suite.at b/tests/suite.at index 17bacb7..a147eb3 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.1
