Makefile

# Developer entry points. Releases and the site deploy run in GitHub Actions
# (.github/workflows); nothing here needs credentials.

XCODEPROJ := Fader.xcodeproj
SCHEME    := Fader

# TCC keys permission grants to the signing identity; unsigned (ad-hoc)
# debug builds get pinned to the binary hash and re-prompt on every
# rebuild. Sign with the local Developer ID when present; contributors
# without the certificate fall back to no signing.
SIGN_ID := $(shell security find-identity -v -p codesigning 2>/dev/null \
	| grep -o '"Developer ID Application: [^"]*"' | head -1)
ifeq ($(SIGN_ID),)
SIGN_FLAGS := CODE_SIGNING_ALLOWED=NO
else
SIGN_FLAGS := CODE_SIGN_STYLE=Manual CODE_SIGN_IDENTITY=$(SIGN_ID)
endif

.PHONY: gen build test lint run clean icon og menubar-icon favicon

gen:
	xcodegen generate

build: gen
	xcodebuild -project $(XCODEPROJ) -scheme $(SCHEME) -configuration Debug \
		$(SIGN_FLAGS) build

test: gen
	xcodebuild -project $(XCODEPROJ) -scheme $(SCHEME) -configuration Debug \
		CODE_SIGNING_ALLOWED=NO test

# All linters and formatters live in .pre-commit-config.yaml; this is the
# same suite the commit hook and CI run.
lint:
	pre-commit run --all-files

run: build
	open "$$(xcodebuild -project $(XCODEPROJ) -scheme $(SCHEME) -configuration Debug \
		-showBuildSettings 2>/dev/null | awk '/ BUILT_PRODUCTS_DIR/{print $$3}')/Fader.app"

clean:
	rm -rf build dist $(XCODEPROJ)

# Regenerate the app icon from scripts/generate-icon.swift.
icon:
	swift scripts/generate-icon.swift /tmp/fader-icon-1024.png
	rm -rf /tmp/fader.iconset && mkdir -p /tmp/fader.iconset
	for size in 16 32 128 256 512; do \
		sips -z $$size $$size /tmp/fader-icon-1024.png --out /tmp/fader.iconset/icon_$${size}x$${size}.png > /dev/null; \
		sips -z $$((size * 2)) $$((size * 2)) /tmp/fader-icon-1024.png --out /tmp/fader.iconset/icon_$${size}x$${size}@2x.png > /dev/null; \
	done
	iconutil -c icns /tmp/fader.iconset -o Fader/Resources/Fader.icns

# Regenerate the menu bar template icon (1x + 2x).
menubar-icon:
	swift scripts/generate-menubar-icon.swift Fader/Resources

# Regenerate the site's Open Graph preview card.
og:
	swift scripts/generate-og.swift site/og.png
	pngquant --force --quality 65-85 --output site/og.png site/og.png

# Regenerate the site favicon (64 px covers 2x retina tabs; .ico for legacy /favicon.ico probers).
favicon:
	swift scripts/generate-favicon.swift /tmp/fader-favicon-1024.png
	sips -z 64 64 /tmp/fader-favicon-1024.png --out site/favicon.png > /dev/null
	pngquant --force --quality 65-85 --output site/favicon.png site/favicon.png
	python3 -c "from PIL import Image; Image.open('/tmp/fader-favicon-1024.png').save('site/favicon.ico', sizes=[(16,16),(32,32),(48,48)])"