summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2011-12-21 15:57:47 -0500
committerRuss Cox <rsc@golang.org>2011-12-21 15:57:47 -0500
commit011e2890620f0cd9295105c28cdadcec4080f510 (patch)
tree7000f705e9350319bc21c9b66de9288deaec8b70
parented390954d07e3f3597c90cd4648c8f9aa1e8ab15 (diff)
downloadgo-011e2890620f0cd9295105c28cdadcec4080f510.tar.gz
build: fixes for Windows
* work around a linker/cgo bug * do not run deps.bash on Windows unless we need it (cuts a full minute off the build time) * add windows to the list of cgo-enabled targets The gopack problem is issue 2601. R=golang-dev, r, bradfitz CC=golang-dev http://codereview.appspot.com/5504062
-rw-r--r--src/cmd/go/build.go18
-rwxr-xr-xsrc/make.bash1
-rw-r--r--src/pkg/go/build/dir.go2
3 files changed, 18 insertions, 3 deletions
diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go
index eae54c33f..b79a522dc 100644
--- a/src/cmd/go/build.go
+++ b/src/cmd/go/build.go
@@ -452,7 +452,7 @@ func (b *builder) build(a *action) error {
return err
}
- var gofiles, cfiles, sfiles, objects []string
+ var gofiles, cfiles, sfiles, objects, cgoObjects []string
gofiles = append(gofiles, a.p.GoFiles...)
cfiles = append(cfiles, a.p.CFiles...)
sfiles = append(sfiles, a.p.SFiles...)
@@ -487,7 +487,7 @@ func (b *builder) build(a *action) error {
if err != nil {
return err
}
- objects = append(objects, outObj...)
+ cgoObjects = append(cgoObjects, outObj...)
gofiles = append(gofiles, outGo...)
}
@@ -576,6 +576,12 @@ func (b *builder) build(a *action) error {
objects = append(objects, out)
}
+ // NOTE(rsc): On Windows, it is critically important that the
+ // gcc-compiled objects (cgoObjects) be listed after the ordinary
+ // objects in the archive. I do not know why this is.
+ // http://golang.org/issue/2601
+ objects = append(objects, cgoObjects...)
+
// pack into archive in obj directory
if err := b.gopack(a.p, obj, a.objpkg, objects); err != nil {
return err
@@ -917,6 +923,8 @@ func (b *builder) cgo(p *Package, cgoExe, obj string, gccfiles []string) (outGo,
return nil, nil, errors.New("cannot use cgo when compiling for a different operating system")
}
+ outObj = append(outObj, "") // for importObj, at end of function
+
// cgo
// TODO: CGOPKGPATH, CGO_FLAGS?
gofiles := []string{obj + "_cgo_gotypes.go"}
@@ -983,7 +991,11 @@ func (b *builder) cgo(p *Package, cgoExe, obj string, gccfiles []string) (outGo,
if err := b.cc(p, obj, importObj, importC); err != nil {
return nil, nil, err
}
- outObj = append(outObj, importObj)
+
+ // NOTE(rsc): The importObj is a 5c/6c/8c object and on Windows
+ // must be processed before the gcc-generated objects.
+ // Put it first. We left room above. http://golang.org/issue/2601
+ outObj[0] = importObj
return outGo, outObj, nil
}
diff --git a/src/make.bash b/src/make.bash
index 000020ecd..70beb47c0 100755
--- a/src/make.bash
+++ b/src/make.bash
@@ -71,6 +71,7 @@ do
fi
done
+$USE_GO_TOOL ||
(
cd "$GOROOT"/src/pkg;
bash deps.bash # do this here so clean.bash will work in the pkg directory
diff --git a/src/pkg/go/build/dir.go b/src/pkg/go/build/dir.go
index b710bc18d..265261f22 100644
--- a/src/pkg/go/build/dir.go
+++ b/src/pkg/go/build/dir.go
@@ -84,6 +84,8 @@ var cgoEnabled = map[string]bool{
"linux/amd64": true,
"freebsd/386": true,
"freebsd/amd64": true,
+ "windows/386": true,
+ "windows/amd64": true,
}
func defaultContext() Context {