1
0
mirror of https://github.com/golang/go synced 2024-11-26 22:11:25 -07:00

cmd/link: add -extar option to set ar program for c-archive

People who want to use -buildmode=c-archive in unusual cross-compilation
setups will need something like this.  It could also be done via (yet
another) environment variable but I use -extar by analogy with the
existing -extld.

Change-Id: I354cfabc4c470603affd13cd946997b3a24c0e6c
Reviewed-on: https://go-review.googlesource.com/18913
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Ian Lance Taylor 2016-01-25 11:44:02 -08:00
parent c2b40809c1
commit 1aab7b9626
4 changed files with 28 additions and 1 deletions

View File

@ -85,4 +85,22 @@ if ! $bin; then
fi fi
rm -rf libgo4.a libgo4.h testp pkg rm -rf libgo4.a libgo4.h testp pkg
rm -f testar
cat >testar <<EOF
#!/usr/bin/env bash
while expr \$1 : '[-]' >/dev/null; do
shift
done
echo "testar" > \$1
echo "testar" > $(pwd)/testar.ran
EOF
chmod +x testar
rm -f testar.ran
GOPATH=$(pwd) go build -buildmode=c-archive -ldflags=-extar=$(pwd)/testar -o libgo4.a libgo4
if ! test -f testar.ran; then
echo "FAIL test5"
status=1
fi
rm -rf libgo4.a libgo4.h testar testar.ran pkg
exit $status exit $status

View File

@ -52,6 +52,9 @@ Flags:
The dynamic header is on by default, even without any The dynamic header is on by default, even without any
references to dynamic libraries, because many common references to dynamic libraries, because many common
system tools now assume the presence of the header. system tools now assume the presence of the header.
-extar ar
Set the external archive program (default "ar").
Used only for -buildmode=c-archive.
-extld linker -extld linker
Set the external linker (default "clang" or "gcc"). Set the external linker (default "clang" or "gcc").
-extldflags flags -extldflags flags

View File

@ -207,6 +207,7 @@ var (
tmpdir string tmpdir string
extld string extld string
extldflags string extldflags string
extar string
libgccfile string libgccfile string
debug_s int // backup old value of debug['s'] debug_s int // backup old value of debug['s']
Ctxt *Link Ctxt *Link
@ -1015,8 +1016,12 @@ func archive() {
return return
} }
if extar == "" {
extar = "ar"
}
mayberemoveoutfile() mayberemoveoutfile()
argv := []string{"ar", "-q", "-c", "-s", outfile} argv := []string{extar, "-q", "-c", "-s", outfile}
argv = append(argv, fmt.Sprintf("%s/go.o", tmpdir)) argv = append(argv, fmt.Sprintf("%s/go.o", tmpdir))
argv = append(argv, hostobjCopy()...) argv = append(argv, hostobjCopy()...)

View File

@ -89,6 +89,7 @@ func Ldmain() {
flag.Var(&Buildmode, "buildmode", "set build `mode`") flag.Var(&Buildmode, "buildmode", "set build `mode`")
obj.Flagcount("c", "dump call graph", &Debug['c']) obj.Flagcount("c", "dump call graph", &Debug['c'])
obj.Flagcount("d", "disable dynamic executable", &Debug['d']) obj.Flagcount("d", "disable dynamic executable", &Debug['d'])
obj.Flagstr("extar", "archive program for buildmode=c-archive", &extar)
obj.Flagstr("extld", "use `linker` when linking in external mode", &extld) obj.Flagstr("extld", "use `linker` when linking in external mode", &extld)
obj.Flagstr("extldflags", "pass `flags` to external linker", &extldflags) obj.Flagstr("extldflags", "pass `flags` to external linker", &extldflags)
obj.Flagcount("f", "ignore version mismatch", &Debug['f']) obj.Flagcount("f", "ignore version mismatch", &Debug['f'])