You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.1 KiB
133 lines
3.1 KiB
// Heavily inspired (copied) by the restic build file
|
|
// https://github.com/restic/restic/blob/aa0faa8c7d7800b6ba7b11164fa2d3683f7f78aa/helpers/build-release-binaries/main.go#L225
|
|
|
|
package main
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"crypto/sha1"
|
|
"crypto/sha256"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"path"
|
|
"path/filepath"
|
|
"sync"
|
|
|
|
"github.com/cupcakearmy/autorestic/internal"
|
|
)
|
|
|
|
var DIR, _ = filepath.Abs("./dist")
|
|
|
|
var targets = map[string][]string{
|
|
// "aix": {"ppc64"}, // Not supported by fsnotify
|
|
"darwin": {"amd64", "arm64"},
|
|
"freebsd": {"386", "amd64", "arm"},
|
|
"linux": {"386", "amd64", "arm", "arm64", "ppc64le", "mips", "mipsle", "mips64", "mips64le", "s390x"},
|
|
"netbsd": {"386", "amd64"},
|
|
"openbsd": {"386", "amd64"},
|
|
// "windows": {"386", "amd64"}, // Not supported by autorestic
|
|
"solaris": {"amd64"},
|
|
}
|
|
|
|
type buildOptions struct {
|
|
Target, Arch, Version string
|
|
}
|
|
|
|
const (
|
|
CHECKSUM_MD5 = "MD5SUMS"
|
|
CHECKSUM_SHA_1 = "SHA1SUMS"
|
|
CHECKSUM_SHA_256 = "SHA256SUMS"
|
|
)
|
|
|
|
type Checksums struct {
|
|
filename, md5, sha1, sha256 string
|
|
}
|
|
|
|
func writeChecksums(checksums *[]Checksums) {
|
|
FILE_MD5, _ := os.OpenFile(path.Join(DIR, CHECKSUM_MD5), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
|
|
defer FILE_MD5.Close()
|
|
FILE_SHA1, _ := os.OpenFile(path.Join(DIR, CHECKSUM_SHA_1), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
|
|
defer FILE_SHA1.Close()
|
|
FILE_SHA256, _ := os.OpenFile(path.Join(DIR, CHECKSUM_SHA_256), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
|
|
defer FILE_SHA256.Close()
|
|
|
|
for _, checksum := range *checksums {
|
|
fmt.Fprintf(FILE_MD5, "%s %s\n", checksum.md5, checksum.filename)
|
|
fmt.Fprintf(FILE_SHA1, "%s %s\n", checksum.sha1, checksum.filename)
|
|
fmt.Fprintf(FILE_SHA256, "%s %s\n", checksum.sha256, checksum.filename)
|
|
}
|
|
}
|
|
|
|
func build(options buildOptions, wg *sync.WaitGroup, checksums *[]Checksums) {
|
|
defer wg.Done()
|
|
|
|
fmt.Printf("Building: %s %s\n", options.Target, options.Arch)
|
|
out := fmt.Sprintf("autorestic_%s_%s_%s", options.Version, options.Target, options.Arch)
|
|
out = path.Join(DIR, out)
|
|
|
|
// Build
|
|
{
|
|
c := exec.Command("go", "build", "-o", out, "./main.go")
|
|
c.Stdout = os.Stdout
|
|
c.Stderr = os.Stderr
|
|
c.Env = append(os.Environ(),
|
|
"CGO_ENABLED=0",
|
|
"GOOS="+options.Target,
|
|
"GOARCH="+options.Arch,
|
|
)
|
|
err := c.Run()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
// Compress
|
|
{
|
|
c := exec.Command("bzip2", out)
|
|
c.Dir = DIR
|
|
c.Stdout = os.Stdout
|
|
c.Stderr = os.Stderr
|
|
err := c.Run()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
// Checksum
|
|
{
|
|
file := out + ".bz2"
|
|
content, _ := ioutil.ReadFile(file)
|
|
*checksums = append(*checksums, Checksums{
|
|
filename: path.Base(file),
|
|
md5: fmt.Sprintf("%x", md5.Sum(content)),
|
|
sha1: fmt.Sprintf("%x", sha1.Sum(content)),
|
|
sha256: fmt.Sprintf("%x", sha256.Sum256(content)),
|
|
})
|
|
}
|
|
|
|
fmt.Printf("Built: %s\n", path.Base(out))
|
|
}
|
|
|
|
func main() {
|
|
os.RemoveAll(DIR)
|
|
v := internal.VERSION
|
|
checksums := []Checksums{}
|
|
|
|
// Build async
|
|
var wg sync.WaitGroup
|
|
for target, archs := range targets {
|
|
for _, arch := range archs {
|
|
wg.Add(1)
|
|
go build(buildOptions{
|
|
Target: target,
|
|
Arch: arch,
|
|
Version: v,
|
|
}, &wg, &checksums)
|
|
}
|
|
}
|
|
wg.Wait()
|
|
writeChecksums(&checksums)
|
|
}
|