[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