Join GitHub today
GitHub is home to over 20 million developers working together to host and review code, manage projects, and build software together.
build: CGO_ENABLED=0 ./make.bash does not force default in later runs of cmd/go #12808
Comments
I can't tell if this is a bug report or not. We use the issue tracker for actual bugs and proposed changes. Please ask questions on the golang-nuts mailing list or on https://forum.golangbridge.org/. Thanks. I can't see what you are referring to in #9344. In any case, when you check out go1.5.1, you are getting a released version of Go. To get a non-released version of Go, you need to check out something that is not a release. But of course those are not supported. If you build your own version of Go with CGO_ENABLED=0 set in the environment, you should get a version of Go that builds statically by default. |
jefferai
commented
Oct 1, 2015
@ianlancetaylor I couldn't tell if it was a bug either, because I wasn't sure if the workflow that was described was expected to work, or not. After reading what you said, I do think it's at least a documentation issue. #9344 suggests that the reason for dynamic linking in released versions is because they are installed to system locations that normal users don't have access to change. This is confusing, because this should be a toggle flipped by packagers when building binary packages for release, but instead is (apparently) something enforced in the code in Git. IOW, it's not clear that "released version" means "tagged in Git" as opposed to "downloadable release from the web site". |
jefferai
commented
Oct 1, 2015
@ianlancetaylor I built Go from go1.5.1 tag with CGO_ENABLED=0 set (which appears to be the default anyways), and after setting that as GOROOT it still builds dynamic programs by default, unless I also set CGO_ENABLED=0 before building the program. |
I'm still not sure what you're referring to in #9344, but it doesn't much matter. What matters is the documentation. Never set GOROOT. If it is in your environment, take it out. If you build a release, run bin/go from that release. CGO_ENABLED=0 is not the default for a native build. Setting CGO_ENABLED when building the Go sources is documented in src/make.bash. |
jefferai
commented
Oct 1, 2015
#9344 is the exact issue I've been having problems with. There are several mentions of released builds, for instance, #9344 (comment) and #9344 (comment) It's not clear where CGO_ENABLED is toggled to 1 in a native build. Regardless, with CGO_ENABLED=0 exported and running all.bash, the built |
rakyll
changed the title from
Building a program with non-release version of Go is dynamic by default
to
cmd/go: building a program with non-release version of Go is dynamic by default
Oct 1, 2015
The comments you link to from #9344 are both out of date, as it happens. In Go 1.5 the -a option to go build does rebuild everything, including the standard library, whether you are running a release build or not. I just tried running CGO_ENABLED=0 bash make.bash on a clean checkout of Go tip. It built a statically linked program version of ../bin/go. But, you are correct: when, using that version of go, I run go env CGO_ENABLED, it prints 1, and it will link packages like os/user dynamically. I did not expect that. I'm not sure whether it is a bug or not. |
ianlancetaylor
changed the title from
cmd/go: building a program with non-release version of Go is dynamic by default
to
build: setting CGO_ENABLED when building does not affect built go tool
Oct 2, 2015
ianlancetaylor
added this to the Go1.6 milestone
Oct 2, 2015
jefferai
commented
Oct 2, 2015
OK -- I didn't realize the behavior changed again in 1.5. I'll keep an eye on this report. Thanks for looking into it. |
rsc
changed the title from
build: setting CGO_ENABLED when building does not affect built go tool
to
build: CGO_ENABLED=0 ./make.bash does not force default in later runs of cmd/go
Dec 5, 2015
I am not 100% sure the requested behavior is what we want. I'm curious whether it changed or if it has always been the way it is now. I suspect the latter. |
Looked some more. I think it has always been this way, at least back to Go 1.2: CGO_ENABLED controls now, not later. It does not bake in a default value during make.bash. Still not sure whether we want to change it. |
jefferai
commented
Dec 17, 2015
@rsc I appreciate you looking. As you can see from the initial issue I referenced (and others I can point to) usage of CGO_ENABLED vs. other methods of ensuring that a built binary is static (when not cross-compiling) has been a point of confusion, and I think a lot of that has been due to the changes to e.g. Feel free to close this, unless you want to keep it open as a documentation enhancement request. |
For now it's open because we may still want to change it.
|
I think this should probably force the default but it's too late for Go 1.6. |
rsc
modified the milestones:
Go1.7Early,
Go1.6
Jan 6, 2016
bradfitz
modified the milestones:
Go1.8Early,
Go1.7Early
May 5, 2016
Didn't happen for 1.7 either. |
May 25, 2016
This was referenced
quentinmit
added
the
NeedsDecision
label
Sep 26, 2016
quentinmit
assigned
rsc
Sep 26, 2016
OK, let's try this and see what breaks. Will send CL. |
rsc
added
NeedsFix
and removed
NeedsDecision
labels
Oct 17, 2016
gopherbot
commented
Oct 17, 2016
CL https://golang.org/cl/31141 mentions this issue. |
jefferai commentedOct 1, 2015
I've been trying to figure out how to make my programs build statically by default without specifying
-a -installsuffix cgo -ldflags '-extldflags "-static" -s
for every project. I've read through #9344, and supposedly the change to make dynamic builds the default is only for released versions of Go. Accordingly, I tried the following:GOROOT
to point to the checked-out version of Go, andGOROOT_BOOTSTRAP
to the system version of Gocd src; ./all.bash
-- successfulrm -rf $GOPATH/pkg
-a -installsuffix cgo -ldflags '-extldflags "-static" -s
Is this a bug, or did I misinterpret the requirements in #9344?
Thanks!