view GNUmakefile @ 303:48a09c9d3d00

core: make zstd optional
author David Demelier <markand@malikania.fr>
date Thu, 24 Jun 2021 20:30:41 +0200
parents f09c166fd4d4
children 3ccf841ca1fe
line wrap: on
line source

#
# GNUmakefile -- GNU make for molko
#
# Copyright (c) 2020-2021 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.
#

CC=                     cc
CFLAGS=                 -O0 -g
AR=                     ar

# Don't use absolute paths except for PREFIX.
PREFIX=                 /usr/local
BINDIR=                 bin
LIBDIR=                 lib
DATADIR=                share
LOCALEDIR=              share/locale

# Compile time options.
NLS=                    1
COMPRESS=               1
ZSTD=                   1

LIBMLK_SQLITE=          extern/libsqlite/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}

LIBMLK_CORE=            libmlk-core/libmlk-core.a
LIBMLK_CORE_SRCS=       libmlk-core/core/action.c \
                        libmlk-core/core/alloc.c \
                        libmlk-core/core/animation.c \
                        libmlk-core/core/clock.c \
                        libmlk-core/core/core.c \
                        libmlk-core/core/drawable.c \
                        libmlk-core/core/error.c \
                        libmlk-core/core/event.c \
                        libmlk-core/core/font.c \
                        libmlk-core/core/game.c \
                        libmlk-core/core/image.c \
                        libmlk-core/core/maths.c \
                        libmlk-core/core/music.c \
                        libmlk-core/core/painter.c \
                        libmlk-core/core/panic.c \
                        libmlk-core/core/script.c \
                        libmlk-core/core/sound.c \
                        libmlk-core/core/sprite.c \
                        libmlk-core/core/state.c \
                        libmlk-core/core/sys.c \
                        libmlk-core/core/texture.c \
                        libmlk-core/core/trace.c \
                        libmlk-core/core/translate.c \
                        libmlk-core/core/util.c \
                        libmlk-core/core/window.c \
                        libmlk-core/core/zfile.c
LIBMLK_CORE_OBJS=       ${LIBMLK_CORE_SRCS:.c=.o}
LIBMLK_CORE_DEPS=       ${LIBMLK_CORE_SRCS:.c=.d}

LIBMLK_UI=              libmlk-ui/libmlk-ui.a
LIBMLK_UI_SRCS=         libmlk-ui/ui/align.c \
                        libmlk-ui/ui/button.c \
                        libmlk-ui/ui/checkbox.c \
                        libmlk-ui/ui/debug.c \
                        libmlk-ui/ui/frame.c \
                        libmlk-ui/ui/gridmenu.c \
                        libmlk-ui/ui/label.c \
                        libmlk-ui/ui/theme.c \
                        libmlk-ui/ui/ui.c
LIBMLK_UI_OBJS=         ${LIBMLK_UI_SRCS:.c=.o}
LIBMLK_UI_DEPS=         ${LIBMLK_UI_SRCS:.c=.d}
LIBMLK_UI_ASTS=         libmlk-ui/assets/fonts/opensans-light.h \
                        libmlk-ui/assets/fonts/opensans-regular.h

LIBMLK_RPG=             libmlk-rpg/libmlk-rpg.a
LIBMLK_RPG_SRCS=        libmlk-rpg/rpg/battle-bar.c \
                        libmlk-rpg/rpg/battle-entity-state-attacking.c \
                        libmlk-rpg/rpg/battle-entity-state-blinking.c \
                        libmlk-rpg/rpg/battle-entity-state-moving.c \
                        libmlk-rpg/rpg/battle-entity-state-normal.c \
                        libmlk-rpg/rpg/battle-entity-state.c \
                        libmlk-rpg/rpg/battle-entity.c \
                        libmlk-rpg/rpg/battle-indicator.c \
                        libmlk-rpg/rpg/battle-message.c \
                        libmlk-rpg/rpg/battle-state-ai.c \
                        libmlk-rpg/rpg/battle-state-attacking.c \
                        libmlk-rpg/rpg/battle-state-check.c \
                        libmlk-rpg/rpg/battle-state-closing.c \
                        libmlk-rpg/rpg/battle-state-item.c \
                        libmlk-rpg/rpg/battle-state-lost.c \
                        libmlk-rpg/rpg/battle-state-menu.c \
                        libmlk-rpg/rpg/battle-state-opening.c \
                        libmlk-rpg/rpg/battle-state-selection.c \
                        libmlk-rpg/rpg/battle-state-sub.c \
                        libmlk-rpg/rpg/battle-state-victory.c \
                        libmlk-rpg/rpg/battle-state.c \
                        libmlk-rpg/rpg/battle.c \
                        libmlk-rpg/rpg/character.c \
                        libmlk-rpg/rpg/equipment.c \
                        libmlk-rpg/rpg/inventory.c \
                        libmlk-rpg/rpg/item.c \
                        libmlk-rpg/rpg/map-file.c \
                        libmlk-rpg/rpg/map.c \
                        libmlk-rpg/rpg/message.c \
                        libmlk-rpg/rpg/rpg.c \
                        libmlk-rpg/rpg/save.c \
                        libmlk-rpg/rpg/selection.c \
                        libmlk-rpg/rpg/spell.c \
                        libmlk-rpg/rpg/team.c \
                        libmlk-rpg/rpg/tileset-file.c \
                        libmlk-rpg/rpg/tileset.c \
                        libmlk-rpg/rpg/walksprite.c
