view Makefile.gen @ 2576:812b16ee49db

I had been living under apparent false impression that "realfft.c" on which the FFT implementation in DMLIB was basically copied from was released in public domain at some point, but it could very well be that it never was. Correct license is (or seems to be) GNU GPL. Thus I removing the code from DMLIB, and profusely apologize to the author, Philip Van Baren. It was never my intention to distribute code based on his original work under a more liberal license than originally intended.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 11 Mar 2022 16:32:50 +0200
parents fdea5e3d727f
children 9807ae37ad69
line wrap: on
line source

###
### Get settings from config.mak or other include
###
ifneq ($(DM_CONFIG),)
ifneq ($(DM_CONFIG),no)
include $(DM_CONFIG)
else
DM_CONFIG=
endif
else
include config.mak
DM_CONFIG=config.mak
endif


###
### Compiler flags
###
ifeq ($(EXTRA_CFLAGS),)
EXTRA_CFLAGS =-O3
# -march=corei7
endif

CFLAGS += -g -W -Wall $(EXTRA_CFLAGS)
#CFLAGS += -std=c11 -D_FILE_OFFSET_BITS=64 -D_POSIX_C_SOURCE=200808L
CXXFLAGS = $(CFLAGS)

DM_CFLAGS += -I$(DMLIB_SRC) $(SDL_CFLAGS)
DM_LDFLAGS += $(LDFLAGS)


###
### Tools, paths and directories
###
MKDIR ?= mkdir
MKDIR_P ?= $(MKDIR) -p
BINPATH ?= ./
DMLIB ?= ./
TOOL_SRC = $(DMLIB)tools/
TESTS_SRC = $(DMLIB)tests/

TOOL_BINPATH ?= $(TOOL_SRC)
TESTS_BINPATH ?= $(TESTS_SRC)

DMLIB_SRC = $(DMLIB)src/


###
### Extra debug messages etc?
###
ifeq ($(DM_DEBUG),yes)
DM_CFLAGS += -DDM_DEBUG

# Disable JSS_LIGHT
JSS_LIGHT=no
endif


###
### Build demo target?
###
ifneq ($(DEMO_BIN),)
BINARIES += $(DEMO_BIN)
endif

ifeq ($(DM_BUILT_IN_SETUP),yes)
DM_CFLAGS += -DDM_BUILT_IN_SETUP
endif


###
### Editor
###
ifeq ($(DM_USE_TIMELINE),yes)
DM_CFLAGS+=-DDM_USE_TIMELINE
DMLIB_OBJS += dmtimeline.o dmtimelinew.o

ifeq ($(DM_BUILD_EDITOR),yes)
ifneq ($(DEMO_BIN),)
BINARIES += ed_$(DEMO_BIN)
TARGETS += $(EDITOR_MAKEFILE) $(EDITOR_PRO)
TMPFILES += $(OBJPATH)moc_*
endif
endif
endif

EDITOR_PRO = editor.pro
EDITOR_MAKEFILE = Makefile.editor
EDITOR_SOURCES = editor/edmain.cpp editor/edgui.cpp editor/edview.cpp \
	editor/edtlobj.cpp editor/edtimeline.cpp editor/edwaveform.cpp \
	editor/edres.cpp
EDITOR_HEADERS = editor/edmain.h editor/edtlobj.h editor/edview.h \
	editor/edtimeline.h editor/edwaveform.h editor/edres.h


###
### Form additional compilation defines based on settings
###

# Enable SIMD routines, if requested
ifeq ($(DM_USE_SIMD),yes)
DM_CFLAGS+=-DDM_USE_SIMD -msse2
endif

# Enable Tremor Ogg Vorbis decoder
ifeq ($(DM_USE_TREMOR),yes)
DM_CFLAGS+=-DDM_USE_TREMOR $(TREMOR_CFLAGS)
DEMO_LDFLAGS+=$(TREMOR_LDFLAGS)
endif


###
### Filesystem
###
ifeq ($(DM_USE_PACKFS),yes)
BUILD_RES=yes
DM_CFLAGS += -DDM_USE_PACKFS
DMLIB_OBJS += dmpack.o
ifeq ($(DM_BUILD_TOOLS),yes)
TOOL_BINARIES += packed
endif
endif

