changeset 304:3ccf841ca1fe

make: improve readability and add examples/tests
author David Demelier <markand@malikania.fr>
date Thu, 24 Jun 2021 22:35:02 +0200
parents 48a09c9d3d00
children 3675021fa6e5
files .hgignore GNUmakefile
diffstat 2 files changed, 203 insertions(+), 79 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Thu Jun 24 20:30:41 2021 +0200
+++ b/.hgignore	Thu Jun 24 22:35:02 2021 +0200
@@ -1,3 +1,12 @@
+# temporary files.
+\.a$
+\.d$
+\.o$
+
+# generated files.
+assets/.*\.h$
+^config\.h$
+
 # vim/emacs specific.
 ^tags$
 ^tags.lock$
@@ -8,5 +17,41 @@
 # macOS specific.
 \.DS_Store$
 
-# CMake build directory.
-^build$
+# examples.
+^examples/example-action/main$
+^examples/example-animation/main$
+^examples/example-audio/main$
+^examples/example-cursor/main$
+^examples/example-debug/main$
+^examples/example-drawable/main$
+^examples/example-font/main$
+^examples/example-gridmenu/main$
+^examples/example-label/main$
+^examples/example-message/main$
+^examples/example-sprite/main$
+^examples/example-trace/main$
+^examples/example-ui/main$
+
+# tests.
+^tests/test-action$
+^tests/test-action-script$
+^tests/test-alloc$
+^tests/test-character$
+^tests/test-color$
+^tests/test-drawable$
+^tests/test-error$
+^tests/test-map$
+^tests/test-save$
+^tests/test-state$
+^tests/test-tileset$
+^tests/test-util$
+
+# maps and tilesets from libmlk-data.
+^libmlk-data/maps/.*\.map$
+^libmlk-data/maps/.*\.tileset$
+
+# executables.
+^mlk-adventure/mlk-adventure$
+^tools/bcc/mlk-bcc$
+^tools/map/mlk-map$
+^tools/tileset/mlk-tileset$
--- a/GNUmakefile	Thu Jun 24 20:30:41 2021 +0200
+++ b/GNUmakefile	Thu Jun 24 22:35:02 2021 +0200
@@ -151,26 +151,9 @@
 LIBMLK_ADVENTURE_OBJS=  ${LIBMLK_ADVENTURE_SRCS:.c=.o}
 LIBMLK_ADVENTURE_DEPS=  ${LIBMLK_ADVENTURE_SRCS:.c=.d}
 
-# Not a real target, only headers.
-LIBMLK_DATA_ASTS=       libmlk-data/fonts/cubic.h \
-                        libmlk-data/fonts/lato.h \
-                        libmlk-data/fonts/pirata-one.h \
-                        libmlk-data/fonts/teutonic.h \
-                        libmlk-data/images/battle-background.h \
-                        libmlk-data/images/black-cat.h \
-                        libmlk-data/images/haunted-wood.h \
-                        libmlk-data/music/vabsounds-romance.h \
-                        libmlk-data/sounds/fire.h \
-                        libmlk-data/sounds/potion.h \
-                        libmlk-data/sprites/chest.h \
-                        libmlk-data/sprites/explosion.h \
-                        libmlk-data/sprites/faces.h \
-                        libmlk-data/sprites/john-sword.h \
-                        libmlk-data/sprites/john-walk.h \
-                        libmlk-data/sprites/john.h \
-                        libmlk-data/sprites/numbers.h \
-                        libmlk-data/sprites/people.h \
-                        libmlk-data/sprites/ui-cursor.h
+# Not a real target, only generated maps and tilesets.
+LIBMLK_DATA_ASTS=       libmlk-data/maps/map-world.map \
+                        libmlk-data/maps/tileset-world.tileset
 
 MLK_BCC=                tools/bcc/mlk-bcc
 MLK_BCC_SRCS=           tools/bcc/main.c
@@ -192,6 +175,33 @@
 MLK_ADVENTURE_OBJS=     ${MLK_ADVENTURE_SRCS:.c=.o}
 MLK_ADVENTURE_DEPS=     ${MLK_ADVENTURE_SRCS:.c=.d}
 
+EXAMPLES=               examples/example-action/main \
+                        examples/example-animation/main \
+                        examples/example-audio/main \
+                        examples/example-cursor/main \
+                        examples/example-debug/main \
+                        examples/example-drawable/main \
+                        examples/example-font/main \
+                        examples/example-gridmenu/main \
+                        examples/example-label/main \
+                        examples/example-message/main \
+                        examples/example-sprite/main \
+                        examples/example-trace/main \
+                        examples/example-ui/main
+
+TESTS=                  tests/test-action-script \
+                        tests/test-action \
+                        tests/test-alloc \
+                        tests/test-character \
+                        tests/test-color \
+                        tests/test-drawable \
+                        tests/test-error \
+                        tests/test-map \
+                        tests/test-save \
+                        tests/test-state \
+                        tests/test-tileset \
+                        tests/test-util
+
 TARGETS=                ${LIBMLK_ADVENTURE} \
                         ${LIBMLK_CORE} \
                         ${LIBMLK_RPG} \
