]> Cypherpunks repositories - gostls13.git/commitdiff
build: fixes for Windows
authorRuss Cox <rsc@golang.org>
Wed, 21 Dec 2011 20:57:47 +0000 (15:57 -0500)
committerRuss Cox <rsc@golang.org>
Wed, 21 Dec 2011 20:57:47 +0000 (15:57 -0500)
* 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
https://golang.org/cl/5504062

src/cmd/go/build.go
src/make.bash
src/pkg/go/build/dir.go

index eae54c33f958c3b3f20c600fd1ceff3b5677dd91..b79a522dc901d592b1bb48f6c9083d2e6e600e9f 100644 (file)
@@ -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
 }
index 000020ecd96f2e7bd01c6be8c5d7f0cb3fb69afd..70beb47c0b5c85d197a7336089e20712daf2cb19 100755 (executable)
@@ -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
index b710bc18da7854d8271840a6ea395ff4c9b8bbf7..265261f22eaaac2c71c7f43290a343a7b765f423 100644 (file)
@@ -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 {