LIBMLK_RPG_OBJS=        ${LIBMLK_RPG_SRCS:.c=.o}
LIBMLK_RPG_DEPS=        ${LIBMLK_RPG_SRCS:.c=.d}
LIBMLK_RPG_ASTS=        libmlk-rpg/assets/sql/character-load.h \
                        libmlk-rpg/assets/sql/character-save.h \
                        libmlk-rpg/assets/sql/init.h \
                        libmlk-rpg/assets/sql/property-get.h \
                        libmlk-rpg/assets/sql/property-remove.h \
                        libmlk-rpg/assets/sql/property-set.h

LIBMLK_ADVENTURE=       libmlk-adventure/libmlk-adventure.a
LIBMLK_ADVENTURE_SRCS=  libmlk-adventure/adventure/action/chest.c \
                        libmlk-adventure/adventure/action/spawner.c \
                        libmlk-adventure/adventure/action/teleport.c \
                        libmlk-adventure/adventure/assets.c \
                        libmlk-adventure/adventure/character/black-cat.c \
                        libmlk-adventure/adventure/character/neth.c \
                        libmlk-adventure/adventure/dialog/save.c \
                        libmlk-adventure/adventure/item/potion.c \
                        libmlk-adventure/adventure/mapscene/mapscene.c \
                        libmlk-adventure/adventure/molko.c \
                        libmlk-adventure/adventure/spell/fire-minor.c \
                        libmlk-adventure/adventure/state/battle.c \
                        libmlk-adventure/adventure/state/continue.c \
                        libmlk-adventure/adventure/state/mainmenu.c \
                        libmlk-adventure/adventure/state/map.c \
                        libmlk-adventure/adventure/state/panic.c \
                        libmlk-adventure/adventure/state/splashscreen.c \
                        libmlk-adventure/adventure/trace_hud.c
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

MLK_BCC=                tools/bcc/mlk-bcc
MLK_BCC_SRCS=           tools/bcc/main.c
MLK_BCC_OBJS=           ${MLK_BCC_SRCS:.c=.o}
MLK_BCC_DEPS=           ${MLK_BCC_SRCS:.c=.d}

MLK_TILESET=            tools/tileset/mlk-tileset
MLK_TILESET_SRCS=       tools/tileset/main.c
MLK_TILESET_OBJS=       ${MLK_TILESET_SRCS:.c=.o}
MLK_TILESET_DEPS=       ${MLK_TILESET_SRCS:.c=.d}

MLK_MAP=                tools/map/mlk-map
MLK_MAP_SRCS=           tools/map/main.c
MLK_MAP_OBJS=           ${MLK_MAP_SRCS:.c=.o}
MLK_MAP_DEPS=           ${MLK_MAP_SRCS:.c=.d}

MLK_ADVENTURE=          mlk-adventure/mlk-adventure
MLK_ADVENTURE_SRCS=     mlk-adventure/main.c
MLK_ADVENTURE_OBJS=     ${MLK_ADVENTURE_SRCS:.c=.o}
MLK_ADVENTURE_DEPS=     ${MLK_ADVENTURE_SRCS:.c=.d}

TARGETS=                ${LIBMLK_ADVENTURE} \
                        ${LIBMLK_CORE} \
                        ${LIBMLK_RPG} \
                        ${LIBMLK_SQLITE} \
                        ${LIBMLK_UI} \
                        ${MLK_ADVENTURE} \
                        ${MLK_BCC} \
                        ${MLK_MAP} \
                        ${MLK_TILESET}

SDL2_INCS:=             $(shell pkg-config --cflags sdl2 SDL2_mixer SDL2_ttf SDL2_image)
SDL2_LIBS:=             $(shell pkg-config --libs sdl2 SDL2_mixer SDL2_ttf SDL2_image)

JANSSON_INCS:=          $(shell pkg-config --cflags jansson)
JANSSON_LIBS:=          $(shell pkg-config --libs jansson)

ifeq (${ZSTD},1)
ZSTD_INCS:=             $(shell pkg-config --cflags libzstd)
ZSTD_LIBS:=             $(shell pkg-config --libs libzstd)
endif

