Skip to content

Commit

Permalink
package/go: Build host tools with host CC
Browse files Browse the repository at this point in the history
The go build system doesn't have the notion of cross compiling, but just the
notion of architecture.  When the host and target architectures are different
it expects to be given a target cross compiler in CC_FOR_TARGET.  When the
architectures are the same it will use CC_FOR_TARGET for both host and target
compilation.  To work around this limitation, when the host and target
architectures are the same build a set of host binaries and tools with
CC_FOR_TARGET set to the host compiler.  Also, the go build system is not
compatible with ccache, so use HOSTCC_NOCCACHE.  See
golang/go#11685.

Fixes build errors like these:

  host/usr/bin/go: No such file or directory

  http://autobuild.buildroot.net/results/6664189a6f3a815978e8d0a1d7ef408ca47e2874/

Signed-off-by: Geoff Levand <geoff@infradead.org>
  • Loading branch information
glevand committed May 19, 2016
1 parent 2391f76 commit cdad0e2
Showing 1 changed file with 37 additions and 4 deletions.
41 changes: 37 additions & 4 deletions package/go/go.mk
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@ endif
HOST_GO_DEPENDENCIES = host-go-bootstrap
HOST_GO_ROOT = $(HOST_DIR)/usr/lib/go

# The go build system doesn't have the notion of cross compiling, but just the
# notion of architecture. When the host and target architectures are different
# it expects to be given a target cross compiler in CC_FOR_TARGET. When the
# architectures are the same it will use CC_FOR_TARGET for both host and target
# compilation. To work around this limitation, when the host and target
# architectures are the same build a set of host binaries and tools with
# CC_FOR_TARGET set to the host compiler. Also, the go build system is not
# compatible with ccache, so use HOSTCC_NOCCACHE. See
# https://github.com/golang/go/issues/11685.

HOST_GO_MAKE_ENV = \
GOROOT_BOOTSTRAP=$(HOST_GO_BOOTSTRAP_ROOT) \
GOROOT_FINAL=$(HOST_GO_ROOT) \
Expand All @@ -44,16 +54,39 @@ HOST_GO_MAKE_ENV = \
$(if $(GO_GOARM),GOARM=$(GO_GOARM)) \
GOOS=linux \
CGO_ENABLED=1 \
CC=$(HOSTCC_NOCCACHE)

HOST_GO_TARGET_CC = \
CC_FOR_TARGET=$(TARGET_CC) \
CXX_FOR_TARGET=$(TARGET_CXX)

HOST_GO_HOST_CC = \
CC_FOR_TARGET=$(HOSTCC_NOCCACHE) \
CXX_FOR_TARGET=$(HOSTCC_NOCCACHE)

HOST_GO_TMP = $(@D)/host-go-tmp

ifneq ($(ARCH),$(HOSTARCH))
define HOST_GO_BUILD_CMDS
cd $(@D)/src && $(HOST_GO_MAKE_ENV) ./make.bash
cd $(@D)/src && $(HOST_GO_MAKE_ENV) $(HOST_GO_TARGET_CC) ./make.bash
mkdir -p $(HOST_GO_TMP)
mv $(@D)/pkg/tool $(HOST_GO_TMP)/
mv $(@D)/bin/ $(HOST_GO_TMP)/
endef
else
define HOST_GO_BUILD_CMDS
cd $(@D)/src && $(HOST_GO_MAKE_ENV) $(HOST_GO_HOST_CC) ./make.bash
mkdir -p $(HOST_GO_TMP)
cp -a $(@D)/pkg/tool $(HOST_GO_TMP)/
cp -a $(@D)/bin/ $(HOST_GO_TMP)/
cd $(@D)/src && $(HOST_GO_MAKE_ENV) $(HOST_GO_TARGET_CC) ./make.bash
cp -a $(@D)/pkg/tool $(HOST_GO_TMP)/
endef
endif

define HOST_GO_INSTALL_CMDS
$(INSTALL) -D -m 0755 $(@D)/bin/go $(HOST_GO_ROOT)/bin/go
$(INSTALL) -D -m 0755 $(@D)/bin/gofmt $(HOST_GO_ROOT)/bin/gofmt
$(INSTALL) -D -m 0755 $(HOST_GO_TMP)/bin/go $(HOST_GO_ROOT)/bin/go
$(INSTALL) -D -m 0755 $(HOST_GO_TMP)/bin/gofmt $(HOST_GO_ROOT)/bin/gofmt

ln -sf ../lib/go/bin/go $(HOST_DIR)/usr/bin/
ln -sf ../lib/go/bin/gofmt $(HOST_DIR)/usr/bin/
Expand All @@ -62,7 +95,7 @@ define HOST_GO_INSTALL_CMDS

mkdir -p $(HOST_GO_ROOT)/pkg
cp -a $(@D)/pkg/include $(@D)/pkg/linux_* $(HOST_GO_ROOT)/pkg/
cp -a $(@D)/pkg/tool $(HOST_GO_ROOT)/pkg/
cp -a $(HOST_GO_TMP)/tool $(HOST_GO_ROOT)/pkg/

# There is a known issue which requires the go sources to be installed
# https://golang.org/issue/2775
Expand Down

0 comments on commit cdad0e2

Please sign in to comment.