[OpenWrt-Devel] [PATCH] [toolchain]: Add experimental GCCGO support

openwrt at daniel.thecshore.com openwrt at daniel.thecshore.com
Wed Dec 9 04:39:18 EST 2015


From: Daniel Dickinson <openwrt at daniel.thecshore.com>

Packages can use TARGET_GOC for the gnugcc compiler.

No generic packaging defaults have been added as I'm not sure what that should
look like or if there are even sensible defaults for the Go projects out there.

Currently only patches for GCC 5 - previous versions of GCC will need similar work.
Also note that GCC 5 is required for Go 1.4; previous versions of GCC only support
Go 1.1 therefore a dependency on GCC version will be required by many packages.

Signed-off-by: Daniel Dickinson <openwrt at daniel.thecshore.com>
---
 rules.mk                                           |   4 +
 toolchain/gcc/Config.in                            |   8 ++
 toolchain/gcc/common.mk                            |  10 +-
 toolchain/gcc/final/Makefile                       |   2 +-
 .../5.2.0/960-add-libm-for-extra-langs.patch       |  39 +++++++
 .../5.2.0/970-fix-go-mprof-use-uninitialized.patch |  13 +++
 .../980-fix-missing-glibc-types-with-musl.patch    | 119 +++++++++++++++++++++
 .../gcc/patches/5.2.0/990-fix-skip-gotools.patch   |  26 +++++
 8 files changed, 216 insertions(+), 5 deletions(-)
 create mode 100644 toolchain/gcc/patches/5.2.0/960-add-libm-for-extra-langs.patch
 create mode 100644 toolchain/gcc/patches/5.2.0/970-fix-go-mprof-use-uninitialized.patch
 create mode 100644 toolchain/gcc/patches/5.2.0/980-fix-missing-glibc-types-with-musl.patch
 create mode 100644 toolchain/gcc/patches/5.2.0/990-fix-skip-gotools.patch

diff --git a/rules.mk b/rules.mk
index 1e7549f..2bda73c 100644
--- a/rules.mk
+++ b/rules.mk
@@ -187,6 +187,8 @@ else
   endif
 endif
 
+TARGET_CFLAGS_GO=$(TARGET_CFLAGS) -g1
+
 export PATH:=$(TARGET_PATH)
 export STAGING_DIR STAGING_DIR_HOST
 export SH_FUNC:=. $(INCLUDE_DIR)/shell.sh;
@@ -214,6 +216,7 @@ endif
 BUILD_KEY=$(TOPDIR)/key-build
 
 TARGET_CC:=$(TARGET_CROSS)gcc
+TARGET_GOC:=$(TARGET_CROSS)gccgo
 TARGET_CXX:=$(TARGET_CROSS)g++
 KPATCH:=$(SCRIPT_DIR)/patch-kernel.sh
 SED:=$(STAGING_DIR_HOST)/bin/sed -i -e
@@ -253,6 +256,7 @@ TARGET_CONFIGURE_OPTS = \
   LD=$(TARGET_CROSS)ld \
   NM="$(TARGET_NM)" \
   CC="$(TARGET_CC)" \
+  GOC="$(TARGET_GOC)" \
   GCC="$(TARGET_CC)" \
   CXX="$(TARGET_CXX)" \
   RANLIB="$(TARGET_RANLIB)" \
diff --git a/toolchain/gcc/Config.in b/toolchain/gcc/Config.in
index a8c39d6..e89b81a 100644
--- a/toolchain/gcc/Config.in
+++ b/toolchain/gcc/Config.in
@@ -72,3 +72,11 @@ config INSTALL_GFORTRAN
 	default n
 	help
 	    Build/install GNU fortran compiler ?
