mirror of https://github.com/status-im/xgo.git
Add support for output prefix and -v / -race flags
This commit is contained in:
parent
6d30460233
commit
5d94f51094
29
README.md
29
README.md
|
@ -72,7 +72,6 @@ to xgo and if the specific release was already integrated, it will automatically
|
||||||
be retrieved and installed.
|
be retrieved and installed.
|
||||||
|
|
||||||
$ xgo -go 1.3.0 github.com/project-iris/iris
|
$ xgo -go 1.3.0 github.com/project-iris/iris
|
||||||
...
|
|
||||||
|
|
||||||
Since xgo depends on not only the official releases, but also on Dave Cheney's
|
Since xgo depends on not only the official releases, but also on Dave Cheney's
|
||||||
ARM packages, there will be a slight delay between official Go updates and the
|
ARM packages, there will be a slight delay between official Go updates and the
|
||||||
|
@ -80,5 +79,29 @@ xgo updates.
|
||||||
|
|
||||||
Additionally, a few wildcard release strings are also supported:
|
Additionally, a few wildcard release strings are also supported:
|
||||||
|
|
||||||
- `-go latest` will use the latest Go release
|
- `latest` will use the latest Go release
|
||||||
- `-go 1.3.x` will use the latest point release of a specific Go version
|
- `1.3.x` will use the latest point release of a specific Go version
|
||||||
|
|
||||||
|
### Output prefixing
|
||||||
|
|
||||||
|
Xgo by default uses the name of the package being cross compiled as the output
|
||||||
|
file prefix. This can be overridden with the `-out` flag.
|
||||||
|
|
||||||
|
$ xgo -out iris-v0.3.0 github.com/project-iris/iris
|
||||||
|
...
|
||||||
|
|
||||||
|
$ ls -al
|
||||||
|
-rwxr-xr-x 1 root root 3090956 Aug 14 12:39 iris-v0.3.0-darwin-386
|
||||||
|
-rwxr-xr-x 1 root root 3941068 Aug 14 12:39 iris-v0.3.0-darwin-amd64
|
||||||
|
-rwxr-xr-x 1 root root 4185224 Aug 14 12:39 iris-v0.3.0-linux-386
|
||||||
|
-rwxr-xr-x 1 root root 5200960 Aug 14 12:39 iris-v0.3.0-linux-amd64
|
||||||
|
-rwxr-xr-x 1 root root 4155880 Aug 14 12:39 iris-v0.3.0-linux-arm
|
||||||
|
-rwxr-xr-x 1 root root 4230144 Aug 14 12:39 iris-v0.3.0-windows-386.exe
|
||||||
|
-rwxr-xr-x 1 root root 5245952 Aug 14 12:39 iris-v0.3.0-windows-amd64.exe
|
||||||
|
|
||||||
|
### Build flags
|
||||||
|
|
||||||
|
A handful of flags can be passed to `go build`. The currently supported ones are
|
||||||
|
|
||||||
|
- `-v`: prints the names of packages as they are compiled
|
||||||
|
- `-race`: enables data race detection (supported only on amd64, rest built without)
|
||||||
|
|
|
@ -61,21 +61,20 @@ RUN \
|
||||||
echo '$FETCH $DIST_WIN_32 $DIST_WIN_32_SHA1' >> $BOOTSTRAP && \
|
echo '$FETCH $DIST_WIN_32 $DIST_WIN_32_SHA1' >> $BOOTSTRAP && \
|
||||||
echo >> $BOOTSTRAP && \
|
echo >> $BOOTSTRAP && \
|
||||||
echo 'tar -C /usr/local -xzf `basename $DIST_LINUX_64`' >> $BOOTSTRAP && \
|
echo 'tar -C /usr/local -xzf `basename $DIST_LINUX_64`' >> $BOOTSTRAP && \
|
||||||
echo 'rm -rf /usr/local/go/pkg/linux_amd64_race' >> $BOOTSTRAP && \
|
|
||||||
echo >> $BOOTSTRAP && \
|
echo >> $BOOTSTRAP && \
|
||||||
echo 'tar -C /usr/local --wildcards -xzf `basename $DIST_LINUX_32` go/pkg/linux_386' >> $BOOTSTRAP && \
|
echo 'tar -C /usr/local --wildcards -xzf `basename $DIST_LINUX_32` go/pkg/linux_386*' >> $BOOTSTRAP && \
|
||||||
echo 'GOOS=linux GOARCH=386 /usr/local/go/pkg/tool/linux_amd64/dist bootstrap' >> $BOOTSTRAP && \
|
echo 'GOOS=linux GOARCH=386 /usr/local/go/pkg/tool/linux_amd64/dist bootstrap' >> $BOOTSTRAP && \
|
||||||
echo 'tar -C /usr/local --wildcards -xzf `basename $DIST_LINUX_ARM` go/pkg/linux_arm' >> $BOOTSTRAP && \
|
echo 'tar -C /usr/local --wildcards -xzf `basename $DIST_LINUX_ARM` go/pkg/linux_arm*' >> $BOOTSTRAP && \
|
||||||
echo 'GOOS=linux GOARCH=arm /usr/local/go/pkg/tool/linux_amd64/dist bootstrap' >> $BOOTSTRAP && \
|
echo 'GOOS=linux GOARCH=arm /usr/local/go/pkg/tool/linux_amd64/dist bootstrap' >> $BOOTSTRAP && \
|
||||||
echo >> $BOOTSTRAP && \
|
echo >> $BOOTSTRAP && \
|
||||||
echo 'tar -C /usr/local --wildcards -xzf `basename $DIST_OSX_64` go/pkg/darwin_amd64' >> $BOOTSTRAP && \
|
echo 'tar -C /usr/local --wildcards -xzf `basename $DIST_OSX_64` go/pkg/darwin_amd64*' >> $BOOTSTRAP && \
|
||||||
echo 'GOOS=darwin GOARCH=amd64 /usr/local/go/pkg/tool/linux_amd64/dist bootstrap' >> $BOOTSTRAP && \
|
echo 'GOOS=darwin GOARCH=amd64 /usr/local/go/pkg/tool/linux_amd64/dist bootstrap' >> $BOOTSTRAP && \
|
||||||
echo 'tar -C /usr/local --wildcards -xzf `basename $DIST_OSX_32` go/pkg/darwin_386' >> $BOOTSTRAP && \
|
echo 'tar -C /usr/local --wildcards -xzf `basename $DIST_OSX_32` go/pkg/darwin_386*' >> $BOOTSTRAP && \
|
||||||
echo 'GOOS=darwin GOARCH=386 /usr/local/go/pkg/tool/linux_amd64/dist bootstrap' >> $BOOTSTRAP && \
|
echo 'GOOS=darwin GOARCH=386 /usr/local/go/pkg/tool/linux_amd64/dist bootstrap' >> $BOOTSTRAP && \
|
||||||
echo >> $BOOTSTRAP && \
|
echo >> $BOOTSTRAP && \
|
||||||
echo 'unzip -d /usr/local -q `basename $DIST_WIN_64` go/pkg/windows_amd64/*' >> $BOOTSTRAP && \
|
echo 'unzip -d /usr/local -q `basename $DIST_WIN_64` go/pkg/windows_amd64*' >> $BOOTSTRAP && \
|
||||||
echo 'GOOS=windows GOARCH=amd64 /usr/local/go/pkg/tool/linux_amd64/dist bootstrap' >> $BOOTSTRAP && \
|
echo 'GOOS=windows GOARCH=amd64 /usr/local/go/pkg/tool/linux_amd64/dist bootstrap' >> $BOOTSTRAP && \
|
||||||
echo 'unzip -d /usr/local -q `basename $DIST_WIN_32` go/pkg/windows_386/*' >> $BOOTSTRAP && \
|
echo 'unzip -d /usr/local -q `basename $DIST_WIN_32` go/pkg/windows_386*' >> $BOOTSTRAP && \
|
||||||
echo 'GOOS=windows GOARCH=386 /usr/local/go/pkg/tool/linux_amd64/dist bootstrap' >> $BOOTSTRAP && \
|
echo 'GOOS=windows GOARCH=386 /usr/local/go/pkg/tool/linux_amd64/dist bootstrap' >> $BOOTSTRAP && \
|
||||||
echo >> $BOOTSTRAP && \
|
echo >> $BOOTSTRAP && \
|
||||||
echo 'rm -f `basename $DIST_LINUX_64` `basename $DIST_LINUX_32` `basename $DIST_LINUX_ARM` \\' >> $BOOTSTRAP && \
|
echo 'rm -f `basename $DIST_LINUX_64` `basename $DIST_LINUX_32` `basename $DIST_LINUX_ARM` \\' >> $BOOTSTRAP && \
|
||||||
|
@ -89,43 +88,50 @@ ENV GOPATH /go
|
||||||
# Create a small script to go get a package and cross compile it
|
# Create a small script to go get a package and cross compile it
|
||||||
ENV BUILD ./build.sh
|
ENV BUILD ./build.sh
|
||||||
RUN \
|
RUN \
|
||||||
echo '#!/bin/bash' > $BUILD && \
|
echo '#!/bin/bash' > $BUILD && \
|
||||||
echo 'set -e' >> $BUILD && \
|
echo 'set -e' >> $BUILD && \
|
||||||
echo >> $BUILD && \
|
echo >> $BUILD && \
|
||||||
echo 'echo Fetching $1...' >> $BUILD && \
|
echo 'echo Fetching $1...' >> $BUILD && \
|
||||||
echo 'go get $1' >> $BUILD && \
|
echo 'go get $1' >> $BUILD && \
|
||||||
echo 'cd $GOPATH/src/$1' >> $BUILD && \
|
echo 'cd $GOPATH/src/$1' >> $BUILD && \
|
||||||
echo 'pack=`basename $1`' >> $BUILD && \
|
echo >> $BUILD && \
|
||||||
echo >> $BUILD && \
|
echo 'NAME=`basename $1`' >> $BUILD && \
|
||||||
echo 'echo Compiling for linux/amd64...' >> $BUILD && \
|
echo 'if [ "$OUT" != "" ]; then' >> $BUILD && \
|
||||||
echo 'GOOS=linux GOARCH=amd64 CGO_ENABLED=1 go build -o $pack-linux-amd64' >> $BUILD && \
|
echo ' NAME=$OUT' >> $BUILD && \
|
||||||
echo >> $BUILD && \
|
echo 'fi' >> $BUILD && \
|
||||||
echo 'echo Compiling for linux/386...' >> $BUILD && \
|
echo >> $BUILD && \
|
||||||
echo 'GOOS=linux GOARCH=386 CGO_ENABLED=1 go build -o $pack-linux-386' >> $BUILD && \
|
echo 'if [ "$FLAG_V" == "true" ]; then V=-v; fi' >> $BUILD && \
|
||||||
echo >> $BUILD && \
|
echo 'if [ "$FLAG_RACE" == "true" ]; then R=-race; fi' >> $BUILD && \
|
||||||
echo 'echo Compiling for linux/arm...' >> $BUILD && \
|
echo >> $BUILD && \
|
||||||
echo 'CC=arm-linux-gnueabi-gcc \\' >> $BUILD && \
|
echo 'echo Compiling for linux/amd64...' >> $BUILD && \
|
||||||
echo ' GOOS=linux GOARCH=arm CGO_ENABLED=1 go build -o $pack-linux-arm' >> $BUILD && \
|
echo 'GOOS=linux GOARCH=amd64 CGO_ENABLED=1 go build $V $R -o $NAME-linux-amd64$R' >> $BUILD && \
|
||||||
echo >> $BUILD && \
|
echo >> $BUILD && \
|
||||||
echo 'echo Compiling for windows/amd64...' >> $BUILD && \
|
echo 'echo Compiling for linux/386...' >> $BUILD && \
|
||||||
echo 'CC=x86_64-w64-mingw32-gcc \\' >> $BUILD && \
|
echo 'GOOS=linux GOARCH=386 CGO_ENABLED=1 go build $V -o $NAME-linux-386' >> $BUILD && \
|
||||||
echo ' GOOS=windows GOARCH=amd64 CGO_ENABLED=1 go build -o $pack-windows-amd64.exe' >> $BUILD && \
|
echo >> $BUILD && \
|
||||||
echo >> $BUILD && \
|
echo 'echo Compiling for linux/arm...' >> $BUILD && \
|
||||||
echo 'echo Compiling for windows/386...' >> $BUILD && \
|
echo 'CC=arm-linux-gnueabi-gcc \\' >> $BUILD && \
|
||||||
echo 'CC=i686-w64-mingw32-gcc \\' >> $BUILD && \
|
echo ' GOOS=linux GOARCH=arm CGO_ENABLED=1 go build $V -o $NAME-linux-arm' >> $BUILD && \
|
||||||
echo ' GOOS=windows GOARCH=386 CGO_ENABLED=1 go build -o $pack-windows-386.exe' >> $BUILD && \
|
echo >> $BUILD && \
|
||||||
echo >> $BUILD && \
|
echo 'echo Compiling for windows/amd64...' >> $BUILD && \
|
||||||
echo 'echo Compiling for darwin/amd64...' >> $BUILD && \
|
echo 'CC=x86_64-w64-mingw32-gcc \\' >> $BUILD && \
|
||||||
echo '`/osxcross/target/bin/osxcross-env`' >> $BUILD && \
|
echo ' GOOS=windows GOARCH=amd64 CGO_ENABLED=1 go build $V $R -o $NAME-windows-amd64$R.exe' >> $BUILD && \
|
||||||
echo 'CC=o64-clang \\' >> $BUILD && \
|
echo >> $BUILD && \
|
||||||
echo ' GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 go build -o $pack-darwin-amd64' >> $BUILD && \
|
echo 'echo Compiling for windows/386...' >> $BUILD && \
|
||||||
echo >> $BUILD && \
|
echo 'CC=i686-w64-mingw32-gcc \\' >> $BUILD && \
|
||||||
echo 'echo Compiling for darwin/386...' >> $BUILD && \
|
echo ' GOOS=windows GOARCH=386 CGO_ENABLED=1 go build $V -o $NAME-windows-386.exe' >> $BUILD && \
|
||||||
echo 'CC=o32-clang \\' >> $BUILD && \
|
echo >> $BUILD && \
|
||||||
echo ' GOOS=darwin GOARCH=386 CGO_ENABLED=1 go build -o $pack-darwin-386' >> $BUILD && \
|
echo 'echo Compiling for darwin/amd64...' >> $BUILD && \
|
||||||
echo >> $BUILD && \
|
echo '`/osxcross/target/bin/osxcross-env`' >> $BUILD && \
|
||||||
echo 'echo Moving binaries to host...' >> $BUILD && \
|
echo 'CC=o64-clang \\' >> $BUILD && \
|
||||||
echo 'cp `ls -t | head -n 7` /build' >> $BUILD && \
|
echo ' GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 go build $V $R -o $NAME-darwin-amd64$R' >> $BUILD && \
|
||||||
|
echo >> $BUILD && \
|
||||||
|
echo 'echo Compiling for darwin/386...' >> $BUILD && \
|
||||||
|
echo 'CC=o32-clang \\' >> $BUILD && \
|
||||||
|
echo ' GOOS=darwin GOARCH=386 CGO_ENABLED=1 go build $V -o $NAME-darwin-386' >> $BUILD && \
|
||||||
|
echo >> $BUILD && \
|
||||||
|
echo 'echo Moving binaries to host...' >> $BUILD && \
|
||||||
|
echo 'cp `ls -t | head -n 7` /build' >> $BUILD && \
|
||||||
chmod +x $BUILD
|
chmod +x $BUILD
|
||||||
|
|
||||||
ENTRYPOINT ["./build.sh"]
|
ENTRYPOINT ["./build.sh"]
|
||||||
|
|
19
xgo.go
19
xgo.go
|
@ -22,6 +22,11 @@ var dockerDist = "karalabe/xgo-"
|
||||||
|
|
||||||
// Command line arguments to fine tune the compilation
|
// Command line arguments to fine tune the compilation
|
||||||
var goVersion = flag.String("go", "latest", "Go release to use for cross compilation")
|
var goVersion = flag.String("go", "latest", "Go release to use for cross compilation")
|
||||||
|
var outPrefix = flag.String("out", "", "Prefix to use for output naming (empty = package name)")
|
||||||
|
|
||||||
|
// Command line arguments to pass to go build
|
||||||
|
var buildVerbose = flag.Bool("v", false, "Print the names of packages as they are compiled")
|
||||||
|
var buildRace = flag.Bool("race", false, "Enable data race detection (supported only on amd64)")
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
@ -48,7 +53,7 @@ func main() {
|
||||||
fmt.Println("found.")
|
fmt.Println("found.")
|
||||||
}
|
}
|
||||||
// Cross compile the requested package into the local folder
|
// Cross compile the requested package into the local folder
|
||||||
if err := compile(flag.Args()[0]); err != nil {
|
if err := compile(flag.Args()[0], *outPrefix, *buildVerbose, *buildRace); err != nil {
|
||||||
log.Fatalf("Failed to cross compile package: %v.", err)
|
log.Fatalf("Failed to cross compile package: %v.", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -81,16 +86,18 @@ func pullDockerImage(image string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cross compiles a requested package into the current working directory.
|
// Cross compiles a requested package into the current working directory.
|
||||||
func compile(path string) error {
|
func compile(path string, prefix string, verbose bool, race bool) error {
|
||||||
folder, err := os.Getwd()
|
folder, err := os.Getwd()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to retrieve the working directory: %v.", err)
|
log.Fatalf("Failed to retrieve the working directory: %v.", err)
|
||||||
}
|
}
|
||||||
fmt.Printf("Cross compiling %s...\n", path)
|
fmt.Printf("Cross compiling %s...\n", path)
|
||||||
if err := run(exec.Command("docker", "run", "-v", folder+":/build", dockerDist+*goVersion, path)); err != nil {
|
return run(exec.Command("docker", "run",
|
||||||
return err
|
"-v", folder+":/build",
|
||||||
}
|
"-e", "OUT="+prefix,
|
||||||
return nil
|
"-e", fmt.Sprintf("FLAG_V=%v", verbose),
|
||||||
|
"-e", fmt.Sprintf("FLAG_RACE=%v", race),
|
||||||
|
dockerDist+*goVersion, path))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Executes a command synchronously, redirecting its output to stdout.
|
// Executes a command synchronously, redirecting its output to stdout.
|
||||||
|
|
Loading…
Reference in New Issue