]> Cypherpunks repositories - gostls13.git/commitdiff
build: multiple fixes to make "go install" work on windows
authorAlex Brainman <alex.brainman@gmail.com>
Wed, 21 Dec 2011 05:57:44 +0000 (16:57 +1100)
committerAlex Brainman <alex.brainman@gmail.com>
Wed, 21 Dec 2011 05:57:44 +0000 (16:57 +1100)
R=rsc
CC=golang-dev
https://golang.org/cl/5502054

src/buildscript_windows_386.sh
src/buildscript_windows_amd64.sh
src/cmd/go/build.go
src/cmd/go/main.go
src/cmd/go/pkg.go
src/pkg/mime/type_unix.go
src/pkg/runtime/cgo/trigger.go

index 954ce370588aa9fad1c203f659229920cc42d63d..d5eba87ddfc0447213f08c85892097ca6583aa99 100755 (executable)
@@ -545,4 +545,4 @@ mkdir -p $WORK/cmd/go/_obj/
 gopack grc $WORK/cmd/go.a $WORK/cmd/go/_obj/_go_.6
 8l -o $WORK/cmd/go/_obj/a.out -L $WORK $WORK/cmd/go.a
 mkdir -p $GOBIN/
-cp $WORK/cmd/go/_obj/a.out $GOBIN/go
+cp $WORK/cmd/go/_obj/a.out $GOBIN/go.exe
index eca576ec601203ea7c27f62849bb33d46a7430f2..836994ebc22b2cd280df5697c49412bdc7c856b3 100755 (executable)
@@ -544,4 +544,4 @@ mkdir -p $WORK/cmd/go/_obj/
 gopack grc $WORK/cmd/go.a $WORK/cmd/go/_obj/_go_.6
 6l -o $WORK/cmd/go/_obj/a.out -L $WORK $WORK/cmd/go.a
 mkdir -p $GOBIN/
-cp $WORK/cmd/go/_obj/a.out $GOBIN/go
+cp $WORK/cmd/go/_obj/a.out $GOBIN/go.exe
index f53efc8c1ff965538fa73922168d44aa363226c1..b10687b48971ce8b8f239495270fee357bbed803 100644 (file)
@@ -15,6 +15,7 @@ import (
        "os/exec"
        "path/filepath"
        "regexp"
+       "runtime"
        "strings"
        "sync"
 )
@@ -518,6 +519,33 @@ func (b *builder) install(a *action) error {
        return b.copyFile(dst, src, perm)
 }
 
+// removeByRenaming removes file name by moving it to a tmp
+// directory and deleting the target if possible.
+func removeByRenaming(name string) error {
+       f, err := ioutil.TempFile("", "")
+       if err != nil {
+               return err
+       }
+       tmpname := f.Name()
+       f.Close()
+       err = os.Remove(tmpname)
+       if err != nil {
+               return err
+       }
+       err = os.Rename(name, tmpname)
+       if err != nil {
+               // assume name file does not exists,
+               // otherwise later code will fail.
+               return nil
+       }
+       err = os.Remove(tmpname)
+       if err != nil {
+               // TODO(brainman): file is locked and can't be deleted.
+               // We need to come up with a better way of doing it. 
+       }
+       return nil
+}
+
 // copyFile is like 'cp src dst'.
 func (b *builder) copyFile(dst, src string, perm uint32) error {
        if b.nflag || b.xflag {
@@ -535,7 +563,19 @@ func (b *builder) copyFile(dst, src string, perm uint32) error {
        os.Remove(dst)
        df, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
        if err != nil {
-               return err
+               if runtime.GOOS != "windows" {
+                       return err
+               }
+               // Windows does not allow to replace binary file
+               // while it is executing. We will cheat.
+               err = removeByRenaming(dst)
+               if err != nil {
+                       return err
+               }
+               df, err = os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
+               if err != nil {
+                       return err
+               }
        }
        _, err = io.Copy(df, sf)
        df.Close()
index 6d70da824fda3116cd66509a2e3d5f93c74b9ad2..2efe4bdac05bd818249ddf4bee09b9986abdafa9 100644 (file)
@@ -285,7 +285,7 @@ func allPackages() []string {
                        if err != nil {
                                return nil
                        }
-                       name := path[len(src):]
+                       name := filepath.ToSlash(path[len(src):])
                        if !have[name] {
                                pkgs = append(pkgs, name)
                                have[name] = true
index 599c4e0779b19918731a9e2325e3ba8ee9bcdad4..f86a9b67223223e9610fb75cd991cf475ce9a476 100644 (file)
@@ -113,6 +113,9 @@ func scanPackage(ctxt *build.Context, t *build.Tree, arg, importPath, dir string
        if info.Package == "main" {
                _, elem := filepath.Split(importPath)
                targ = filepath.Join(t.BinDir(), elem)
+               if ctxt.GOOS == "windows" {
+                       targ += ".exe"
+               }
        } else {
                targ = filepath.Join(t.PkgDir(), filepath.FromSlash(importPath)+".a")
        }
index 45127ba29df4e5b827f9fc2084ccf4e2a77811c5..2950e7b400654374e9c024737c0acadf00f6845d 100644 (file)
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// +build darwin freebsd linux openbsd plan9
+
 package mime
 
 import (
index 61666ff4c2194a594243ca639a1d30d4e45eb45a..a7788118fa1c3dce3b35b96c16c16aac1d791955 100644 (file)
@@ -14,7 +14,7 @@ package cgo
 #cgo linux LDFLAGS: -lpthread
 #cgo netbsd LDFLAGS: -lpthread
 #cgo openbsd LDFLAGS: -lpthread
-#cgo windows LDFLAGS: -lm -lmthreads
+#cgo windows LDFLAGS: -lm -mthreads
 
 */
 import "C"