INCS=                   -I. \
                        -Iextern/libsqlite \
                        -Ilibmlk-core \
                        -Ilibmlk-ui \
                        -Ilibmlk-rpg \
                        -Ilibmlk-adventure \
                        ${SDL2_INCS}
DEFS=                   -DMOLKO_BINDIR=\"${BINDIR}\" \
                        -DMOLKO_DATADIR=\"${DATADIR}\" \
                        -DMOLKO_LOCALEDIR=\"${LOCALEDIR}\" \
                        -DMOLKO_ABS_BINDIR=\"${PREFIX}/${BINDIR}\" \
                        -DMOLKO_ABS_DATADIR=\"${PREFIX}/${DATADIR}\" \
                        -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
endif

# Can't use standard input otherwise frame content size isn't available.
ifeq (${COMPRESS},1)
TILESET.cmd=            ${MLK_TILESET} < $< > $@.tmp && zstd -17 $@.tmp --rm -fqo $@
MAP.cmd=                ${MLK_MAP} < $< > $@.tmp && zstd -17 $@.tmp --rm -fqo $@
else
TILESET.cmd=            ${MLK_TILESET} < $< > $@
MAP.cmd=                ${MLK_MAP} < $< > $@
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}" \
		-e "${SED.zstd}" < $< > $@

.c.o:
	@echo "CC   $<"
	@${CC} -MMD ${INCS} ${DEFS} ${CFLAGS} -c $< -o $@

# Binary files.
.ttf.h .png.h .ogg.h:
	@echo "BCC  $<"
	@${MLK_BCC} -csu $< assets_$(notdir $<) > $@

# Text files.
.sql.h:
	@echo "BCC  $<"
	@${MLK_BCC} -0csu $< assets_$(notdir $<) > $@

# Maps.
.json.map:
	@echo "MAP  $<"
	@${MAP.cmd}

# Tilesets.
.json.tileset:
	@echo "TS   $<"
	@${TILESET.cmd}

-include ${LIBMLK_ADVENTURE_DEPS}
-include ${LIBMLK_CORE_DEPS}
-include ${LIBMLK_RPG_DEPS}
-include ${LIBMLK_SQLITE_DEPS}
-include ${LIBMLK_UI_DEPS}
-include ${MLK_ADVENTURE_DEPS}
-include ${MLK_BCC_DEPS}
-include ${MLK_MAP_DEPS}
-include ${MLK_TILESET_DEPS}

${LIBMLK_SQLITE}: ${LIBMLK_SQLITE_OBJS}
	@echo "AR   $@"
	@${AR} -rc $@ ${LIBMLK_SQLITE_OBJS}

${LIBMLK_CORE_OBJS}: config.h

${LIBMLK_CORE}: ${LIBMLK_CORE_OBJS}
	@echo "AR   $@"
	@${AR} -rc $@ ${LIBMLK_CORE_OBJS}

${LIBMLK_UI_ASTS}: ${MLK_BCC}
${LIBMLK_UI_OBJS}: ${LIBMLK_UI_ASTS}

${LIBMLK_UI}: ${LIBMLK_CORE} ${LIBMLK_UI_OBJS}
	@echo "AR   $@"
	@${AR} -rc $@ ${LIBMLK_UI_OBJS}

${LIBMLK_RPG_ASTS}: ${MLK_BCC}
${LIBMLK_RPG_OBJS}: ${LIBMLK_RPG_ASTS}

${LIBMLK_RPG}: ${LIBMLK_UI} ${LIBMLK_SQLITE} ${LIBMLK_RPG_OBJS}
	@echo "AR   $@"
	@${AR} -rc $@ ${LIBMLK_RPG_OBJS}

${LIBMLK_ADVENTURE_ASTS}: ${MLK_BCC}
${LIBMLK_ADVENTURE_OBJS}: ${LIBMLK_ADVENTURE_ASTS}

${LIBMLK_ADVENTURE}: ${LIBMLK_RPG} ${LIBMLK_ADVENTURE_OBJS}
	@echo "AR   $@"
	@${AR} -rc $@ ${LIBMLK_ADVENTURE_OBJS}

${MLK_BCC}: ${MLK_BCC_OBJS}
	@echo "CCLD $@"
	@${CC} ${CFLAGS} -o $@ ${MLK_BCC_OBJS} ${SDL2_LIBS} ${LDFLAGS}

${MLK_TILESET}: ${MLK_TILESET_OBJS}
	@echo "CCLD $@"
	@${CC} ${CFLAGS} -o $@ ${MLK_TILESET_OBJS} ${JANSSON_LIBS} ${LDFLAGS}

${MLK_MAP}: ${MLK_MAP_OBJS}
	@echo "CCLD $@"
	@${CC} ${CFLAGS} -o $@ ${MLK_MAP_OBJS} ${JANSSON_LIBS} ${LDFLAGS}

${MLK_ADVENTURE_OBJS}: ${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}

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}

.PHONY: all clean