Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 73 additions & 19 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,15 @@ UUID = "forge@jmmaranan.com"
INSTALL_PATH = $(HOME)/.local/share/gnome-shell/extensions/$(UUID)
MSGSRC = $(wildcard po/*.po)

.PHONY: all clean install schemas uninstall enable disable log debug patchcss
# Shell configuration - use POSIX /bin/sh for better portability
SHELL := /bin/sh
.SHELLFLAGS := -ec

# Tool detection (using POSIX redirection)
HAS_XGETTEXT := $(shell command -v xgettext >/dev/null 2>&1 && echo yes || echo no)
HAS_MSGFMT := $(shell command -v msgfmt >/dev/null 2>&1 && echo yes || echo no)

.PHONY: all clean install schemas uninstall enable disable log debug patchcss check-deps

all: build install enable restart

Expand All @@ -19,12 +27,25 @@ schemas/gschemas.compiled: schemas/*.gschema.xml
patchcss:
# TODO: add the script to update css tag when delivering theme.js


metadata:
echo "export const developers = Object.entries([" > lib/prefs/metadata.js
git shortlog -sne || echo "" >> lib/prefs/metadata.js
awk -i inplace '!/dependabot|noreply/' lib/prefs/metadata.js
sed -i 's/^[[:space:]]*[0-9]*[[:space:]]*\(.*\) <\(.*\)>/ {name:"\1", email:"\2"},/g' lib/prefs/metadata.js
echo "].reduce((acc, x) => ({ ...acc, [x.email]: acc[x.email] ?? x.name }), {})).map(([email, name]) => name + ' <' + email + '>')" >> lib/prefs/metadata.js
@echo "Generating developer metadata..."
@echo "export const developers = [" > lib/prefs/metadata.js
@git shortlog -sne --all \
| (grep -vE 'dependabot|noreply' || true) \
| awk -F'\t' '{ \
rest = $$2; \
n = index(rest, " <"); \
if (n == 0) next; \
name = substr(rest, 1, n - 1); \
email_part = substr(rest, n + 2); \
gsub(/>$$/, "", email_part); \
if (email_part in seen) next; \
seen[email_part] = 1; \
gsub(/"/, "\\\"", name); \
printf " \"%s <%s>\",\n", name, email_part; \
}' >> lib/prefs/metadata.js
@echo "];" >> lib/prefs/metadata.js

build: clean metadata.json schemas compilemsgs metadata
rm -rf temp
Expand All @@ -39,37 +60,70 @@ build: clean metadata.json schemas compilemsgs metadata
cp LICENSE temp
mkdir -p temp/locale
for msg in $(MSGSRC:.po=.mo); do \
msgf=temp/locale/`basename $$msg .mo`; \
mkdir -p $$msgf; \
mkdir -p $$msgf/LC_MESSAGES; \
cp $$msg $$msgf/LC_MESSAGES/forge.mo; \
if [ -f "$$msg" ]; then \
msg_base="$$(basename "$$msg" .mo)"; \
msgf="temp/locale/$$msg_base"; \
mkdir -p "$$msgf"; \
mkdir -p "$$msgf/LC_MESSAGES"; \
cp "$$msg" "$$msgf/LC_MESSAGES/forge.mo"; \
fi; \
done;

./po/%.mo: ./po/%.po
msgfmt -c $< -o $@

debug:
sed -i 's/export const production = true/export const production = false/' temp/lib/shared/settings.js
#sed -i 's|1.*-alpha|4999|' temp/metadata.json

potfile: ./po/forge.pot

# Conditional potfile generation based on xgettext availability
ifeq ($(HAS_XGETTEXT),yes)
./po/forge.pot: metadata ./prefs.js ./extension.js ./lib/**/*.js
mkdir -p po
xgettext --from-code=UTF-8 --output=po/forge.pot --package-name "Forge" ./prefs.js ./extension.js ./lib/**/*.js
else
./po/forge.pot:
@echo "WARNING: xgettext not found, skipping pot file generation"
@echo "Install gettext package for translation support"
@mkdir -p po
@touch ./po/forge.pot
endif

# Conditional compilation of messages based on msgfmt availability
ifeq ($(HAS_MSGFMT),yes)
./po/%.mo: ./po/%.po
msgfmt -c $< -o $@

compilemsgs: potfile $(MSGSRC:.po=.mo)
for msg in $(MSGSRC); do \
msgmerge -U $$msg ./po/forge.pot; \
msgmerge -U "$$msg" ./po/forge.pot; \
done;
else
compilemsgs:
@echo "WARNING: msgfmt not found, skipping translation compilation"
@echo "Install gettext package for translation support"
endif

clean:
rm -f lib/prefs/metadata.js
rm "$(UUID).zip" || echo "Nothing to delete"
rm -f lib/prefs/metadata.js "$(UUID).zip"
Copy link

Copilot AI Jan 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The clean target now attempts to remove "$(UUID).zip" without checking if it exists first. While the -f flag prevents errors if the file doesn't exist, combining multiple rm operations on one line means if the first file removal has any unexpected issues, the entire command could fail. The old version had explicit error handling with || echo "Nothing to delete". Consider whether silent failure with -f is the desired behavior or if explicit feedback is preferred.

Suggested change
rm -f lib/prefs/metadata.js "$(UUID).zip"
@if [ -e "lib/prefs/metadata.js" ]; then rm -f "lib/prefs/metadata.js"; else echo "lib/prefs/metadata.js: Nothing to delete"; fi
@if [ -e "$(UUID).zip" ]; then rm -f "$(UUID).zip"; else echo "$(UUID).zip: Nothing to delete"; fi

Copilot uses AI. Check for mistakes.
rm -rf temp schemas/gschemas.compiled

check-deps:
@echo "Checking build dependencies..."
@command -v glib-compile-schemas >/dev/null 2>&1 || (echo "ERROR: glib-compile-schemas not found. Install glib2-devel or libglib2.0-dev" && exit 1)
@command -v git >/dev/null 2>&1 || (echo "ERROR: git not found" && exit 1)
@command -v zip >/dev/null 2>&1 || echo "WARNING: zip not found, 'make dist' will fail"
@command -v xgettext >/dev/null 2>&1 || echo "WARNING: xgettext not found, translations will be skipped"
@command -v msgfmt >/dev/null 2>&1 || echo "WARNING: msgfmt not found, translations will be skipped"
@echo "All required dependencies found. Optional tools may be missing; see any warnings above."

enable:
gnome-extensions enable "$(UUID)"
@if gnome-extensions list | grep -Fqx "$(UUID)"; then \
gnome-extensions enable "$(UUID)" && echo "Extension enabled successfully"; \
else \
echo "WARNING: Extension not detected by GNOME Shell yet"; \
echo "On Wayland: Log out and log back in, then run 'make enable'"; \
echo "On X11: Press Alt+F2, type 'r', press Enter, then run 'make enable'"; \
fi

disable:
gnome-extensions disable "$(UUID)" || echo "Nothing to disable"
Expand All @@ -90,7 +144,7 @@ dist: build
zip -qr "../${UUID}.zip" .

restart:
if bash -c 'xprop -root &> /dev/null'; then \
if xprop -root >/dev/null 2>&1; then \
killall -HUP gnome-shell; \
else \
gnome-session-quit --logout; \
Expand All @@ -115,7 +169,7 @@ test-nested: horizontal-line
WAYLAND_DISPLAY=wayland-forge \
dbus-run-session -- gnome-shell --nested --wayland --wayland-display=wayland-forge

# Usage:
# Usage:
# make test-open &
# make test-open CMD=gnome-text-editor
# make test-open CMD=gnome-terminal ARGS='--app-id app.x'
Expand Down