+
+config INSTALL_GOLANG
+	bool
+	prompt "Build/install golang compiler?" if TOOLCHAINOPTS
+	default n
+	help
+	    Build/install GNU golang compiler ?
+
diff --git a/toolchain/gcc/common.mk b/toolchain/gcc/common.mk
index 3e4f3ee..54e8f2d 100644
--- a/toolchain/gcc/common.mk
+++ b/toolchain/gcc/common.mk
@@ -101,7 +101,7 @@ HOST_STAMP_CONFIGURED:=$(GCC_BUILD_DIR)/.configured
 HOST_STAMP_INSTALLED:=$(STAGING_DIR_HOST)/stamp/.gcc_$(GCC_VARIANT)_installed
 
 SEP:=,
-TARGET_LANGUAGES:="c,c++$(if $(CONFIG_INSTALL_LIBGCJ),$(SEP)java)$(if $(CONFIG_INSTALL_GFORTRAN),$(SEP)fortran)"
+TARGET_LANGUAGES:="c,c++$(if $(CONFIG_INSTALL_LIBGCJ),$(SEP)java)$(if $(CONFIG_INSTALL_GFORTRAN),$(SEP)fortran)$(if $(CONFIG_INSTALL_GOLANG),$(SEP)go)"
 
 export libgcc_cv_fixed_point=no
 ifdef CONFIG_USE_UCLIBC
@@ -122,8 +122,9 @@ GCC_CONFIGURE:= \
 	SHELL="$(BASH)" \
 	$(if $(shell gcc --version 2>&1 | grep LLVM), \
 		CFLAGS="-O2 -fbracket-depth=512 -pipe" \
-		CXXFLAGS="-O2 -fbracket-depth=512 -pipe" \
-	) \
+		CXXFLAGS="-O2 -fbracket-depth=512 -pipe"  \
+        ) \
+	$(if $(CONFIG_USE_MUSL),CONFIG_USE_MUSL="-DCONFIG_USE_MUSL") \
 	$(HOST_SOURCE_DIR)/configure \
 		--with-bugurl=$(BUGURL) \
 		--with-pkgversion="$(PKGVERSION)" \
@@ -199,7 +200,8 @@ GCC_MAKE:= \
 	$(MAKE) \
 		CFLAGS="$(HOST_CFLAGS)" \
 		CFLAGS_FOR_TARGET="$(TARGET_CFLAGS)" \
-		CXXFLAGS_FOR_TARGET="$(TARGET_CFLAGS)"
+		CXXFLAGS_FOR_TARGET="$(TARGET_CFLAGS)" \
+		GOCFLAGS_FOR_TARGET="-O2 -g $(if $(CONFIG_USE_MUSL),-DCONFIG_USE_MUSL)"
 
 define Host/Prepare
 	mkdir -p $(GCC_BUILD_DIR)
diff --git a/toolchain/gcc/final/Makefile b/toolchain/gcc/final/Makefile
index 3434d89..224dbdb 100644
--- a/toolchain/gcc/final/Makefile
+++ b/toolchain/gcc/final/Makefile
@@ -44,7 +44,7 @@ define Host/Compile
 endef
 
 define SetupExtraArch
