build: Add support for debug-only binary (i.e., dlv)

GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/4633
LGTM: AudriusButkevicius
This commit is contained in:
Lars K.W. Gohlke 2018-01-03 08:07:15 +00:00 committed by Jakob Borg
parent 53f4dfe83c
commit e6551c8485
1 changed files with 27 additions and 19 deletions

View File

@ -46,6 +46,7 @@ var (
extraTags string extraTags string
installSuffix string installSuffix string
pkgdir string pkgdir string
debugBinary bool
) )
type target struct { type target struct {
@ -358,6 +359,7 @@ func parseFlags() {
flag.StringVar(&extraTags, "tags", extraTags, "Extra tags, space separated") flag.StringVar(&extraTags, "tags", extraTags, "Extra tags, space separated")
flag.StringVar(&installSuffix, "installsuffix", installSuffix, "Install suffix, optional") flag.StringVar(&installSuffix, "installsuffix", installSuffix, "Install suffix, optional")
flag.StringVar(&pkgdir, "pkgdir", "", "Set -pkgdir parameter for `go build`") flag.StringVar(&pkgdir, "pkgdir", "", "Set -pkgdir parameter for `go build`")
flag.BoolVar(&debugBinary, "debug-binary", debugBinary, "Create unoptimized binary to use with delve, set -gcflags='-N -l' and omit -ldflags")
flag.Parse() flag.Parse()
} }
@ -419,20 +421,9 @@ func install(target target, tags []string) {
log.Fatal(err) log.Fatal(err)
} }
os.Setenv("GOBIN", filepath.Join(cwd, "bin")) os.Setenv("GOBIN", filepath.Join(cwd, "bin"))
args := []string{"install", "-v", "-ldflags", ldflags()}
if pkgdir != "" { args := []string{"install", "-v"}
args = append(args, "-pkgdir", pkgdir) args = appendParameters(args, tags, target)
}
if len(tags) > 0 {
args = append(args, "-tags", strings.Join(tags, " "))
}
if installSuffix != "" {
args = append(args, "-installsuffix", installSuffix)
}
if race {
args = append(args, "-race")
}
args = append(args, target.buildPkg)
os.Setenv("GOOS", goos) os.Setenv("GOOS", goos)
os.Setenv("GOARCH", goarch) os.Setenv("GOARCH", goarch)
@ -445,7 +436,16 @@ func build(target target, tags []string) {
tags = append(target.tags, tags...) tags = append(target.tags, tags...)
rmr(target.BinaryName()) rmr(target.BinaryName())
args := []string{"build", "-i", "-v", "-ldflags", ldflags()}
args := []string{"build", "-i", "-v"}
args = appendParameters(args, tags, target)
os.Setenv("GOOS", goos)
os.Setenv("GOARCH", goarch)
runPrint("go", args...)
}
func appendParameters(args []string, tags []string, target target) []string {
if pkgdir != "" { if pkgdir != "" {
args = append(args, "-pkgdir", pkgdir) args = append(args, "-pkgdir", pkgdir)
} }
@ -458,11 +458,19 @@ func build(target target, tags []string) {
if race { if race {
args = append(args, "-race") args = append(args, "-race")
} }
args = append(args, target.buildPkg)
os.Setenv("GOOS", goos) if !debugBinary {
os.Setenv("GOARCH", goarch) // Regular binaries get version tagged and skip some debug symbols
runPrint("go", args...) args = append(args, "-ldflags", ldflags())
} else {
// -gcflags to disable optimizations and inlining. Skip -ldflags
// because `Could not launch program: decoding dwarf section info at
// offset 0x0: too short` on 'dlv exec ...' see
// https://github.com/derekparker/delve/issues/79
args = append(args, "-gcflags", "-N -l")
}
return append(args, target.buildPkg)
} }
func buildTar(target target) { func buildTar(target target) {