diff --git a/Makefile b/Makefile index aab453a..6c878c1 100644 --- a/Makefile +++ b/Makefile @@ -1,214 +1,214 @@ -# extract name from package.json -PACKAGE_NAME := $(shell awk '/"name":/ {gsub(/[",]/, "", $$2); print $$2}' package.json) -RPM_NAME := cockpit-$(PACKAGE_NAME) -VERSION := $(shell T=$$(git describe 2>/dev/null) || T=1; echo $$T | tr '-' '.') -ifeq ($(TEST_OS),) -TEST_OS = centos-9-stream -endif -export TEST_OS -TARFILE=$(RPM_NAME)-$(VERSION).tar.xz -NODE_CACHE=$(RPM_NAME)-node-$(VERSION).tar.xz -SPEC=$(RPM_NAME).spec -PREFIX ?= /usr/local -APPSTREAMFILE=org.cockpit_project.$(subst -,_,$(PACKAGE_NAME)).metainfo.xml -VM_IMAGE=$(CURDIR)/test/images/$(TEST_OS) -# stamp file to check for node_modules/ -NODE_MODULES_TEST=package-lock.json -# one example file in dist/ from bundler to check if that already ran -DIST_TEST=dist/manifest.json -# one example file in pkg/lib to check if it was already checked out -COCKPIT_REPO_STAMP=pkg/lib/cockpit-po-plugin.js -# common arguments for tar, mostly to make the generated tarballs reproducible -TAR_ARGS = --sort=name --mtime "@$(shell git show --no-patch --format='%at')" --mode=go=rX,u+rw,a-s --numeric-owner --owner=0 --group=0 - -all: $(DIST_TEST) - -# checkout common files from Cockpit repository required to build this project; -# this has no API stability guarantee, so check out a stable tag when you start -# a new project, use the latest release, and update it from time to time -COCKPIT_REPO_FILES = \ - pkg/lib \ - test/common \ - $(NULL) - -COCKPIT_REPO_URL = https://github.com/cockpit-project/cockpit.git -COCKPIT_REPO_COMMIT = 7776f5476411577da93a0fc8ba9ba467d846358f - -$(COCKPIT_REPO_FILES): $(COCKPIT_REPO_STAMP) -COCKPIT_REPO_TREE = '$(strip $(COCKPIT_REPO_COMMIT))^{tree}' -$(COCKPIT_REPO_STAMP): Makefile - @git rev-list --quiet --objects $(COCKPIT_REPO_TREE) -- 2>/dev/null || \ - git fetch --no-tags --no-write-fetch-head --depth=1 $(COCKPIT_REPO_URL) $(COCKPIT_REPO_COMMIT) - git archive $(COCKPIT_REPO_TREE) -- $(COCKPIT_REPO_FILES) | tar x - -# -# i18n -# - -LINGUAS=$(basename $(notdir $(wildcard po/*.po))) - -po/$(PACKAGE_NAME).js.pot: - xgettext --default-domain=$(PACKAGE_NAME) --output=- --language=C --keyword= \ - --add-comments=Translators: \ - --keyword=_:1,1t --keyword=_:1c,2,2t --keyword=C_:1c,2 \ - --keyword=N_ --keyword=NC_:1c,2 \ - --keyword=gettext:1,1t --keyword=gettext:1c,2,2t \ - --keyword=ngettext:1,2,3t --keyword=ngettext:1c,2,3,4t \ - --keyword=gettextCatalog.getString:1,3c --keyword=gettextCatalog.getPlural:2,3,4c \ - --from-code=UTF-8 $$(find src/ -name '*.[jt]s' -o -name '*.[jt]sx') | \ - sed '/^#/ s/, c-format//' > $@ - -po/$(PACKAGE_NAME).html.pot: $(NODE_MODULES_TEST) $(COCKPIT_REPO_STAMP) - pkg/lib/html2po -o $@ $$(find src -name '*.html') - -po/$(PACKAGE_NAME).manifest.pot: $(COCKPIT_REPO_STAMP) - pkg/lib/manifest2po -o $@ src/manifest.json - -po/$(PACKAGE_NAME).metainfo.pot: $(APPSTREAMFILE) - xgettext --default-domain=$(PACKAGE_NAME) --output=$@ $< - -po/$(PACKAGE_NAME).pot: po/$(PACKAGE_NAME).html.pot po/$(PACKAGE_NAME).js.pot po/$(PACKAGE_NAME).manifest.pot po/$(PACKAGE_NAME).metainfo.pot - msgcat --sort-output --output-file=$@ $^ - -po/LINGUAS: - echo $(LINGUAS) | tr ' ' '\n' > $@ - -# -# Build/Install/dist -# - -$(SPEC): packaging/$(SPEC).in $(NODE_MODULES_TEST) - provides=$$(npm ls --omit dev --package-lock-only --depth=Infinity | grep -Eo '[^[:space:]]+@[^[:space:]]+' | sort -u | sed 's/^/Provides: bundled(npm(/; s/\(.*\)@/\1)) = /'); \ - awk -v p="$$provides" '{gsub(/%{VERSION}/, "$(VERSION)"); gsub(/%{NPM_PROVIDES}/, p)}1' $< > $@ - -$(DIST_TEST): $(NODE_MODULES_TEST) $(COCKPIT_REPO_STAMP) $(shell find src/ -type f) package.json build.js - NODE_ENV=$(NODE_ENV) node ./build.js - -watch: $(NODE_MODULES_TEST) $(COCKPIT_REPO_STAMP) - NODE_ENV=$(NODE_ENV) node ./build.js --watch - -clean: - rm -rf dist/ - rm -f $(SPEC) - rm -f po/LINGUAS - -install: $(DIST_TEST) po/LINGUAS - mkdir -p $(DESTDIR)$(PREFIX)/share/cockpit/$(PACKAGE_NAME) - cp -r dist/* $(DESTDIR)$(PREFIX)/share/cockpit/$(PACKAGE_NAME) - mkdir -p $(DESTDIR)$(PREFIX)/share/metainfo/ - msgfmt --xml -d po \ - --template $(APPSTREAMFILE) \ - -o $(DESTDIR)$(PREFIX)/share/metainfo/$(APPSTREAMFILE) - -# this requires a built source tree and avoids having to install anything system-wide -devel-install: $(DIST_TEST) - mkdir -p ~/.local/share/cockpit - ln -s `pwd`/dist ~/.local/share/cockpit/$(PACKAGE_NAME) - -# assumes that there was symlink set up using the above devel-install target, -# and removes it -devel-uninstall: - rm -f ~/.local/share/cockpit/$(PACKAGE_NAME) - -print-version: - @echo "$(VERSION)" - -dist: $(TARFILE) - @ls -1 $(TARFILE) - -# when building a distribution tarball, call bundler with a 'production' environment -# we don't ship node_modules for license and compactness reasons; we ship a -# pre-built dist/ (so it's not necessary) and ship package-lock.json (so that -# node_modules/ can be reconstructed if necessary) -$(TARFILE): export NODE_ENV=production -$(TARFILE): $(DIST_TEST) $(SPEC) - if type appstream-util >/dev/null 2>&1; then appstream-util validate-relax --nonet *.metainfo.xml; fi - tar --xz $(TAR_ARGS) -cf $(TARFILE) --transform 's,^,$(RPM_NAME)/,' \ - --exclude packaging/$(SPEC).in --exclude node_modules \ - $$(git ls-files) $(COCKPIT_REPO_FILES) $(NODE_MODULES_TEST) $(SPEC) dist/ - -$(NODE_CACHE): $(NODE_MODULES_TEST) - tar --xz $(TAR_ARGS) -cf $@ node_modules - -node-cache: $(NODE_CACHE) - -# convenience target for developers -srpm: $(TARFILE) $(NODE_CACHE) $(SPEC) - rpmbuild -bs \ - --define "_sourcedir `pwd`" \ - --define "_srcrpmdir `pwd`" \ - $(SPEC) - -# convenience target for developers -rpm: $(TARFILE) $(NODE_CACHE) $(SPEC) - mkdir -p "`pwd`/output" - mkdir -p "`pwd`/rpmbuild" - rpmbuild -bb \ - --define "_sourcedir `pwd`" \ - --define "_specdir `pwd`" \ - --define "_builddir `pwd`/rpmbuild" \ - --define "_srcrpmdir `pwd`" \ - --define "_rpmdir `pwd`/output" \ - --define "_buildrootdir `pwd`/build" \ - $(SPEC) - find `pwd`/output -name '*.rpm' -printf '%f\n' -exec mv {} . \; - rm -r "`pwd`/rpmbuild" - rm -r "`pwd`/output" "`pwd`/build" - -# build a VM with locally built distro pkgs installed -# disable networking, VM images have mock/pbuilder with the common build dependencies pre-installed -$(VM_IMAGE): export XZ_OPT=-0 -$(VM_IMAGE): $(TARFILE) $(NODE_CACHE) bots test/vm.install - bots/image-customize --no-network --fresh \ - --upload $(NODE_CACHE):/var/tmp/ --build $(TARFILE) \ - --script $(CURDIR)/test/vm.install $(TEST_OS) - -# convenience target for the above -vm: $(VM_IMAGE) - @echo $(VM_IMAGE) - -# convenience target to print the filename of the test image -print-vm: - @echo $(VM_IMAGE) - -# convenience target to setup all the bits needed for the integration tests -# without actually running them -prepare-check: $(NODE_MODULES_TEST) $(VM_IMAGE) test/common - -# run the browser integration tests -# this will run all tests/check-* and format them as TAP -check: prepare-check - test/common/run-tests ${RUN_TESTS_OPTIONS} - -codecheck: test/common $(NODE_MODULES_TEST) - test/common/static-code - -# checkout Cockpit's bots for standard test VM images and API to launch them -bots: $(COCKPIT_REPO_STAMP) - test/common/make-bots - -$(NODE_MODULES_TEST): package.json - # if it exists already, npm install won't update it; force that so that we always get up-to-date packages - rm -f package-lock.json - # unset NODE_ENV, skips devDependencies otherwise - env -u NODE_ENV npm install --ignore-scripts - env -u NODE_ENV npm prune - -deb: - rm -fr "`pwd`/output" - mkdir -m 0755 -p "`pwd`/output" - mkdir -m 0755 -p "`pwd`/output/cockpit-$(PACKAGE_NAME)" - mkdir -m 0755 -p "`pwd`/output/cockpit-$(PACKAGE_NAME)/DEBIAN" - mkdir -m 0755 -p "`pwd`/output/cockpit-$(PACKAGE_NAME)/usr/share/cockpit/$(PACKAGE_NAME)" - cp -r dist/* "`pwd`/output/cockpit-$(PACKAGE_NAME)/usr/share/cockpit/$(PACKAGE_NAME)" - cp packaging/cockpit-$(PACKAGE_NAME).control "`pwd`/output/cockpit-$(PACKAGE_NAME)/DEBIAN/control" - chmod 755 "`pwd`/output/cockpit-$(PACKAGE_NAME)/DEBIAN/control" - dpkg-deb -Zxz --build output/cockpit-$(PACKAGE_NAME) - mv "`pwd`/output/cockpit-$(PACKAGE_NAME).deb" "`pwd`/" - rm -r "`pwd`/output" - - -install_pkg_build_deps: - sudo bash packaging/install_pkg_build_deps.sh - -.PHONY: all clean install devel-install devel-uninstall print-version dist node-cache rpm prepare-check check vm print-vm deb +# extract name from package.json +PACKAGE_NAME := $(shell awk '/"name":/ {gsub(/[",]/, "", $$2); print $$2}' package.json) +RPM_NAME := cockpit-$(PACKAGE_NAME) +VERSION := $(shell T=$$(git describe 2>/dev/null) || T=1; echo $$T | tr '-' '.') +ifeq ($(TEST_OS),) +TEST_OS = centos-9-stream +endif +export TEST_OS +TARFILE=$(RPM_NAME)-$(VERSION).tar.xz +NODE_CACHE=$(RPM_NAME)-node-$(VERSION).tar.xz +SPEC=$(RPM_NAME).spec +PREFIX ?= /usr/local +APPSTREAMFILE=org.cockpit_project.$(subst -,_,$(PACKAGE_NAME)).metainfo.xml +VM_IMAGE=$(CURDIR)/test/images/$(TEST_OS) +# stamp file to check for node_modules/ +NODE_MODULES_TEST=package-lock.json +# one example file in dist/ from bundler to check if that already ran +DIST_TEST=dist/manifest.json +# one example file in pkg/lib to check if it was already checked out +COCKPIT_REPO_STAMP=pkg/lib/cockpit-po-plugin.js +# common arguments for tar, mostly to make the generated tarballs reproducible +TAR_ARGS = --sort=name --mtime "@$(shell git show --no-patch --format='%at')" --mode=go=rX,u+rw,a-s --numeric-owner --owner=0 --group=0 + +all: $(DIST_TEST) + +# checkout common files from Cockpit repository required to build this project; +# this has no API stability guarantee, so check out a stable tag when you start +# a new project, use the latest release, and update it from time to time +COCKPIT_REPO_FILES = \ + pkg/lib \ + test/common \ + $(NULL) + +COCKPIT_REPO_URL = https://github.com/cockpit-project/cockpit.git +COCKPIT_REPO_COMMIT = 6f8dbc47501c5255ff9351b771c84f06f729d14d # 347 + 19 commits + +$(COCKPIT_REPO_FILES): $(COCKPIT_REPO_STAMP) +COCKPIT_REPO_TREE = '$(strip $(COCKPIT_REPO_COMMIT))^{tree}' +$(COCKPIT_REPO_STAMP): Makefile + @git rev-list --quiet --objects $(COCKPIT_REPO_TREE) -- 2>/dev/null || \ + git fetch --no-tags --no-write-fetch-head --depth=1 $(COCKPIT_REPO_URL) $(COCKPIT_REPO_COMMIT) + git archive $(COCKPIT_REPO_TREE) -- $(COCKPIT_REPO_FILES) | tar x + +# +# i18n +# + +LINGUAS=$(basename $(notdir $(wildcard po/*.po))) + +po/$(PACKAGE_NAME).js.pot: + xgettext --default-domain=$(PACKAGE_NAME) --output=- --language=C --keyword= \ + --add-comments=Translators: \ + --keyword=_:1,1t --keyword=_:1c,2,2t --keyword=C_:1c,2 \ + --keyword=N_ --keyword=NC_:1c,2 \ + --keyword=gettext:1,1t --keyword=gettext:1c,2,2t \ + --keyword=ngettext:1,2,3t --keyword=ngettext:1c,2,3,4t \ + --keyword=gettextCatalog.getString:1,3c --keyword=gettextCatalog.getPlural:2,3,4c \ + --from-code=UTF-8 $$(find src/ -name '*.[jt]s' -o -name '*.[jt]sx') | \ + sed '/^#/ s/, c-format//' > $@ + +po/$(PACKAGE_NAME).html.pot: $(NODE_MODULES_TEST) $(COCKPIT_REPO_STAMP) + pkg/lib/html2po -o $@ $$(find src -name '*.html') + +po/$(PACKAGE_NAME).manifest.pot: $(COCKPIT_REPO_STAMP) + pkg/lib/manifest2po -o $@ src/manifest.json + +po/$(PACKAGE_NAME).metainfo.pot: $(APPSTREAMFILE) + xgettext --default-domain=$(PACKAGE_NAME) --output=$@ $< + +po/$(PACKAGE_NAME).pot: po/$(PACKAGE_NAME).html.pot po/$(PACKAGE_NAME).js.pot po/$(PACKAGE_NAME).manifest.pot po/$(PACKAGE_NAME).metainfo.pot + msgcat --sort-output --output-file=$@ $^ + +po/LINGUAS: + echo $(LINGUAS) | tr ' ' '\n' > $@ + +# +# Build/Install/dist +# + +$(SPEC): packaging/$(SPEC).in $(NODE_MODULES_TEST) + provides=$$(npm ls --omit dev --package-lock-only --depth=Infinity | grep -Eo '[^[:space:]]+@[^[:space:]]+' | sort -u | sed 's/^/Provides: bundled(npm(/; s/\(.*\)@/\1)) = /'); \ + awk -v p="$$provides" '{gsub(/%{VERSION}/, "$(VERSION)"); gsub(/%{NPM_PROVIDES}/, p)}1' $< > $@ + +$(DIST_TEST): $(NODE_MODULES_TEST) $(COCKPIT_REPO_STAMP) $(shell find src/ -type f) package.json build.js + NODE_ENV=$(NODE_ENV) node ./build.js + +watch: $(NODE_MODULES_TEST) $(COCKPIT_REPO_STAMP) + NODE_ENV=$(NODE_ENV) node ./build.js --watch + +clean: + rm -rf dist/ + rm -f $(SPEC) + rm -f po/LINGUAS + +install: $(DIST_TEST) po/LINGUAS + mkdir -p $(DESTDIR)$(PREFIX)/share/cockpit/$(PACKAGE_NAME) + cp -r dist/* $(DESTDIR)$(PREFIX)/share/cockpit/$(PACKAGE_NAME) + mkdir -p $(DESTDIR)$(PREFIX)/share/metainfo/ + msgfmt --xml -d po \ + --template $(APPSTREAMFILE) \ + -o $(DESTDIR)$(PREFIX)/share/metainfo/$(APPSTREAMFILE) + +# this requires a built source tree and avoids having to install anything system-wide +devel-install: $(DIST_TEST) + mkdir -p ~/.local/share/cockpit + ln -s `pwd`/dist ~/.local/share/cockpit/$(PACKAGE_NAME) + +# assumes that there was symlink set up using the above devel-install target, +# and removes it +devel-uninstall: + rm -f ~/.local/share/cockpit/$(PACKAGE_NAME) + +print-version: + @echo "$(VERSION)" + +dist: $(TARFILE) + @ls -1 $(TARFILE) + +# when building a distribution tarball, call bundler with a 'production' environment +# we don't ship node_modules for license and compactness reasons; we ship a +# pre-built dist/ (so it's not necessary) and ship package-lock.json (so that +# node_modules/ can be reconstructed if necessary) +$(TARFILE): export NODE_ENV=production +$(TARFILE): $(DIST_TEST) $(SPEC) + if type appstream-util >/dev/null 2>&1; then appstream-util validate-relax --nonet *.metainfo.xml; fi + tar --xz $(TAR_ARGS) -cf $(TARFILE) --transform 's,^,$(RPM_NAME)/,' \ + --exclude packaging/$(SPEC).in --exclude node_modules \ + $$(git ls-files) $(COCKPIT_REPO_FILES) $(NODE_MODULES_TEST) $(SPEC) dist/ + +$(NODE_CACHE): $(NODE_MODULES_TEST) + tar --xz $(TAR_ARGS) -cf $@ node_modules + +node-cache: $(NODE_CACHE) + +# convenience target for developers +srpm: $(TARFILE) $(NODE_CACHE) $(SPEC) + rpmbuild -bs \ + --define "_sourcedir `pwd`" \ + --define "_srcrpmdir `pwd`" \ + $(SPEC) + +# convenience target for developers +rpm: $(TARFILE) $(NODE_CACHE) $(SPEC) + mkdir -p "`pwd`/output" + mkdir -p "`pwd`/rpmbuild" + rpmbuild -bb \ + --define "_sourcedir `pwd`" \ + --define "_specdir `pwd`" \ + --define "_builddir `pwd`/rpmbuild" \ + --define "_srcrpmdir `pwd`" \ + --define "_rpmdir `pwd`/output" \ + --define "_buildrootdir `pwd`/build" \ + $(SPEC) + find `pwd`/output -name '*.rpm' -printf '%f\n' -exec mv {} . \; + rm -r "`pwd`/rpmbuild" + rm -r "`pwd`/output" "`pwd`/build" + +# build a VM with locally built distro pkgs installed +# disable networking, VM images have mock/pbuilder with the common build dependencies pre-installed +$(VM_IMAGE): export XZ_OPT=-0 +$(VM_IMAGE): $(TARFILE) $(NODE_CACHE) bots test/vm.install + bots/image-customize --no-network --fresh \ + --upload $(NODE_CACHE):/var/tmp/ --build $(TARFILE) \ + --script $(CURDIR)/test/vm.install $(TEST_OS) + +# convenience target for the above +vm: $(VM_IMAGE) + @echo $(VM_IMAGE) + +# convenience target to print the filename of the test image +print-vm: + @echo $(VM_IMAGE) + +# convenience target to setup all the bits needed for the integration tests +# without actually running them +prepare-check: $(NODE_MODULES_TEST) $(VM_IMAGE) test/common + +# run the browser integration tests +# this will run all tests/check-* and format them as TAP +check: prepare-check + test/common/run-tests ${RUN_TESTS_OPTIONS} + +codecheck: test/common $(NODE_MODULES_TEST) + test/common/static-code + +# checkout Cockpit's bots for standard test VM images and API to launch them +bots: $(COCKPIT_REPO_STAMP) + test/common/make-bots + +$(NODE_MODULES_TEST): package.json + # if it exists already, npm install won't update it; force that so that we always get up-to-date packages + rm -f package-lock.json + # unset NODE_ENV, skips devDependencies otherwise + env -u NODE_ENV npm install --ignore-scripts + env -u NODE_ENV npm prune + +deb: + rm -fr "`pwd`/output" + mkdir -m 0755 -p "`pwd`/output" + mkdir -m 0755 -p "`pwd`/output/cockpit-$(PACKAGE_NAME)" + mkdir -m 0755 -p "`pwd`/output/cockpit-$(PACKAGE_NAME)/DEBIAN" + mkdir -m 0755 -p "`pwd`/output/cockpit-$(PACKAGE_NAME)/usr/share/cockpit/$(PACKAGE_NAME)" + cp -r dist/* "`pwd`/output/cockpit-$(PACKAGE_NAME)/usr/share/cockpit/$(PACKAGE_NAME)" + cp packaging/cockpit-$(PACKAGE_NAME).control "`pwd`/output/cockpit-$(PACKAGE_NAME)/DEBIAN/control" + chmod 755 "`pwd`/output/cockpit-$(PACKAGE_NAME)/DEBIAN/control" + dpkg-deb -Zxz --build output/cockpit-$(PACKAGE_NAME) + mv "`pwd`/output/cockpit-$(PACKAGE_NAME).deb" "`pwd`/" + rm -r "`pwd`/output" + + +install_pkg_build_deps: + sudo bash packaging/install_pkg_build_deps.sh + +.PHONY: all clean install devel-install devel-uninstall print-version dist node-cache rpm prepare-check check vm print-vm deb