From 03a83797438cc219e2d277f1f4b2d7695eab32dd Mon Sep 17 00:00:00 2001
From: Mattias Andrée <maandree@kth.se>
Date: Sat, 1 Jul 2023 21:12:34 +0200
Subject: Improve makfile
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Mattias Andrée <maandree@kth.se>
---
 .gitignore      |   1 +
 Makefile        | 156 ++++++--------------------------------------------------
 config.mk       |   7 ---
 make-stage-2.mk | 129 ++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 147 insertions(+), 146 deletions(-)
 create mode 100644 make-stage-2.mk

diff --git a/.gitignore b/.gitignore
index 6cbd03c..704ad22 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@
 conv
 *.o
 *.su
+/generated-rules.mk
diff --git a/Makefile b/Makefile
index 1a64ef1..2071ccf 100644
--- a/Makefile
+++ b/Makefile
@@ -1,150 +1,28 @@
-.NONPOSIX:
+.POSIX:
 
 CONFIGFILE = config.mk
 include $(CONFIGFILE)
 
-DIRS =\
-	actions\
-	apps\
-	categories\
-	devices\
-	emblems\
-	emotes\
-	mimetypes\
-	places\
-	status
+all:
 
-include icons.mk
-
-ALL_PNG_ICONS = $(foreach S,$(SIZES),$(foreach I,$(ICONS),$(S)x$(S)$(DIR_SUFFIX)/$(I).png))
-
-all: index.theme $(ALL_PNG_ICONS)
-
-all-fast: index.theme all-fast-icons
-
-index.theme: Makefile
-	set -e;\
-	printf '%s\n' \
-		'[Icon Theme]'\
-		'Name=$(THEME_NAME)'\
-		'Comment=$(THEME_DESC)'\
-		'Example=folder'\
-		''\
-		'# KDE specific stuff'\
-		'DisplayDepth=32'\
-		'LinkOverlay=link_overlay'\
-		'LockOverlay=lock_overlay'\
-		'ZipOverlay=zip_overlay'\
-		'DesktopDefault=48'\
-		'DesktopSizes='$$(printf ',%s' $(SIZES) | sed 's/^,//')\
-		'ToolbarDefault=22'\
-		'ToolbarSizes=8,16,22,32,48'\
-		'MainToolbarDefault=22'\
-		'MainToolbarSizes=8,16,22,32,48'\
-		'SmallDefault=16'\
-		'SmallSizes=16'\
-		'PanelDefault=32'\
-		'PanelSizes='$$(printf ',%s' $(SIZES) | sed 's/^,//')\
-		''\
-		> index.theme
-	printf 'Directories=' >> index.theme
-	set -e;\
-	for s in $(SIZES); do\
-		for d in $(DIRS); do\
-			printf ',%sx%s/%s' $$s $$s $$d;\
-		done;\
-	done | sed 's/^,//' >> index.theme
-	set -e;\
-	for d in $(DIRS); do\
-		printf ',scalable/%s' $$d;\
-	done >> index.theme
-	printf '\n' >> index.theme
-	set -e;\
-	for s in $(SIZES) scalable; do\
-		for d in $(DIRS); do\
-			printf '\n';\
-			./make-dir-info $$s $$d;\
-		done;\
-	done >> index.theme
-
-all-fast-icons: $(ICONS:=.x)
-
-scalable-$(DIR_SUFFIX_)/%.svg: scalable/%.svg
-	@mkdir -p -- "$$(dirname "$@")"
-	if ! test "$@" = "scalable/$*.svg"; then\
-		if test -L "scalable/$*.svg"; then\
-			ln -s "$$(readlink -- "scalable/$*.svg")" $@;\
-		else\
-			sed < scalable/$*.svg > $@\
-				-e 's/#[bB][eE][bB][eE][bB][eE]/#$(BASE_COLOUR)/g'\
-				-e 's/#[eE][fF]2929/#$(ALARM_RED)/g'\
-				-e 's/#[fF]57900/#$(ALARM_ORANGE)/g'\
-				-e 's/#[cC][dD]656[cC]/#$(RED)/g'\
-				-e 's/#[dD]69553/#$(ORANGE)/g'\
-				-e 's/#[cC][cC][aA][dD]47/#$(YELLOW)/g'\
-				-e 's/#32[aA]679/#$(GREEN)/g'\
-				-e 's/#00[aA]09[fF]/#$(CYAN)/g'\
-				-e 's/#2495[bB][eE]/#$(BLUE)/g'\
-				-e 's/#[aA]46[eE][bB]0/#$(MAGENTA)/g'\
-				-e 's/#000000/#$(OUTLINE)/g';\
-		fi;\
-	fi
-
-%.x: conv
-	@if test -n "$(DIR_SUFFIX)"; then make scalable$(DIR_SUFFIX)/$*.svg; fi
-	@ # Does work as a dependeny in GNU make for some reason,
-	@ # additionally, this lets us avoid starting make once
-	@ # extra for every icon
-	./conv scalable$(DIR_SUFFIX)/$*.svg $(SIZES)
-
-conv: conv.c
-	$(CC) -o $@ $< $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)
-
-8x8$(DIR_SUFFIX)/%.png: scalable$(DIR_SUFFIX)/%.svg conv
-	./conv $@
-
-16x16$(DIR_SUFFIX)/%.png: scalable$(DIR_SUFFIX)/%.svg conv
-	./conv $@
-
-22x22$(DIR_SUFFIX)/%.png: scalable$(DIR_SUFFIX)/%.svg conv
-	./conv $@
-
-24x24$(DIR_SUFFIX)/%.png: scalable$(DIR_SUFFIX)/%.svg conv
-	./conv $@
-
-32x32$(DIR_SUFFIX)/%.png: scalable$(DIR_SUFFIX)/%.svg conv
-	./conv $@
-
-36x36$(DIR_SUFFIX)/%.png: scalable$(DIR_SUFFIX)/%.svg conv
-	./conv $@
-
-48x48$(DIR_SUFFIX)/%.png: scalable$(DIR_SUFFIX)/%.svg conv
-	./conv $@
-
-install: index.theme $(ALL_PNG_ICONS)
-	mkdir -p -- "$(DESTDIR)$(ICONPREFIX)"
-	set -e;\
-	for d in $(DIRS); do\
-		for s in $(SIZES); do\
-			mkdir -p -- "$(DESTDIR)$(ICONPREFIX)/$(THEME_DIR)/$${s}x$${s}/$${d}";\
-		done;\
-		mkdir -p -- "$(DESTDIR)$(ICONPREFIX)/$(THEME_DIR)/scalable/$${d}";\
-	done
-	set -e;\
-	for i in $(ICONS); do\
-		for s in $(SIZES); do\
-			cp -P -- "$${s}x$${s}$(DIR_SUFFIX)/$${i}.png" "$(DESTDIR)$(ICONPREFIX)/$(THEME_DIR)/$${s}x$${s}/$${i}.png";\
-		done;\
-		cp -P -- "scalable$(DIR_SUFFIX)/$${i}.svg" "$(DESTDIR)$(ICONPREFIX)/$(THEME_DIR)/scalable/$${i}.svg";\
-	done
-	cp -- index.theme "$(DESTDIR)$(ICONPREFIX)/$(THEME_DIR)/index.theme"
-
-uninstall:
-	rm -rf -- "$(DESTDIR)$(ICONPREFIX)/$(THEME_DIR)"
+generated-rules.mk: $(CONFIGFILE)
+	@test ! -e $@ || chmod -- u+w $@
+	printf '# %s\n' 'This file is generated from Makefile' > $@
+	printf '\n%1i$$(DIR_SUFFIX)/%%.png: scalable$$(DIR_SUFFIX)/%%.svg conv\n\t./conv $$@\n' $(SIZES) | \
+		sed 's/^[0-9]\+/&x&/' >> $@
+	@chmod -- a-w $@
 
 clean:
-	-rm -f -- index.theme *.o *.su conv
+	-rm -f -- index.theme *.o *.su conv generated-rules.mk
 	-if test -n "$(DIR_SUFFIX)"; then rm -rf -- scalable$(DIR_SUFFIX); fi
 	-for s in $(SIZES); do printf "$${s}x$${s}$(DIR_SUFFIX)\n"; done | xargs rm -rf --
 
+# These are just added so autocompletion works with them
+all all-fast all-fast-icons install uninstall index.theme conv: generated-rules.mk
+	+@$(MAKE) -f make-stage-2.mk $@
+
+.DEFAULT:
+	+@$(MAKE) generated-rules.mk
+	+@$(MAKE) -f make-stage-2.mk $@
+
 .PHONY: all all-fast all-fast-icons install uninstall clean
diff --git a/config.mk b/config.mk
index db05de0..026792e 100644
--- a/config.mk
+++ b/config.mk
@@ -21,10 +21,3 @@ OUTLINE      = 000000
 # Uncomment the two lines above if you want to use customised colours
 
 SIZES = 16 24 32 48
-# Supported sizes are 8, 16, 22, 24, 32, 36, and 48,
-# you you want any other size add
-#
-# 	###x###$(DIR_SUFFIX)/%.png: scalable$(DIR_SUFFIX)/%.svg conv
-# 		./conv $@
-# 
-# with ### replaces for the size to add support for.
diff --git a/make-stage-2.mk b/make-stage-2.mk
new file mode 100644
index 0000000..5482c26
--- /dev/null
+++ b/make-stage-2.mk
@@ -0,0 +1,129 @@
+## Not compatible with POSIX make, tested with GNU make
+
+CONFIGFILE = config.mk
+include $(CONFIGFILE)
+
+DIRS =\
+	actions\
+	apps\
+	categories\
+	devices\
+	emblems\
+	emotes\
+	mimetypes\
+	places\
+	status
+
+include icons.mk
+
+ALL_PNG_ICONS = $(foreach S,$(SIZES),$(foreach I,$(ICONS),$(S)x$(S)$(DIR_SUFFIX)/$(I).png))
+
+all: index.theme $(ALL_PNG_ICONS)
+
+all-fast: index.theme all-fast-icons
+
+index.theme: Makefile
+	set -e;\
+	printf '%s\n' \
+		'[Icon Theme]'\
+		'Name=$(THEME_NAME)'\
+		'Comment=$(THEME_DESC)'\
+		'Example=folder'\
+		''\
+		'# KDE specific stuff'\
+		'DisplayDepth=32'\
+		'LinkOverlay=link_overlay'\
+		'LockOverlay=lock_overlay'\
+		'ZipOverlay=zip_overlay'\
+		'DesktopDefault=48'\
+		'DesktopSizes='$$(printf ',%s' $(SIZES) | sed 's/^,//')\
+		'ToolbarDefault=22'\
+		'ToolbarSizes=8,16,22,32,48'\
+		'MainToolbarDefault=22'\
+		'MainToolbarSizes=8,16,22,32,48'\
+		'SmallDefault=16'\
+		'SmallSizes=16'\
+		'PanelDefault=32'\
+		'PanelSizes='$$(printf ',%s' $(SIZES) | sed 's/^,//')\
+		''\
+		> index.theme
+	printf 'Directories=' >> index.theme
+	set -e;\
+	for s in $(SIZES); do\
+		for d in $(DIRS); do\
+			printf ',%sx%s/%s' $$s $$s $$d;\
+		done;\
+	done | sed 's/^,//' >> index.theme
+	set -e;\
+	for d in $(DIRS); do\
+		printf ',scalable/%s' $$d;\
+	done >> index.theme
+	printf '\n' >> index.theme
+	set -e;\
+	for s in $(SIZES) scalable; do\
+		for d in $(DIRS); do\
+			printf '\n';\
+			./make-dir-info $$s $$d;\
+		done;\
+	done >> index.theme
+
+all-fast-icons: $(ICONS:=.x)
+
+scalable-$(DIR_SUFFIX_)/%.svg: scalable/%.svg
+	@mkdir -p -- "$$(dirname "$@")"
+	if ! test "$@" = "scalable/$*.svg"; then\
+		if test -L "scalable/$*.svg"; then\
+			ln -sf "$$(readlink -- "scalable/$*.svg")" $@;\
+		else\
+			sed < scalable/$*.svg > $@\
+				-e 's/#[bB][eE][bB][eE][bB][eE]/#$(BASE_COLOUR)/g'\
+				-e 's/#[eE][fF]2929/#$(ALARM_RED)/g'\
+				-e 's/#[fF]57900/#$(ALARM_ORANGE)/g'\
+				-e 's/#[cC][dD]656[cC]/#$(RED)/g'\
+				-e 's/#[dD]69553/#$(ORANGE)/g'\
+				-e 's/#[cC][cC][aA][dD]47/#$(YELLOW)/g'\
+				-e 's/#32[aA]679/#$(GREEN)/g'\
+				-e 's/#00[aA]09[fF]/#$(CYAN)/g'\
+				-e 's/#2495[bB][eE]/#$(BLUE)/g'\
+				-e 's/#[aA]46[eE][bB]0/#$(MAGENTA)/g'\
+				-e 's/#000000/#$(OUTLINE)/g';\
+		fi;\
+	fi
+
+%.x: conv
+	@if test -n "$(DIR_SUFFIX)"; then $(MAKE) scalable$(DIR_SUFFIX)/$*.svg; fi
+	@ # Does work as a dependeny in GNU make for some reason,
+	@ # additionally, this lets us avoid starting make once
+	@ # extra for every icon
+	./conv scalable$(DIR_SUFFIX)/$*.svg $(SIZES)
+
+conv: conv.c
+	$(CC) -o $@ $< $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)
+
+include generated-rules.mk
+
+install: index.theme $(ALL_PNG_ICONS)
+	mkdir -p -- "$(DESTDIR)$(ICONPREFIX)"
+	set -e;\
+	for d in $(DIRS); do\
+		for s in $(SIZES); do\
+			mkdir -p -- "$(DESTDIR)$(ICONPREFIX)/$(THEME_DIR)/$${s}x$${s}/$${d}";\
+		done;\
+		mkdir -p -- "$(DESTDIR)$(ICONPREFIX)/$(THEME_DIR)/scalable/$${d}";\
+	done
+	set -e;\
+	for i in $(ICONS); do\
+		for s in $(SIZES); do\
+			cp -P -- "$${s}x$${s}$(DIR_SUFFIX)/$${i}.png" "$(DESTDIR)$(ICONPREFIX)/$(THEME_DIR)/$${s}x$${s}/$${i}.png";\
+		done;\
+		cp -P -- "scalable$(DIR_SUFFIX)/$${i}.svg" "$(DESTDIR)$(ICONPREFIX)/$(THEME_DIR)/scalable/$${i}.svg";\
+	done
+	cp -- index.theme "$(DESTDIR)$(ICONPREFIX)/$(THEME_DIR)/index.theme"
+
+uninstall:
+	rm -rf -- "$(DESTDIR)$(ICONPREFIX)/$(THEME_DIR)"
+
+clean:
+	+@$(MAKE) -f Makefile clean
+
+.PHONY: all all-fast all-fast-icons install uninstall clean
-- 
cgit v1.2.3-70-g09d2