ifeq ($(DM_USE_STDIO),yes)
BUILD_RES=yes
DM_CFLAGS += -DDM_USE_STDIO
endif

ifeq ($(DM_USE_MEMIO),yes)
BUILD_RES=yes
DM_CFLAGS += -DDM_USE_MEMIO
endif

ifeq ($(BUILD_RES),yes)
DMLIB_OBJS += dmres.o dmresw.o
endif

###
### Graphics support
###

ifeq ($(DM_GFX_LINES),yes)
DM_CFLAGS += -DDM_GFX_LINES
DMLIB_OBJS += dmline.o
endif

ifeq ($(DM_GFX_BLITS),yes)
DM_CFLAGS += -DDM_GFX_BLITS
DMLIB_OBJS += dmblit.o

ifeq ($(DM_GFX_BM_TEXT),yes)
DM_CFLAGS += -DDM_GFX_BM_TEXT
DMLIB_OBJS += dmtext_bm.o
ifeq ($(DM_BUILD_TOOLS),yes)
ifeq ($(DM_USE_STDIO),yes)
TOOL_BINARIES += fontconv
endif
endif
endif
endif

ifeq ($(DM_GFX_TTF_TEXT),yes)
DM_CFLAGS += -DDM_GFX_TTF_TEXT
DMLIB_OBJS += dmtext_ttf.o

ifeq ($(DM_BUILD_TESTS),yes)
ifeq ($(DM_GFX_BLITS),yes)
ifeq ($(DM_USE_STDIO),yes)
#TESTS_BINARIES += blittest
endif
endif
endif
else
SDL_TTF_LDFLAGS=
SDL_TTF_CFLAGS=
endif


###
### miniJSS
###
MINIJSS=$(DMLIB)/minijss/


ifeq ($(JSS),yes)
DM_CFLAGS+=-DDM_USE_JSS -I$(MINIJSS)

ifeq ($(JSS_LIGHT),yes)
DM_CFLAGS+=-DJSS_LIGHT -Os
else
ifeq ($(JSS_USE_ASSERTS),yes)
DM_CFLAGS+=-DJSS_USE_ASSERTS
endif
ifeq ($(JSS_DEBUG),yes)
DM_CFLAGS+=-DJSS_DEBUG
endif
endif

ifeq ($(JSS_MIX_FP),yes)
DM_CFLAGS+=-DJSS_MIX_FP
endif

ifeq ($(JSS_SUP_THREADS),yes)
DM_CFLAGS+=-DJSS_SUP_THREADS
endif


SUP_MODLOAD=no
ifeq ($(JSS_SUP_XM),yes)
SUP_MODLOAD=yes
DMLIB_OBJS+= jloadxm.o 
DM_CFLAGS+=-DJSS_SUP_XM
endif

ifeq ($(JSS_SUP_JSSMOD),yes)
SUP_MODLOAD=yes
DMLIB_OBJS+= jloadjss.o
DM_CFLAGS+=-DJSS_SUP_JSSMOD $(JSSMOD_FLAGS)
endif

ifeq ($(DM_USE_C),yes)
DM_CFLAGS+=-DDM_USE_C
TARGETS += $(MINIJSS)jmix_c.c
DMLIB_OBJS+=jmix_c.o
endif

#ifeq ($(DM_USE_SIMD),yes)
#DMLIB_OBJS+=jmix_simd.o
#endif

ifeq ($(DM_BUILD_TOOLS),yes)
ifeq ($(DM_USE_STDIO),yes)
ifeq ($(JSS_SUP_JSSMOD),yes)
ifeq ($(JSS_SUP_XM),yes)
TOOL_BINARIES+= xm2jss
endif
endif
endif
endif
DMLIB_OBJS += jss.o jssmix.o jssmod.o jssplr.o
endif


