changeset 411:d74f53299252

make: add basic GNU make support
author David Demelier <markand@malikania.fr>
date Fri, 07 Oct 2022 14:35:31 +0200
parents 1bf7d6669f0a
children a1d7f422759b
files .hgignore GNUmakefile src/libmlk-core/CMakeLists.txt src/libmlk-core/core/core.c src/libmlk-core/core/core.h src/libmlk-core/core/core_p.h src/libmlk-core/core/panic.c src/libmlk-core/core/sys.c src/libmlk-core/core/sys.h src/libmlk-core/core/sys_p.h src/libmlk-core/core/sysconfig.h.in src/libmlk-core/core/translate.c src/libmlk-core/core/translate.h src/libmlk-core/core/vfs-zip.c src/libmlk-core/core/vfs-zip.h src/libmlk-port/port/config.h.in src/libmlk-port/port/fmemopen.c src/libmlk-port/port/port.h src/libmlk-rpg/CMakeLists.txt src/libmlk-rpg/rpg/battle-bar-default.c src/libmlk-rpg/rpg/battle-state-check.c src/libmlk-rpg/rpg/battle-state-lost.c src/libmlk-rpg/rpg/battle-state-victory.c src/libmlk-rpg/rpg/battle.c src/libmlk-rpg/rpg/character.c src/libmlk-rpg/rpg/map-file.c src/libmlk-rpg/rpg/message.c src/libmlk-rpg/rpg/property.c src/libmlk-rpg/rpg/quest.c src/libmlk-rpg/rpg/rpg.c src/libmlk-rpg/rpg/rpg_p.h src/libmlk-rpg/rpg/save.c src/libmlk-rpg/rpg/tileset-file.c src/libmlk-ui/CMakeLists.txt src/libmlk-ui/ui/button.c src/libmlk-ui/ui/gridmenu.c src/libmlk-ui/ui/notify.c src/libmlk-ui/ui/theme.c src/libmlk-ui/ui/ui.c src/libmlk-ui/ui/ui_p.h
diffstat 40 files changed, 489 insertions(+), 453 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Fri Sep 09 13:30:34 2022 +0200
+++ b/.hgignore	Fri Oct 07 14:35:31 2022 +0200
@@ -1,3 +1,9 @@
+# object files.
+\.a$
+\.d$
+\.o$
+assets/.*\.h$
+
 # CMake files.
 ^build
 
@@ -14,9 +20,11 @@
 
 # macOS specific.
 \.DS_Store$
+\.dSYM
 
 # Generated files.
 \.exe$
