From e1cadb889a4cca262b255466e0d31414c0d9a9f4 Mon Sep 17 00:00:00 2001 From: Fredrick Brennan Date: Sun, 12 Mar 2023 22:40:48 -0400 Subject: [PATCH] Prepare MFEKglifIconFont for egui build --- GNUmakefile | 2 + Makefile | 67 +----------------- .../fonts/MFEKglifIconFont.ufo/features.fea | 0 .../fonts/MFEKglifIconFont.ufo/fontinfo.plist | 0 .../MFEKglifIconFont.ufo/glyphs/anchor.glif | 0 .../glyphs/bsplinepen.glif | 0 .../glyphs/closedeye.glif | 0 .../MFEKglifIconFont.ufo/glyphs/combine.glif | 0 .../MFEKglifIconFont.ufo/glyphs/confirm.glif | 0 .../glyphs/contents.plist | 0 .../MFEKglifIconFont.ufo/glyphs/copy.glif | 0 .../MFEKglifIconFont.ufo/glyphs/cut.glif | 0 .../MFEKglifIconFont.ufo/glyphs/dash.glif | 0 .../MFEKglifIconFont.ufo/glyphs/delete.glif | 0 .../glyphs/difference.glif | 0 .../MFEKglifIconFont.ufo/glyphs/down.glif | 0 .../MFEKglifIconFont.ufo/glyphs/export.glif | 0 .../MFEKglifIconFont.ufo/glyphs/globe.glif | 0 .../MFEKglifIconFont.ufo/glyphs/grid.glif | 0 .../glyphs/guidelines.glif | 0 .../glyphs/hyperbezier.glif | 0 .../MFEKglifIconFont.ufo/glyphs/image.glif | 0 .../glyphs/intersection.glif | 0 .../MFEKglifIconFont.ufo/glyphs/knife.glif | 0 .../MFEKglifIconFont.ufo/glyphs/layers.glif | 0 .../MFEKglifIconFont.ufo/glyphs/left.glif | 0 .../MFEKglifIconFont.ufo/glyphs/measure.glif | 0 .../MFEKglifIconFont.ufo/glyphs/minus.glif | 0 .../MFEKglifIconFont.ufo/glyphs/openeye.glif | 0 .../MFEKglifIconFont.ufo/glyphs/pan.glif | 0 .../MFEKglifIconFont.ufo/glyphs/pap.glif | 0 .../MFEKglifIconFont.ufo/glyphs/paste.glif | 0 .../MFEKglifIconFont.ufo/glyphs/pen.glif | 0 .../MFEKglifIconFont.ufo/glyphs/pencil.glif | 0 .../MFEKglifIconFont.ufo/glyphs/plus.glif | 0 .../MFEKglifIconFont.ufo/glyphs/quadpen.glif | 0 .../MFEKglifIconFont.ufo/glyphs/refresh.glif | 0 .../MFEKglifIconFont.ufo/glyphs/reject.glif | 0 .../MFEKglifIconFont.ufo/glyphs/rename.glif | 0 .../MFEKglifIconFont.ufo/glyphs/right.glif | 0 .../MFEKglifIconFont.ufo/glyphs/save.glif | 0 .../MFEKglifIconFont.ufo/glyphs/select.glif | 0 .../MFEKglifIconFont.ufo/glyphs/settings.glif | 0 .../MFEKglifIconFont.ufo/glyphs/shapes.glif | 0 .../MFEKglifIconFont.ufo/glyphs/spiropen.glif | 0 .../MFEKglifIconFont.ufo/glyphs/squiggle.glif | 0 .../MFEKglifIconFont.ufo/glyphs/text.glif | 0 .../MFEKglifIconFont.ufo/glyphs/ufo.glif | 0 .../MFEKglifIconFont.ufo/glyphs/union.glif | 0 .../fonts/MFEKglifIconFont.ufo/glyphs/up.glif | 0 .../MFEKglifIconFont.ufo/glyphs/venn.glif | 0 .../MFEKglifIconFont.ufo/glyphs/vws.glif | 0 .../MFEKglifIconFont.ufo/glyphs/xor.glif | 0 .../MFEKglifIconFont.ufo/glyphs/zoom.glif | 0 .../MFEKglifIconFont.ufo/layercontents.plist | 0 .../fonts/MFEKglifIconFont.ufo/metainfo.plist | 0 build/mk/iconfont.mk | 14 ++++ build/mk/main.mk | 61 ++++++++++++++++ resources/fonts/icons.otf | Bin 0 -> 19216 bytes resources/fonts/icons.ttf | Bin 20056 -> 20056 bytes 60 files changed, 79 insertions(+), 65 deletions(-) create mode 100644 GNUmakefile rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/features.fea (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/fontinfo.plist (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/anchor.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/bsplinepen.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/closedeye.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/combine.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/confirm.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/contents.plist (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/copy.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/cut.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/dash.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/delete.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/difference.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/down.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/export.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/globe.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/grid.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/guidelines.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/hyperbezier.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/image.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/intersection.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/knife.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/layers.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/left.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/measure.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/minus.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/openeye.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/pan.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/pap.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/paste.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/pen.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/pencil.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/plus.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/quadpen.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/refresh.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/reject.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/rename.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/right.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/save.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/select.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/settings.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/shapes.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/spiropen.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/squiggle.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/text.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/ufo.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/union.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/up.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/venn.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/vws.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/xor.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/glyphs/zoom.glif (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/layercontents.plist (100%) rename {resources => build/data}/fonts/MFEKglifIconFont.ufo/metainfo.plist (100%) create mode 100644 build/mk/iconfont.mk create mode 100644 build/mk/main.mk create mode 100644 resources/fonts/icons.otf diff --git a/GNUmakefile b/GNUmakefile new file mode 100644 index 00000000..fc2073bf --- /dev/null +++ b/GNUmakefile @@ -0,0 +1,2 @@ +include build/mk/main.mk +include build/mk/iconfont.mk diff --git a/Makefile b/Makefile index 55fae386..9e451a0b 100644 --- a/Makefile +++ b/Makefile @@ -1,65 +1,2 @@ -COMMA:=, -SOURCES:=$(shell find src -iname '*.rs') - -MFEK_MODULE := MFEKglif -export MFEK_ARGS := $(if $(MFEK_ARGS),$(MFEK_ARGS),'examples/Layered.ufo/glyphs/S_.rhigh.layered.glifjson') - -UNAME_FIRST=$(word 1, $(shell uname -a)) -DEFAULT_CARGO_FLAGS := $(shell if [[ "$(UNAME_FIRST)" =~ Linux ]]; then echo --features=sdl2-dynamic; else echo --features=sdl2-static; fi) -export CARGO_FLAGS := $(if $(CARGO_FLAGS),$(CARGO_FLAGS),$(DEFAULT_CARGO_FLAGS)) -export CARGO_PROFILE := $(if $(CARGO_PROFILE),$(CARGO_PROFILE),debug) -ifneq ($(strip $(CARGO_PROFILE)),debug) -export CARGO_PROFILE_ARG := --$(CARGO_PROFILE) -endif - -# Cargo flags -export RUST_LOG := $(if $(RUST_LOG),$(RUST_LOG),MFEKglif=debug$(COMMA)mfek_ipc=trace) -export RUST_BACKTRACE := $(if $(RUST_BACKTRACE),$(RUST_BACKTRACE),) - -all: build - -.PHONY: cargo -cargo: - @env | grep -E 'MFEK|RUST|CARGO' &&\ - RUST_LOG="$(RUST_LOG)" RUST_BACKTRACE="$(RUST_BACKTRACE)" env cargo $(CARGO_CMD) $(CARGO_PROFILE_ARG) $(CARGO_FLAGS) $(MFEK_FLAGS) - -.PHONY: clean -clean: - cargo clean - -target/$(CARGO_PROFILE)/$(MFEK_MODULE): $(SOURCES) - $(MAKE) CARGO_CMD=build cargo - -.PHONY .SILENT: build -build: - $(MAKE) target/$(CARGO_PROFILE)/$(MFEK_MODULE) - -.PHONY .SILENT: testrun -testrun: - $(MAKE) build &&\ - target/$(CARGO_PROFILE)/$(MFEK_MODULE) $(MFEK_ARGS) - -.PHONY .SILENT: echo-% -echo-%: - @$(MAKE) -s --just-print $* - -# --lzma due to upx/upx#224 (GitHub) -.PHONY: dist -dist: - $(MAKE) CARGO_PROFILE=release build &&\ - which upx || (>&2 echo "Error: upx not installed." && exit 1) &&\ - mkdir -p target/release-upx &&\ - (upx --best --lzma -o target/release-upx/$(MFEK_MODULE) target/release/$(MFEK_MODULE) || (>&2 echo "Error: upx failed." && exit 1)) - -.PHONY: fmt -fmt: - @FILES="`git ls-files | grep -E '.rs$$'`" &&\ - parallel --bar RUST_LOG=error rustfmt {} <<< "$$FILES" &&\ - cargo fmt --all -- --check &&\ - echo ✅ - -resources/fonts/icons.ttf: - fontmake -u resources/fonts/$(MFEK_MODULE)IconFont.ufo -o ttf --output-path $@ - -.PHONY: iconfont -iconfont: resources/fonts/icons.ttf +all: + echo 'GNU `make` is required!' diff --git a/resources/fonts/MFEKglifIconFont.ufo/features.fea b/build/data/fonts/MFEKglifIconFont.ufo/features.fea similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/features.fea rename to build/data/fonts/MFEKglifIconFont.ufo/features.fea diff --git a/resources/fonts/MFEKglifIconFont.ufo/fontinfo.plist b/build/data/fonts/MFEKglifIconFont.ufo/fontinfo.plist similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/fontinfo.plist rename to build/data/fonts/MFEKglifIconFont.ufo/fontinfo.plist diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/anchor.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/anchor.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/anchor.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/anchor.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/bsplinepen.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/bsplinepen.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/bsplinepen.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/bsplinepen.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/closedeye.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/closedeye.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/closedeye.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/closedeye.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/combine.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/combine.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/combine.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/combine.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/confirm.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/confirm.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/confirm.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/confirm.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/contents.plist b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/contents.plist similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/contents.plist rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/contents.plist diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/copy.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/copy.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/copy.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/copy.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/cut.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/cut.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/cut.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/cut.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/dash.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/dash.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/dash.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/dash.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/delete.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/delete.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/delete.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/delete.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/difference.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/difference.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/difference.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/difference.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/down.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/down.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/down.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/down.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/export.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/export.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/export.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/export.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/globe.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/globe.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/globe.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/globe.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/grid.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/grid.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/grid.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/grid.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/guidelines.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/guidelines.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/guidelines.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/guidelines.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/hyperbezier.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/hyperbezier.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/hyperbezier.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/hyperbezier.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/image.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/image.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/image.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/image.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/intersection.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/intersection.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/intersection.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/intersection.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/knife.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/knife.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/knife.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/knife.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/layers.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/layers.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/layers.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/layers.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/left.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/left.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/left.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/left.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/measure.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/measure.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/measure.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/measure.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/minus.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/minus.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/minus.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/minus.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/openeye.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/openeye.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/openeye.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/openeye.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/pan.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/pan.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/pan.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/pan.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/pap.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/pap.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/pap.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/pap.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/paste.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/paste.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/paste.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/paste.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/pen.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/pen.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/pen.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/pen.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/pencil.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/pencil.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/pencil.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/pencil.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/plus.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/plus.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/plus.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/plus.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/quadpen.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/quadpen.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/quadpen.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/quadpen.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/refresh.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/refresh.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/refresh.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/refresh.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/reject.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/reject.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/reject.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/reject.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/rename.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/rename.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/rename.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/rename.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/right.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/right.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/right.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/right.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/save.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/save.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/save.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/save.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/select.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/select.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/select.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/select.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/settings.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/settings.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/settings.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/settings.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/shapes.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/shapes.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/shapes.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/shapes.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/spiropen.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/spiropen.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/spiropen.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/spiropen.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/squiggle.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/squiggle.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/squiggle.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/squiggle.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/text.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/text.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/text.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/text.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/ufo.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/ufo.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/ufo.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/ufo.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/union.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/union.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/union.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/union.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/up.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/up.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/up.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/up.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/venn.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/venn.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/venn.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/venn.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/vws.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/vws.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/vws.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/vws.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/xor.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/xor.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/xor.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/xor.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/glyphs/zoom.glif b/build/data/fonts/MFEKglifIconFont.ufo/glyphs/zoom.glif similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/glyphs/zoom.glif rename to build/data/fonts/MFEKglifIconFont.ufo/glyphs/zoom.glif diff --git a/resources/fonts/MFEKglifIconFont.ufo/layercontents.plist b/build/data/fonts/MFEKglifIconFont.ufo/layercontents.plist similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/layercontents.plist rename to build/data/fonts/MFEKglifIconFont.ufo/layercontents.plist diff --git a/resources/fonts/MFEKglifIconFont.ufo/metainfo.plist b/build/data/fonts/MFEKglifIconFont.ufo/metainfo.plist similarity index 100% rename from resources/fonts/MFEKglifIconFont.ufo/metainfo.plist rename to build/data/fonts/MFEKglifIconFont.ufo/metainfo.plist diff --git a/build/mk/iconfont.mk b/build/mk/iconfont.mk new file mode 100644 index 00000000..ceb0820d --- /dev/null +++ b/build/mk/iconfont.mk @@ -0,0 +1,14 @@ +resources/fonts/icons.%: build/data/fonts/$(MFEK_MODULE)IconFont.ufo + $(MAKE) iconfont-impl FMT=$* UFO=$< OUT=$@ + +.PHONY: iconfont +ifeq ($(strip $(FONTFMT)),) +FONTFMT := otf ttf +endif +iconfont: + $(foreach FMT,$(FONTFMT),$(MAKE) resources/fonts/icons.$(FMT);) + + +.PHONY: iconfont-impl +iconfont-impl: + fontmake -u $(UFO) -o $(FMT) --output-path $(OUT) diff --git a/build/mk/main.mk b/build/mk/main.mk new file mode 100644 index 00000000..128d0ffe --- /dev/null +++ b/build/mk/main.mk @@ -0,0 +1,61 @@ +COMMA:=, +SOURCES:=$(shell find src -iname '*.rs') +SHELL:=/bin/bash + +MFEK_MODULE := MFEKglif +export MFEK_ARGS := $(if $(MFEK_ARGS),$(MFEK_ARGS),'examples/Layered.ufo/glyphs/S_.rhigh.layered.glifjson') + +UNAME_FIRST=$(word 1, $(shell uname -a)) +DEFAULT_CARGO_FLAGS := $(shell if [[ "$(UNAME_FIRST)" =~ Linux ]]; then echo --features=sdl2-dynamic; else echo --features=sdl2-static; fi) +export CARGO_FLAGS := $(if $(CARGO_FLAGS),$(CARGO_FLAGS),$(DEFAULT_CARGO_FLAGS)) +export CARGO_PROFILE := $(if $(CARGO_PROFILE),$(CARGO_PROFILE),debug) +ifneq ($(strip $(CARGO_PROFILE)),debug) +export CARGO_PROFILE_ARG := --$(CARGO_PROFILE) +endif + +# Cargo flags +export RUST_LOG := $(if $(RUST_LOG),$(RUST_LOG),MFEKglif=debug$(COMMA)mfek_ipc=trace) +export RUST_BACKTRACE := $(if $(RUST_BACKTRACE),$(RUST_BACKTRACE),) + +all: build + +.PHONY: cargo +cargo: + @env | grep -E 'MFEK|RUST|CARGO' &&\ + RUST_LOG="$(RUST_LOG)" RUST_BACKTRACE="$(RUST_BACKTRACE)" env cargo $(CARGO_CMD) $(CARGO_PROFILE_ARG) $(CARGO_FLAGS) $(MFEK_FLAGS) + +.PHONY: clean +clean: + cargo clean + +target/$(CARGO_PROFILE)/$(MFEK_MODULE): $(SOURCES) + $(MAKE) CARGO_CMD=build cargo + +.PHONY .SILENT: build +build: + $(MAKE) target/$(CARGO_PROFILE)/$(MFEK_MODULE) + +.PHONY .SILENT: testrun +testrun: + $(MAKE) build &&\ + target/$(CARGO_PROFILE)/$(MFEK_MODULE) $(MFEK_ARGS) + +.PHONY .SILENT: echo-% +echo-%: + @$(MAKE) -s --just-print $* + +# --lzma due to upx/upx#224 (GitHub) +.PHONY: dist +dist: + $(MAKE) CARGO_PROFILE=release build &&\ + which upx || (>&2 echo "Error: upx not installed." && exit 1) &&\ + mkdir -p target/release-upx &&\ + (upx --best --lzma -o target/release-upx/$(MFEK_MODULE) target/release/$(MFEK_MODULE) || (>&2 echo "Error: upx failed." && exit 1)) + +.PHONY: fmt +fmt: + @FILES="`git ls-files | grep -E '.rs$$'`" &&\ + parallel --bar RUST_LOG=error rustfmt {} <<< "$$FILES" &&\ + cargo fmt --all -- --check &&\ + echo ✅ + diff --git a/resources/fonts/icons.otf b/resources/fonts/icons.otf new file mode 100644 index 0000000000000000000000000000000000000000..f5bd3009385b5f5b7ff5d50646e0ae255c24741a GIT binary patch literal 19216 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 h#Zsh<;#Vy=UWt3SR)` CG7~QV delta 49 zcmcaHhw;W7#t8u|(tgI1Cx#Tr+z*}J9nWv`m4TW01p^S=u08z*MBja?GHK(33SR)% CY7;L2