Makefile 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. # hoardom makefile
  2. # supports: make, make install, make deb, make pkg, make clean
  3. NAME := hoardom
  4. VERSION := $(shell grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/')
  5. DESCRIPTION := Domain hoarding made less painful
  6. MAINTAINER := crt
  7. PREFIX ?= /usr/local
  8. BINDIR := $(PREFIX)/bin
  9. DATADIR := $(PREFIX)/share
  10. APPDIR := $(DATADIR)/applications
  11. ICONDIR := $(DATADIR)/icons/hicolor/256x256/apps
  12. ICON_FILE := dist/AppIcon.ico
  13. CARGO ?= cargo
  14. CARGO_FLAGS ?=
  15. BUILDDIR := target/release
  16. BINARY := $(BUILDDIR)/$(NAME)
  17. GUI_BINARY := $(BUILDDIR)/$(NAME)-app
  18. # packaging scratch dirs
  19. PKG_ROOT := target/pkg-root
  20. DEB_ROOT := target/deb-root
  21. MAC_ROOT := target/mac-root
  22. MAC_APP := target/mac-root/$(NAME).app
  23. # ---- build ----
  24. .PHONY: all build release debug clean install uninstall deb pkg app
  25. all: release
  26. release:
  27. $(CARGO) build --release $(CARGO_FLAGS)
  28. debug:
  29. $(CARGO) build $(CARGO_FLAGS)
  30. # build the gui wrapper (requires gui feature)
  31. app: release
  32. $(CARGO) build --release --features gui $(CARGO_FLAGS)
  33. # ---- install (linux / mac) ----
  34. install: release
  35. @echo "installing $(NAME) to $(DESTDIR)$(BINDIR)"
  36. install -d $(DESTDIR)$(BINDIR)
  37. install -m 755 $(BINARY) $(DESTDIR)$(BINDIR)/$(NAME)
  38. @# install gui wrapper too if it was built
  39. @if [ -f $(GUI_BINARY) ]; then \
  40. install -m 755 $(GUI_BINARY) $(DESTDIR)$(BINDIR)/$(NAME)-app; \
  41. fi
  42. ifeq ($(shell uname), Darwin)
  43. @echo "installing macOS app bundle"
  44. install -d $(DESTDIR)/Applications
  45. $(MAKE) _mac_app APP_DEST=$(DESTDIR)/Applications
  46. else
  47. @echo "installing desktop file"
  48. install -d $(DESTDIR)$(APPDIR)
  49. install -m 644 dist/$(NAME).desktop $(DESTDIR)$(APPDIR)/$(NAME).desktop
  50. install -d $(DESTDIR)$(ICONDIR)
  51. install -m 644 $(ICON_FILE) $(DESTDIR)$(ICONDIR)/$(NAME).ico
  52. endif
  53. @echo "done, $(NAME) is ready to go"
  54. uninstall:
  55. rm -f $(DESTDIR)$(BINDIR)/$(NAME)
  56. rm -f $(DESTDIR)$(BINDIR)/$(NAME)-app
  57. rm -f $(DESTDIR)$(APPDIR)/$(NAME).desktop
  58. rm -f $(DESTDIR)$(ICONDIR)/$(NAME).ico
  59. ifeq ($(shell uname), Darwin)
  60. rm -rf $(DESTDIR)/Applications/$(NAME).app
  61. endif
  62. @echo "uninstalled"
  63. # ---- debian .deb package ----
  64. deb: release
  65. @echo "building deb package v$(VERSION)"
  66. rm -rf $(DEB_ROOT)
  67. # binary
  68. install -d $(DEB_ROOT)/usr/bin
  69. install -m 755 $(BINARY) $(DEB_ROOT)/usr/bin/$(NAME)
  70. # desktop file + icon
  71. install -d $(DEB_ROOT)/usr/share/applications
  72. install -m 644 dist/$(NAME).desktop $(DEB_ROOT)/usr/share/applications/$(NAME).desktop
  73. install -d $(DEB_ROOT)/usr/share/icons/hicolor/256x256/apps
  74. install -m 644 $(ICON_FILE) $(DEB_ROOT)/usr/share/icons/hicolor/256x256/apps/$(NAME).ico
  75. # control file
  76. install -d $(DEB_ROOT)/DEBIAN
  77. printf 'Package: $(NAME)\n\
  78. Version: $(VERSION)\n\
  79. Section: utils\n\
  80. Priority: optional\n\
  81. Architecture: $(shell dpkg --print-architecture 2>/dev/null || echo amd64)\n\
  82. Maintainer: $(MAINTAINER)\n\
  83. Description: $(DESCRIPTION)\n\
  84. TUI and CLI tool for searching domain availability across TLD lists.\n\
  85. Includes favorites, scratchpad, export, and custom list support.\n' > $(DEB_ROOT)/DEBIAN/control
  86. dpkg-deb --build --root-owner-group $(DEB_ROOT) target/$(NAME)_$(VERSION)_$(shell dpkg --print-architecture 2>/dev/null || echo amd64).deb
  87. @echo "deb built: target/$(NAME)_$(VERSION)_*.deb"
  88. # ---- macOS .pkg package ----
  89. pkg: app
  90. @echo "building macOS pkg v$(VERSION)"
  91. rm -rf $(PKG_ROOT) $(MAC_ROOT)
  92. # cli binary package
  93. install -d $(PKG_ROOT)/cli$(PREFIX)/bin
  94. install -m 755 $(BINARY) $(PKG_ROOT)/cli$(PREFIX)/bin/$(NAME)
  95. pkgbuild \
  96. --root $(PKG_ROOT)/cli \
  97. --identifier ch.teleco.$(NAME).cli \
  98. --version $(VERSION) \
  99. --install-location / \
  100. target/$(NAME)-cli.pkg
  101. # app bundle package
  102. install -d $(PKG_ROOT)/app
  103. $(MAKE) _mac_app APP_DEST=$(PKG_ROOT)/app
  104. pkgbuild \
  105. --component $(PKG_ROOT)/app/$(NAME).app \
  106. --identifier ch.teleco.$(NAME).app \
  107. --version $(VERSION) \
  108. --install-location /Applications \
  109. target/$(NAME)-app.pkg
  110. # distribution xml so the installer actually has permission to write to /Applications
  111. printf '<?xml version="1.0" encoding="utf-8"?>\n\
  112. <installer-gui-script minSpecVersion="1">\n\
  113. <title>$(NAME) $(VERSION)</title>\n\
  114. <options customize="never" require-scripts="false"/>\n\
  115. <domains enable_localSystem="true"/>\n\
  116. <choices-outline>\n\
  117. <line choice="cli"/>\n\
  118. <line choice="app"/>\n\
  119. </choices-outline>\n\
  120. <choice id="cli" title="CLI Tool">\n\
  121. <pkg-ref id="ch.teleco.$(NAME).cli"/>\n\
  122. </choice>\n\
  123. <choice id="app" title="App Bundle">\n\
  124. <pkg-ref id="ch.teleco.$(NAME).app"/>\n\
  125. </choice>\n\
  126. <pkg-ref id="ch.teleco.$(NAME).cli" version="$(VERSION)" installKBytes="$(shell echo $$(( $$(stat -f%z $(BINARY)) / 1024 )))">#$(NAME)-cli.pkg</pkg-ref>\n\
  127. <pkg-ref id="ch.teleco.$(NAME).app" version="$(VERSION)" installKBytes="$(shell echo $$(( $$(stat -f%z $(BINARY)) / 1024 )))">#$(NAME)-app.pkg</pkg-ref>\n\
  128. </installer-gui-script>\n' > $(PKG_ROOT)/distribution.xml
  129. productbuild \
  130. --distribution $(PKG_ROOT)/distribution.xml \
  131. --package-path target \
  132. target/$(NAME)-$(VERSION).pkg
  133. rm -f target/$(NAME)-cli.pkg target/$(NAME)-app.pkg
  134. rm -rf $(PKG_ROOT)
  135. @echo "pkg built: target/$(NAME)-$(VERSION).pkg"
  136. # ---- internal: macOS .app bundle ----
  137. _mac_app:
  138. @test -n "$(APP_DEST)" || (echo "APP_DEST not set" && exit 1)
  139. install -d $(APP_DEST)/$(NAME).app/Contents/MacOS
  140. install -d $(APP_DEST)/$(NAME).app/Contents/Resources
  141. # gui wrapper as the executable (or shell launcher as fallback)
  142. @if [ -f $(GUI_BINARY) ]; then \
  143. echo "using native gui wrapper"; \
  144. install -m 755 $(GUI_BINARY) $(APP_DEST)/$(NAME).app/Contents/MacOS/$(NAME)-app; \
  145. else \
  146. echo "gui wrapper not built, using shell launcher fallback"; \
  147. install -m 755 dist/mac-launcher.sh $(APP_DEST)/$(NAME).app/Contents/MacOS/$(NAME)-app; \
  148. fi
  149. # the actual tui binary (gui wrapper spawns this, shell launcher also needs it)
  150. install -m 755 $(BINARY) $(APP_DEST)/$(NAME).app/Contents/MacOS/$(NAME)
  151. # Info.plist
  152. printf '<?xml version="1.0" encoding="UTF-8"?>\n\
  153. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n\
  154. <plist version="1.0">\n\
  155. <dict>\n\
  156. <key>CFBundleExecutable</key>\n\
  157. <string>$(NAME)-app</string>\n\
  158. <key>CFBundleIdentifier</key>\n\
  159. <string>ch.teleco.$(NAME)</string>\n\
  160. <key>CFBundleName</key>\n\
  161. <string>$(NAME)</string>\n\
  162. <key>CFBundleDisplayName</key>\n\
  163. <string>hoardom</string>\n\
  164. <key>CFBundleVersion</key>\n\
  165. <string>$(VERSION)</string>\n\
  166. <key>CFBundleShortVersionString</key>\n\
  167. <string>$(VERSION)</string>\n\
  168. <key>CFBundlePackageType</key>\n\
  169. <string>APPL</string>\n\
  170. <key>CFBundleIconFile</key>\n\
  171. <string>icon.icns</string>\n\
  172. <key>LSMinimumSystemVersion</key>\n\
  173. <string>10.12</string>\n\
  174. <key>NSHighResolutionCapable</key>\n\
  175. <true/>\n\
  176. </dict>\n\
  177. </plist>\n' > $(APP_DEST)/$(NAME).app/Contents/Info.plist
  178. # app icon
  179. cp dist/AppIcon.icns $(APP_DEST)/$(NAME).app/Contents/Resources/icon.icns
  180. # ---- clean ----
  181. clean:
  182. $(CARGO) clean
  183. rm -rf $(PKG_ROOT) $(DEB_ROOT) $(MAC_ROOT)
  184. rm -f target/$(NAME)_*.deb target/$(NAME)-*.pkg