+^config\.h$
 ^mlk-
 ^example-
 ^src/libmlk-data/maps/.*\.map$
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GNUmakefile	Fri Oct 07 14:35:31 2022 +0200
@@ -0,0 +1,349 @@
+-include config.mk
+
+# Toolchain options.
+CC ?=                   clang
+CFLAGS ?=               -g -O0
+BCC ?=                  bcc
+BCC_OPTS ?=             -cs
+MD ?=                   -MD
+
+# User options.
+WITH_ZIP :=             yes
+WITH_ZSTD :=            yes
+WITH_DEBUG :=           no
+
+OS :=                   $(shell uname -s)
+
+SDL2_INCS ?=            $(shell pkg-config --cflags sdl2)
+SDL2_LIBS ?=            $(shell pkg-config --libs sdl2)
+
+SDL2_IMAGE_INCS ?=      $(shell pkg-config --cflags SDL2_image)
+SDL2_IMAGE_LIBS ?=      $(shell pkg-config --libs SDL2_image)
+
+SDL2_TTF_INCS ?=        $(shell pkg-config --cflags SDL2_ttf)
+SDL2_TTF_LIBS ?=        $(shell pkg-config --libs SDL2_ttf)
+
+SNDFILE_INCS ?=         $(shell pkg-config --cflags sndfile)
+SNDFILE_LIBS ?=         $(shell pkg-config --libs sndfile)
+
+ifeq ($(WITH_ZSTD),yes)
+ZSTD_INCS ?=            $(shell pkg-config --cflags libzstd)
+ZSTD_LIBS ?=            $(shell pkg-config --libs libzstd)
+endif
+
+ifeq ($(WITH_ZIP),yes)
+LIBZIP_INCS ?=          $(shell pkg-config --cflags libzip)
+LIBZIP_LIBS ?=          $(shell pkg-config --libs libzip)
+endif
+
+ifeq ($(OS),Darwin)
+OPENAL_LIBS ?=          -framework OpenAL
+else
+OPENAL_INCS ?=          $(shell pkg-config --cflags openal)
+OPENAL_LIBS ?=          $(shell pkg-config --libs openal)
+endif
+
+# Global INCS, OPTS and DEFS for every targets.
+INCS :=                 -Iextern/libdt \
+                        -Iextern/libsqlite \
+                        -Isrc/libmlk-port \
+                        -Isrc/libmlk-core \
+                        -Isrc/libmlk-ui \
+                        -Isrc/libmlk-rpg \
+                        -I. \
+                        $(SDL2_INCS) \
+                        $(SDL2_IMAGE_INCS) \
+                        $(SDL2_TTF_INCS) \
+                        $(SNDFILE_INCS)
+
+ifeq ($(WITH_ZSTD),yes)
+INCS +=                 $(ZSTD_INCS)
+endif
+
+ifeq ($(WITH_ZIP),yes)
+INCS +=                 $(ZIP_INCS)
+endif
+
+OPTS :=                 -Wall -Wextra -pipe
+
+ifeq ($(OS),Darwin)
+OPTS +=                 -Wno-deprecated-declarations
+endif
+
+ifeq ($(WITH_DEBUG),yes)
+OPTS +=                 -g -O0
+else
+OPTS +=                 -DNDEBUG -O3
+endif
+
+.DEFAULT_GOAL :=        all
+
+.SUFFIXES:
+.SUFFIXES: .c .h .o .sql .ttf
+
+.c.o:
+	$(CC) $(OPTS) $(INCS) $(DEFS) $(CFLAGS) $(MD) -c $< -o $@
+
+.c:
+	$(CC) $(OPTS) $(INCS) $(DEFS) $(CFLAGS) $< -o $@ $(LIBS) $(LDFLAGS)
+
+.ttf.h .sql.h:
+	$(BCC) $(BCC_OPTS) $< assets_$(basename $(<F)) > $@
+
+%.a:
+	$(AR) -rc $@ $(OBJS)
+
+# {{{ config.h
+
+config.h:
+	rm -f config.h
+	touch config.h
+ifeq ($(WITH_ZSTD),yes)
+	echo "#define MLK_WITH_ZSTD" >> config.h
+endif
+ifeq ($(WITH_ZIP),yes)
+	echo "#define MLK_WITH_ZIP" >> config.h
+endif
+
+# }}}
+
+# {{{ libmlk-port
+
+LIBMLK_PORT :=          libmlk-port.a
+LIBMLK_PORT_SRCS :=     src/libmlk-port/port/basename.c \
+                        src/libmlk-port/port/dirname.c \
+                        src/libmlk-port/port/fmemopen.c \
+                        src/libmlk-port/port/getopt.c \
+                        src/libmlk-port/port/strlcat.c \
+                        src/libmlk-port/port/strlcpy.c
+LIBMLK_PORT_OBJS :=     $(LIBMLK_PORT_SRCS:.c=.o)
+LIBMLK_PORT_DEPS :=     $(LIBMLK_PORT_SRCS:.c=.d)
+
+-include $(LIBMLK_PORT_DEPS)
+
+$(LIBMLK_PORT): INCS :=
+$(LIBMLK_PORT): OBJS := $(LIBMLK_PORT_OBJS)
+$(LIBMLK_PORT): $(LIBMLK_PORT_OBJS)
+
+all: $(LIBMLK_PORT)
+
+# }}}
+
+# {{{ libmlk-sqlite
+
+LIBMLK_SQLITE :=          libmlk-sqlite.a
+LIBMLK_SQLITE_SRCS :=     extern/libsqlite/sqlite3.c
+LIBMLK_SQLITE_OBJS :=     $(LIBMLK_SQLITE_SRCS:.c=.o)
+LIBMLK_SQLITE_DEPS :=     $(LIBMLK_SQLITE_SRCS:.c=.d)
+
+-include $(LIBMLK_SQLITE_DEPS)
+
+$(LIBMLK_SQLITE): INCS :=
+$(LIBMLK_SQLITE): OBJS := $(LIBMLK_SQLITE_OBJS)
+$(LIBMLK_SQLITE): $(LIBMLK_SQLITE_OBJS)
+
+all: $(LIBMLK_SQLITE)
+
+# }}}
+
+# {{{ libmlk-core
+
+LIBMLK_CORE :=          libmlk-core.a
+LIBMLK_CORE_SRCS :=     src/libmlk-core/core/action-stack.c \
+                        src/libmlk-core/core/action.c \
+                        src/libmlk-core/core/alloc.c \
+                        src/libmlk-core/core/animation.c \
+                        src/libmlk-core/core/buf.c \
+                        src/libmlk-core/core/clock.c \
+                        src/libmlk-core/core/core.c \
+                        src/libmlk-core/core/drawable-stack.c \
+                        src/libmlk-core/core/drawable.c \
+                        src/libmlk-core/core/error.c \
+                        src/libmlk-core/core/event.c \
+                        src/libmlk-core/core/font.c \
+                        src/libmlk-core/core/game.c \
+                        src/libmlk-core/core/image.c \
+                        src/libmlk-core/core/maths.c \
+                        src/libmlk-core/core/music.c \
+                        src/libmlk-core/core/painter.c \
+                        src/libmlk-core/core/panic.c \
+                        src/libmlk-core/core/script.c \
+                        src/libmlk-core/core/sound.c \
+                        src/libmlk-core/core/sprite.c \
+                        src/libmlk-core/core/state.c \
+                        src/libmlk-core/core/sys.c \
+                        src/libmlk-core/core/texture.c \
+                        src/libmlk-core/core/trace.c \
+                        src/libmlk-core/core/util.c \
+                        src/libmlk-core/core/vfs-directory.c \
+                        src/libmlk-core/core/vfs-zip.c \
+                        src/libmlk-core/core/vfs.c \
+                        src/libmlk-core/core/window.c \
+                        src/libmlk-core/core/zfile.c
+LIBMLK_CORE_OBJS :=     $(LIBMLK_CORE_SRCS:.c=.o)
+LIBMLK_CORE_DEPS :=     $(LIBMLK_CORE_SRCS:.c=.d)
+
+-include $(LIBMLK_CORE_DEPS)
+
+$(LIBMLK_CORE_OBJS): config.h
+$(LIBMLK_CORE): OBJS := $(LIBMLK_CORE_OBJS)
+$(LIBMLK_CORE): $(LIBMLK_CORE_OBJS)
+
+all: $(LIBMLK_CORE)
+
+# }}}
+
+# {{{ libmlk-ui
+
+LIBMLK_UI :=            libmlk-ui.a
+LIBMLK_UI_SRCS :=       src/libmlk-ui/ui/align.c \
+                        src/libmlk-ui/ui/button.c \
+                        src/libmlk-ui/ui/checkbox.c \
+                        src/libmlk-ui/ui/debug.c \
+                        src/libmlk-ui/ui/frame.c \
+                        src/libmlk-ui/ui/gridmenu.c \
+                        src/libmlk-ui/ui/label.c \
+                        src/libmlk-ui/ui/notify.c \
+                        src/libmlk-ui/ui/theme.c \
+                        src/libmlk-ui/ui/ui.c
+
+LIBMLK_UI_OBJS :=       $(LIBMLK_UI_SRCS:.c=.o)
+LIBMLK_UI_DEPS :=       $(LIBMLK_UI_SRCS:.c=.d)
+LIBMLK_UI_DATA_SRCS :=  src/libmlk-ui/assets/fonts/opensans-light.ttf \
+                        src/libmlk-ui/assets/fonts/opensans-medium.ttf \
+                        src/libmlk-ui/assets/fonts/opensans-regular.ttf
+LIBMLK_UI_DATA_OBJS :=  $(addsuffix .h,$(basename $(LIBMLK_UI_DATA_SRCS)))
+
+$(LIBMLK_UI_OBJS): $(LIBMLK_UI_DATA_OBJS)
+$(LIBMLK_UI): $(LIBMLK_UI_OBJS)
+$(LIBMLK_UI): OBJS := $(LIBMLK_UI_OBJS)
+
+all: $(LIBMLK_UI)
+
+# }}}
+
+# {{{ libmlk-rpg
+
+LIBMLK_RPG :=           libmlk-rpg.a
+LIBMLK_RPG_SRCS :=      src/libmlk-rpg/rpg/battle-bar-default.c \
+                        src/libmlk-rpg/rpg/battle-bar.c \
+                        src/libmlk-rpg/rpg/battle-entity-state-attacking.c \
+                        src/libmlk-rpg/rpg/battle-entity-state-blinking.c \
+                        src/libmlk-rpg/rpg/battle-entity-state-moving.c \
+                        src/libmlk-rpg/rpg/battle-entity-state-normal.c \
+                        src/libmlk-rpg/rpg/battle-entity-state.c \
+                        src/libmlk-rpg/rpg/battle-entity.c \
+                        src/libmlk-rpg/rpg/battle-indicator.c \
+                        src/libmlk-rpg/rpg/battle-message.c \
+                        src/libmlk-rpg/rpg/battle-state-ai.c \
+                        src/libmlk-rpg/rpg/battle-state-attacking.c \
+                        src/libmlk-rpg/rpg/battle-state-check.c \
+                        src/libmlk-rpg/rpg/battle-state-closing.c \
+                        src/libmlk-rpg/rpg/battle-state-item.c \
+                        src/libmlk-rpg/rpg/battle-state-lost.c \
+                        src/libmlk-rpg/rpg/battle-state-menu.c \
+                        src/libmlk-rpg/rpg/battle-state-opening.c \
+                        src/libmlk-rpg/rpg/battle-state-rendering.c \
+                        src/libmlk-rpg/rpg/battle-state-selection.c \
+                        src/libmlk-rpg/rpg/battle-state-victory.c \
+                        src/libmlk-rpg/rpg/battle-state.c \
+                        src/libmlk-rpg/rpg/battle.c \
+                        src/libmlk-rpg/rpg/character.c \
+                        src/libmlk-rpg/rpg/equipment.c \
+                        src/libmlk-rpg/rpg/inventory.c \
+                        src/libmlk-rpg/rpg/item.c \
+                        src/libmlk-rpg/rpg/map-file.c \
+                        src/libmlk-rpg/rpg/map.c \
+                        src/libmlk-rpg/rpg/message.c \
+                        src/libmlk-rpg/rpg/property.c \
+                        src/libmlk-rpg/rpg/quest.c \
+                        src/libmlk-rpg/rpg/rpg.c \
+                        src/libmlk-rpg/rpg/save.c \
+                        src/libmlk-rpg/rpg/selection.c \
+                        src/libmlk-rpg/rpg/spell.c \
+                        src/libmlk-rpg/rpg/team.c \
+                        src/libmlk-rpg/rpg/tileset-file.c \
+                        src/libmlk-rpg/rpg/tileset.c \
+                        src/libmlk-rpg/rpg/walksprite.c
+
+LIBMLK_RPG_OBJS :=      $(LIBMLK_RPG_SRCS:.c=.o)
+LIBMLK_RPG_DEPS :=      $(LIBMLK_RPG_SRCS:.c=.d)
+LIBMLK_RPG_DATA_SRCS := src/libmlk-rpg/assets/sql/character-load.sql \
+                        src/libmlk-rpg/assets/sql/character-save.sql \
+                        src/libmlk-rpg/assets/sql/init.sql \
+                        src/libmlk-rpg/assets/sql/property-load.sql \
+                        src/libmlk-rpg/assets/sql/property-remove.sql \
+                        src/libmlk-rpg/assets/sql/property-save.sql \
+                        src/libmlk-rpg/assets/sql/quest-remove.sql \
+                        src/libmlk-rpg/assets/sql/quest-save.sql \
+                        src/libmlk-rpg/assets/sql/quest-step-load.sql \
+                        src/libmlk-rpg/assets/sql/quest-step-save.sql
+LIBMLK_RPG_DATA_OBJS := $(addsuffix .h,$(basename $(LIBMLK_RPG_DATA_SRCS)))
+
+$(LIBMLK_RPG_DATA_OBJS): BCC_OPTS := -cs0
+$(LIBMLK_RPG_OBJS): $(LIBMLK_RPG_DATA_OBJS)
+$(LIBMLK_RPG): $(LIBMLK_RPG_OBJS)
+$(LIBMLK_RPG): OBJS := $(LIBMLK_RPG_OBJS)
+
+all: $(LIBMLK_RPG)
+
+# }}}
+
+# Meta variable that contains all libraries, used for executables and tests.
+LIBMLK :=       $(LIBMLK_RPG) \
+                $(LIBMLK_UI) \
+                $(LIBMLK_CORE) \
+                $(LIBMLK_PORT) \
+                $(LIBMLK_SQLITE) \
+                $(SDL2_LIBS) \
+                $(SDL2_IMAGE_LIBS) \
+                $(SDL2_TTF_LIBS) \
+                $(OPENAL_LIBS) \
+                $(SNDFILE_LIBS)
+
+ifeq ($(WITH_ZSTD),yes)
+LIBMLK +=       $(ZSTD_LIBS)
+endif
+
+ifeq ($(WITH_ZIP),yes)
+LIBMLK +=       $(LIBZIP_LIBS)
+endif
+
+TESTS :=        tests/test-action-script.c \
+                tests/test-action.c \
+                tests/test-alloc.c \
+                tests/test-character.c \
+                tests/test-color.c \
+                tests/test-drawable.c \
+                tests/test-error.c \
+                tests/test-map.c \
+                tests/test-save-quest.c \
+                tests/test-save.c \
+                tests/test-state.c \
+                tests/test-tileset.c \
+                tests/test-util.c \
+                tests/test-vfs-directory.c \
+
+ifeq ($(WITH_ZIP),yes)
+TESTS +=        tests/test-vfs-zip.c
+endif
+
+TESTS_EXE :=    $(TESTS:.c=)
+
+$(TESTS_EXE): private LIBS += $(LIBMLK)
+$(TESTS_EXE): private DEFS += -DDIRECTORY=\"$(CURDIR)/tests/assets\"
+$(TESTS_EXE): $(LIBMLK_RPG) $(LIBMLK_UI) $(LIBMLK_CORE) $(LIBMLK_PORT) $(LIBMLK_SQLITE)
+
+tests: $(TESTS_EXE)
+	for t in $(TESTS_EXE); do ./$$t; done
+
+clean:
+	rm -f config.h
+	rm -f $(LIBMLK_SQLITE) $(LIBMLK_SQLITE_DEPS) $(LIBMLK_SQLITE_OBJS)
+	rm -f $(LIBMLK_PORT) $(LIBMLK_PORT_DEPS) $(LIBMLK_PORT_OBJS)
+	rm -f $(LIBMLK_CORE) $(LIBMLK_CORE_DEPS) $(LIBMLK_CORE_OBJS)
+	rm -f $(LIBMLK_UI) $(LIBMLK_UI_DEPS) $(LIBMLK_UI_OBJS) $(LIBMLK_UI_DATA_OBJS)
+	rm -f $(LIBMLK_RPG) $(LIBMLK_RPG_DEPS) $(LIBMLK_RPG_OBJS) $(LIBMLK_RPG_DATA_OBJS)
+	rm -f $(TESTS_EXE)
+
+.PHONY: all clean tests
--- a/src/libmlk-core/CMakeLists.txt	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-core/CMakeLists.txt	Fri Oct 07 14:35:31 2022 +0200
@@ -35,7 +35,6 @@
 	${libmlk-core_SOURCE_DIR}/core/color.h
 	${libmlk-core_SOURCE_DIR}/core/core.c
 	${libmlk-core_SOURCE_DIR}/core/core.h
