diff --git a/Makefile b/Makefile index c6d8430..89ee1cb 100644 --- a/Makefile +++ b/Makefile @@ -1,74 +1,89 @@ SHELL := /bin/bash -JS_FILES = $(shell find -type f -and \( -name "*.js" \)) -UI_FILES = $(shell find -type f -and \( -name "*.ui" \)) +# We define these here to make the makefile easier to port to another extension. +NAME := burn-my-windows +DOMAIN := schneegans.github.com +ZIP_NAME := $(NAME)@$(DOMAIN).zip + +# Some of the recipes below depend on some of these files. +JS_FILES = $(shell find -type f -and \( -name "*.js" \)) +UI_FILES = $(shell find -type f -and \( -name "*.ui" \)) RESOURCE_FILES = $(shell find resources -mindepth 2 -type f) +LOCALES_PO = $(wildcard po/*.po) +LOCALES_MO = $(patsubst po/%.po,locale/%/LC_MESSAGES/$(NAME).mo,$(LOCALES_PO)) -LOCALES_PO = $(wildcard po/*.po) -LOCALES_MO = $(patsubst po/%.po,locale/%/LC_MESSAGES/burn-my-windows.mo,$(LOCALES_PO)) +# These files will be included in the extension zip file. +ZIP_CONTENT = $(JS_FILES) $(LOCALES_MO) resources/$(NAME).gresource \ + schemas/gschemas.compiled metadata.json LICENSE -.PHONY: zip install uninstall all-po pot clean +# These five recipes can be invoked by the user. +.PHONY: zip install uninstall pot clean -zip: burn-my-windows@schneegans.github.com.zip +# The zip recipes only bundles the extension without installing it. +zip: $(ZIP_NAME) -install: burn-my-windows@schneegans.github.com.zip - gnome-extensions install "burn-my-windows@schneegans.github.com.zip" --force +# The install recipes creates the extension zip and installs it. +install: $(ZIP_NAME) + gnome-extensions install "$(ZIP_NAME)" --force @echo "Extension installed successfully! Now restart the Shell ('Alt'+'F2', then 'r')." +# This uninstalls the previously installed extension. uninstall: - gnome-extensions uninstall "burn-my-windows@schneegans.github.com" - -all-po: $(LOCALES_PO) + gnome-extensions uninstall "$(NAME)@$(DOMAIN)" +# Use gettext to generate a translation template file. pot: $(JS_FILES) $(UI_FILES) - @echo "Generating 'burn-my-windows.pot'..." + @echo "Generating '$(NAME).pot'..." @xgettext --from-code=UTF-8 \ - --add-comments=Translators \ - --copyright-holder="Simon Schneegans" \ - --package-name="Burn-My-Windows" \ - --output=po/burn-my-windows.pot \ - $(JS_FILES) $(UI_FILES) + --add-comments=Translators \ + --copyright-holder="Simon Schneegans" \ + --package-name="$(NAME)" \ + --output=po/$(NAME).pot \ + $(JS_FILES) $(UI_FILES) +# This removes all temporary files created with the other recipes. clean: - rm -rf \ - burn-my-windows@schneegans.github.com.zip \ - resources/burn-my-windows.gresource \ - resources/burn-my-windows.gresource.xml \ - schemas/gschemas.compiled \ - locale \ - ui/*.ui~ \ - po/*.po~ + rm -rf $(ZIP_NAME) \ + resources/$(NAME).gresource \ + resources/$(NAME).gresource.xml \ + schemas/gschemas.compiled \ + locale -burn-my-windows@schneegans.github.com.zip: schemas/gschemas.compiled resources/burn-my-windows.gresource $(JS_FILES) $(LOCALES_MO) +# This bundles the extension and checks whether it is small enough to be uploaded to +# extensions.gnome.org. We do not use "gnome-extensions pack" for this, as this is not +# readily available on the GitHub runners. +$(ZIP_NAME): $(ZIP_CONTENT) @echo "Packing zip file..." - @rm --force burn-my-windows@schneegans.github.com.zip - @zip -r burn-my-windows@schneegans.github.com.zip -- *.js src/*.js resources/burn-my-windows.gresource schemas/gschemas.compiled $(LOCALES_MO) metadata.json LICENSE - + @rm --force $(ZIP_NAME) + @zip $(ZIP_NAME) -- $(ZIP_CONTENT) + @#Check if the zip size is too big to be uploaded - @if [[ "$$(stat -c %s burn-my-windows@schneegans.github.com.zip)" -gt 4096000 ]]; then \ - echo "ERROR! The extension is too big to be uploaded to the extensions website, keep it smaller than 4096 KB!"; exit 1; \ - fi + @SIZE=$$(unzip -Zt $(ZIP_NAME) | awk '{print $$3}') ; \ + if [[ $$SIZE -gt 5242880 ]]; then \ + echo "ERROR! The extension is too big to be uploaded to" \ + "the extensions website, keep it smaller than 5 MB!"; \ + exit 1; \ + fi -resources/burn-my-windows.gresource: resources/burn-my-windows.gresource.xml - @echo "Compiling resources..." - @glib-compile-resources --sourcedir="resources" --generate resources/burn-my-windows.gresource.xml - -resources/burn-my-windows.gresource.xml: $(RESOURCE_FILES) - @echo "Creating resources xml..." - @FILES=$$(find "resources" -mindepth 2 -type f -printf "%P\n" | xargs -i echo "{}") ; \ - echo " $$FILES " > resources/burn-my-windows.gresource.xml - -schemas/gschemas.compiled: schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml +# Compiles the gschemas.compiled file from the gschema.xml file. +schemas/gschemas.compiled: schemas/org.gnome.shell.extensions.$(NAME).gschema.xml @echo "Compiling schemas..." @glib-compile-schemas schemas -locale/%/LC_MESSAGES/burn-my-windows.mo: po/%.po +# Compiles the gresource file from the gresources.xml. +resources/$(NAME).gresource: resources/$(NAME).gresource.xml + @echo "Compiling resources..." + @glib-compile-resources --sourcedir="resources" --generate resources/$(NAME).gresource.xml + +# Generates the gresources.xml based on all files in the resources subdirectory. +resources/$(NAME).gresource.xml: $(RESOURCE_FILES) + @echo "Creating resources xml..." + @FILES=$$(find "resources" -mindepth 2 -type f -printf "%P\n" | xargs -i echo "{}") ; \ + echo " $$FILES " \ + > resources/$(NAME).gresource.xml + +# Compiles all *.po files to *.mo files. +locale/%/LC_MESSAGES/$(NAME).mo: po/%.po @echo "Compiling $@" @mkdir -p locale/$*/LC_MESSAGES @msgfmt -c -o $@ $< - -po/%.po: - @echo "Updating $@" - msgmerge --previous --update $@ po/burn-my-windows.pot - @# Output translation progress - @msgfmt --check --verbose --output-file=/dev/null $@ \ No newline at end of file