main
  1# Makefile for home
  2HOSTS          = $(shell nix flake show --json --all-systems 2>/dev/null | yq '.nixosConfigurations.[] | key')
  3HOSTS_BUILD    = $(addprefix host/, $(addsuffix /build,$(HOSTS)))
  4
  5.PHONY: all
  6all: help
  7
  8.PHONY: help
  9help: ## Show this help message
 10	@echo 'Usage: make [target]'
 11	@echo ''
 12	@echo 'Available targets:'
 13	@awk 'BEGIN {FS = ":.*##"} \
 14		/^[a-zA-Z_\/%-]+:.*?##/ { printf "  %-30s %s\n", $$1, $$2 } \
 15		/^##@/ { printf "\n%s\n", substr($$0, 5) }' $(MAKEFILE_LIST)
 16
 17##@ Host Operations (Remote)
 18
 19.PHONY: hosts
 20hosts: ${HOSTS_BUILD} ## List and build all hosts
 21	echo ${HOSTS_BUILD} ${HOSTS}
 22
 23host/%/build: FORCE ## Build a specific remote host (e.g., make host/demeter/build)
 24	nix build .#nixosConfigurations.$*.config.system.build.toplevel --no-link
 25
 26host/%/boot: FORCE ## Deploy to remote host and activate on next boot (e.g., make host/demeter/boot)
 27	nixos-rebuild --target-host root@$*.sbr.pm --flake .#$* boot
 28
 29host/%/switch: FORCE ## Deploy to remote host and activate immediately (e.g., make host/demeter/switch)
 30	nixos-rebuild --target-host root@$*.sbr.pm --flake .#$* switch
 31
 32# Host-specific overrides (non-standard DNS/network)
 33.PHONY: host/sakhalin/build
 34host/sakhalin/build: ## Build Home Manager and generated host files for Sakhalin
 35	nix build .#homeConfigurations.vincent@sakhalin.activationPackage --no-link
 36	nix build .#fedoraConfigs.sakhalin --no-link
 37
 38.PHONY: host/sakhalin/switch
 39host/sakhalin/switch: ## Deploy generated host files and switch Home Manager on Sakhalin
 40	nix build .#fedoraConfigs.sakhalin
 41	sudo ./result/deploy
 42	nix run home-manager -- switch --flake .#vincent@sakhalin -b backup
 43
 44.PHONY: host/nagoya/build
 45host/nagoya/build: ## Build Home Manager and generated host files for Nagoya
 46	nix build .#homeConfigurations.vincent@nagoya.activationPackage --no-link
 47	nix build .#hostConfigs.nagoya --no-link
 48
 49.PHONY: host/nagoya/switch
 50host/nagoya/switch: ## Deploy generated host files and switch Home Manager on Nagoya
 51	nix build .#hostConfigs.nagoya
 52	sudo ./result/deploy
 53	nix run home-manager -- switch --flake .#vincent@nagoya -b backup
 54
 55.PHONY: host/kobe/boot
 56host/kobe/boot:
 57	nixos-rebuild --target-host root@192.168.1.77 --flake .#kobe boot
 58
 59.PHONY: host/aix/boot
 60host/aix/boot:
 61	nixos-rebuild --target-host root@10.100.0.89 --flake .#aix boot
 62
 63.PHONY: host/carthage/boot
 64host/carthage/boot:
 65	nixos-rebuild --target-host root@carthage.vpn --flake .#carthage boot
 66
 67.PHONY: host/carthage/switch
 68host/carthage/switch:
 69	nixos-rebuild --target-host root@carthage.vpn --flake .#carthage switch
 70
 71##@ Home Manager (non-NixOS hosts)
 72
 73home/%/switch: FORCE ## Switch a home-manager config (e.g., make home/vdemeest@aomi/switch)
 74	nix run home-manager -- switch --flake .#$* -b backup
 75
 76.PHONY: host/aomi/build
 77host/aomi/build: ## Build home-manager + fedora configs for aomi
 78	nix build .#homeConfigurations.vdemeest@aomi.activationPackage --no-link
 79	nix build .#fedoraConfigs.aomi --no-link
 80
 81.PHONY: host/aomi/switch
 82host/aomi/switch: home/vdemeest@aomi/switch ## Switch home-manager for aomi
 83
 84.PHONY: host/kyushu/build
 85host/kyushu/build: ## Build home-manager + fedora configs for kyushu
 86	nix build .#homeConfigurations.vdemeest@kyushu.activationPackage --no-link
 87	nix build .#fedoraConfigs.kyushu --no-link
 88
 89.PHONY: host/kyushu/switch
 90host/kyushu/switch: home/vdemeest@kyushu/switch ## Switch home-manager for kyushu
 91
 92##@ Local System Operations
 93
 94.PHONY: boot
 95boot: ## Build and activate local system on next boot
 96	sudo nixos-rebuild --flake .# boot
 97
 98.PHONY: switch
 99switch: ## Build and activate local system immediately