-	${libmlk-core_SOURCE_DIR}/core/core_p.h
 	${libmlk-core_SOURCE_DIR}/core/drawable.c
 	${libmlk-core_SOURCE_DIR}/core/drawable.h
 	${libmlk-core_SOURCE_DIR}/core/drawable-stack.c
@@ -77,8 +76,6 @@
 	${libmlk-core_SOURCE_DIR}/core/texture_p.h
 	${libmlk-core_SOURCE_DIR}/core/trace.c
 	${libmlk-core_SOURCE_DIR}/core/trace.h
-	${libmlk-core_SOURCE_DIR}/core/translate.c
-	${libmlk-core_SOURCE_DIR}/core/translate.h
 	${libmlk-core_SOURCE_DIR}/core/util.c
 	${libmlk-core_SOURCE_DIR}/core/util.h
 	${libmlk-core_SOURCE_DIR}/core/vfs-directory.c
--- a/src/libmlk-core/core/core.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-core/core/core.c	Fri Oct 07 14:35:31 2022 +0200
@@ -23,7 +23,6 @@
 
 #include "core.h"
 #include "sys.h"
-#include "translate.h"
 
 int
 core_init(const char *organization, const char *name)
@@ -36,8 +35,6 @@
 	if (sys_init(organization, name) < 0)
 		return -1;
 
-	translate_init("libmlk-core");
-
 	return 0;
 }
 
--- a/src/libmlk-core/core/core.h	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-core/core/core.h	Fri Oct 07 14:35:31 2022 +0200
@@ -21,7 +21,7 @@
 
 #if defined(__cplusplus)
 #       define CORE_BEGIN_DECLS extern "C" {
-#       define CORE_END_DECLS   }
+#       define CORE_END_DECLS }
 #else
 #       define CORE_BEGIN_DECLS
 #       define CORE_END_DECLS