### Dependancies
ifeq ($(DM_BUILD_TOOLS),yes)
ifeq ($(DM_USE_STDIO),yes)
TOOL_BINARIES+= objlink data2inc gfxconv fanalyze
ifeq ($(SUP_MODLOAD),yes)
TOOL_BINARIES+= dumpmod mod2wav
TESTS_BINARIES+= plrtest
ifeq ($(DM_GFX_BLITS),yes)
TOOL_BINARIES+= 64vw
ifeq ($(DM_GFX_BM_TEXT),yes)
TOOL_BINARIES+= ppl
endif
endif
endif

endif
endif


### libPNG handling
ifeq ($(DM_USE_LIBPNG),yes)
DM_CFLAGS += -DDM_USE_LIBPNG $(LIBPNG_CFLAGS)
endif


### Check requirements for zlib
ifeq ($(DM_USE_ZLIB),yes)
DM_CFLAGS += -DDM_USE_ZLIB $(ZLIB_CFLAGS)
DEMO_LDFLAGS += $(ZLIB_LDFLAGS)
else
DEMO_LDFLAGS +=
endif


### What tests to build?
ifeq ($(DM_BUILD_TESTS),yes)
TESTS_BINARIES += vecmattest fptest dzlibtest encbr1test
endif

FONTCONV_BIN=$(TOOL_BINPATH)fontconv$(BINEXT)
DATA2INC_BIN=$(TOOL_BINPATH)data2inc$(BINEXT)

ifeq ($(BINEXT),.exe)
# Cross-building Windows binaries requires locally installed utilities
FONTCONV_DEP=
DATA2INC_DEP=
else
ifeq ($(DM_BUILD_TOOLS),yes)
FONTCONV_DEP=$(FONTCONV_BIN)
DATA2INC_DEP=$(DATA2INC_BIN)
endif
endif


###
### Main targets and objects
###
DMLIB_A = $(OBJPATH)dmlib.a
DMLIB_OBJS += \
	dmfile.o dmlib.o dmcurves.o dmstring.o \
	dmgrowbuf.o dmargs.o dmvecmat.o dmperlin.o \
	dmimage.o dmengine.o dmzlib.o \
	dmlicense.o


TESTS_TARGETS = $(addprefix $(TESTS_BINPATH),$(addsuffix $(BINEXT),$(TESTS_BINARIES)))
TOOL_TARGETS = $(addprefix $(TOOL_BINPATH),$(addsuffix $(BINEXT),$(TOOL_BINARIES)))

TARGETS += \
	$(DMLIB_A) \
	$(addprefix $(BINPATH),$(addsuffix $(BINEXT),$(BINARIES))) \
	$(TOOL_TARGETS) $(TESTS_TARGETS)

NOBUILD_TARGETS +=
NOINST_TARGETS += 


###
### Functions and compilation/link commands
###
ifneq ($(V),1)
DO_CMD=/bin/echo -E " $(1) $(2)" && $(3)
else
DO_CMD=/bin/echo -E $(3) && $(3)
endif
DO_MKDIR=if test ! -z "$(1)" -a ! -d "$(1)"; then /bin/echo -E " MKDIR $(1)"; mkdir -p "$(1)"; fi


COMPILE_C_OBJ = \
	@$(call DO_MKDIR,$(OBJPATH)) ; \
	$(call DO_CMD,CC,$<,$(CC) $(CFLAGS) $(DM_CFLAGS) -c -o $@ $< $(1))

LINK_C_BIN = \
	@$(call DO_MKDIR,$(BINPATH)) ; \
	$(call DO_CMD,LINK,$@,$(CC) -o $@ $(filter %.o %.a,$+) $(LDFLAGS) $(1))

COMPILE_CXX_OBJ = \
	@$(call DO_MKDIR,$(OBJPATH)) ; \
	$(call DO_CMD,CXX,$<,$(CXX) $(CXXFLAGS) $(DM_CFLAGS) -c -o $@ $< $(1))

LINK_CXX_BIN = \
	@$(call DO_MKDIR,$(BINPATH)) ; \
	$(call DO_CMD,LINK,$@,$(CXX) -o $@ $(filter %.o %.a,$+) $(LDFLAGS) $(1))

