Commit 1aab7b96 authored by Ian Lance Taylor's avatar Ian Lance Taylor

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/18913Reviewed-by: default avatarRuss Cox <rsc@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent c2b40809
...@@ -85,4 +85,22 @@ if ! $bin; then ...@@ -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
...@@ -52,6 +52,9 @@ Flags: ...@@ -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
......
...@@ -207,6 +207,7 @@ var ( ...@@ -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() { ...@@ -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()...)
......
...@@ -89,6 +89,7 @@ func Ldmain() { ...@@ -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'])
......
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