--- a/src/libmlk-core/core/core_p.h	Fri Sep 09 13:30:34 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/*
- * core_p -- libcore private definitions
- *
- * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef MLK_CORE_CORE_P_H
-#define MLK_CORE_CORE_P_H
-
-#include "config.h"
-
-#if defined(MLK_WITH_NLS)
-#       include <libintl.h>
-#       define _(s) dgettext("libmlk-core", s)
-#else
-#       define _(s) s
-#endif
-
-#endif /* !MLK_CORE_CORE_P_H */
--- a/src/libmlk-core/core/panic.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-core/core/panic.c	Fri Oct 07 14:35:31 2022 +0200
@@ -20,14 +20,13 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "core_p.h"
 #include "error.h"
 #include "panic.h"
 
 static void
 terminate(void)
 {
-	fprintf(stderr, _("abort: %s\n"), error());
+	fprintf(stderr, "abort: %s\n", error());
 	abort();
 	exit(1);
 }
@@ -74,6 +73,6 @@
 	 * This should not happen, if it does it means the user did not fully
 	 * satisfied the constraint of panic_handler.
 	 */
-	fprintf(stderr, _("abort: panic handler returned\n"));
+	fprintf(stderr, "abort: panic handler returned\n");
 	exit(1);
 }
--- a/src/libmlk-core/core/sys.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-core/core/sys.c	Fri Oct 07 14:35:31 2022 +0200
@@ -60,12 +60,6 @@
 	.name = "molko"
 };
 
-static struct {
-	char bindir[PATH_MAX];
-	char datadir[PATH_MAX];
-	char localedir[PATH_MAX];
-} paths;
-
 static inline char *
 normalize(char *str)
 {
@@ -76,83 +70,6 @@
 	return str;
 }
 
-static inline int
-absolute(const char *path)
-{
-#if defined(_WIN32)
-	return !PathIsRelativeA(path);
-#else
-	/* Assuming UNIX like. */
-	if (path[0] == '/')
-		return 1;
-
-	return 0;
-#endif
-}
-
-static const char *
-system_directory(const char *whichdir)
-{
-	static char path[PATH_MAX];
-	static char ret[PATH_MAX];
-	char *base, *binsect;
-
-	/*
-	 * Some system does not provide support (shame on you OpenBSD)
-	 * to the executable path. In that case we use PREFIX+<dir>
-	 * instead unless <dir> is already absolute.
-	 */
-
-	/*
-	 * If requested directory is absolute return immediately.
-	 *
-	 * e.g. whichdir == /usr/share  -> return immediately
-	 *      whichdir == bin         -> will be computed
-	 */
-	if (absolute(whichdir))
-		return whichdir;
-
-	/*
-	 * If MLK_BINDIR is absolute then we're unable to compute whichdir which
-	 * now is mandatory relative. In that case return its whole path to the
-	 * prefix.
-	 */
-	if (absolute(MLK_BINDIR) || !(base = SDL_GetBasePath()))
-		snprintf(ret, sizeof (ret), "%s/%s", MLK_PREFIX, whichdir);
-	else {
-		/*
-		 * Decompose the path to the given special directory by
-		 * computing relative directory to it from where the
-		 * binary is located.
-		 *
-		 * Example:
-		 *
-		 *   PREFIX/bin/<executable>
-		 *   PREFIX/share/mysupergame
-		 *
-		 * The path to the data is ../share/mysupergame starting from
-		 * the binary.
-		 *
-		 * Put the base path into the path and remove the value
-		 * of MLK_BINDIR.
-		 *
-		 * Example:
-		 *   from: /usr/local/bin
-		 *   to:   /usr/local
-		 */
-		port_strlcpy(path, base, sizeof (path));
-		SDL_free(base);
-
-		/* TODO: remove using negative offset. */
-		if ((binsect = strstr(path, MLK_BINDIR)))
-			*binsect = '\0';
-
-		snprintf(ret, sizeof (ret), "%s%s", path, whichdir);
-	}
-
-	return normalize(ret);
-}
-
 static const char *
 user_directory(enum sys_dir kind)
 {
@@ -194,12 +111,10 @@
 	setbuf(stderr, NULL);
 	setbuf(stdout, NULL);
 #endif
-	port_strlcpy(paths.bindir, system_directory(MLK_BINDIR), sizeof (paths.bindir));
-	port_strlcpy(paths.datadir, system_directory(MLK_DATADIR), sizeof (paths.datadir));
-	port_strlcpy(paths.localedir, system_directory(MLK_LOCALEDIR), sizeof (paths.localedir));
 
-	port_strlcpy(info.organization, organization, sizeof (info.organization));
-	port_strlcpy(info.name, name, sizeof (info.name));
+	/* Kept for future use. */
+	(void)organization;
+	(void)name;
 
 	/* SDL2. */
 	if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
@@ -229,16 +144,7 @@
 const char *
 sys_dir(enum sys_dir kind)
 {
-	switch (kind) {
-	case SYS_DIR_BIN:
-		return paths.bindir;
-	case SYS_DIR_DATA:
-		return paths.datadir;
-	case SYS_DIR_LOCALE:
-		return paths.localedir;
-	default:
-		return user_directory(kind);
-	}
+	return user_directory(kind);
 }
 
 int
@@ -317,7 +223,7 @@
 	    stream->samplesz * sizeof (*stream->samples), stream->samplerate);
 	alGenSources(1, &stream->source);
 	alSourcei(stream->source, AL_BUFFER, stream->buffer);
-	
+
 	sf_close(file);
 
 	return stream;
@@ -409,7 +315,7 @@
 		.data = data,
 		.datasz = datasz,
 	};
-	
+
 	if (!(file = sf_open_virtual(&io, SFM_READ, &info, &viodata)))
 		return NULL;
 
--- a/src/libmlk-core/core/sys.h	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-core/core/sys.h	Fri Oct 07 14:35:31 2022 +0200
@@ -24,10 +24,7 @@
 #include "core.h"
 
 enum sys_dir {
-	SYS_DIR_BIN,
-	SYS_DIR_DATA,
-	SYS_DIR_LOCALE,
-	SYS_DIR_SAVE,
+	SYS_DIR_SAVE
 };
 
 CORE_BEGIN_DECLS
--- a/src/libmlk-core/core/sys_p.h	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-core/core/sys_p.h	Fri Oct 07 14:35:31 2022 +0200
@@ -19,10 +19,17 @@
 #ifndef MLK_CORE_SYS_P_H
 #define MLK_CORE_SYS_P_H
 
+#include <port/port.h>
+
 #include <stddef.h>
 
-#include <al.h>
-#include <alc.h>
+#if defined(MLK_OS_APPLE)
+#       include <OpenAL/al.h>
+#       include <OpenAL/alc.h>
+#else
+#       include <al.h>
+#       include <alc.h>
+#endif
 
 extern ALCdevice *audio_dev;
 extern ALCcontext *audio_ctx;