@@ -215,11 +225,14 @@
 
 INCS=                   -I. \
                         -Iextern/libsqlite \
+                        -Iextern/libgreatest \
                         -Ilibmlk-core \
                         -Ilibmlk-ui \
                         -Ilibmlk-rpg \
                         -Ilibmlk-adventure \
-                        ${SDL2_INCS}
+                        ${SDL2_INCS} \
+                        ${JANSSON_INCS} \
+                        ${ZSTD_INCS}
 DEFS=                   -DMOLKO_BINDIR=\"${BINDIR}\" \
                         -DMOLKO_DATADIR=\"${DATADIR}\" \
                         -DMOLKO_LOCALEDIR=\"${LOCALEDIR}\" \
@@ -228,14 +241,12 @@
                         -DMOLKO_ABS_LOCALEDIR=\"${PREFIX}/${LOCALEDIR}\"
 
 ifeq (${NLS},1)
-LIBS+=                  -lintl
 SED.nls=                s/@define WITH_NLS@/\#define MOLKO_WITH_NLS/
 else
 SED.nls=                /@define WITH_NLS@/d
 endif
 
 ifeq (${ZSTD},1)
-LIBS+=                  -lintl
 SED.zstd=               s/@define WITH_ZSTD@/\#define MOLKO_WITH_ZSTD/
 else
 SED.zstd=               /@define WITH_ZSTD@/d
@@ -250,39 +261,50 @@
 MAP.cmd=                ${MLK_MAP} < $< > $@
 endif
 
+CMD.ar=                 ${AR} -rc $@ $^
+CMD.cc=                 ${CC} ${DEFS} ${INCS} ${CFLAGS} -MMD -c $< -o $@ ${LDFLAGS}
+CMD.ccld=               ${CC} ${DEFS} ${INCS} ${CFLAGS} -o $@ $^ ${LIBS} ${LDFLAGS}
+
+# All libraries required when linking to Molko's Adventure API.
+LIBMLK_ALL:=            ${LIBMLK_ADVENTURE}
+LIBMLK_ALL+=            ${LIBMLK_RPG}
+LIBMLK_ALL+=            ${LIBMLK_UI}
+LIBMLK_ALL+=            ${LIBMLK_CORE}
+LIBMLK_ALL+=            ${LIBMLK_SQLITE}
+LIBMLK_ALL+=            ${SDL2_LIBS}
+LIBMLK_ALL+=            ${ZSTD_LIBS}
+
+ifeq (${NLS},1)
+LIBMLK_ALL+=            -lintl
+endif
+
 .SUFFIXES:
 .SUFFIXES: .c .o .h .json .map .ogg .png .sql .tileset .ttf
 
 all: ${TARGETS}
 
 config.h: config.h.in
-	@echo "SED  $<"
-	@sed -e "${SED.nls}" \
+	sed -e "${SED.nls}" \
 		-e "${SED.zstd}" < $< > $@
 
 .c.o:
-	@echo "CC   $<"
-	@${CC} -MMD ${INCS} ${DEFS} ${CFLAGS} -c $< -o $@
+	${CMD.cc}
 
 # Binary files.
 .ttf.h .png.h .ogg.h:
-	@echo "BCC  $<"
-	@${MLK_BCC} -csu $< assets_$(notdir $<) > $@
+	${MLK_BCC} -csu $< assets_$(notdir $<) > $@
 
 # Text files.
 .sql.h:
-	@echo "BCC  $<"
-	@${MLK_BCC} -0csu $< assets_$(notdir $<) > $@
+	${MLK_BCC} -0csu $< assets_$(notdir $<) > $@
 
 # Maps.
 .json.map:
-	@echo "MAP  $<"
-	@${MAP.cmd}
+	${MAP.cmd}
 
 # Tilesets.
 .json.tileset:
-	@echo "TS   $<"
-	@${TILESET.cmd}
+	${TILESET.cmd}
 
 -include ${LIBMLK_ADVENTURE_DEPS}
 -include ${LIBMLK_CORE_DEPS}
@@ -294,69 +316,126 @@
 -include ${MLK_MAP_DEPS}
 -include ${MLK_TILESET_DEPS}
 
