[OpenWrt-Devel] [PATCH] [toolchain]: Add experimental GCCGO support
openwrt at daniel.thecshore.com
openwrt at daniel.thecshore.com
Wed Dec 16 10:50:13 EST 2015
From: Daniel Dickinson <openwrt at daniel.thecshore.com>
I've tweaked a few things mentioned by Hauke and verified it's still
working. The CONFIG_USE_MUSL parts are to work around gccgo build
complaining about missing symbols due to the build needing 'real'
types (e.g. typedefs) not #define, but musl use #define for some
of the required types so for the gccgo build we have to undefine the
macros and create typedefs instead.
Packages can use TARGET_GOC for the gccgo 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.
Signed-off-by: Daniel Dickinson <openwrt at daniel.thecshore.com>
---
rules.mk | 4 +
toolchain/gcc/Config.in | 9 ++
toolchain/gcc/common.mk | 6 +-
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, 215 insertions(+), 3 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..a264c05 100644
--- a/toolchain/gcc/Config.in
+++ b/toolchain/gcc/Config.in
@@ -72,3 +72,12 @@ config INSTALL_GFORTRAN
default n
help
Build/install GNU fortran compiler ?
+
+config INSTALL_GOLANG
+ bool
+ prompt "Build/install golang compiler?" if TOOLCHAINOPTS
+ default n
+ depends on GCC_VERSION_5
+ help
+ Build/install GNU golang compiler ?
+
diff --git a/toolchain/gcc/common.mk b/toolchain/gcc/common.mk
index 3e4f3ee..49fca3b 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
@@ -124,6 +124,7 @@ GCC_CONFIGURE:= \
CFLAGS="-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="$(TARGET_CFLAGS) -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