forked from himmelblau-idm/himmelblau
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
298 lines (265 loc) · 12.7 KB
/
Copy pathMakefile
File metadata and controls
298 lines (265 loc) · 12.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
SHELL := /bin/bash
all: .packaging dockerfiles ## Auto-detect host distro and build packages just for this host
@set -euo pipefail; \
. /etc/os-release; \
ID="$${ID}"; VER="$${VERSION_ID}"; LIKE="$${ID_LIKE:-}"; \
TARGET=""; \
echo "Detecting host distro: ID=$$ID VERSION_ID=$$VER ID_LIKE=$$LIKE"; \
case "$$ID" in \
ubuntu) case "$$VER" in 22.04*) TARGET="ubuntu22.04" ;; 24.04*) TARGET="ubuntu24.04" ;; esac ;; \
linuxmint) case "$$VER" in 21.*) TARGET="ubuntu22.04" ;; 22*|23*) TARGET="ubuntu24.04" ;; esac ;; \
debian) case "$$VER" in 12*|12.*) TARGET="debian12" ;; 13*|13.*) TARGET="debian13" ;; esac ;; \
rocky|almalinux|rhel|ol|oraclelinux|centos|centos_stream|centos-stream) \
major=$$(echo "$$VER" | awk -F. '{print $$1}'); \
case "$$major" in 8) TARGET="rocky8" ;; 9) TARGET="rocky9" ;; 10) TARGET="rocky10" ;; esac ;; \
fedora) case "$$VER" in 42*) TARGET="fedora42" ;; 43*) TARGET="fedora43" ;; *) TARGET="rawhide" ;; esac ;; \
sles|sled|sle_micro|suse|suse-linux-enterprise) \
case "$$VER" in 15.6*|15-SP6*) TARGET="sle15sp6" ;; 15.7*|15-SP7*) TARGET="sle15sp7" ;; 16*|16.*) TARGET="sle16" ;; esac ;; \
opensuse-leap) case "$$VER" in 15.6*) TARGET="sle15sp6" ;; 15.7*) TARGET="sle15sp7" ;; esac ;; \
opensuse-tumbleweed) TARGET="tumbleweed" ;; \
esac; \
if [ -z "$$TARGET" ]; then echo "Error: unsupported or unmapped distro: $$ID $$VER"; exit 2; fi; \
all_targets="$(ALL_PACKAGE_TARGETS)"; \
case " $${all_targets} " in *" $$TARGET "*) ;; \
*) echo "Error: no packaging rule for '$$TARGET' (supported: $${all_targets})"; exit 3 ;; esac; \
echo "Building packages for target '$$TARGET'…"; \
$(MAKE) $$TARGET; \
echo "Packages written to ./packaging/"
test: dockerfiles ## Run cargo tests in a container
mkdir -p target/test
$(DOCKER) build -t himmelblau-test-build -f images/Dockerfile.test .
$(DOCKER) run --rm --security-opt label=disable -it \
-v $(CURDIR):/himmelblau \
-v $(CURDIR)/target/test:/himmelblau/target \
himmelblau-test-build
clean: ## Remove cargo build artifacts
cargo clean
PLATFORM := $(shell grep '^ID=' /etc/os-release | awk -F= '{ print $$2 }' | tr -d '"')
DOCKER := $(shell command -v podman || command -v docker)
NIX := $(shell command -v nix)
# Optional: Mount local libhimmelblau for development testing
# Usage: LIBHIMMELBLAU_LOCAL=/path/to/libhimmelblau make ubuntu24.04
ifdef LIBHIMMELBLAU_LOCAL
LIBHIMMELBLAU_MOUNT := -v $(LIBHIMMELBLAU_LOCAL):/libhimmelblau
LIBHIMMELBLAU_BUILD_ARG := --build-arg "CARGO_PATCH_ARG=--config 'patch.crates-io.libhimmelblau.path=\"/libhimmelblau\"'"
PATCH_LIBHIMMELBLAU := --patch-libhimmelblau
$(info Using local libhimmelblau from: $(LIBHIMMELBLAU_LOCAL))
$(info LIBHIMMELBLAU_BUILD_ARG: $(LIBHIMMELBLAU_BUILD_ARG))
else
LIBHIMMELBLAU_MOUNT :=
LIBHIMMELBLAU_BUILD_ARG :=
PATCH_LIBHIMMELBLAU :=
endif
.packaging:
mkdir -p ./packaging/
nix: .packaging ## Build Nix packages into ./packaging/
echo "Building nix packages"
for v in himmelblau himmelblau-desktop; do \
$(NIX) --extra-experimental-features 'nix-command flakes' build ".#$$v" --out-link ./packaging/nix-$$v-result; \
done
DEB_TARGETS := ubuntu22.04 ubuntu24.04 debian12 debian13
RPM_TARGETS := rocky8 rocky9 rocky10 tumbleweed rawhide fedora42 fedora43
SLE_TARGETS := sle15sp6 sle15sp7 sle16
ALL_PACKAGE_TARGETS := $(DEB_TARGETS) $(RPM_TARGETS) $(SLE_TARGETS)
install: ## Install packages from ./packaging onto this host (apt/dnf/yum/zypper auto-detected)
@set -euo pipefail; \
. /etc/os-release; \
ID="$${ID}"; VER="$${VERSION_ID}"; \
PKGTYPE=""; RPM_SUFFIX=""; INSTALL_CMD=""; \
case "$$ID" in \
ubuntu|linuxmint|debian) \
PKGTYPE="deb"; INSTALL_CMD='apt-get update && apt-get install -y ./packaging/*.deb' ;; \
rocky|almalinux|rhel|ol|oraclelinux|centos|centos_stream|centos-stream|fedora|sles|sled|sle_micro|suse|suse-linux-enterprise|opensuse-leap|opensuse-tumbleweed) \
PKGTYPE="rpm"; INSTALL_CMD='(command -v dnf >/dev/null && dnf -y install ./packaging/*.rpm) || \
(command -v yum >/dev/null && yum -y localinstall ./packaging/*.rpm) || \
(command -v zypper >/dev/null && zypper --non-interactive --no-gpg-checks in ./packaging/*.rpm)';; \
esac; \
if [ -z "$$PKGTYPE" ]; then echo "Error: unknown distro family for install"; exit 2; fi; \
if [ "$$PKGTYPE" = "deb" ]; then \
ls ./packaging/*.deb >/dev/null 2>&1 || { echo "Error: no .deb packages in ./packaging/ — run 'make' first"; exit 4; }; \
else \
ls ./packaging/*.rpm >/dev/null 2>&1 || { echo "Error: no .rpm packages in ./packaging/ — run 'make' first"; exit 4; }; \
fi; \
echo "Installing from ./packaging/…"; \
sh -c "$$INSTALL_CMD"; \
echo "Install complete."
uninstall: ## Uninstall Himmelblau packages from this host (apt/dnf/yum/zypper auto-detected)
@set -e; \
PM=""; PKGTYPE=""; \
if command -v apt-get >/dev/null 2>&1; then \
PKGTYPE="deb"; PM="sudo apt-get remove -y"; \
elif command -v dnf >/dev/null 2>&1; then \
PKGTYPE="rpm"; PM="sudo dnf remove -y"; \
elif command -v yum >/dev/null 2>&1; then \
PKGTYPE="rpm"; PM="sudo yum remove -y"; \
elif command -v zypper >/dev/null 2>&1; then \
PKGTYPE="rpm"; PM="sudo zypper rm -y"; \
else \
echo "Error: no supported package manager found (apt/dnf/yum/zypper)."; exit 2; \
fi; \
pkgs="himmelblau himmelblau-qr-greeter himmelblau-selinux himmelblau-sshd-config himmelblau-sso nss-himmelblau pam-himmelblau"; \
echo "Removing: $$pkgs"; \
$$PM $$pkgs; \
echo "Uninstall complete."
dockerfiles:
python3 scripts/gen_dockerfiles.py --out ./images/ $(PATCH_LIBHIMMELBLAU)
deb-servicefiles:
python3 ./scripts/gen_servicefiles.py --out ./platform/debian/
rpm-servicefiles:
python3 ./scripts/gen_servicefiles.py --out ./platform/opensuse/
authselect:
python3 ./scripts/gen_authselect.py --root=./ --aad-tool=./target/release/aad-tool --output-dir=./platform/el/authselect/
.PHONY: package deb rpm $(DEB_TARGETS) $(RPM_TARGETS) ${SLE_TARGETS} dockerfiles deb-servicefiles rpm-servicefiles authselect install uninstall help sbom
check-licenses: ## Validate dependant licenses comply with GPLv3
cargo deny -V >/dev/null || (echo "cargo-deny required" && cargo install cargo-deny)
cargo deny --all-features check licenses
vet: ## Vet Dependencies
cargo vet -V >/dev/null || (echo "cargo-vet required" && cargo install cargo-vet)
cargo vet || echo "Use |cargo vet inspect| to vet the changes to each crate"
sbom: .packaging ## Generate a Software Bill of Materials
cargo sbom -V >/dev/null || (echo "cargo-sbom required" && cargo install cargo-sbom)
cargo sbom > ./packaging/sbom.json
package: deb rpm sbom ## Build packages for all supported distros (DEB+RPM)
ls ./packaging/
# ---- failure tracking (used by deb/rpm/package) ----
FAIL_DIR := $(CURDIR)/target/fail
FAIL_FILE := $(FAIL_DIR)/failures.txt
MISS_FILE := $(FAIL_DIR)/no_artifacts.txt
deb: .packaging dockerfiles ## Build all DEB targets (continue on failure, summarize)
@set -e; mkdir -p "$(FAIL_DIR)"; rm -f "$(FAIL_FILE)" "$(MISS_FILE)"; \
for t in $(DEB_TARGETS); do \
echo "==== [DEB] Building $$t ===="; \
mark="$$(mktemp)"; \
if $(MAKE) --no-print-directory $$t; then :; else \
echo "$$t" >> "$(FAIL_FILE)"; echo "FAIL: $$t build failed"; rm -f "$$mark"; continue; \
fi; \
cnt=$$(find ./packaging -type f -newer "$$mark" -name "himmelblau_*-$${t}_amd64.deb" | wc -l); \
if [ "$$cnt" -gt 0 ]; then \
echo "OK: $$t produced .deb(s)"; \
else \
echo "$$t" >> "$(MISS_FILE)"; echo "WARN: $$t produced no .deb artifacts"; \
fi; \
rm -f "$$mark"; \
done
rpm: .packaging dockerfiles ## Build all RPM targets; continue on failure; then sign whatever exists
@set -e; mkdir -p "$(FAIL_DIR)"; : > /dev/null; \
for t in $(RPM_TARGETS) $(SLE_TARGETS); do \
echo "==== [RPM] Building $$t ===="; \
mark="$$(mktemp)"; \
if $(MAKE) --no-print-directory $$t; then :; else \
echo "$$t" >> "$(FAIL_FILE)"; echo "FAIL: $$t build failed"; rm -f "$$mark"; continue; \
fi; \
cnt=$$(find ./packaging -type f -newer "$$mark" -name "*-$$t.rpm" | wc -l); \
if [ "$$cnt" -gt 0 ]; then \
echo "OK: $$t produced .rpm(s)"; \
else \
echo "$$t" >> "$(MISS_FILE)"; echo "WARN: $$t produced no .rpm artifacts"; \
fi; \
rm -f "$$mark"; \
done; \
$(MAKE) --no-print-directory sign-rpms
# Load GPG key IDs from ~/.himmelblau-signing.conf (if present)
GPG_CONF_FILE := $(HOME)/.himmelblau-signing.conf
ifneq ("$(wildcard $(GPG_CONF_FILE))","")
include $(GPG_CONF_FILE)
else
$(warning No $(GPG_CONF_FILE) found; using dummy placeholders)
GPG_KEY_RSA_EL8 := UNSPECIFIED_RSA_KEY
GPG_KEY_ED25519 := UNSPECIFIED_ED25519_KEY
endif
# Sign EL8/SLE15 with RSA (older rpm doesn’t support Ed25519)
sign-el8-sle:
@set -e; shopt -s nullglob; \
el8_sle_pkgs=(./packaging/*rocky8*.rpm); \
if [ $${#el8_sle_pkgs[@]} -gt 0 ]; then \
echo "Signing EL8 with $(GPG_KEY_RSA_EL8)"; \
rpmsign --define "_gpg_name $(GPG_KEY_RSA_EL8)" --addsign "$${el8_sle_pkgs[@]}"; \
else \
echo "No EL8 RPMs to sign."; \
fi
# Sign everything else with Ed25519
sign-others:
@set -e; shopt -s nullglob; \
all=(./packaging/*.rpm); \
excl=(./packaging/*rocky8*.rpm); \
sign_list=(); \
for f in "$${all[@]}"; do \
skip=0; for e in "$${excl[@]}"; do [[ "$$f" == "$$e" ]] && skip=1 && break; done; \
[ $$skip -eq 0 ] && sign_list+=("$$f"); \
done; \
if [ $${#sign_list[@]} -gt 0 ]; then \
echo "Signing non-EL8 with $(GPG_KEY_ED25519)"; \
rpmsign --define "_gpg_name $(GPG_KEY_ED25519)" --addsign "$${sign_list[@]}"; \
else \
echo "No non-EL8 RPMs to sign."; \
fi
sign-rpms: sign-el8-sle sign-others
$(DEB_TARGETS): %: .packaging dockerfiles
@echo "Building Ubuntu $@ packages"
mkdir -p target/$@
$(DOCKER) build $(LIBHIMMELBLAU_BUILD_ARG) -t himmelblau-$@-build -f images/Dockerfile.$@ .
$(DOCKER) run --rm --security-opt label=disable -it \
-v $(CURDIR):/himmelblau \
-v $(CURDIR)/target/$@:/himmelblau/target \
$(LIBHIMMELBLAU_MOUNT) \
himmelblau-$@-build
$(DOCKER) run --rm --security-opt label=disable -it \
-v $(CURDIR):/himmelblau \
-v $(CURDIR)/target/$@:/himmelblau/target \
$(LIBHIMMELBLAU_MOUNT) \
himmelblau-$@-build /bin/sh -c \
'mv ./target/debian/*.deb ./packaging/'
$(RPM_TARGETS): %: .packaging dockerfiles
@echo "Building $@ RPM packages"
mkdir -p target/$@
$(DOCKER) build $(LIBHIMMELBLAU_BUILD_ARG) -t himmelblau-$@-build -f images/Dockerfile.$@ .
$(DOCKER) run --rm --security-opt label=disable -it \
-v $(CURDIR):/himmelblau \
-v $(CURDIR)/target/$@:/himmelblau/target \
$(LIBHIMMELBLAU_MOUNT) \
himmelblau-$@-build
$(DOCKER) run --rm --security-opt label=disable -it \
-v $(CURDIR):/himmelblau \
-v $(CURDIR)/target/$@:/himmelblau/target \
$(LIBHIMMELBLAU_MOUNT) \
himmelblau-$@-build /bin/sh -c \
'for f in ./target/generate-rpm/*.rpm; do \
mv $$f $${f%.rpm}-$@.rpm; \
done && mv ./target/generate-rpm/*.rpm ./packaging/'
$(SLE_TARGETS): %: .packaging dockerfiles
@echo "Building $@ SLE RPM packages"
mkdir -p target/$@
$(DOCKER) build --secret id=scc_regcode,src=${HOME}/.secrets/scc_regcode $(LIBHIMMELBLAU_BUILD_ARG) -t himmelblau-$@-build -f images/Dockerfile.$@ .
$(DOCKER) run --rm --security-opt label=disable -it \
-v $(CURDIR):/himmelblau \
-v $(CURDIR)/target/$@:/himmelblau/target \
$(LIBHIMMELBLAU_MOUNT) \
himmelblau-$@-build
$(DOCKER) run --rm --security-opt label=disable -it \
-v $(CURDIR):/himmelblau \
-v $(CURDIR)/target/$@:/himmelblau/target \
$(LIBHIMMELBLAU_MOUNT) \
himmelblau-$@-build /bin/sh -c \
'for f in ./target/generate-rpm/*.rpm; do \
mv $$f $${f%.rpm}-$@.rpm; \
done && mv ./target/generate-rpm/*.rpm ./packaging/'
# Pretty/help colors (safe if your shell prints raw escapes; adjust or remove if you prefer plain)
HELP_COL := \033[36m
HELP_RST := \033[0m
help: ## Show this help
@printf "Himmelblau Packaging Makefile\n\n"
@printf "Usage:\n make [target]\n\n"
@printf "Common targets:\n"
@awk 'BEGIN {FS = ":.*##"} \
/^[A-Za-z0-9_.-]+:.*##/ { \
printf " %s%-18s%s %s\n", "$(HELP_COL)", $$1, "$(HELP_RST)", $$2 \
}' $(MAKEFILE_LIST)
@printf "\nPer-distro build targets (build only that distro):\n"
@for t in $(ALL_PACKAGE_TARGETS); do printf " - %s\n" "make $$t"; done
@printf "\nDetected tools:\n DOCKER: %s\n NIX: %s\n" "$(DOCKER)" "$(NIX)"
@printf "\nTips:\n"
@printf " • Running plain 'make' invokes the default 'all' target (auto-detects host distro).\n"
@printf " • You can install a development build of Himmelblau on the current host with 'make && sudo make install'\n"
@printf " • Built packages are written to ./packaging/\n"
@printf " • To use local libhimmelblau: LIBHIMMELBLAU_LOCAL=/path/to/libhimmelblau make <target>\n\n"
@printf "If you'd like a new distro added to the supported packages list, contact a maintainer. We're happy to help.\n"