-	for app in $(TOOLCHAIN_DIR)/bin/$(OPTIMIZE_FOR_CPU)*-{gcc,gcc-*,g++}; do \
+	for app in $(TOOLCHAIN_DIR)/bin/$(OPTIMIZE_FOR_CPU)*-{gcc,gcc-*,g++,gccgo}; do \
 		[ -e $$$$app ] || continue; \
 		old_base=$$$$(basename $$$$app); \
 		new_base=$(call qstrip,$(CONFIG_EXTRA_TARGET_ARCH_NAME))-$$$${old_base##$(OPTIMIZE_FOR_CPU)-}; \
diff --git a/toolchain/gcc/patches/5.2.0/960-add-libm-for-extra-langs.patch b/toolchain/gcc/patches/5.2.0/960-add-libm-for-extra-langs.patch
new file mode 100644
index 0000000..a780ba6
--- /dev/null
+++ b/toolchain/gcc/patches/5.2.0/960-add-libm-for-extra-langs.patch
@@ -0,0 +1,39 @@
+Index: gcc-5.2.0/gcc/go/Make-lang.in
+===================================================================
+--- gcc-5.2.0.orig/gcc/go/Make-lang.in
++++ gcc-5.2.0/gcc/go/Make-lang.in
+@@ -74,7 +74,7 @@ go_OBJS = $(GO_OBJS) go/gospec.o
+ 
+ go1$(exeext): $(GO_OBJS) attribs.o $(BACKEND) $(LIBDEPS)
+ 	+$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
+-	      $(GO_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS)
++	      $(GO_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS) -lm
+ 
+ # Documentation.
+ 
+Index: gcc-5.2.0/gcc/java/Make-lang.in
+===================================================================
+--- gcc-5.2.0.orig/gcc/java/Make-lang.in
++++ gcc-5.2.0/gcc/java/Make-lang.in
+@@ -96,7 +96,7 @@ java/jvspec.o-warn = -Wno-error
+ jc1$(exeext): $(JAVA_OBJS) $(BACKEND) $(LIBDEPS) attribs.o
+ 	rm -f $@
+ 	+$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
+-		$(JAVA_OBJS) $(BACKEND) $(ZLIB) $(LIBICONV) $(LIBS) attribs.o $(BACKENDLIBS)
++		$(JAVA_OBJS) $(BACKEND) $(ZLIB) $(LIBICONV) $(LIBS) attribs.o $(BACKENDLIBS) -lm
+ 
+ jcf-dump$(exeext): $(JCFDUMP_OBJS) $(LIBDEPS)
+ 	rm -f $@
+Index: gcc-5.2.0/gcc/fortran/Make-lang.in
+===================================================================
+--- gcc-5.2.0.orig/gcc/fortran/Make-lang.in
++++ gcc-5.2.0/gcc/fortran/Make-lang.in
+@@ -96,7 +96,7 @@ f951$(exeext): $(F95_OBJS) \
+ 		$(BACKEND) $(LIBDEPS) attribs.o
+ 	+$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
+ 		$(F95_OBJS) $(BACKEND) $(ZLIB) $(LIBS) attribs.o \
+-		$(BACKENDLIBS)
++		$(BACKENDLIBS) -lm
+ 
+ gt-fortran-trans.h    : s-gtype; @true
+ #
diff --git a/toolchain/gcc/patches/5.2.0/970-fix-go-mprof-use-uninitialized.patch b/toolchain/gcc/patches/5.2.0/970-fix-go-mprof-use-uninitialized.patch
new file mode 100644
index 0000000..51300a0
--- /dev/null
+++ b/toolchain/gcc/patches/5.2.0/970-fix-go-mprof-use-uninitialized.patch
@@ -0,0 +1,13 @@
+Index: gcc-5.2.0/libgo/runtime/mprof.goc
+===================================================================
+--- gcc-5.2.0.orig/libgo/runtime/mprof.goc
++++ gcc-5.2.0/libgo/runtime/mprof.goc
+@@ -403,7 +403,7 @@ func ThreadCreateProfile(p Slice) (n int
+ 
+ func Stack(b Slice, all bool) (n int) {
+ 	byte *pc, *sp;
+-	bool enablegc;
++	bool enablegc = false;
+ 	
+ 	sp = runtime_getcallersp(&b);
+ 	pc = (byte*)(uintptr)runtime_getcallerpc(&b);
diff --git a/toolchain/gcc/patches/5.2.0/980-fix-missing-glibc-types-with-musl.patch b/toolchain/gcc/patches/5.2.0/980-fix-missing-glibc-types-with-musl.patch
new file mode 100644
index 0000000..3a88be8
--- /dev/null
+++ b/toolchain/gcc/patches/5.2.0/980-fix-missing-glibc-types-with-musl.patch
@@ -0,0 +1,119 @@
+Index: gcc-5.2.0/libgo/mksysinfo.sh
+===================================================================
+--- gcc-5.2.0.orig/libgo/mksysinfo.sh
++++ gcc-5.2.0/libgo/mksysinfo.sh
+@@ -166,6 +166,13 @@ cat > sysinfo.c <<EOF
+ #if defined(HAVE_SCHED_H)
+ #include <sched.h>
+ #endif
++#if defined(CONFIG_USE_MUSL)
++#include <sys/glibc-types.h>
++#undef off64_t
++#undef loff_t
++typedef off_t loff_t;
++typedef off_t off64_t;
++#endif
+ 
+ /* Constants that may only be defined as expressions on some systems,
+    expressions too complex for -fdump-go-spec to handle.  These are
+Index: gcc-5.2.0/configure
+===================================================================
+--- gcc-5.2.0.orig/configure
++++ gcc-5.2.0/configure
+@@ -641,6 +641,7 @@ BUILD_CONFIG
+ LDFLAGS_FOR_TARGET
+ CXXFLAGS_FOR_TARGET
+ CFLAGS_FOR_TARGET
++CONFIG_USE_MUSL
+ DEBUG_PREFIX_CFLAGS_FOR_TARGET
+ SYSROOT_CFLAGS_FOR_TARGET
+ extra_host_libiberty_configure_flags
+Index: gcc-5.2.0/configure.ac
+===================================================================
+--- gcc-5.2.0.orig/configure.ac
++++ gcc-5.2.0/configure.ac
+@@ -2359,6 +2359,7 @@ if test "x$CFLAGS_FOR_TARGET" = x; then
+   fi
+ fi
+ AC_SUBST(CFLAGS_FOR_TARGET)
++AC_SUBST(CONFIG_USE_MUSL)
+ 
+ if test "x$CXXFLAGS_FOR_TARGET" = x; then
+   if test "x${is_cross_compiler}" = xyes; then
+Index: gcc-5.2.0/libgo/Makefile.in
+===================================================================
+--- gcc-5.2.0.orig/libgo/Makefile.in
++++ gcc-5.2.0/libgo/Makefile.in
+@@ -4510,7 +4510,7 @@ s-syscall_arch: Makefile
+ 
+ sysinfo.go: s-sysinfo; @true
+ s-sysinfo: $(srcdir)/mksysinfo.sh config.h
+-	CC="$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(OSCFLAGS) -O" $(SHELL) $(srcdir)/mksysinfo.sh
++	CC="$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(OSCFLAGS) $(CONFIG_USE_MUSL) -O" $(SHELL) $(srcdir)/mksysinfo.sh
+ 	$(SHELL) $(srcdir)/mvifdiff.sh tmp-sysinfo.go sysinfo.go
+ 	$(STAMP) $@
+ 
+Index: gcc-5.2.0/Makefile.in
+===================================================================
+--- gcc-5.2.0.orig/Makefile.in
++++ gcc-5.2.0/Makefile.in
+@@ -353,6 +353,7 @@ NM_FOR_BUILD = @NM_FOR_BUILD@
+ RANLIB_FOR_BUILD = @RANLIB_FOR_BUILD@
+ WINDMC_FOR_BUILD = @WINDMC_FOR_BUILD@
+ WINDRES_FOR_BUILD = @WINDRES_FOR_BUILD@
++CONFIG_USE_MUSL = @CONFIG_USE_MUSL@
+ 
+ # Special variables passed down in EXTRA_GCC_FLAGS.  They are defined
+ # here so that they can be overridden by Makefile fragments.
+@@ -412,6 +413,9 @@ CXXFLAGS = @CXXFLAGS@
+ LIBCXXFLAGS = $(CXXFLAGS) -fno-implicit-templates
+ GOCFLAGS = $(CFLAGS)
+ 
++MODULE_FLAGS-target-libgo = \
++	CONFIG_USE_MUSL="$(CONFIG_USE_MUSL)"
++
+ TFLAGS =
+ 
+ # Defaults for all stages; some are overridden below.
+@@ -40930,8 +40934,8 @@ all-target-libgo: configure-target-libgo
+ 	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+ 	$(NORMAL_TARGET_EXPORTS)  \
+ 	(cd $(TARGET_SUBDIR)/libgo && \
+-	  $(MAKE) $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS)   \
+-		$(TARGET-target-libgo))
++	  $(MAKE) $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS) \
++		$(MODULE_FLAGS-target-libgo) $(TARGET-target-libgo))
+ @endif target-libgo
+ 
+ 
+Index: gcc-5.2.0/Makefile.tpl
+===================================================================
+--- gcc-5.2.0.orig/Makefile.tpl
++++ gcc-5.2.0/Makefile.tpl
+@@ -356,6 +356,7 @@ NM_FOR_BUILD = @NM_FOR_BUILD@
+ RANLIB_FOR_BUILD = @RANLIB_FOR_BUILD@
+ WINDMC_FOR_BUILD = @WINDMC_FOR_BUILD@
+ WINDRES_FOR_BUILD = @WINDRES_FOR_BUILD@
++CONFIG_USE_MUSL = @CONFIG_USE_MUSL@
+ 
+ # Special variables passed down in EXTRA_GCC_FLAGS.  They are defined
+ # here so that they can be overridden by Makefile fragments.
+@@ -415,6 +416,9 @@ CXXFLAGS = @CXXFLAGS@
+ LIBCXXFLAGS = $(CXXFLAGS) -fno-implicit-templates
+ GOCFLAGS = $(CFLAGS)
+ 
++MODULE_FLAGS-target-libgo = \
++	CONFIG_USE_MUSL="$(CONFIG_USE_MUSL)"
++
+ TFLAGS =
+ 
+ # Defaults for all stages; some are overridden below.
+@@ -1104,7 +1108,7 @@ all-[+prefix+][+module+]: configure-[+pr
+ 	[+exports+] [+extra_exports+] \
+ 	(cd [+subdir+]/[+module+] && \
+ 	  $(MAKE) $(BASE_FLAGS_TO_PASS) [+args+] [+stage1_args+] [+extra_make_flags+] \
+-		$(TARGET-[+prefix+][+module+]))
++		$(MODULE_FLAGS-[+prefix+][+module+]) $(TARGET-[+prefix+][+module+]))
+ @endif [+prefix+][+module+]
+ 
+ [+ IF bootstrap +]
diff --git a/toolchain/gcc/patches/5.2.0/990-fix-skip-gotools.patch b/toolchain/gcc/patches/5.2.0/990-fix-skip-gotools.patch
new file mode 100644
index 0000000..151a5b4
--- /dev/null
+++ b/toolchain/gcc/patches/5.2.0/990-fix-skip-gotools.patch
@@ -0,0 +1,26 @@
+Index: gcc-5.2.0/configure
+===================================================================
+--- gcc-5.2.0.orig/configure
++++ gcc-5.2.0/configure
+@@ -2836,7 +2836,7 @@ Use a pristine source tree when building
+ fi
+ 
+ # Skipdirs are removed silently.
+-skipdirs=
++skipdirs=gotools
+ # Noconfigdirs are removed loudly.
+ noconfigdirs=""
+ 
+Index: gcc-5.2.0/configure.ac
+===================================================================
+--- gcc-5.2.0.orig/configure.ac
++++ gcc-5.2.0/configure.ac
+@@ -226,7 +226,7 @@ Use a pristine source tree when building
+ fi
+ 
+ # Skipdirs are removed silently.
+-skipdirs=
++skipdirs=gotools
+ # Noconfigdirs are removed loudly.
+ noconfigdirs=""
+ 
-- 
2.4.3
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list