]> Cypherpunks repositories - gostls13.git/commitdiff
misc/dist: add windows packaging support
authorAndrew Gerrand <adg@golang.org>
Mon, 5 Mar 2012 21:55:53 +0000 (08:55 +1100)
committerAndrew Gerrand <adg@golang.org>
Mon, 5 Mar 2012 21:55:53 +0000 (08:55 +1100)
R=golang-dev, bsiegert, jdpoirier
CC=golang-dev
https://golang.org/cl/5727059

misc/dist/bindist.go
misc/dist/windows/README.txt
misc/dist/windows/dist.bat [deleted file]

index f307d9b7682fc732a5e167dcf6397654bcf173d1..1dda47a5247d4896e8550f2e5664e78e1bdb05b4 100644 (file)
@@ -7,6 +7,7 @@
 package main
 
 import (
+       "bufio"
        "bytes"
        "encoding/base64"
        "errors"
@@ -52,7 +53,9 @@ func main() {
        if flag.NArg() == 0 {
                flag.Usage()
        }
-       readCredentials()
+       if err := readCredentials(); err != nil {
+               log.Println("readCredentials:", err)
+       }
        for _, targ := range flag.Args() {
                p := strings.SplitN(targ, "-", 2)
                if len(p) != 2 {
@@ -91,7 +94,11 @@ func (b *Build) Do() error {
        }
 
        // Build.
-       _, err = b.run(filepath.Join(work, "go/src"), "bash", "make.bash")
+       if b.OS == "windows" {
+               _, err = b.run(filepath.Join(b.root, "src"), "cmd", "/C", "make.bat")
+       } else {
+               _, err = b.run(filepath.Join(b.root, "src"), "bash", "make.bash")
+       }
        if err != nil {
                return err
        }
@@ -103,6 +110,7 @@ func (b *Build) Do() error {
        }
        v := bytes.SplitN(version, []byte(" "), 4)
        version = bytes.Join(v[2:], []byte(" "))
+       ver := string(v[2])
 
        // Write VERSION file.
        err = ioutil.WriteFile(filepath.Join(b.root, "VERSION"), version, 0644)
@@ -119,7 +127,7 @@ func (b *Build) Do() error {
        }
 
        // Create packages.
-       targ := fmt.Sprintf("go.%s.%s-%s", v[2], b.OS, b.Arch)
+       targ := fmt.Sprintf("go.%s.%s-%s", ver, b.OS, b.Arch)
        switch b.OS {
        case "linux", "freebsd":
                // build tarball
@@ -159,6 +167,47 @@ func (b *Build) Do() error {
                        "--title", "Go",
                        "--version", "1.0",
                        "--target", "10.5")
+       case "windows":
+               win := filepath.Join(b.root, "misc/dist/windows")
+               installer := filepath.Join(win, "installer.wxs")
+               appfiles := filepath.Join(work, "AppFiles.wxs")
+               msi := filepath.Join(work, "installer.msi")
+               // Gather files.
+               _, err = b.run(work, "heat", "dir", "go",
+                       "-nologo",
+                       "-gg", "-g1", "-srd", "-sfrag",
+                       "-cg", "AppFiles",
+                       "-template", "fragment",
+                       "-dr", "INSTALLDIR",
+                       "-var", "var.SourceDir",
+                       "-out", appfiles)
+               if err != nil {
+                       return err
+               }
+               // Build package.
+               _, err = b.run(work, "candle",
+                       "-nologo",
+                       "-dVersion="+ver,
+                       "-dArch="+b.Arch,
+                       "-dSourceDir=go",
+                       installer, appfiles)
+               if err != nil {
+                       return err
+               }
+               appfiles = filepath.Join(work, "AppFiles.wixobj")
+               installer = filepath.Join(work, "installer.wixobj")
+               _, err = b.run(win, "light",
+                       "-nologo",
+                       "-ext", "WixUIExtension",
+                       "-ext", "WixUtilExtension",
+                       installer, appfiles,
+                       "-o", msi)
+               if err != nil {
+                       return err
+               }
+               // Copy installer to target file.
+               targ += ".msi"
+               err = cp(targ, msi)
        }
        if err == nil && password != "" {
                err = b.upload(string(v[2]), targ)
@@ -199,13 +248,17 @@ func (b *Build) env() []string {
                        }
                }
        }
+       final := "/usr/local/go"
+       if b.OS == "windows" {
+               final = `c:\go`
+       }
        env = append(env,
                "GOARCH="+b.Arch,
                "GOHOSTARCH="+b.Arch,
                "GOHOSTOS="+b.OS,
                "GOOS="+b.OS,
                "GOROOT="+b.root,
-               "GOROOT_FINAL=/usr/local/go",
+               "GOROOT_FINAL="+final,
        )
        return env
 }
@@ -230,6 +283,9 @@ func (b *Build) upload(version string, filename string) error {
        case "darwin":
                os_ = "Mac OS X"
                labels = append(labels, "Type-Installer", "OpSys-OSX")
+       case "windows":
+               os_ = "Windows"
+               labels = append(labels, "Type-Installer", "OpSys-Windows")
        }
        summary := fmt.Sprintf("Go %s %s (%s)", version, os_, arch)
 
@@ -290,15 +346,41 @@ func exists(path string) bool {
        return err == nil
 }
 
-func readCredentials() {
+func readCredentials() error {
        name := filepath.Join(os.Getenv("HOME"), ".gobuildkey")
-       c, err := ioutil.ReadFile(name)
+       f, err := os.Open(name)
        if err != nil {
-               log.Println("readCredentials:", err)
-               return
+               return err
        }
-       v := bytes.Split(c, []byte("\n"))
-       if len(v) >= 3 {
-               username, password = string(v[1]), string(v[2])
+       defer f.Close()
+       r := bufio.NewReader(f)
+       for i := 0; i < 3; i++ {
+               b, _, err := r.ReadLine()
+               if err != nil {
+                       return err
+               }
+               b = bytes.TrimSpace(b)
+               switch i {
+               case 1:
+                       username = string(b)
+               case 2:
+                       password = string(b)
+               }
        }
+       return nil
+}
+
+func cp(dst, src string) error {
+       sf, err := os.Open(src)
+       if err != nil {
+               return err
+       }
+       defer sf.Close()
+       df, err := os.Create(dst)
+       if err != nil {
+               return err
+       }
+       defer df.Close()
+       _, err = io.Copy(df, sf)
+       return err
 }
index b2f00d427f5b788dab48f3da7620f9e9ab07d763..0cf828b24d220eebe6622e0e51c91f3090aab994 100644 (file)
@@ -1,34 +1,25 @@
-dist.bat packages the Go toolchain for Windows in both zip\r
-and installer (msi) format.\r
-\r
-Dependencies\r
-============\r
-- Windows Installer XML (WiX) toolset: http://wix.sourceforge.net/\r
-- 7Zip (command line version): http://www.7-zip.org/download.html\r
-- Mercurial (hg): http://mercurial.selenic.com/\r
-\r
-\r
-Packaging\r
-=========\r
-The dependencies must be callable from dist.bat, therefore,\r
-they'll need to be in/added to the system's search PATH. \r
-\r
-The packaging needs to be done from within a tracked Go folder. \r
-Packages are built by cloning the same version of the source tree\r
-that the Go tools were built from.\r
-\r
-Run dist.bat from a command prompt or click on the batch file.\r
-\r
-TODO\r
-----
-- Write a Go program for dist.bat functionality\r
-- Documentation server shortcut checkbox option\r
-\r
-Misc\r
-----\r
-WiX box sizes:\r
- - banner size: 493x58\r
- - left side of dialog: 164x312\r
- - full dialog size: 493x312\r
-\r
-\r
+
+Windows build dependencies
+
+- Mercurial (hg): http://mercurial.selenic.com/
+- MinGW: http://www.mingw.org/
+- Windows Installer XML (WiX) toolset: http://wix.sourceforge.net/
+
+Packaging
+
+The dependencies must be in/added to the system's search PATH. 
+
+Run bindist as normal, eg:
+       bindist windows-386
+
+TODO
+
+- Documentation server shortcut checkbox option
+
+Misc
+
+WiX box sizes:
+ - banner size: 493x58
+ - left side of dialog: 164x312
+ - full dialog size: 493x312
+
diff --git a/misc/dist/windows/dist.bat b/misc/dist/windows/dist.bat
deleted file mode 100644 (file)
index 4ae2df5..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-:: Copyright 2012 The Go Authors. All rights reserved.\r
-:: Use of this source code is governed by a BSD-style\r
-:: license that can be found in the LICENSE file.\r
-@echo off\r
-\r
-setlocal\r
-\r
-:: Requires Windows Installer XML (WiX), 7zip, and Mercurial (hg)\r
-\r
-echo # Cleaning previous WiX output files\r
-del /F /Q /S *.wixobj AppFiles.wxs *.wixpdb>NUL\r
-\r
-echo # Setting some variables\r
-for /f %%i in ('hg.exe root') do set ROOT=%%i\r
-for /f "tokens=3" %%i in ('%ROOT%\bin\go.exe version') do set VER=%%i\r
-for /f "tokens=4" %%i in ('%ROOT%\bin\go.exe version') do set ID=%%i\r
-set ID=%ID:+=%\r
-if errorlevel 1 goto end\r
-\r
-echo # Getting GOARCH\r
-%ROOT%\bin\go tool dist env -w>env.bat\r
-call env.bat\r
-del /F /Q /S env.bat>NUL\r
-if errorlevel 1 goto end\r
-\r
-\r
-rmdir /S /Q go>NUL\r
-mkdir go\r
-\r
-echo # Cloning the Go tree\r
-hg clone -r %ID% %ROOT% go\r
-if errorlevel 1 goto end\r
-\r
-rmdir /S /Q  go\.hg>NUL\r
-del /F /Q /S go\.hgignore go\.hgtags>NUL\r
-\r
-echo # Copying pkg, bin, and src/pkg/runtime/z*\r
-xcopy %ROOT%\pkg                   go\pkg /V /E /Y /I\r
-xcopy %ROOT%\bin                   go\bin /V /E /Y /I\r
-xcopy %ROOT%\src\pkg\runtime\z*.c  go\src\pkg\runtime  /V /E /Y\r
-xcopy %ROOT%\src\pkg\runtime\z*.go go\src\pkg\runtime  /V /E /Y\r
-xcopy %ROOT%\src\pkg\runtime\z*.h  go\src\pkg\runtime  /V /E /Y\r
-\r
-echo # Starting zip packaging\r
-7za a -tzip -mx=9 go.%VER%.windows-%GOARCH%.zip "go/"\r
-if errorlevel 1 goto end\r
-\r
-\r
-echo # Starting Go directory file harvesting\r
-heat dir go -nologo -cg AppFiles -gg -g1 -srd -sfrag -template fragment -dr INSTALLDIR -var var.SourceDir -out AppFiles.wxs\r
-if errorlevel 1 goto end\r
-\r
-echo # Starting installer packaging\r
-candle -nologo -dVersion=%VER% -dArch=%GOARCH% -dSourceDir=go installer.wxs AppFiles.wxs\r
-light -nologo -ext WixUIExtension -ext WixUtilExtension installer.wixobj AppFiles.wixobj -o go.%VER%.windows-%GOARCH%.msi\r
-if errorlevel 1 goto end\r
-\r
-del /F /Q /S *.wixobj AppFiles.wxs *.wixpdb>NUL\r
-\r
-:end\r
-endlocal\r