--- a/src/libmlk-core/core/sysconfig.h.in	Fri Sep 09 13:30:34 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * sysconfig.h -- build time configuration
- *
- * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef MOLKO_CORE_SYSCONFIG_H
-#define MOLKO_CORE_SYSCONFIG_H
-
-#cmakedefine MOLKO_WITH_NLS
-
-#define MOLKO_BINDIR            "@CMAKE_INSTALL_BINDIR@"
-#define MOLKO_DATADIR           "@CMAKE_INSTALL_DATADIR@"
-#define MOLKO_LOCALEDIR         "@CMAKE_INSTALL_LOCALEDIR@"
-
-#define MOLKO_ABS_BINDIR        "@CMAKE_INSTALL_FULL_BINDIR"
-#define MOLKO_ABS_DATADIR       "@CMAKE_INSTALL_FULL_DATADIR"
-#define MOLKO_ABS_LOCALEDIR     "@CMAKE_INSTALL_FULL_LOCALEDIR"
-
-#endif /* !MOLKO_CORE_SYSCONFIG_H */
--- a/src/libmlk-core/core/translate.c	Fri Sep 09 13:30:34 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
- * translate.c -- native language support
- *
- * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <stdio.h>
-
-#include "config.h"
-
-#if defined(MLK_WITH_NLS)
-#	include <libintl.h>
-#endif
-
-#include "sys.h"
-#include "translate.h"
-#include "util.h"
-
-int
-translate_init(const char *name)
-{
-#if defined(MLK_WITH_NLS)
-	if (!bindtextdomain(name, sys_dir(SYS_DIR_LOCALE)))
-		return -1;
-#endif
-	return 0;
-}
-
-void
-translate_finish(void)
-{
-}
--- a/src/libmlk-core/core/translate.h	Fri Sep 09 13:30:34 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/*
- * translate.h -- native language support
- *
- * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef MLK_CORE_TRANSLATE_H
-#define MLK_CORE_TRANSLATE_H
-
-#include "core.h"
-
-CORE_BEGIN_DECLS
-
-int
-translate_init(const char *);
-
-void
-translate_finish(void);
-
-CORE_END_DECLS
-
-#endif /* !MLK_CORE_TRANSLATE_H */
--- a/src/libmlk-core/core/vfs-zip.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-core/core/vfs-zip.c	Fri Oct 07 14:35:31 2022 +0200
@@ -16,6 +16,10 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include "config.h"
+
+#if defined(MLK_WITH_ZIP)
+
 #include <assert.h>
 #include <string.h>
 
@@ -121,3 +125,5 @@
 
 	return 0;
 }
+
+#endif /* !MLK_WITH_ZIP */
--- a/src/libmlk-core/core/vfs-zip.h	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-core/core/vfs-zip.h	Fri Oct 07 14:35:31 2022 +0200
@@ -19,6 +19,10 @@
 #ifndef MLK_CORE_VFS_ZIP_H
 #define MLK_CORE_VFS_ZIP_H
 
+#include "config.h"
+
+#if defined(MLK_WITH_ZIP)
+
 #include "core.h"
 
 struct vfs;
@@ -30,4 +34,6 @@
 
 CORE_END_DECLS
 
+#endif /* !MLK_WITH_ZIP */
+
 #endif /* !MLK_CORE_VFS_ZIP_H */
--- a/src/libmlk-port/port/config.h.in	Fri Sep 09 13:30:34 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/*
- * config.h -- system configuration and polyfills
- *
- * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef MOLKO_CONFIG_H
-#define MOLKO_CONFIG_H
-
-#define MLK_PREFIX      "@CMAKE_INSTALL_PREFIX@"
-#define MLK_BINDIR      "@CMAKE_INSTALL_BINDIR@"
-#define MLK_DATADIR     "@CMAKE_INSTALL_DATADIR@"
-#define MLK_LOCALEDIR   "@CMAKE_INSTALL_LOCALEDIR@"
-
-#cmakedefine MLK_WITH_NLS
-#cmakedefine MLK_WITH_ZSTD
-
-#cmakedefine MLK_HAS_STRLCPY
-#cmakedefine MLK_HAS_FMEMOPEN
-#cmakedefine MLK_HAS_BASENAME
-#cmakedefine MLK_HAS_DIRNAME
-#cmakedefine MLK_HAS_GETOPT
-#cmakedefine MLK_HAS_PATH_MAX
-#cmakedefine MLK_HAS_SSIZE_T
-
-#endif /* !MOLKO_CONFIG_H */
--- a/src/libmlk-port/port/fmemopen.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-port/port/fmemopen.c	Fri Oct 07 14:35:31 2022 +0200
@@ -16,7 +16,9 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#if defined(_WIN32)
+#include "port.h"
+
+#if !defined(MLK_HAS_FMEMOPEN)
 
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -60,7 +62,7 @@
 	return fp;
 }
 
-#else /* !_WIN32 */
+#else /* !MLK_HAS_FMEMOPEN */
 
 #include <stdio.h>
 
--- a/src/libmlk-port/port/port.h	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-port/port/port.h	Fri Oct 07 14:35:31 2022 +0200
@@ -22,33 +22,66 @@
 #include <limits.h>
 #include <stdio.h>
 
-/* PATH_MAX (defined in limits.h) (POSIX) */
+/*
+ * This file helps finding what are the available features accross the various
+ * operating system in the landscape.
+ *
+ * The following macros are automatically set depending on the operating
+ * system:
+ *
+ * - MLK_OS_WINDOWS: running on any Windows machine
+ * - MLK_OS_POSIX: every mostly POSIX systems
+ *
+ * The following macro will be automatically defined unless the user override
+ * them:
+ *
+ * - MLK_HAS_FMEMOPEN: defined if fmemopen function is available.
+ * - MLK_HAS_SSIZE_T: defined if ssize_t typedef is available.
+ */
+
+#if defined(_WIN32)
+#       define MLK_OS_WINDOWS
+#elif defined(__FreeBSD__)
+#       define MLK_OS_POSIX
+#elif defined(__OpenBSD__)
+#       define MLK_OS_POSIX
+#elif defined(__NetBSD__)
+#       define MLK_OS_POSIX
+#elif defined(__linux__)
+#       define MLK_OS_POSIX
+#elif defined(__APPLE__)
+#       define MLK_OS_POSIX
+#       define MLK_OS_APPLE
+#endif
+
 #if !defined(PATH_MAX)
 #       define PATH_MAX 2048
 #endif
 
-/* (POSIX) */
-#if defined(_WIN32)
+#if defined(MLK_OS_POSIX) && !defined(MLK_HAS_SSIZE_T)
+#       define MLK_HAS_SSIZE_T
+#endif
+
+#if !defined(MLK_HAS_SSIZE_T)
 typedef long long int ssize_t;
 #endif
 
-/* OpenBSD extension (in next POSIX version). */
+#if defined(MLK_OS_POSIX) && !defined(MLK_HAS_FMEMOPEN)
+#       define MLK_HAS_FMEMOPEN
+#endif
+
 size_t
 port_strlcpy(char *, const char *, size_t);
 
-/* Same as strlcpy. */
 size_t
 port_strlcat(char *, const char *, size_t);
 
-/* POSIX. */
 FILE *
 port_fmemopen(void *, size_t, const char *);
 
-/* POSIX. */
 char *
 port_basename(char *);
 
-/* POSIX. */
 char *
 port_dirname(char *);
 
--- a/src/libmlk-rpg/CMakeLists.txt	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/CMakeLists.txt	Fri Oct 07 14:35:31 2022 +0200
@@ -86,7 +86,6 @@
 	${libmlk-rpg_SOURCE_DIR}/rpg/quest.h
 	${libmlk-rpg_SOURCE_DIR}/rpg/rpg.c
 	${libmlk-rpg_SOURCE_DIR}/rpg/rpg.h
-	${libmlk-rpg_SOURCE_DIR}/rpg/rpg_p.h
 	${libmlk-rpg_SOURCE_DIR}/rpg/save.c
 	${libmlk-rpg_SOURCE_DIR}/rpg/save.h
 	${libmlk-rpg_SOURCE_DIR}/rpg/selection.c
--- a/src/libmlk-rpg/rpg/battle-bar-default.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/battle-bar-default.c	Fri Oct 07 14:35:31 2022 +0200
@@ -40,7 +40,6 @@
 #include "character.h"
 #include "inventory.h"
 #include "item.h"
-#include "rpg_p.h"
 #include "spell.h"
 
 #define THEME(bar) ((bar)->theme ? (bar)->theme : theme_default())