LINK_STATIC_LIB = \
	@$(call DO_MKDIR,$(OBJPATH)) ; \
	$(call DO_CMD,AR,$@ $(filter %.o,$+),$(AR) cru $@ $(filter %.o,$+)) ; \
	$(call DO_CMD,RANLIB,$@,$(RANLIB) $@)


###
### Generic target rules
###
all: $(NOBUILD_TARGETS) $(NOINST_TARGETS) $(TARGETS)


$(OBJPATH)%.o: $(DMLIB)tests/%.c $(DMLIB)tests/%.h
	$(call COMPILE_C_OBJ,)

$(OBJPATH)%.o: $(DMLIB)tests/%.c
	$(call COMPILE_C_OBJ,)

$(OBJPATH)%.o: $(DMLIB)tools/%.c $(DMLIB)tools/%.h
	$(call COMPILE_C_OBJ,)

$(OBJPATH)%.o: $(DMLIB)tools/%.c
	$(call COMPILE_C_OBJ,)

$(OBJPATH)%.o: %.c %.h
	$(call COMPILE_C_OBJ,)

$(OBJPATH)%.o: %.c
	$(call COMPILE_C_OBJ,)

$(OBJPATH)%.o: $(MINIJSS)%.c $(MINIJSS)%.h
	$(call COMPILE_C_OBJ,)

$(OBJPATH)%.o: $(MINIJSS)%.c
	$(call COMPILE_C_OBJ,)

$(OBJPATH)%.o: $(DMLIB_SRC)%.c $(DMLIB_SRC)%.h
	$(call COMPILE_C_OBJ,)

$(OBJPATH)%.o: $(DMLIB_SRC)%.c
	$(call COMPILE_C_OBJ,)


###
### dmlib-specific rules
###
$(MINIJSS)jmix_c.c: $(MINIJSS)jmix_c_in.c $(MINIJSS)jmixtmpl_c.h $(MINIJSS)jmix_post_c.h
	(echo "#include \"jssmix.h\"" && cpp $< $(DM_CFLAGS)) | sed "s/^# .*//g" > $@

$(OBJPATH)dmimage.o: $(DMLIB_SRC)dmimage.c $(DMLIB_SRC)stb_image.c $(DMLIB_SRC)dmimage.h
	$(call COMPILE_C_OBJ,)

$(OBJPATH)dmresw.o: $(DMLIB_SRC)dmresw.c $(DMLIB_SRC)dmres.h
	$(call COMPILE_C_OBJ,)


$(OBJPATH)jssmod.o: $(MINIJSS)jssmod.c $(MINIJSS)jssmod.h $(OBJPATH)jss.o
	$(call COMPILE_C_OBJ,)

$(OBJPATH)jssmix.o: $(MINIJSS)jssmix.c $(MINIJSS)jssmix.h $(OBJPATH)jssmod.o
	$(call COMPILE_C_OBJ,)

$(OBJPATH)jssplr.o: $(MINIJSS)jssplr.c $(MINIJSS)jssplr.h $(OBJPATH)jssmix.o
	$(call COMPILE_C_OBJ,)


$(OBJPATH)dmblit.o: $(DMLIB_SRC)dmblit.c $(DMLIB_SRC)dmscaledblit.h $(DMLIB_SRC)dmunscaledblit.h $(DMLIB_SRC)dmblitfunc.h $(DMLIB_SRC)dmlib.h
	$(call COMPILE_C_OBJ,)

$(OBJPATH)dmline.o: $(DMLIB_SRC)dmline.c $(DMLIB_SRC)dmdrawline.h $(DMLIB_SRC)dmlinefunc.h $(DMLIB_SRC)dmlineclip.h $(DMLIB_SRC)dmlib.h
	$(call COMPILE_C_OBJ,)

$(OBJPATH)libgfx.o: $(DMLIB)tools/libgfx.c $(DMLIB)tools/libgfx.h $(DMLIB_A)
	$(call COMPILE_C_OBJ,)

$(OBJPATH)lib64gfx.o: $(DMLIB)tools/lib64gfx.c $(DMLIB)tools/lib64gfx.h $(OBJPATH)libgfx.o
	$(call COMPILE_C_OBJ,)

