[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
PATCH RFA: Add support for Go programming language
From: |
Ian Lance Taylor |
Subject: |
PATCH RFA: Add support for Go programming language |
Date: |
Tue, 12 Oct 2010 12:37:40 -0700 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) |
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 <address@hidden>
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 <address@hidden>
+
+ * 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 <address@hidden>
AS_LITERAL_IF: Treat raw = as literal again.
--
1.7.1
>From 4de9d8afef42a50e96a29257b6cec39781f17821 Mon Sep 17 00:00:00 2001
From: Ian Lance Taylor <address@hidden>
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
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.
@@ -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
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{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
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
@@ -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}.
+
address@hidden 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@&address@hidden|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
- PATCH RFA: Add support for Go programming language,
Ian Lance Taylor <=