@@ -327,28 +326,28 @@
 		{
 			.align = ALIGN_TOP,
 			.label = {
-				.text = _("Attack"),
+				.text = "Attack",
 				.flags = LABEL_FLAGS_SHADOW
 			}
 		},
 		{
 			.align = ALIGN_RIGHT,
 			.label = {
-				.text = _("Magic"),
+				.text = "Magic",
 				.flags = LABEL_FLAGS_SHADOW
 			}
 		},
 		{
 			.align = ALIGN_BOTTOM,
 			.label = {
-				.text = _("Objects"),
+				.text = "Objects",
 				.flags = LABEL_FLAGS_SHADOW
 			}
 		},
 		{
 			.align = ALIGN_LEFT,
 			.label = {
-				.text = _("Special"),
+				.text = "Special",
 				.flags = LABEL_FLAGS_SHADOW
 			}
 		}
--- a/src/libmlk-rpg/rpg/battle-state-check.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/battle-state-check.c	Fri Oct 07 14:35:31 2022 +0200
@@ -32,7 +32,6 @@
 #include "battle-state.h"
 #include "battle.h"
 #include "character.h"
-#include "rpg_p.h"
 
 struct fadeout {
 	struct character *ch;
@@ -85,7 +84,7 @@
 	struct fadeout *fade;
 
 	if (!bt->effects) {
-		tracef(_("can't create a fadeout effect without a drawable_stack"));
+		tracef("can't create a fadeout effect without a drawable_stack");
 		return;
 	}
 
--- a/src/libmlk-rpg/rpg/battle-state-lost.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/battle-state-lost.c	Fri Oct 07 14:35:31 2022 +0200
@@ -27,7 +27,6 @@
 #include "battle-state-lost.h"
 #include "battle-state.h"
 #include "battle.h"
-#include "rpg_p.h"
 
 struct self {
 	struct battle_state_lost data;
@@ -62,7 +61,7 @@
 	assert(lost);
 	assert(bt);
 
-	lost->text = _("You have been defeated...");
+	lost->text = "You have been defeated...";
 
 	lost->msg.lines = &lost->text;
 	lost->msg.linesz = 1;
--- a/src/libmlk-rpg/rpg/battle-state-victory.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/battle-state-victory.c	Fri Oct 07 14:35:31 2022 +0200
@@ -27,7 +27,6 @@
 #include "battle-state-victory.h"
 #include "battle-state.h"
 #include "battle.h"
-#include "rpg_p.h"
 
 struct self {
 	struct battle_state_victory data;
@@ -63,7 +62,7 @@
 {
 	assert(bt);
 
-	vic->text = _("Victory!");
+	vic->text = "Victory!";
 
 	vic->msg.lines = &vic->text;
 	vic->msg.linesz = 1;
--- a/src/libmlk-rpg/rpg/battle.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/battle.c	Fri Oct 07 14:35:31 2022 +0200
@@ -48,7 +48,6 @@
 #include "character.h"
 #include "inventory.h"
 #include "item.h"
-#include "rpg_p.h"
 #include "spell.h"
 
 struct indicator {
@@ -392,7 +391,7 @@
 	struct indicator *id;
 
 	if (!(bt->effects)) {
-		tracef(_("unable to add id without a drawable_stack"));
+		tracef("unable to add id without a drawable_stack");
 		return;
 	}
 
--- a/src/libmlk-rpg/rpg/character.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/character.c	Fri Oct 07 14:35:31 2022 +0200
@@ -76,7 +76,7 @@
 	assert(ch);
 	assert(save_ok(s));
 
-	return save_exec(s, (const char *)assets_sql_character_save, "s iii i iiiiii",
+	return save_exec(s, (const char *)assets_character_save, "s iii i iiiiii",
 	    ch->name,
 	    ch->hp,
 	    ch->mp,
@@ -100,7 +100,7 @@
 	struct save_stmt stmt;
 	enum save_stmt_errno ret;
 
-	if (save_stmt_init(&stmt, s, (const char *)assets_sql_character_load, "s", ch->name) < 0)
+	if (save_stmt_init(&stmt, s, (const char *)assets_character_load, "s", ch->name) < 0)
 		return -1;
 
 	ret = save_stmt_next(&stmt, "iii i iiiiii",
--- a/src/libmlk-rpg/rpg/map-file.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/map-file.c	Fri Oct 07 14:35:31 2022 +0200
@@ -33,7 +33,6 @@
 #include <core/zfile.h>
 
 #include "map-file.h"
-#include "rpg_p.h"
 
 #define MAX_F(v) MAX_F_(v)
 #define MAX_F_(v) "%" #v "[^\n|]"
@@ -58,7 +57,7 @@
 	else if (strcmp(layer_name, "above") == 0)
 		layer_type = MAP_LAYER_TYPE_ABOVE;
 	else
-		return errorf(_("invalid layer type: %s"), layer_name);
+		return errorf("invalid layer type: %s", layer_name);
 
 	amount = ctx->map->columns * ctx->map->rows;
 	current = 0;
@@ -89,7 +88,7 @@
 		struct map_block *reg;
 
 		if (!ctx->mf->load_action) {
-			tracef(_("ignoring action %d,%d,%u,%u,%d,%s"), x, y, w, h, block, exec);
+			tracef("ignoring action %d,%d,%u,%u,%d,%s", x, y, w, h, block, exec);
 			continue;
 		}
 
@@ -127,11 +126,11 @@
 
 	/* Check if weight/height has been specified. */
 	if (ctx->map->columns == 0 || ctx->map->rows == 0)
-		return errorf(_("missing map dimensions before layer"));
+		return errorf("missing map dimensions before layer");
 
 	/* Determine layer type. */
 	if (sscanf(line, "layer|%32s", layer_name) <= 0)
-		return errorf(_("missing layer type definition"));
+		return errorf("missing layer type definition");
 
 	if (strcmp(layer_name, "actions") == 0)
 		return parse_actions(ctx);
@@ -147,7 +146,7 @@
 	struct tileset_file *tf = &mf->tileset_file;
 
 	if (!(p = strchr(line, '|')))
-		return errorf(_("could not parse tileset"));
+		return errorf("could not parse tileset");
 
 	snprintf(path, sizeof (path), "%s/%s", ctx->basedir, p + 1);
 
@@ -163,7 +162,7 @@
 parse_title(struct context *ctx, const char *line)
 {
 	if (sscanf(line, "title|" MAX_F(MAP_FILE_TITLE_MAX), ctx->mf->title) != 1 || strlen(ctx->mf->title) == 0)
-		return errorf(_("null map title"));
+		return errorf("null map title");
 
 	ctx->map->title = ctx->mf->title;
 
@@ -174,7 +173,7 @@
 parse_columns(struct context *ctx, const char *line)
 {
 	if (sscanf(line, "columns|%u", &ctx->map->columns) != 1 || ctx->map->columns == 0)
-		return errorf(_("null map columns"));
+		return errorf("null map columns");
 
 	return 0;
 }
@@ -183,7 +182,7 @@
 parse_rows(struct context *ctx, const char *line)
 {
 	if (sscanf(line, "rows|%u", &ctx->map->rows) != 1 || ctx->map->rows == 0)
-		return errorf(_("null map rows"));
+		return errorf("null map rows");
 
 	return 0;
 }
@@ -192,7 +191,7 @@
 parse_origin(struct context *ctx, const char *line)
 {
 	if (sscanf(line, "origin|%d|%d", &ctx->map->player_x, &ctx->map->player_y) != 2)
-		return errorf(_("invalid origin"));
+		return errorf("invalid origin");
 
 	return 0;
 }
@@ -246,18 +245,18 @@
 	 * Check that we have parsed every required components.
 	 */
 	if (!map->title)
-		return errorf(_("missing title"));
+		return errorf("missing title");
 
 	/*
 	 * We don't need to check width/height because parsing layers and
 	 * tilesets already check for their presence, so only check layers.
 	 */
 	if (!map->layers[0].tiles)
-		return errorf(_("missing background layer"));
+		return errorf("missing background layer");
 	if (!map->layers[1].tiles)
-		return errorf(_("missing foreground layer"));
+		return errorf("missing foreground layer");
 	if (!tileset_ok(map->tileset))
-		return errorf(_("missing tileset"));
+		return errorf("missing tileset");
 
 	return 0;
 }
--- a/src/libmlk-rpg/rpg/message.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/message.c	Fri Oct 07 14:35:31 2022 +0200
@@ -36,7 +36,6 @@
 #include <ui/theme.h>
 
 #include "message.h"
-#include "rpg_p.h"
 
 #define THEME(msg)      (msg->theme ? msg->theme : theme_default())
 
@@ -129,9 +128,9 @@
 		label.flags = LABEL_FLAGS_SHADOW;
 
 		if (label.x + lw > msg->w)
-			tracef(_("message width too small: %u < %u"), msg->w, min_width(msg));
+			tracef("message width too small: %u < %u", msg->w, min_width(msg));
 		if (label.y + lh > msg->h)
-			tracef(_("message height too small: %u < %u"), msg->h, min_height(msg));
+			tracef("message height too small: %u < %u", msg->h, min_height(msg));
 
 		/*
 		 * The function label_draw will use THEME_COLOR_NORMAL to draw
@@ -162,7 +161,7 @@
 	    : MESSAGE_STATE_SHOWING;
 
 	if (msg->flags & MESSAGE_FLAGS_AUTOMATIC && msg->timeout == 0)
-		tracef(_("message is automatic but has zero timeout"));
+		tracef("message is automatic but has zero timeout");
 }
 
 void
@@ -268,7 +267,7 @@
 	unsigned int w, h;
 
 	if (msg->w == 0 || msg->h == 0) {
-		tracef(_("message has null dimensions"));
+		tracef("message has null dimensions");
 		return;
 	}
 
--- a/src/libmlk-rpg/rpg/property.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/property.c	Fri Oct 07 14:35:31 2022 +0200
@@ -31,7 +31,7 @@
 	assert(p);
 	assert(save_ok(s));
 
-	return save_exec(s, (const char *)assets_sql_property_save, "ss", p->key, p->value);
+	return save_exec(s, (const char *)assets_property_save, "ss", p->key, p->value);
 }
 
 int
@@ -43,7 +43,7 @@
 	struct save_stmt stmt;
 	enum save_stmt_errno ret;
 
-	if (save_stmt_init(&stmt, s, (const char *)assets_sql_property_load, "s", p->key) < 0)
+	if (save_stmt_init(&stmt, s, (const char *)assets_property_load, "s", p->key) < 0)
 		return -1;
 
 	ret = save_stmt_next(&stmt, "s", p->value, sizeof (p->value)) == SAVE_STMT_ROW;
@@ -58,6 +58,6 @@
 	assert(p);
 	assert(save_ok(s));
 
-	return save_exec(s, (const char *)assets_sql_property_remove, "s", p->key);
+	return save_exec(s, (const char *)assets_property_remove, "s", p->key);
 }
 
--- a/src/libmlk-rpg/rpg/quest.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/quest.c	Fri Oct 07 14:35:31 2022 +0200
@@ -37,15 +37,15 @@
 	if (save_tx_begin(s) < 0)
 		return -1;
 
-	if (save_exec(s, (const char *)assets_sql_quest_save, "s", q->name) < 0) {
+	if (save_exec(s, (const char *)assets_quest_save, "s", q->name) < 0) {
 		save_tx_rollback(s);
 		return -1;
 	}
 
 	for (size_t i = 0; i < q->stepsz; ++i) {
 		step = &q->steps[i];
-		
-		if (save_exec(s, (const char *)assets_sql_quest_step_save, "ssi", q->name, step->name, step->percent) < 0) {
+
+		if (save_exec(s, (const char *)assets_quest_step_save, "ssi", q->name, step->name, step->percent) < 0) {
 			save_tx_rollback(s);
 			return -1;
 		}
@@ -67,15 +67,15 @@
 
 	for (size_t i = 0; i < q->stepsz; ++i) {
 		step = &q->steps[i];
-		
-		if (save_stmt_init(&stmt, s, (const char *)assets_sql_quest_step_load, "s", step->name))
+
+		if (save_stmt_init(&stmt, s, (const char *)assets_quest_step_load, "s", step->name))
 			return -1;
-			
+
 		if (save_stmt_next(&stmt, "i", &step->percent) < 0) {
 			save_stmt_finish(&stmt);
 			return -1;
 		}
-		
+
 		save_stmt_finish(&stmt);
 	}
 
--- a/src/libmlk-rpg/rpg/rpg.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/rpg.c	Fri Oct 07 14:35:31 2022 +0200
@@ -16,19 +16,11 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <core/translate.h>
-
 #include "rpg.h"
-#include "rpg_p.h"
 
 int
 rpg_init(void)
 {
-#if defined(MOLKO_WITH_NLS)
-	if (translate_init("libmlk-rpg") < 0)
-		return -1;
-#endif
-
 	return 0;
 }
 
--- a/src/libmlk-rpg/rpg/rpg_p.h	Fri Sep 09 13:30:34 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/*
- * rpg_p.h -- librpg private definitions
- *
- * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef MLK_RPG_RPG_P_H
-#define MLK_RPG_RPG_P_H
-
-#include "config.h"
-
-#if defined(MLK_WITH_NLS)
-#       include <libintl.h>
-#       define _(s) dgettext("libmlk-rpg", s)
-#else
-#       define _(s) s
-#endif
-
-#endif /* !MLK_RPG_RPG_P_H */
--- a/src/libmlk-rpg/rpg/save.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/save.c	Fri Oct 07 14:35:31 2022 +0200
@@ -31,7 +31,6 @@
 
 #include <assets/sql/init.h>
 
-#include "rpg_p.h"
 #include "property.h"
 #include "save.h"
 
@@ -75,7 +74,7 @@
 	for (size_t i = 0; i < UTIL_SIZE(table); ++i) {
 		if (property_load(&table[i].prop, db) < 0) {
 			sqlite3_close(db->handle);
-			return errorf(_("database not initialized correctly"));
+			return errorf("database not initialized correctly");
 		}
 
 		*table[i].date = strtoull(table[i].prop.value, NULL, 10);
@@ -184,7 +183,7 @@
 	if (sqlite3_open_v2(path, (sqlite3**)&db->handle, flags, NULL) != SQLITE_OK)
 		goto sqlite3_err;
 
-	if (mode == SAVE_MODE_WRITE && execu(db, assets_sql_init) < 0)
+	if (mode == SAVE_MODE_WRITE && execu(db, assets_init) < 0)
 		goto sqlite3_err;
 
 	return verify(db);
@@ -268,10 +267,10 @@
 	switch (sqlite3_step(stmt->handle)) {
 	case SQLITE_ROW:
 		va_start(ap, args);
-		
+
 		if (extract(stmt, args, ap) == 0)
 			ret = SAVE_STMT_ROW;
-		
+
 		va_end(ap);
 		break;
 	case SQLITE_DONE:
--- a/src/libmlk-rpg/rpg/tileset-file.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-rpg/rpg/tileset-file.c	Fri Oct 07 14:35:31 2022 +0200
@@ -33,7 +33,6 @@
 #include <core/util.h>
 #include <core/zfile.h>
 
-#include "rpg_p.h"
 #include "tileset-file.h"
 #include "tileset.h"
 
@@ -131,7 +130,7 @@
 parse_tilewidth(struct context *ctx, const char *line)
 {
 	if (sscanf(line, "tilewidth|%u", &ctx->tilewidth) != 1 || ctx->tilewidth == 0)
-		return errorf(_("tilewidth is null"));
+		return errorf("tilewidth is null");
 
 	return 0;
 }
@@ -140,7 +139,7 @@
 parse_tileheight(struct context *ctx, const char *line)
 {
 	if (sscanf(line, "tileheight|%u", &ctx->tileheight) != 1 || ctx->tileheight == 0)
-		return errorf(_("tileheight is null"));
+		return errorf("tileheight is null");
 
 	return 0;
 }
@@ -232,9 +231,9 @@
 	char *p;
 
 	if (ctx->tilewidth == 0 || ctx->tileheight == 0)
-		return errorf(_("missing tile dimensions before image"));
+		return errorf("missing tile dimensions before image");
 	if (!(p = strchr(line, '|')))
-		return errorf(_("could not parse image"));
+		return errorf("could not parse image");
 
 	if (image_open(&ctx->tf->image, util_pathf("%s/%s", ctx->basedir, p + 1)) < 0)
 		return -1;
@@ -263,7 +262,7 @@
 		if (strncmp(line, props[i].property, strlen(props[i].property)) == 0)
 			return props[i].read(ctx, line);
 	}
-	
+
 	return 0;
 }
 
@@ -291,7 +290,7 @@
 check(const struct tileset *tileset)
 {
 	if (!tileset->sprite)
-		return errorf(_("missing tileset image"));
+		return errorf("missing tileset image");
 
 	return 0;
 }
--- a/src/libmlk-ui/CMakeLists.txt	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-ui/CMakeLists.txt	Fri Oct 07 14:35:31 2022 +0200
@@ -40,7 +40,6 @@
 	${libmlk-ui_SOURCE_DIR}/ui/theme.h
 	${libmlk-ui_SOURCE_DIR}/ui/ui.c
 	${libmlk-ui_SOURCE_DIR}/ui/ui.h
-	${libmlk-ui_SOURCE_DIR}/ui/ui_p.h
 )
 
 set(
--- a/src/libmlk-ui/ui/button.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-ui/ui/button.c	Fri Oct 07 14:35:31 2022 +0200
@@ -28,7 +28,6 @@
 #include "button.h"
 #include "label.h"
 #include "theme.h"
-#include "ui_p.h"
 
 static int
 is_boxed(const struct button *button, const struct event_click *click)
@@ -57,9 +56,9 @@
 	label_query(&label, &lw, &lh);
 
 	if (lw > button->w)
-		tracef(_("button width is too small for text: %u < %u"), button->w, lw);
+		tracef("button width is too small for text: %u < %u", button->w, lw);
 	if (lh > button->h)
-		tracef(_("button height is too small for text: %u < %u"), button->h, lh);
+		tracef("button height is too small for text: %u < %u", button->h, lh);
 
 	align(ALIGN_CENTER, &label.x, &label.y, lw, lh,
 	    button->x, button->y, button->w, button->h);
--- a/src/libmlk-ui/ui/gridmenu.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-ui/ui/gridmenu.c	Fri Oct 07 14:35:31 2022 +0200
@@ -27,7 +27,6 @@
 #include <core/texture.h>
 #include <core/trace.h>
 
-#include "ui_p.h"
 #include "frame.h"
 #include "label.h"
 #include "gridmenu.h"
@@ -83,7 +82,7 @@
 	 * is outside of the elements.
 	 */
 	if (reqw > menu->w) {
-		tracef(_("gridmenu width is too small: %u < %u"), menu->w, reqw);
+		tracef("gridmenu width is too small: %u < %u", menu->w, reqw);
 		menu->spacew = 1;
 	} else if (menu->ncols > 1) {
 		reqw -= theme->padding * 2;
@@ -91,7 +90,7 @@
 	}
 
 	if (reqh > menu->h) {
-		tracef(_("gridmenu height is too small: %u < %u"), menu->h, reqh);
+		tracef("gridmenu height is too small: %u < %u", menu->h, reqh);
 		menu->spaceh = 1;
 	} else if (menu->nrows > 1) {
 		reqh -= theme->padding * 2;
--- a/src/libmlk-ui/ui/notify.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-ui/ui/notify.c	Fri Oct 07 14:35:31 2022 +0200
@@ -30,7 +30,6 @@
 #include "label.h"
 #include "notify.h"
 #include "theme.h"
-#include "ui_p.h"
 
 #define WIDTH   (window.w / 3)
 #define HEIGHT  (window.h / 10)
@@ -81,7 +80,7 @@
 
 	/* Align icon at the left center. */
 	if (n->icon->h >= HEIGHT) {
-		tracef(_("notification icon is too large: %u > %u"), n->icon->h, HEIGHT);
+		tracef("notification icon is too large: %u > %u", n->icon->h, HEIGHT);
 		geo->icon_x = x + geo->theme->padding;
 		geo->icon_y = y + geo->theme->padding;
 	} else {
--- a/src/libmlk-ui/ui/theme.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-ui/ui/theme.c	Fri Oct 07 14:35:31 2022 +0200
@@ -66,9 +66,9 @@
 	struct font **dest;
 	struct font font;
 } default_fonts[] = {
-	FONT(assets_fonts_opensans_light, 12, THEME_FONT_DEBUG),
-	FONT(assets_fonts_opensans_regular, 14, THEME_FONT_INTERFACE),
-	FONT(assets_fonts_opensans_medium, 14, THEME_FONT_IMPORTANT)
+	FONT(assets_opensans_light, 12, THEME_FONT_DEBUG),
+	FONT(assets_opensans_regular, 14, THEME_FONT_INTERFACE),
+	FONT(assets_opensans_medium, 14, THEME_FONT_IMPORTANT)
 };
 
 int
--- a/src/libmlk-ui/ui/ui.c	Fri Sep 09 13:30:34 2022 +0200
+++ b/src/libmlk-ui/ui/ui.c	Fri Oct 07 14:35:31 2022 +0200
@@ -16,20 +16,12 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <core/translate.h>
-
-#include "ui_p.h"
+#include "theme.h"
 #include "ui.h"
-#include "theme.h"
 
 int
 ui_init(void)
 {
-#if defined(MOLKO_WITH_NLS)
-	if (translate_init("libmlk-ui") < 0)
-		return -1;
-#endif
-
 	return theme_init();
 }
 
--- a/src/libmlk-ui/ui/ui_p.h	Fri Sep 09 13:30:34 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/*
- * ui_p -- libui private definitions
- *
- * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef MLK_UI_UI_P_H
-#define MLK_UI_UI_P_H
-
-#include "config.h"
-
-#if defined(MLK_WITH_NLS)
-#       include <libintl.h>
-#       define _(s) dgettext("libmlk-ui", s)
-#else
-#       define _(s) s
-#endif
-
-#endif /* !MLK_UI_UI_P_H */