diff --git a/build.go b/build.go index 42196534d..bc75e7d53 100644 --- a/build.go +++ b/build.go @@ -46,6 +46,7 @@ var ( extraTags string installSuffix string pkgdir string + debugBinary bool ) type target struct { @@ -358,6 +359,7 @@ func parseFlags() { flag.StringVar(&extraTags, "tags", extraTags, "Extra tags, space separated") flag.StringVar(&installSuffix, "installsuffix", installSuffix, "Install suffix, optional") 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() } @@ -419,20 +421,9 @@ func install(target target, tags []string) { log.Fatal(err) } os.Setenv("GOBIN", filepath.Join(cwd, "bin")) - args := []string{"install", "-v", "-ldflags", ldflags()} - if pkgdir != "" { - args = append(args, "-pkgdir", pkgdir) - } - 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) + + args := []string{"install", "-v"} + args = appendParameters(args, tags, target) os.Setenv("GOOS", goos) os.Setenv("GOARCH", goarch) @@ -445,7 +436,16 @@ func build(target target, tags []string) { tags = append(target.tags, tags...) 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 != "" { args = append(args, "-pkgdir", pkgdir) } @@ -458,11 +458,19 @@ func build(target target, tags []string) { if race { args = append(args, "-race") } - args = append(args, target.buildPkg) - os.Setenv("GOOS", goos) - os.Setenv("GOARCH", goarch) - runPrint("go", args...) + if !debugBinary { + // Regular binaries get version tagged and skip some debug symbols + 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) {