0

There are two folds to this problem:

1) Go install not able to generate binary

go version go1.7.3 linux/amd64

go env:
GOARCH="amd64" GOBIN="" GOEXE="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOOS="linux" GOPATH="/opt/gopath" GORACE="" GOROOT="/opt/go" GOTOOLDIR="/opt/go/pkg/tool/linux_amd64" CC="gcc" GOGCCFLAGS="-fPIC
-m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build831334660=/tmp/go-build -gno-record-gcc-switches" CXX="g++" CGO_ENABLED="1"

Source of the program: https://github.com/hyperledger/fabric

Working dir: /opt/gopath/src/github.com/hyperledger/fabric

Main program to build: /opt/gopath/src/github.com/hyperledger/fabric/peer/main.go

Build command:

CGO_ENABLED=0 GOBIN=/opt/gopath/bin go install -x -ldflags " -X github.com/hyperledger/fabric/common/metadata.Version=1.0.0-snapshot-d6fbfcf -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.3.0 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger -linkmode external -extldflags -static -lpthread" github.com/hyperledger/fabric/peer

I expect the binary built in /opt/gopath/bin but there was nothing there.

It shows on the console that series of .a files were built and moved to /opt/gopath/pkg/linux_amd64/ Eventually program stopped and no binary was built. This is true regardless CGO_ENABLED was set to 0 or 1.

Somehow the program thoughts it was done, without linking the object files and building the binary? Any other debugging measures that I can use to look further into it?

2) The 'Go install' command was taken from Makefile

@$(DRUN) \
-v $(abspath build/docker/bin):/opt/gopath/bin \
-v $(abspath build/docker/$(TARGET)/pkg):/opt/gopath/pkg \
hyperledger/fabric-baseimage:$(BASE_DOCKER_TAG) \
go install -compiler gccgo -ldflags "$(DOCKER_GO_LDFLAGS)" $(pkgmap.$(@F))

where 
DRUN = docker run -i --rm $(DOCKER_RUN_FLAGS) \
-v $(abspath .):/opt/gopath/src/$(PKGNAME) \
-w /opt/gopath/src/$(PKGNAME)

The 'Go install' command was run inside a docker container, which was started the same way the Makefile specified. The only difference was that I was doing it manually, in two shots, i.e. start docker container + go install. If I were to build it with Makefile in one shot, it would work just fine.

Is there any catch/caveat on using this 'docker run <image> go install <args>' style command?

chingy
  • 31
  • 1
  • 3
  • have you tried to configure GOBIN="" to point to the desired location ? /opt/gopath/bin see also https://golang.org/cmd/go/#hdr-GOPATH_environment_variable: `If the GOBIN environment variable is set, commands are installed to the directory it names instead of DIR/bin. GOBIN must be an absolute path` not sure what means "commands are installed to the directory it names" –  May 07 '17 at 11:11
  • @mh-cbon yes I have tried setting the GOBIN, and I made sure that GOBIN was an absolute path. It does look like the .a files were generated fine, but at the end I am missing a linker invocation. – chingy May 08 '17 at 16:29
  • if that is a builder environment problem, you might want to try the ML@go-nuts –  May 09 '17 at 09:31

0 Answers0