$(OBJPATH)lib64util.o: $(DMLIB)tools/lib64util.c $(DMLIB)tools/lib64util.h $(OBJPATH)lib64gfx.o
	$(call COMPILE_C_OBJ,)

$(OBJPATH)lib64fmts.o: $(DMLIB)tools/lib64fmts.c $(OBJPATH)lib64gfx.o
	$(call COMPILE_C_OBJ,)

$(OBJPATH)64vw.o: $(DMLIB)tools/64vw.c $(OBJPATH)lib64util.o
	$(call COMPILE_C_OBJ,)

$(OBJPATH)gfxconv.o: $(DMLIB)tools/gfxconv.c $(OBJPATH)lib64util.o
	$(call COMPILE_C_OBJ,)

$(OBJPATH)ppl.o: $(TOOL_SRC)ppl.c $(DMLIB_SRC)setupfont.h \
	$(OBJPATH)libgutil.o $(DMLIB_A)
	$(call COMPILE_C_OBJ,)


$(DMLIB)assets/SetupFont.dmf: $(DMLIB)assets/SetupFont.fnt $(FONTCONV_DEP)
	@$(call DO_CMD,FONT,$@ $<,$(FONTCONV_BIN) $< $@)

$(DMLIB_SRC)setupfont.h: $(DMLIB)assets/SetupFont.dmf $(DATA2INC_DEP)
	@$(call DO_CMD,DATA,$@ $<,$(DATA2INC_BIN) -q -f c -n engineSetupFont -t Uint8 $< $@ > /dev/null)

$(DMLIB_SRC)setupimage.h: $(DMLIB)assets/SetupImage.png $(DATA2INC_DEP)
	@$(call DO_CMD,DATA,$@ $<,$(DATA2INC_BIN) -q -f c -n engineSetupImage -t Uint8 $< $@ > /dev/null)

$(DMLIB_SRC)setupmenubar.h: $(DMLIB)assets/SetupMenuBar.png  $(DATA2INC_DEP)
	@$(call DO_CMD,DATA,$@ $<,$(DATA2INC_BIN) -q -f c -n engineSetupMenuBar -t Uint8 $< $@ > /dev/null)


$(OBJPATH)dmsimple.o: $(addprefix $(DMLIB_SRC), dmsimple.c dmengine.h \
		setupmenubar.h setupfont.h setupimage.h dmsimple.c)
	$(call COMPILE_C_OBJ,)


$(DMLIB_A): $(addprefix $(OBJPATH),$(DMLIB_OBJS)) $(DMLIB)Makefile.gen $(DM_CONFIG)
	$(call LINK_STATIC_LIB,)


###
### Tests
###
define RULE_TESTS_BIN
$$(TESTS_BINPATH)$(1)$$(BINEXT): $$(OBJPATH)$(1).o $(2) $$(DMLIB_A)
	$$(call LINK_C_BIN,$$(DM_LDFLAGS) $$(SDL_LDFLAGS) $(3))

endef

$(eval $(call RULE_TESTS_BIN,blittest,,$$(SDL_TTF_LDFLAGS) -lm))
$(eval $(call RULE_TESTS_BIN,dzlibtest,,$$(ZLIB_LDFLAGS)))
$(eval $(call RULE_TESTS_BIN,plrtest,,$$(ZLIB_LDFLAGS) -lm))
$(eval $(call RULE_TESTS_BIN,%test,,$$(TOOL_LDFLAGS) -lm))


###
### Tools
###
define RULE_TOOL_BIN
$$(TOOL_BINPATH)$(1)$$(BINEXT): $$(OBJPATH)$(1).o $(2) $$(DMLIB_A)
	$$(call LINK_C_BIN, $$(DM_LDFLAGS) $$(TOOL_LDFLAGS) $(3))

endef

$(eval $(call RULE_TOOL_BIN,fontconv,,\
	$$(SDL_LDFLAGS) $$(SDL_TTF_LDFLAGS) $$(ZLIB_LDFLAGS) -lm))
