diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 573da1ed4..d8f4abebb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,7 +19,7 @@ jobs: strategy: fail-fast: false matrix: - job_name: ['linux', 'mac', 'windows_amd64', 'windows_386', 'other_os', 'go1.13', 'go1.14', 'go1.15'] + job_name: ['linux', 'mac_amd64', 'mac_arm64', 'windows_amd64', 'windows_386', 'other_os', 'go1.13', 'go1.14', 'go1.15'] include: - job_name: linux @@ -32,7 +32,7 @@ jobs: racequicktest: true deploy: true - - job_name: mac + - job_name: mac_amd64 os: macOS-latest go: '1.16.0-rc1' gotags: 'cmount' @@ -41,6 +41,13 @@ jobs: racequicktest: true deploy: true + - job_name: mac_arm64 + os: macOS-latest + go: '1.16.0-rc1' + gotags: 'cmount' + build_flags: '-include "^darwin/arm64" -cgo -macos-arch arm64 -macos-sdk macosx11.1 -cgo-cflags=-I/usr/local/include -cgo-ldflags=-L/usr/local/lib' + deploy: true + - job_name: windows_amd64 os: windows-latest go: '1.16.0-rc1' @@ -65,7 +72,7 @@ jobs: - job_name: other_os os: ubuntu-latest go: '1.16.0-rc1' - build_flags: '-exclude "^(windows/|darwin/amd64|linux/)"' + build_flags: '-exclude "^(windows/|darwin/|linux/)"' compile_all: true deploy: true diff --git a/bin/cross-compile.go b/bin/cross-compile.go index 66d7464f3..536327723 100644 --- a/bin/cross-compile.go +++ b/bin/cross-compile.go @@ -27,17 +27,22 @@ import ( var ( // Flags - debug = flag.Bool("d", false, "Print commands instead of running them.") - parallel = flag.Int("parallel", runtime.NumCPU(), "Number of commands to run in parallel.") - copyAs = flag.String("release", "", "Make copies of the releases with this name") - gitLog = flag.String("git-log", "", "git log to include as well") - include = flag.String("include", "^.*$", "os/arch regexp to include") - exclude = flag.String("exclude", "^$", "os/arch regexp to exclude") - cgo = flag.Bool("cgo", false, "Use cgo for the build") - noClean = flag.Bool("no-clean", false, "Don't clean the build directory before running.") - tags = flag.String("tags", "", "Space separated list of build tags") - buildmode = flag.String("buildmode", "", "Passed to go build -buildmode flag") - compileOnly = flag.Bool("compile-only", false, "Just build the binary, not the zip.") + debug = flag.Bool("d", false, "Print commands instead of running them.") + parallel = flag.Int("parallel", runtime.NumCPU(), "Number of commands to run in parallel.") + copyAs = flag.String("release", "", "Make copies of the releases with this name") + gitLog = flag.String("git-log", "", "git log to include as well") + include = flag.String("include", "^.*$", "os/arch regexp to include") + exclude = flag.String("exclude", "^$", "os/arch regexp to exclude") + cgo = flag.Bool("cgo", false, "Use cgo for the build") + noClean = flag.Bool("no-clean", false, "Don't clean the build directory before running.") + tags = flag.String("tags", "", "Space separated list of build tags") + buildmode = flag.String("buildmode", "", "Passed to go build -buildmode flag") + compileOnly = flag.Bool("compile-only", false, "Just build the binary, not the zip.") + extraEnv = flag.String("env", "", "comma separated list of VAR=VALUE env vars to set") + macOSSDK = flag.String("macos-sdk", "", "macOS SDK to use") + macOSArch = flag.String("macos-arch", "", "macOS arch to use") + extraCgoCFlags = flag.String("cgo-cflags", "", "extra CGO_CFLAGS") + extraCgoLdFlags = flag.String("cgo-ldflags", "", "extra CGO_LDFLAGS") ) // GOOS/GOARCH pairs we build for @@ -47,6 +52,7 @@ var osarches = []string{ "windows/386", "windows/amd64", "darwin/amd64", + "darwin/arm64", "linux/386", "linux/amd64", "linux/arm", @@ -279,6 +285,15 @@ func stripVersion(goarch string) string { return goarch[:i] } +// run the command returning trimmed output +func runOut(command ...string) string { + out, err := exec.Command(command[0], command[1:]...).Output() + if err != nil { + log.Fatalf("Failed to run %q: %v", command, err) + } + return strings.TrimSpace(string(out)) +} + // build the binary in dir returning success or failure func compileArch(version, goos, goarch, dir string) bool { log.Printf("Compiling %s/%s into %s", goos, goarch, dir) @@ -314,6 +329,35 @@ func compileArch(version, goos, goarch, dir string) bool { "GOOS=" + goos, "GOARCH=" + stripVersion(goarch), } + if *extraEnv != "" { + env = append(env, strings.Split(*extraEnv, ",")...) + } + var ( + cgoCFlags []string + cgoLdFlags []string + ) + if *macOSSDK != "" { + flag := "-isysroot " + runOut("xcrun", "--sdk", *macOSSDK, "--show-sdk-path") + cgoCFlags = append(cgoCFlags, flag) + cgoLdFlags = append(cgoLdFlags, flag) + } + if *macOSArch != "" { + flag := "-arch " + *macOSArch + cgoCFlags = append(cgoCFlags, flag) + cgoLdFlags = append(cgoLdFlags, flag) + } + if *extraCgoCFlags != "" { + cgoCFlags = append(cgoCFlags, *extraCgoCFlags) + } + if *extraCgoLdFlags != "" { + cgoLdFlags = append(cgoLdFlags, *extraCgoLdFlags) + } + if len(cgoCFlags) > 0 { + env = append(env, "CGO_CFLAGS="+strings.Join(cgoCFlags, " ")) + } + if len(cgoLdFlags) > 0 { + env = append(env, "CGO_LDFLAGS="+strings.Join(cgoLdFlags, " ")) + } if !*cgo { env = append(env, "CGO_ENABLED=0") } else { diff --git a/docs/content/downloads.md b/docs/content/downloads.md index c69898b93..8828a42e9 100644 --- a/docs/content/downloads.md +++ b/docs/content/downloads.md @@ -13,7 +13,7 @@ Rclone Download {{< version >}} | Intel/AMD - 32 Bit | {{< download windows 386 >}} | - | {{< download linux 386 >}} | {{< download linux 386 deb >}} | {{< download linux 386 rpm >}} | {{< download freebsd 386 >}} | {{< download netbsd 386 >}} | {{< download openbsd 386 >}} | {{< download plan9 386 >}} | - | | ARMv6 - 32 Bit | - | - | {{< download linux arm >}} | {{< download linux arm deb >}} | {{< download linux arm rpm >}} | {{< download freebsd arm >}} | {{< download netbsd arm >}} | - | - | - | | ARMv7 - 32 Bit | - | - | {{< download linux arm-v7 >}} | {{< download linux arm-v7 deb >}} | {{< download linux arm-v7 rpm >}} | {{< download freebsd arm-v7 >}} | {{< download netbsd arm-v7 >}} | - | - | - | -| ARM - 64 Bit | - | - | {{< download linux arm64 >}} | {{< download linux arm64 deb >}} | {{< download linux arm64 rpm >}} | - | - | - | - | - | +| ARM - 64 Bit | - | {{< download osx arm64 >}} | {{< download linux arm64 >}} | {{< download linux arm64 deb >}} | {{< download linux arm64 rpm >}} | - | - | - | - | - | | MIPS - Big Endian | - | - | {{< download linux mips >}} | {{< download linux mips deb >}} | {{< download linux mips rpm >}} | - | - | - | - | - | | MIPS - Little Endian | - | - | {{< download linux mipsle >}} | {{< download linux mipsle deb >}} | {{< download linux mipsle rpm >}} | - | - | - | - | - | @@ -82,7 +82,7 @@ script) from a URL which doesn't change then you can use these links. | Intel/AMD - 32 Bit | {{< cdownload windows 386 >}} | - | {{< cdownload linux 386 >}} | {{< cdownload linux 386 deb >}} | {{< cdownload linux 386 rpm >}} | {{< cdownload freebsd 386 >}} | {{< cdownload netbsd 386 >}} | {{< cdownload openbsd 386 >}} | {{< cdownload plan9 386 >}} | - | | ARMv6 - 32 Bit | - | - | {{< cdownload linux arm >}} | {{< cdownload linux arm deb >}} | {{< cdownload linux arm rpm >}} | {{< cdownload freebsd arm >}} | {{< cdownload netbsd arm >}} | - | - | - | | ARMv7 - 32 Bit | - | - | {{< cdownload linux arm-v7 >}} | {{< cdownload linux arm-v7 deb >}} | {{< cdownload linux arm-v7 rpm >}} | {{< cdownload freebsd arm-v7 >}} | {{< cdownload netbsd arm-v7 >}} | - | - | - | -| ARM - 64 Bit | - | - | {{< cdownload linux arm64 >}} | {{< cdownload linux arm64 deb >}} | {{< cdownload linux arm64 rpm >}} | - | - | - | - | - | +| ARM - 64 Bit | - | {{< cdownload osx arm64 >}} | {{< cdownload linux arm64 >}} | {{< cdownload linux arm64 deb >}} | {{< cdownload linux arm64 rpm >}} | - | - | - | - | - | | MIPS - Big Endian | - | - | {{< cdownload linux mips >}} | {{< cdownload linux mips deb >}} | {{< cdownload linux mips rpm >}} | - | - | - | - | - | | MIPS - Little Endian | - | - | {{< cdownload linux mipsle >}} | {{< cdownload linux mipsle deb >}} | {{< cdownload linux mipsle rpm >}} | - | - | - | - | - |