Patchwork PATCH RFA: Build machinery: Autoconf support for Go

login
register
mail settings
Submitter Ian Taylor
Date Nov. 3, 2010, 8:21 p.m.
Message ID <mcr62wekvkf.fsf@google.com>
Download mbox | patch
Permalink /patch/70067/
State New
Headers show

Comments

Ian Taylor - Nov. 3, 2010, 8:21 p.m.
This patch adds a new file config/go.m4, which provides autoconf support
for Go.  This file is not used by anything at present, but it will be
used by the libgo library configure script when that is committed.  A
version of this file has been proposed to the autoconf maintainers.
When gcc moves to a version of autoconf which includes Go support, this
file can be deleted.  However, until that time, it is useful for libgo.
Putting it in a separate file means that the libgo configure script
itself most likely will not have to be changed when we move to a new
version of autoconf.

Bootstrapped on x86_64-unknown-linux-gnu.  OK for mainline?

Ian


2010-11-03  Ian Lance Taylor  <iant@google.com>

	* go.m4: New file.
Ralf Wildenhues - Nov. 11, 2010, 6:34 a.m.
Hello Ian,

* Ian Lance Taylor wrote on Wed, Nov 03, 2010 at 09:21:04PM CET:
> This patch adds a new file config/go.m4, which provides autoconf support
> for Go.  This file is not used by anything at present, but it will be
> used by the libgo library configure script when that is committed.  A
> version of this file has been proposed to the autoconf maintainers.
> When gcc moves to a version of autoconf which includes Go support, this
> file can be deleted.  However, until that time, it is useful for libgo.
> Putting it in a separate file means that the libgo configure script
> itself most likely will not have to be changed when we move to a new
> version of autoconf.
> 
> Bootstrapped on x86_64-unknown-linux-gnu.  OK for mainline?

I cannot approve this (yet), but it looks OK except for a couple of
nits: I'd wrap the contents in m4_version_prereq([2.69],, [...])
so that they turn into a no-op once the code has been integrated into
Autoconf (assuming for the moment that this will hapenn before 2.69),
similarly to how we treat additions to config/override.m4.  You could
also have added the code to that file, that would've avoided any further
dependencies of generated aclocal.m4 and configure files (and in
directories using AC_PROG_GO but not using automake the dependency on
config/go.m4 will need to be tracked manually in Makefile.in).  OTOH
the size of this warrants a new file for clarity.

I'm assuming that the macro definitions here are in sync with those
posted on autoconf-patches.

Thanks,
Ralf

> 2010-11-03  Ian Lance Taylor  <iant@google.com>
> 
> 	* go.m4: New file.
> 
>

Patch

Index: config/go.m4
===================================================================
--- config/go.m4	(revision 0)
+++ config/go.m4	(revision 0)
@@ -0,0 +1,105 @@ 
+# Autoconf support for Go.                       -*- Autoconf -*-
+# 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.
+#
+# 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.
+#
+# Go support--there is a pending autoconf patch for this.
+# This version is probably autoconf 2.64 specific.
+# This should be removed when we start using a version of autoconf
+# which includes this support.
+
+AC_LANG_DEFINE([Go], [go], [GO], [],
+[ac_ext=go
+ac_compile='$GOC -c $GOCFLAGS conftest.$ac_ext >&AS_MESSAGE_LOG_FD'
+ac_link='$GOC -o conftest$ac_exeext $GOCFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&AS_MESSAGE_LOG_FD'
+ac_compile_gnu=yes
+])
+
+AU_DEFUN([AC_LANG_GO], [AC_LANG(Go)])
+
+m4_define([AC_LANG_PROGRAM(Go)],
+[package main
+$1
+func main() {
+$2
+}])
+
+m4_define([AC_LANG_IO_PROGRAM(Go)],
+[AC_LANG_PROGRAM([import "os"],
+[if f, err := os.Open("conftest.out", os.O_WRONLY), err != nil {
+	os.Exit(1);
+ }
+ if err := f.Close(); err != nil {
+	os.Exit(1);
+ }
+ os.Exit(0);
+])])
+
+m4_define([AC_LANG_CALL(Go)],
+[AC_LANG_PROGRAM([$1
+m4_if([$2], [main], ,
+[func $2();])],[$2();])])
+
+m4_define([AC_LANG_FUNC_LINK_TRY(Go)],
+[AC_LANG_PROGRAM(
+[func $1() int;
+var f := $1;
+], [return f();])])
+
+m4_define([AC_LANG_BOOL_COMPILE_TRY(Go)],
+[AC_LANG_PROGRAM([$1], [var test_array @<:@1 - 2 * !($2)@:>@;
+test_array @<:@0@:>@ = 0
+])])
+
+m4_define([AC_LANG_INT_SAVE(Go)],
+[AC_LANG_PROGRAM([$1
+import os
+func longval() long { return $2 }
+func ulongval() ulong { return $2 }],
+[panic("unimplemented")])])
+
+AC_DEFUN([AC_LANG_COMPILER(Go)],
+[AC_REQUIRE([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([GOCFLAGS], [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, , , 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
+GOCFLAGS="-g -O2"
+AC_LANG_POP(Go)dnl
+])# AC_PROG_GO