$(eval $(call RULE_TOOL_BIN,data2inc,,))
$(eval $(call RULE_TOOL_BIN,packed,,$(ZLIB_LDFLAGS)))
$(eval $(call RULE_TOOL_BIN,mod2wav,,$(ZLIB_LDFLAGS) -lm))
$(eval $(call RULE_TOOL_BIN,xm2jss,,$(ZLIB_LDFLAGS)))
$(eval $(call RULE_TOOL_BIN,dumpmod,,$(ZLIB_LDFLAGS)))
$(eval $(call RULE_TOOL_BIN,ppl,\
	$$(OBJPATH)libgutil.o,$$(ZLIB_LDFLAGS) $$(SDL_LDFLAGS) -lm))
$(eval $(call RULE_TOOL_BIN,objlink,,))
$(eval $(call RULE_TOOL_BIN,fanalyze,,))

$(eval $(call RULE_TOOL_BIN,gfxconv,\
	$$(OBJPATH)lib64gfx.o $$(OBJPATH)lib64fmts.o \
	$$(OBJPATH)lib64util.o $$(OBJPATH)libgfx.o,\
	$$(LIBPNG_LDFLAGS) $$(ZLIB_LDFLAGS)))

$(eval $(call RULE_TOOL_BIN,64vw,\
	$$(OBJPATH)lib64gfx.o $$(OBJPATH)lib64fmts.o \
	$$(OBJPATH)lib64util.o $$(OBJPATH)libgfx.o,\
	$$(LIBPNG_LDFLAGS) $$(ZLIB_LDFLAGS) $$(SDL_LDFLAGS)))


###
### Demo binary
###
ifneq ($(DEMO_BIN),)
$(BINPATH)$(DEMO_BIN)$(BINEXT): $(addprefix $(OBJPATH),$(DEMO_OBJS)) $(DMLIB_A)
	$(call LINK_C_BIN, $(DM_LDFLAGS) $(SDL_LDFLAGS) $(DEMO_LDFLAGS) -lm)
endif


###
### Editor targets
###
$(EDITOR_PRO): $(DMLIB)Makefile.gen $(DM_CONFIG) $(addprefix $(DMLIB),$(EDITOR_SOURCES) $(EDITOR_HEADERS)) $(addprefix $(OBJPATH),$(DEMO_OBJS)) $(DMLIB_A)
	@echo " CREATE $@"
	@echo "OBJECTS_DIR = $(OBJPATH)" > $@
	@echo "MOC_DIR = $(OBJPATH)" >> $@
	@echo "QMAKE_CXXFLAGS += $(DM_CFLAGS) $(SDL_CFLAGS)" >> $@
	@echo "QMAKE_LIBS += $(filter-out %dmsimple.o,$(filter %.o %.a,$+))" >> $@
	@echo "QMAKE_LIBS += $(DM_LDFLAGS) $(SDL_LDFLAGS) $(DEMO_LDFLAGS)" >> $@
	@echo "MAKEFILE = $(EDITOR_MAKEFILE)" >> $@
	@echo "CONFIG += debug" >> $@
	@echo "QT += core gui opengl" >> $@
	@echo "TARGET = $(BINPATH)ed_$(DEMO_BIN)$(BINEXT)" >> $@
	@echo "TEMPLATE = app" >> $@
	@echo "SOURCES = $(addprefix $(DMLIB),$(EDITOR_SOURCES))" >> $@
	@echo "HEADERS = $(addprefix $(DMLIB),$(EDITOR_HEADERS))" >> $@
	

$(EDITOR_MAKEFILE): $(EDITOR_PRO)
	@$(call DO_CMD,QMAKE,$+,qmake -Wall $<)

$(BINPATH)ed_$(DEMO_BIN)$(BINEXT): $(EDITOR_MAKEFILE)
	@$(MAKE) -f $<


###
### Special targets
###
clean:
	-$(RM) $(TARGETS) $(NOINST_TARGETS) $(CLEAN_TARGETS) $(OBJPATH)*.o

distclean: clean
	-$(RM) $(DISTCLEAN_TARGETS) *~ core *.core

.PHONY: clean distclean all