aboutsummaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile220
1 files changed, 220 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..f023892
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,220 @@
+# hoardom makefile
+# supports: make, make install, make deb, make pkg, make clean
+
+NAME := hoardom
+VERSION := $(shell grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/')
+DESCRIPTION := Domain hoarding made less painful
+MAINTAINER := crt
+
+PREFIX ?= /usr/local
+BINDIR := $(PREFIX)/bin
+DATADIR := $(PREFIX)/share
+APPDIR := $(DATADIR)/applications
+ICONDIR := $(DATADIR)/icons/hicolor/256x256/apps
+ICON_FILE := dist/AppIcon.ico
+
+CARGO ?= cargo
+CARGO_FLAGS ?=
+
+BUILDDIR := target/release
+BINARY := $(BUILDDIR)/$(NAME)
+GUI_BINARY := $(BUILDDIR)/$(NAME)-app
+
+# packaging scratch dirs
+PKG_ROOT := target/pkg-root
+DEB_ROOT := target/deb-root
+MAC_ROOT := target/mac-root
+MAC_APP := target/mac-root/$(NAME).app
+
+# ---- build ----
+
+.PHONY: all build release debug clean install uninstall deb pkg app
+
+all: release
+
+release:
+ $(CARGO) build --release $(CARGO_FLAGS)
+
+debug:
+ $(CARGO) build $(CARGO_FLAGS)
+
+# build the gui wrapper (requires gui feature)
+app: release
+ $(CARGO) build --release --features gui $(CARGO_FLAGS)
+
+# ---- install (linux / mac) ----
+
+install: release
+ @echo "installing $(NAME) to $(DESTDIR)$(BINDIR)"
+ install -d $(DESTDIR)$(BINDIR)
+ install -m 755 $(BINARY) $(DESTDIR)$(BINDIR)/$(NAME)
+ @# install gui wrapper too if it was built
+ @if [ -f $(GUI_BINARY) ]; then \
+ install -m 755 $(GUI_BINARY) $(DESTDIR)$(BINDIR)/$(NAME)-app; \
+ fi
+ifeq ($(shell uname), Darwin)
+ @echo "installing macOS app bundle"
+ install -d $(DESTDIR)/Applications
+ $(MAKE) _mac_app APP_DEST=$(DESTDIR)/Applications
+else
+ @echo "installing desktop file"
+ install -d $(DESTDIR)$(APPDIR)
+ install -m 644 dist/$(NAME).desktop $(DESTDIR)$(APPDIR)/$(NAME).desktop
+ install -d $(DESTDIR)$(ICONDIR)
+ install -m 644 $(ICON_FILE) $(DESTDIR)$(ICONDIR)/$(NAME).ico
+endif
+ @echo "done, $(NAME) is ready to go"
+
+uninstall:
+ rm -f $(DESTDIR)$(BINDIR)/$(NAME)
+ rm -f $(DESTDIR)$(BINDIR)/$(NAME)-app
+ rm -f $(DESTDIR)$(APPDIR)/$(NAME).desktop
+ rm -f $(DESTDIR)$(ICONDIR)/$(NAME).ico
+ifeq ($(shell uname), Darwin)
+ rm -rf $(DESTDIR)/Applications/$(NAME).app
+endif
+ @echo "uninstalled"
+
+# ---- debian .deb package ----
+
+deb: release
+ @echo "building deb package v$(VERSION)"
+ rm -rf $(DEB_ROOT)
+
+ # binary
+ install -d $(DEB_ROOT)/usr/bin
+ install -m 755 $(BINARY) $(DEB_ROOT)/usr/bin/$(NAME)
+
+ # desktop file + icon
+ install -d $(DEB_ROOT)/usr/share/applications
+ install -m 644 dist/$(NAME).desktop $(DEB_ROOT)/usr/share/applications/$(NAME).desktop
+ install -d $(DEB_ROOT)/usr/share/icons/hicolor/256x256/apps
+ install -m 644 $(ICON_FILE) $(DEB_ROOT)/usr/share/icons/hicolor/256x256/apps/$(NAME).ico
+
+ # control file
+ install -d $(DEB_ROOT)/DEBIAN
+ printf 'Package: $(NAME)\n\
+Version: $(VERSION)\n\
+Section: utils\n\
+Priority: optional\n\
+Architecture: $(shell dpkg --print-architecture 2>/dev/null || echo amd64)\n\
+Maintainer: $(MAINTAINER)\n\
+Description: $(DESCRIPTION)\n\
+ TUI and CLI tool for searching domain availability across TLD lists.\n\
+ Includes favorites, scratchpad, export, and custom list support.\n' > $(DEB_ROOT)/DEBIAN/control
+
+ dpkg-deb --build --root-owner-group $(DEB_ROOT) target/$(NAME)_$(VERSION)_$(shell dpkg --print-architecture 2>/dev/null || echo amd64).deb
+ @echo "deb built: target/$(NAME)_$(VERSION)_*.deb"
+
+# ---- macOS .pkg package ----
+
+pkg: app
+ @echo "building macOS pkg v$(VERSION)"
+ rm -rf $(PKG_ROOT) $(MAC_ROOT)
+
+ # cli binary package
+ install -d $(PKG_ROOT)/cli$(PREFIX)/bin
+ install -m 755 $(BINARY) $(PKG_ROOT)/cli$(PREFIX)/bin/$(NAME)
+
+ pkgbuild \
+ --root $(PKG_ROOT)/cli \
+ --identifier ch.teleco.$(NAME).cli \
+ --version $(VERSION) \
+ --install-location / \
+ target/$(NAME)-cli.pkg
+
+ # app bundle package
+ install -d $(PKG_ROOT)/app
+ $(MAKE) _mac_app APP_DEST=$(PKG_ROOT)/app
+
+ pkgbuild \
+ --component $(PKG_ROOT)/app/$(NAME).app \
+ --identifier ch.teleco.$(NAME).app \
+ --version $(VERSION) \
+ --install-location /Applications \
+ target/$(NAME)-app.pkg
+
+ # distribution xml so the installer actually has permission to write to /Applications
+ printf '<?xml version="1.0" encoding="utf-8"?>\n\
+<installer-gui-script minSpecVersion="1">\n\
+ <title>$(NAME) $(VERSION)</title>\n\
+ <options customize="never" require-scripts="false"/>\n\
+ <domains enable_localSystem="true"/>\n\
+ <choices-outline>\n\
+ <line choice="cli"/>\n\
+ <line choice="app"/>\n\
+ </choices-outline>\n\
+ <choice id="cli" title="CLI Tool">\n\
+ <pkg-ref id="ch.teleco.$(NAME).cli"/>\n\
+ </choice>\n\
+ <choice id="app" title="App Bundle">\n\
+ <pkg-ref id="ch.teleco.$(NAME).app"/>\n\
+ </choice>\n\
+ <pkg-ref id="ch.teleco.$(NAME).cli" version="$(VERSION)" installKBytes="$(shell echo $$(( $$(stat -f%z $(BINARY)) / 1024 )))">#$(NAME)-cli.pkg</pkg-ref>\n\
+ <pkg-ref id="ch.teleco.$(NAME).app" version="$(VERSION)" installKBytes="$(shell echo $$(( $$(stat -f%z $(BINARY)) / 1024 )))">#$(NAME)-app.pkg</pkg-ref>\n\
+</installer-gui-script>\n' > $(PKG_ROOT)/distribution.xml
+
+ productbuild \
+ --distribution $(PKG_ROOT)/distribution.xml \
+ --package-path target \
+ target/$(NAME)-$(VERSION).pkg
+ rm -f target/$(NAME)-cli.pkg target/$(NAME)-app.pkg
+ rm -rf $(PKG_ROOT)
+ @echo "pkg built: target/$(NAME)-$(VERSION).pkg"
+
+# ---- internal: macOS .app bundle ----
+
+_mac_app:
+ @test -n "$(APP_DEST)" || (echo "APP_DEST not set" && exit 1)
+ install -d $(APP_DEST)/$(NAME).app/Contents/MacOS
+ install -d $(APP_DEST)/$(NAME).app/Contents/Resources
+
+ # gui wrapper as the executable (or shell launcher as fallback)
+ @if [ -f $(GUI_BINARY) ]; then \
+ echo "using native gui wrapper"; \
+ install -m 755 $(GUI_BINARY) $(APP_DEST)/$(NAME).app/Contents/MacOS/$(NAME)-app; \
+ else \
+ echo "gui wrapper not built, using shell launcher fallback"; \
+ install -m 755 dist/mac-launcher.sh $(APP_DEST)/$(NAME).app/Contents/MacOS/$(NAME)-app; \
+ fi
+
+ # the actual tui binary (gui wrapper spawns this, shell launcher also needs it)
+ install -m 755 $(BINARY) $(APP_DEST)/$(NAME).app/Contents/MacOS/$(NAME)
+
+ # Info.plist
+ printf '<?xml version="1.0" encoding="UTF-8"?>\n\
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n\
+<plist version="1.0">\n\
+<dict>\n\
+ <key>CFBundleExecutable</key>\n\
+ <string>$(NAME)-app</string>\n\
+ <key>CFBundleIdentifier</key>\n\
+ <string>ch.teleco.$(NAME)</string>\n\
+ <key>CFBundleName</key>\n\
+ <string>$(NAME)</string>\n\
+ <key>CFBundleDisplayName</key>\n\
+ <string>hoardom</string>\n\
+ <key>CFBundleVersion</key>\n\
+ <string>$(VERSION)</string>\n\
+ <key>CFBundleShortVersionString</key>\n\
+ <string>$(VERSION)</string>\n\
+ <key>CFBundlePackageType</key>\n\
+ <string>APPL</string>\n\
+ <key>CFBundleIconFile</key>\n\
+ <string>icon.icns</string>\n\
+ <key>LSMinimumSystemVersion</key>\n\
+ <string>10.12</string>\n\
+ <key>NSHighResolutionCapable</key>\n\
+ <true/>\n\
+</dict>\n\
+</plist>\n' > $(APP_DEST)/$(NAME).app/Contents/Info.plist
+
+ # app icon
+ cp dist/AppIcon.icns $(APP_DEST)/$(NAME).app/Contents/Resources/icon.icns
+
+# ---- clean ----
+
+clean:
+ $(CARGO) clean
+ rm -rf $(PKG_ROOT) $(DEB_ROOT) $(MAC_ROOT)
+ rm -f target/$(NAME)_*.deb target/$(NAME)-*.pkg