+# {{{ libmlk-sqlite
+
 ${LIBMLK_SQLITE}: ${LIBMLK_SQLITE_OBJS}
-	@echo "AR   $@"
-	@${AR} -rc $@ ${LIBMLK_SQLITE_OBJS}
+	${CMD.ar}
+
+# }}}
+
+# {{{ libmlk-core
 
 ${LIBMLK_CORE_OBJS}: config.h
 
 ${LIBMLK_CORE}: ${LIBMLK_CORE_OBJS}
-	@echo "AR   $@"
-	@${AR} -rc $@ ${LIBMLK_CORE_OBJS}
+	${CMD.ar}
+
+# }}}
+
+# {{{ libmlk-ui
 
 ${LIBMLK_UI_ASTS}: ${MLK_BCC}
-${LIBMLK_UI_OBJS}: ${LIBMLK_UI_ASTS}
+${LIBMLK_UI_OBJS}: ${LIBMLK_UI_ASTS} ${LIBMLK_CORE}
 
-${LIBMLK_UI}: ${LIBMLK_CORE} ${LIBMLK_UI_OBJS}
-	@echo "AR   $@"
-	@${AR} -rc $@ ${LIBMLK_UI_OBJS}
+${LIBMLK_UI}: ${LIBMLK_UI_OBJS}
+	${CMD.ar}
+
+# }}}
+
+# {{{ libmlk-rpg
 
 ${LIBMLK_RPG_ASTS}: ${MLK_BCC}
-${LIBMLK_RPG_OBJS}: ${LIBMLK_RPG_ASTS}
+${LIBMLK_RPG_OBJS}: ${LIBMLK_RPG_ASTS} ${LIBMLK_UI} ${LIBMLK_SQLITE}
 
-${LIBMLK_RPG}: ${LIBMLK_UI} ${LIBMLK_SQLITE} ${LIBMLK_RPG_OBJS}
-	@echo "AR   $@"
-	@${AR} -rc $@ ${LIBMLK_RPG_OBJS}
+${LIBMLK_RPG}: ${LIBMLK_RPG_OBJS}
+	${CMD.ar}
+
+# }}}
+
+# {{{ libmlk-adventure
 
 ${LIBMLK_ADVENTURE_ASTS}: ${MLK_BCC}
-${LIBMLK_ADVENTURE_OBJS}: ${LIBMLK_ADVENTURE_ASTS}
+${LIBMLK_ADVENTURE_OBJS}: ${LIBMLK_ADVENTURE_ASTS} ${LIBMLK_RPG}
+
+${LIBMLK_ADVENTURE}: ${LIBMLK_ADVENTURE_OBJS}
+	${CMD.ar}
+
+# }}}
+
+# {{{ libmlk-data
 
-${LIBMLK_ADVENTURE}: ${LIBMLK_RPG} ${LIBMLK_ADVENTURE_OBJS}
-	@echo "AR   $@"
-	@${AR} -rc $@ ${LIBMLK_ADVENTURE_OBJS}
+${LIBMLK_DATA_ASTS}: ${MLK_MAP} ${MLK_TILESET}
+
+# }}}
+
+# {{{ tools
 
+${MLK_BCC}: LIBS :=
 ${MLK_BCC}: ${MLK_BCC_OBJS}
-	@echo "CCLD $@"
-	@${CC} ${CFLAGS} -o $@ ${MLK_BCC_OBJS} ${SDL2_LIBS} ${LDFLAGS}
+	${CMD.ccld}
 
+${MLK_TILESET}: LIBS := ${JANSSON_LIBS}
 ${MLK_TILESET}: ${MLK_TILESET_OBJS}
-	@echo "CCLD $@"
-	@${CC} ${CFLAGS} -o $@ ${MLK_TILESET_OBJS} ${JANSSON_LIBS} ${LDFLAGS}
+	${CMD.ccld}
+
+${MLK_MAP}: LIBS := ${JANSSON_LIBS}
+${MLK_MAP}: ${MLK_MAP_OBJS}
+	${CMD.ccld}
+
+# }}}
+
+# {{{ mlk-adventure
 
-${MLK_MAP}: ${MLK_MAP_OBJS}
-	@echo "CCLD $@"
-	@${CC} ${CFLAGS} -o $@ ${MLK_MAP_OBJS} ${JANSSON_LIBS} ${LDFLAGS}
+${MLK_ADVENTURE_OBJS}: ${LIBMLK_ADVENTURE} ${LIBMLK_DATA_ASTS}
+
+${MLK_ADVENTURE}: LIBS := ${LIBMLK_ALL}
+${MLK_ADVENTURE}: ${MLK_ADVENTURE_OBJS}
+	${CMD.ccld}
+
+# }}}
+
+# {{{ examples
+
+${EXAMPLES}: ${LIBMLK_ADVENTURE}
 