100	sudo nixos-rebuild --flake .# switch
101
102.PHONY: dry-build
103dry-build: ## Test build local system without activating
104	nixos-rebuild --flake .# dry-build
105
106.PHONY: build
107build: ## Build local system without activating
108	nixos-rebuild --flake .# build
109
110##@ Development
111
112.PHONY: pre-commit
113pre-commit: fmt ## Run pre-commit checks (formatting)
114
115.PHONY: fmt
116fmt: ## Format Nix files
117	nixfmt-plus
118
119##@ Dotfiles
120
121.PHONY: dots
122dots: ## Build dotfiles
123	@$(MAKE) -C dots
124
125.PHONY: android/ssh-config
126android/ssh-config: ## Generate Android SSH config from globals.nix
127	nix eval --raw -f android/common/generate-ssh-config.nix > android/common/ssh_config
128	@echo "✅ android/common/ssh_config regenerated"
129
130##@ Keyboards
131
132.PHONY: keyboards keyboards/moonlander/build keyboards/moonlander/flash keyboards/moonlander/update keyboards/moonlander/clean
133.PHONY: keyboards/eyelash_corne/build keyboards/eyelash_corne/flash
134.PHONY: keyboards/draw keyboards/moonlander/draw keyboards/eyelash_corne/draw
135
136keyboards: ## Show keyboard-specific help
137	@$(MAKE) -C keyboards help
138
139keyboards/moonlander/build: ## Build Moonlander QMK firmware
140	@$(MAKE) -C keyboards moonlander/build
141
142keyboards/moonlander/flash: ## Flash Moonlander firmware
143	@$(MAKE) -C keyboards moonlander/flash
144
145keyboards/moonlander/update: ## Update Moonlander QMK repository
146	@$(MAKE) -C keyboards moonlander/update
147
148keyboards/moonlander/clean: ## Clean Moonlander build artifacts
149	@$(MAKE) -C keyboards moonlander/clean
150
151keyboards/eyelash_corne/build: ## Build Eyelash Corne ZMK firmware
152	@$(MAKE) -C keyboards eyelash_corne/build
153
154keyboards/eyelash_corne/flash: ## Flash Eyelash Corne firmware
155	@$(MAKE) -C keyboards eyelash_corne/flash
156
157keyboards/draw: ## Generate keymap SVGs for all keyboards
158	@$(MAKE) -C keyboards draw
159
160keyboards/moonlander/draw: ## Generate Moonlander keymap SVG
161	@$(MAKE) -C keyboards moonlander/draw
162
163keyboards/eyelash_corne/draw: ## Generate Eyelash Corne keymap SVG
164	@$(MAKE) -C keyboards eyelash_corne/draw
165
166##@ DNS Management
167
168.PHONY: dns-show
169dns-show: ## Show current DNS records
170	@bash tools/show-dns.sh
171
172.PHONY: dns-update-gandi
173dns-update-gandi: ## Update Gandi DNS records
174	@bash tools/update-gandi-dns.sh
175
176.PHONY: dns-update-gandi-dry-run
177dns-update-gandi-dry-run: ## Dry-run Gandi DNS update
178	@bash tools/update-gandi-dns.sh --dry-run
179
180##@ Alpine Diskless Appliances
181
182.PHONY: alpine/generate
183alpine/generate: ## Generate DNS zones and WireGuard configs from Nix
184	nix build .#dns-zones -o alpine/generated/zones
185	nix build .#wg-configs -o alpine/generated/wireguard
186
187alpine/build/%: alpine/generate ## Build Alpine appliance (e.g. alpine/build/athena)
188	./alpine/build.sh $*
189
190alpine/deploy/%: ## Deploy Alpine appliance to host (e.g. alpine/deploy/athena)
191	./alpine/deploy.sh $* update
192
193alpine/test/%: ## Test Alpine appliance in QEMU (e.g. alpine/test/athena)
194	./alpine/test.sh $*
195
196alpine/stop/%: ## Stop QEMU test for a host (e.g. alpine/stop/athena)
197	./alpine/test.sh $* stop
198
199alpine/validate/%: ## Validate running QEMU test (e.g. alpine/validate/athena)
200	./alpine/test.sh $* validate
201
202alpine/flash/%: ## Flash SD card for a host (e.g. alpine/flash/athena DEVICE=/dev/sda)
203	./alpine/flash.sh $* $(DEVICE)
204
205.PHONY: alpine/all
206alpine/all: alpine/build/athena alpine/build/demeter alpine/build/aix ## Build all Alpine appliances
207
208##@ Maintenance
209
210.PHONY: clean
211clean: clean-system clean-results ## Clean old generations and build results
212
213.PHONY: clean-system
214clean-system: ## Delete system generations older than 15 days
215	sudo nix-env --profile /nix/var/nix/profiles/system --delete-generations 15d
216
217.PHONY: clean-results
218clean-results: ## Remove build result symlinks
219	rm -f result result-*
220
221.PHONY: update
222update: ## Update flake inputs
223	nix flake update
224
225FORCE: