diff --git a/.gitignore b/.gitignore
index 04c489f..c8da8cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
/_output
+/out
/yarr
*.db
*.db-shm
diff --git a/cmd/package_macos/main.go b/cmd/package_macos/main.go
deleted file mode 100644
index 8cd24d8..0000000
--- a/cmd/package_macos/main.go
+++ /dev/null
@@ -1,99 +0,0 @@
-package main
-
-import (
- "flag"
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "path"
- "strconv"
- "strings"
-)
-
-var plist = `
-
-
-
- CFBundleName
- yarr
- CFBundleDisplayName
- yarr
- CFBundleIdentifier
- nkanaev.yarr
- CFBundleVersion
- VERSION
- CFBundlePackageType
- APPL
- CFBundleExecutable
- yarr
-
- CFBundleIconFile
- icon
- LSApplicationCategoryType
- public.app-category.news
-
- NSHighResolutionCapable
- True
-
- LSMinimumSystemVersion
- 10.13
- LSUIElement
-
- NSHumanReadableCopyright
- Copyright © 2020 nkanaev. All rights reserved.
-
-
-`
-
-func run(cmd ...string) {
- fmt.Println(cmd)
- err := exec.Command(cmd[0], cmd[1:]...).Run()
- if err != nil {
- log.Fatal(err)
- }
-}
-
-func main() {
- var version, outdir string
- flag.StringVar(&version, "version", "0.0", "")
- flag.StringVar(&outdir, "outdir", "", "")
- flag.Parse()
-
- outfile := "yarr"
-
- binDir := path.Join(outdir, "yarr.app", "Contents/MacOS")
- resDir := path.Join(outdir, "yarr.app", "Contents/Resources")
-
- plistFile := path.Join(outdir, "yarr.app", "Contents/Info.plist")
- pkginfoFile := path.Join(outdir, "yarr.app", "Contents/PkgInfo")
-
- os.MkdirAll(binDir, 0700)
- os.MkdirAll(resDir, 0700)
-
- f, _ := ioutil.ReadFile(path.Join(outdir, outfile))
- ioutil.WriteFile(path.Join(binDir, outfile), f, 0755)
-
- ioutil.WriteFile(plistFile, []byte(strings.Replace(plist, "VERSION", version, 1)), 0644)
- ioutil.WriteFile(pkginfoFile, []byte("APPL????"), 0644)
-
- iconFile := path.Join(outdir, "icon.png")
- iconsetDir := path.Join(outdir, "icon.iconset")
- os.Mkdir(iconsetDir, 0700)
-
- for _, res := range []int{1024, 512, 256, 128, 64, 32, 16} {
- outfile := fmt.Sprintf("icon_%dx%d.png", res, res)
- if res == 1024 || res == 64 {
- outfile = fmt.Sprintf("icon_%dx%d@2x.png", res/2, res/2)
- }
- cmd := []string{
- "sips", "-s", "format", "png", "--resampleWidth", strconv.Itoa(res),
- iconFile, "--out", path.Join(iconsetDir, outfile),
- }
- run(cmd...)
- }
-
- icnsFile := path.Join(resDir, "icon.icns")
- run("iconutil", "-c", "icns", iconsetDir, "-o", icnsFile)
-}
diff --git a/etc/icon.icns b/etc/icon.icns
new file mode 100644
index 0000000..ec9171c
Binary files /dev/null and b/etc/icon.icns differ
diff --git a/etc/icon_macos.png b/etc/icon_macos.png
new file mode 100644
index 0000000..467a58d
Binary files /dev/null and b/etc/icon_macos.png differ
diff --git a/etc/macos_package.sh b/etc/macos_package.sh
new file mode 100755
index 0000000..f77d5c0
--- /dev/null
+++ b/etc/macos_package.sh
@@ -0,0 +1,62 @@
+#/bin/sh
+
+set -e
+
+usage() {
+ echo "usage: $0 VERSION path/to/icon.icns path/to/binary output/dir"
+}
+
+if [ $# -eq 0 ]; then
+ usage
+ exit
+fi
+
+VERSION=$1
+ICNFILE=$2
+BINFILE=$3
+OUTPATH=$4
+
+mkdir -p $OUTPATH/yarr.app/Contents/MacOS
+mkdir -p $OUTPATH/yarr.app/Contents/Resources
+
+mv $BINFILE $OUTPATH/yarr.app/Contents/MacOS/yarr
+cp $ICNFILE $OUTPATH/yarr.app/Contents/Resources/icon.icns
+
+chmod u+x $OUTPATH/yarr.app/Contents/MacOS/yarr
+
+echo -n 'APPL????' >$OUTPATH/yarr.app/Contents/PkgInfo
+cat <$OUTPATH/yarr.app/Contents/Info.plist
+
+
+
+
+ CFBundleName
+ yarr
+ CFBundleDisplayName
+ yarr
+ CFBundleIdentifier
+ nkanaev.yarr
+ CFBundleVersion
+ $VERSION
+ CFBundlePackageType
+ APPL
+ CFBundleExecutable
+ yarr
+
+ CFBundleIconFile
+ icon
+ LSApplicationCategoryType
+ public.app-category.news
+
+ NSHighResolutionCapable
+ True
+
+ LSMinimumSystemVersion
+ 10.13
+ LSUIElement
+
+ NSHumanReadableCopyright
+ Copyright © 2020 nkanaev. All rights reserved.
+
+
+EOF
diff --git a/makefile b/makefile
index 1d1a974..6691d8c 100644
--- a/makefile
+++ b/makefile
@@ -4,8 +4,10 @@ GITHASH=$(shell git rev-parse --short=8 HEAD)
GO_TAGS = sqlite_foreign_keys sqlite_json
GO_LDFLAGS = -s -w -X 'main.Version=$(VERSION)' -X 'main.GitHash=$(GITHASH)'
-export GOARCH ?= amd64
-export CGO_ENABLED = 1
+GO_FLAGS = -tags "$(GO_TAGS)" -ldflags="$(GO_LDFLAGS)"
+GO_FLAGS_GUI = -tags "$(GO_TAGS) gui" -ldflags="$(GO_LDFLAGS)"
+
+export CGO_ENABLED=1
build_default:
mkdir -p _output
@@ -27,8 +29,33 @@ build_windows:
windres -i src/platform/versioninfo.rc -O coff -o src/platform/versioninfo.syso
GOOS=windows go build -tags "$(GO_TAGS) windows" -ldflags="$(GO_LDFLAGS) -H windowsgui" -o _output/windows/yarr.exe ./cmd/yarr
+etc/icon.icns: etc/icon_macos.png
+ mkdir -p etc/icon.iconset
+ sips -s format png --resampleWidth 1024 etc/icon_macos.png --out etc/icon.iconset/icon_512x512@2x.png
+ sips -s format png --resampleWidth 512 etc/icon_macos.png --out etc/icon.iconset/icon_512x512.png
+ sips -s format png --resampleWidth 256 etc/icon_macos.png --out etc/icon.iconset/icon_256x256.png
+ sips -s format png --resampleWidth 128 etc/icon_macos.png --out etc/icon.iconset/icon_128x128.png
+ sips -s format png --resampleWidth 64 etc/icon_macos.png --out etc/icon.iconset/icon_32x32@2x.png
+ sips -s format png --resampleWidth 32 etc/icon_macos.png --out etc/icon.iconset/icon_32x32.png
+ sips -s format png --resampleWidth 16 etc/icon_macos.png --out etc/icon.iconset/icon_16x16.png
+ iconutil -c icns etc/icon.iconset -o etc/icon.icns
+
+darwin_arm64_gui: etc/icon.icns
+ mkdir -p out/$@
+ CGOGOOS=darwin GOARCH=arm64 go build $(GO_FLAGS_GUI) -o out/$@/yarr ./cmd/yarr
+ ./etc/macos_package.sh $(VERSION) etc/icon.icns out/$@/yarr out/$@
+
+darwin_amd64_gui: etc/icon.icns
+ mkdir -p out/$@
+ GOOS=darwin GOARCH=amd64 go build $(GO_FLAGS_GUI) -o out/$@/yarr ./cmd/yarr
+ ./etc/macos_package.sh $(VERSION) etc/icon.icns out/$@/yarr out/$@
+
serve:
- go run -tags "$(GO_TAGS)" ./cmd/yarr -db local.db
+ go run $(GO_FLAGS) ./cmd/yarr -db local.db
test:
- go test -tags "$(GO_TAGS)" ./...
+ go test $(GO_FLAGS) ./...
+
+.PHONY: serve test \
+ mac_amd64_gui \
+ mac_arm64_gui
diff --git a/src/platform/fixconsole_default.go b/src/platform/fixconsole_default.go
index 8b2c9c4..89eafa4 100644
--- a/src/platform/fixconsole_default.go
+++ b/src/platform/fixconsole_default.go
@@ -1,5 +1,4 @@
//go:build !windows
-// +build !windows
package platform
diff --git a/src/platform/fixconsole_windows.go b/src/platform/fixconsole_windows.go
index 39ea588..faba404 100644
--- a/src/platform/fixconsole_windows.go
+++ b/src/platform/fixconsole_windows.go
@@ -1,3 +1,5 @@
+//go:build windows
+
package platform
import (
diff --git a/src/platform/gui.go b/src/platform/gui.go
index 9920761..4e2e6e7 100644
--- a/src/platform/gui.go
+++ b/src/platform/gui.go
@@ -1,5 +1,4 @@
-//go:build macos || windows
-// +build macos windows
+//go:build (darwin || windows) && gui
package platform
diff --git a/src/platform/guiless.go b/src/platform/guiless.go
index 58c1414..906114c 100644
--- a/src/platform/guiless.go
+++ b/src/platform/guiless.go
@@ -1,5 +1,4 @@
-//go:build !windows && !macos
-// +build !windows,!macos
+//go:build !gui
package platform
diff --git a/src/platform/icon_mac.go b/src/platform/icon_mac.go
index 1840f9e..edd4dca 100644
--- a/src/platform/icon_mac.go
+++ b/src/platform/icon_mac.go
@@ -1,5 +1,4 @@
-//go:build macos
-// +build macos
+//go:build darwin && gui
package platform
diff --git a/src/platform/icon_win.go b/src/platform/icon_win.go
index aef6bcd..b1f7cb3 100644
--- a/src/platform/icon_win.go
+++ b/src/platform/icon_win.go
@@ -1,5 +1,4 @@
-//go:build windows
-// +build windows
+//go:build windows && gui
package platform
diff --git a/src/platform/open_etc.go b/src/platform/open_etc.go
index de5e978..020c9d8 100644
--- a/src/platform/open_etc.go
+++ b/src/platform/open_etc.go
@@ -1,5 +1,4 @@
-//go:build !windows && !darwin
-// +build !windows,!darwin
+//go:build linux
package platform
diff --git a/src/platform/open_mac.go b/src/platform/open_mac.go
index 7d7ae20..3ba9786 100644
--- a/src/platform/open_mac.go
+++ b/src/platform/open_mac.go
@@ -1,5 +1,4 @@
//go:build darwin
-// +build darwin
package platform
diff --git a/src/platform/open_win.go b/src/platform/open_win.go
index c4f01eb..e6eb41b 100644
--- a/src/platform/open_win.go
+++ b/src/platform/open_win.go
@@ -1,5 +1,4 @@
//go:build windows
-// +build windows
package platform