-${MLK_ADVENTURE_OBJS}: ${LIBMLK_ADVENTURE}
+examples/example-%/main: LIBS := ${LIBMLK_ALL}
+examples/example-%/main: examples/example-%/main.c
+	${CMD.ccld}
+
+examples: ${EXAMPLES}
+
+# }}}
+
+# {{{ tests
+
+${TESTS}: ${LIBMLK_ADVENTURE}
 
-${MLK_ADVENTURE}: ${MLK_ADVENTURE_OBJS}
-	@echo "CCLD $@"
-	@${CC} ${CFLAGS} -o $@ ${MLK_ADVENTURE_OBJS} ${LIBMLK_ADVENTURE} \
-		${LIBMLK_RPG} ${LIBMLK_UI} ${LIBMLK_CORE} ${LIBMLK_SQLITE} \
-		${SDL2_LIBS} ${ZSTD_LIBS} ${LIBS} ${LDFLAGS}
+tests/test-%: CFLAGS += -DDIRECTORY=\"${CURDIR}/tests/assets\"
+tests/test-%: LIBS := ${LIBMLK_ALL}
+tests/test-%: tests/test-%.c
+	${CMD.ccld}
+
+tests: ${TESTS}
+	for t in ${TESTS}; do printf "\n=> $$t <=\n" && $$t -v; done
+
+# }}}
+
+# {{{ clean
 
 clean:
-	@echo "cleaning"
-	@rm -f config.h tags
-	@rm -f ${LIBMLK_ADVENTURE} ${LIBMLK_ADVENTURE_OBJS} ${LIBMLK_ADVENTURE_DEPS}
-	@rm -f ${LIBMLK_CORE} ${LIBMLK_CORE_OBJS} ${LIBMLK_CORE_DEPS}
-	@rm -f ${LIBMLK_RPG} ${LIBMLK_RPG_OBJS} ${LIBMLK_RPG_DEPS} ${LIBMLK_RPG_ASTS}
-	@rm -f ${LIBMLK_UI} ${LIBMLK_UI_OBJS} ${LIBMLK_UI_DEPS} ${LIBMLK_UI_ASTS}
-	@rm -f ${LIBMLK_SQLITE} ${LIBMLK_SQLITE_OBJS} ${LIBMLK_SQLITE_DEPS} ${LIBMLK_SQLITE_ASTS}
-	@rm -f ${LIBMLK_DATA_ASTS}
-	@rm -f ${MLK_ADVENTURE} ${MLK_ADVENTURE_OBJS} ${MLK_ADVENTURE_DEPS}
-	@rm -f ${MLK_BCC} ${MLK_BCC_OBJS} ${MLK_BCC_DEPS}
-	@rm -f ${MLK_MAP} ${MLK_MAP_OBJS} ${MLK_MAP_DEPS}
-	@rm -f ${MLK_TILESET} ${MLK_TILESET_OBJS} ${MLK_TILESET_DEPS}
+	rm -f config.h tags
+	rm -f ${LIBMLK_ADVENTURE} ${LIBMLK_ADVENTURE_OBJS} ${LIBMLK_ADVENTURE_DEPS}
+	rm -f ${LIBMLK_CORE} ${LIBMLK_CORE_OBJS} ${LIBMLK_CORE_DEPS}
+	rm -f ${LIBMLK_RPG} ${LIBMLK_RPG_OBJS} ${LIBMLK_RPG_DEPS} ${LIBMLK_RPG_ASTS}
+	rm -f ${LIBMLK_UI} ${LIBMLK_UI_OBJS} ${LIBMLK_UI_DEPS} ${LIBMLK_UI_ASTS}
+	rm -f ${LIBMLK_SQLITE} ${LIBMLK_SQLITE_OBJS} ${LIBMLK_SQLITE_DEPS} ${LIBMLK_SQLITE_ASTS}
+	rm -f ${LIBMLK_DATA_ASTS}
+	rm -f ${MLK_ADVENTURE} ${MLK_ADVENTURE_OBJS} ${MLK_ADVENTURE_DEPS}
+	rm -f ${MLK_BCC} ${MLK_BCC_OBJS} ${MLK_BCC_DEPS}
+	rm -f ${MLK_MAP} ${MLK_MAP_OBJS} ${MLK_MAP_DEPS}
+	rm -f ${MLK_TILESET} ${MLK_TILESET_OBJS} ${MLK_TILESET_DEPS}
+	rm -f ${EXAMPLES} ${TESTS}
 
-.PHONY: all clean
+# }}}
+
+.PHONY: all clean examples tests