Commit cb6e9ec0 authored by Michael Hudson-Doyle's avatar Michael Hudson-Doyle Committed by Ian Lance Taylor

cmd/go: support -buildmode=default,archive,exe,c-shared

Modelled somewhat on the -race support.

Change-Id: I137037addfc76341f7deb216776fdd18e9af9fe5
Reviewed-on: https://go-review.googlesource.com/8680Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 84207a25
...@@ -75,6 +75,8 @@ and test commands: ...@@ -75,6 +75,8 @@ and test commands:
-x -x
print the commands. print the commands.
-buildmode mode
build mode to use. See 'go help buildmodes' for more.
-compiler name -compiler name
name of compiler to use, as in runtime.Compiler (gccgo or gc). name of compiler to use, as in runtime.Compiler (gccgo or gc).
-gccgoflags 'arg list' -gccgoflags 'arg list'
...@@ -85,7 +87,8 @@ and test commands: ...@@ -85,7 +87,8 @@ and test commands:
a suffix to use in the name of the package installation directory, a suffix to use in the name of the package installation directory,
in order to keep output separate from default builds. in order to keep output separate from default builds.
If using the -race flag, the install suffix is automatically set to race If using the -race flag, the install suffix is automatically set to race
or, if set explicitly, has _race appended to it. or, if set explicitly, has _race appended to it. Using a -buildmode
option that requires non-default compile flags has a similar effect.
-ldflags 'flag list' -ldflags 'flag list'
arguments to pass on each 5l, 6l, 8l, or 9l linker invocation. arguments to pass on each 5l, 6l, 8l, or 9l linker invocation.
-asmflags 'flag list' -asmflags 'flag list'
...@@ -145,6 +148,7 @@ var buildLdflags []string // -ldflags flag ...@@ -145,6 +148,7 @@ var buildLdflags []string // -ldflags flag
var buildGccgoflags []string // -gccgoflags flag var buildGccgoflags []string // -gccgoflags flag
var buildRace bool // -race flag var buildRace bool // -race flag
var buildToolExec []string // -toolexec flag var buildToolExec []string // -toolexec flag
var buildBuildmode string // -buildmode flag
var buildContext = build.Default var buildContext = build.Default
var buildToolchain toolchain = noToolchain{} var buildToolchain toolchain = noToolchain{}
...@@ -199,6 +203,7 @@ func addBuildFlags(cmd *Command) { ...@@ -199,6 +203,7 @@ func addBuildFlags(cmd *Command) {
cmd.Flag.Var(buildCompiler{}, "compiler", "") cmd.Flag.Var(buildCompiler{}, "compiler", "")
cmd.Flag.BoolVar(&buildRace, "race", false, "") cmd.Flag.BoolVar(&buildRace, "race", false, "")
cmd.Flag.Var((*stringsFlag)(&buildToolExec), "toolexec", "") cmd.Flag.Var((*stringsFlag)(&buildToolExec), "toolexec", "")
cmd.Flag.StringVar(&buildBuildmode, "buildmode", "default", "")
} }
func addBuildFlagsNX(cmd *Command) { func addBuildFlagsNX(cmd *Command) {
...@@ -273,8 +278,51 @@ func (v *stringsFlag) String() string { ...@@ -273,8 +278,51 @@ func (v *stringsFlag) String() string {
return "<stringsFlag>" return "<stringsFlag>"
} }
var pkgFilter = func(p *Package) bool { return true }
func buildModeInit() {
var codegenArg, ldBuildmode string
switch buildBuildmode {
case "archive":
pkgFilter = func(p *Package) bool { return p.Name != "main" }
case "c-shared":
pkgFilter = func(p *Package) bool { return p.Name == "main" }
platform := goos + "/" + goarch
switch platform {
case "linux/amd64":
case "android/arm":
default:
fmt.Fprintf(os.Stderr, "go %s: -buildmode=c-shared not supported on %s\n", platform)
os.Exit(2)
}
if goarch == "amd64" {
codegenArg = "-shared"
}
ldBuildmode = "c-shared"
case "default":
ldBuildmode = "exe"
case "exe":
pkgFilter = func(p *Package) bool { return p.Name == "main" }
ldBuildmode = "exe"
default:
fatalf("buildmode=%s not supported", buildBuildmode)
}
if ldBuildmode != "" {
buildLdflags = append(buildLdflags, "-buildmode="+ldBuildmode)
}
if codegenArg != "" {
buildAsmflags = append(buildAsmflags, codegenArg)
buildGcflags = append(buildGcflags, codegenArg)
if buildContext.InstallSuffix != "" {
buildContext.InstallSuffix += "_"
}
buildContext.InstallSuffix += codegenArg[1:]
}
}
func runBuild(cmd *Command, args []string) { func runBuild(cmd *Command, args []string) {
raceInit() raceInit()
buildModeInit()
var b builder var b builder
b.init() b.init()
...@@ -321,8 +369,10 @@ func runBuild(cmd *Command, args []string) { ...@@ -321,8 +369,10 @@ func runBuild(cmd *Command, args []string) {
a := &action{} a := &action{}
for _, p := range packages(args) { for _, p := range packages(args) {
if pkgFilter(p) {
a.deps = append(a.deps, b.action(modeBuild, depMode, p)) a.deps = append(a.deps, b.action(modeBuild, depMode, p))
} }
}
b.do(a) b.do(a)
} }
...@@ -362,6 +412,9 @@ func runInstall(cmd *Command, args []string) { ...@@ -362,6 +412,9 @@ func runInstall(cmd *Command, args []string) {
a := &action{} a := &action{}
var tools []*action var tools []*action
for _, p := range pkgs { for _, p := range pkgs {
if !pkgFilter(p) {
continue
}
// If p is a tool, delay the installation until the end of the build. // If p is a tool, delay the installation until the end of the build.
// This avoids installing assemblers/compilers that are being executed // This avoids installing assemblers/compilers that are being executed
// by other steps in the build. // by other steps in the build.
......
...@@ -34,6 +34,7 @@ Use "go help [command]" for more information about a command. ...@@ -34,6 +34,7 @@ Use "go help [command]" for more information about a command.
Additional help topics: Additional help topics:
c calling between Go and C c calling between Go and C
buildmode description of build modes
filetype file types filetype file types
gopath GOPATH environment variable gopath GOPATH environment variable
importpath import path syntax importpath import path syntax
...@@ -94,6 +95,8 @@ and test commands: ...@@ -94,6 +95,8 @@ and test commands:
-x -x
print the commands. print the commands.
-buildmode mode
build mode to use. See 'go help buildmodes' for more.
-compiler name -compiler name
name of compiler to use, as in runtime.Compiler (gccgo or gc). name of compiler to use, as in runtime.Compiler (gccgo or gc).
-gccgoflags 'arg list' -gccgoflags 'arg list'
...@@ -104,7 +107,8 @@ and test commands: ...@@ -104,7 +107,8 @@ and test commands:
a suffix to use in the name of the package installation directory, a suffix to use in the name of the package installation directory,
in order to keep output separate from default builds. in order to keep output separate from default builds.
If using the -race flag, the install suffix is automatically set to race If using the -race flag, the install suffix is automatically set to race
or, if set explicitly, has _race appended to it. or, if set explicitly, has _race appended to it. Using a -buildmode
option that requires non-default compile flags has a similar effect.
-ldflags 'flag list' -ldflags 'flag list'
arguments to pass on each 5l, 6l, 8l, or 9l linker invocation. arguments to pass on each 5l, 6l, 8l, or 9l linker invocation.
-asmflags 'flag list' -asmflags 'flag list'
...@@ -640,6 +644,32 @@ compiler. The CC or CXX environment variables may be set to determine ...@@ -640,6 +644,32 @@ compiler. The CC or CXX environment variables may be set to determine
the C or C++ compiler, respectively, to use. the C or C++ compiler, respectively, to use.
Description of build modes
The 'go build' and 'go install' commands take a -buildmode argument which
indicates which kind of object file is to be built. Currently supported values
are:
-buildmode=archive
Build the listed non-main packages into .a files. Packages named
main are ignored.
-buildmode=c-shared
Build the listed main packages, plus all packages that they
import, into C shared libraries. The only callable symbols will
be those functions marked as exported. Non-main packages are
ignored.
-buildmode=default
Listed main packages are built into executables and listed
non-main packages are built into .a files (the default
behavior).
-buildmode=exe
Build the listed main packages and everything they import into
executables. Packages not named main are ignored.
File types File types
The go command examines the contents of a restricted set of files The go command examines the contents of a restricted set of files
......
...@@ -363,3 +363,32 @@ at the first item in the file that is not a blank line or //-style ...@@ -363,3 +363,32 @@ at the first item in the file that is not a blank line or //-style
line comment. line comment.
`, `,
} }
var helpBuildmode = &Command{
UsageLine: "buildmode",
Short: "description of build modes",
Long: `
The 'go build' and 'go install' commands take a -buildmode argument which
indicates which kind of object file is to be built. Currently supported values
are:
-buildmode=archive
Build the listed non-main packages into .a files. Packages named
main are ignored.
-buildmode=c-shared
Build the listed main packages, plus all packages that they
import, into C shared libraries. The only callable symbols will
be those functions marked as exported. Non-main packages are
ignored.
-buildmode=default
Listed main packages are built into executables and listed
non-main packages are built into .a files (the default
behavior).
-buildmode=exe
Build the listed main packages and everything they import into
executables. Packages not named main are ignored.
`,
}
...@@ -91,6 +91,7 @@ var commands = []*Command{ ...@@ -91,6 +91,7 @@ var commands = []*Command{
cmdVet, cmdVet,
helpC, helpC,
helpBuildmode,
helpFileType, helpFileType,
helpGopath, helpGopath,
helpImportPath, helpImportPath,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment