raze-gles/GNUmakefile

1039 lines
23 KiB
Text
Raw Normal View History

#
# EDuke32 Makefile for GNU Make
#
include Common.mak
### File Extensions
asm := nasm
o := o
### Directories
source := source
obj := obj
### Functions
define parent
$(word 1,$(subst _, ,$1))
endef
define expandobjs
$$(addprefix $$($$(call parent,$1)_obj)/,$$(addsuffix .$$o,$$(basename $$($1_objs) $$($1_rsrc_objs) $$($1_gen_objs))))
endef
define expandsrcs
$(addprefix $($(call parent,$1)_src)/,$($1_objs)) $(addprefix $($(call parent,$1)_rsrc)/,$($1_rsrc_objs)) $(addprefix $($(call parent,$1)_obj)/,$($1_gen_objs))
endef
define expanddeps
$(strip $1 $(foreach j,$1,$(call $0,$($j_deps))))
endef
define getdeps
$(call expanddeps,$1_$2 $(common_$2_deps) engine)
endef
##### External Library Definitions
#### libxmp-lite
libxmplite := libxmp-lite
libxmplite_objs := \
control.c \
dataio.c \
effects.c \
filter.c \
format.c \
hio.c \
lfo.c \
load.c \
load_helpers.c \
memio.c \
mixer.c \
mix_all.c \
period.c \
player.c \
read_event.c \
scan.c \
smix.c \
virtual.c \
common.c \
itsex.c \
it_load.c \
mod_load.c \
mtm_load.c \
s3m_load.c \
sample.c \
xm_load.c \
libxmplite_root := $(source)/$(libxmplite)
libxmplite_src := $(libxmplite_root)/src
libxmplite_inc := $(libxmplite_root)/include
libxmplite_obj := $(obj)/$(libxmplite)
libxmplite_cflags := -DHAVE_ROUND -DLIBXMP_CORE_PLAYER -DBUILDING_STATIC -I$(libxmplite_inc)/libxmp-lite -Wno-unused-parameter -Wno-sign-compare
#### LPeg
lpeg := lpeg
lpeg_objs := \
lpcap.c \
lpcode.c \
lpprint.c \
lptree.c \
lpvm.c \
lpeg_root := $(source)/$(lpeg)
lpeg_src := $(lpeg_root)/src
lpeg_inc := $(lpeg_root)/include
lpeg_obj := $(obj)/$(lpeg)
#### ENet
enet := enet
enet_objs := \
callbacks.c \
host.c \
list.c \
packet.c \
peer.c \
protocol.c \
compress.c \
enet_root := $(source)/$(enet)
enet_src := $(enet_root)/src
enet_inc := $(enet_root)/include
enet_obj := $(obj)/$(enet)
enet_cflags :=
ifeq ($(PLATFORM),WINDOWS)
enet_objs += win32.c
else
enet_objs += unix.c
enet_cflags += -DHAS_SOCKLEN_T
endif
#### glad
glad := glad
glad_objs := \
glad.c \
glad_root := $(source)/$(glad)
glad_src := $(glad_root)/src
glad_inc := $(glad_root)/include
glad_obj := $(obj)/$(glad)
glad__no_cast_qual := -Wno-cast-qual
ifeq (4,$(GCC_MAJOR))
ifneq (,$(filter 0 1 2 3 4,$(GCC_MINOR)))
glad__no_cast_qual :=
endif
endif
glad_cflags := $(glad__no_cast_qual)
ifeq ($(RENDERTYPE),WIN)
glad_objs += glad_wgl.c
endif
##### Component Definitions
#### EBacktrace
ifndef ebacktrace_dll
ebacktrace_dll := ebacktrace1.dll
ifeq ($(findstring x86_64,$(COMPILERTARGET)),x86_64)
ebacktrace_dll := ebacktrace1-64.dll
endif
endif
#### BUILD Engine
engine := build
engine_root := $(source)/$(engine)
engine_src := $(engine_root)/src
engine_inc := $(engine_root)/include
engine_obj := $(obj)/$(engine)
engine_cflags := -I$(engine_src)
engine_deps :=
engine_objs := \
rev.cpp \
baselayer.cpp \
cache1d.cpp \
common.cpp \
compat.cpp \
crc32.cpp \
defs.cpp \
engine.cpp \
tiles.cpp \
clip.cpp \
2d.cpp \
hash.cpp \
palette.cpp \
polymost.cpp \
texcache.cpp \
dxtfilter.cpp \
hightile.cpp \
textfont.cpp \
smalltextfont.cpp \
kplib.cpp \
lz4.c \
osd.cpp \
pragmas.cpp \
scriptfile.cpp \
softsurface.cpp \
mmulti_null.cpp \
mutex.cpp \
xxhash.c \
md4.cpp \
colmatch.cpp \
screenshot.cpp \
mhk.cpp \
pngwrite.cpp \
miniz.c \
miniz_tinfl.c \
miniz_tdef.c \
fix16.c \
fix16_str.c \
engine_editor_objs := \
build.cpp \
config.cpp \
defs.cpp \
engine_tools_objs := \
compat.cpp \
pragmas.cpp \
kplib.cpp \
cache1d.cpp \
crc32.cpp \
colmatch.cpp \
lz4.cpp \
ifeq (0,$(NOASM))
engine_objs += a.nasm
else
engine_objs += a-c.cpp
ifneq (0,$(USE_ASM64))
engine_objs += a64.yasm
endif
endif
ifeq (1,$(USE_OPENGL))
engine_objs += glsurface.cpp voxmodel.cpp mdsprite.cpp tilepacker.cpp
engine_deps += glad
ifeq (1,$(POLYMER))
engine_objs += glbuild.cpp polymer.cpp
endif
endif
ifneq (0,$(LUNATIC))
engine_objs += lunatic.cpp
endif
ifeq ($(PLATFORM),DARWIN)
engine_objs += osxbits.mm
engine_tools_objs += osxbits.mm
ifeq ($(STARTUP_WINDOW),1)
engine_editor_objs += startosx.editor.mm
endif
ifeq ($(SDL_TARGET),1)
ifneq ($(SDL_FRAMEWORK),0)
engine_objs += SDLMain.mm
endif
endif
endif
ifeq ($(PLATFORM),WINDOWS)
engine_objs += winbits.cpp
ifeq ($(STARTUP_WINDOW),1)
engine_editor_objs += startwin.editor.cpp
endif
endif
ifeq ($(PLATFORM),WII)
engine_objs += wiibits.cpp
LINKERFLAGS += -Wl,-wrap,c_default_exceptionhandler
endif
ifeq ($(RENDERTYPE),SDL)
engine_objs += sdlayer.cpp
ifeq (1,$(HAVE_GTK2))
engine_objs += gtkbits.cpp dynamicgtk.cpp
ifeq ($(STARTUP_WINDOW),1)
engine_editor_objs += startgtk.editor.cpp
endif
endif
endif
ifeq ($(RENDERTYPE),WIN)
engine_objs += winlayer.cpp rawinput.cpp
endif
ifneq ($(USE_LIBVPX),0)
engine_objs += animvpx.cpp
endif
#### mact
mact := mact
mact_root := $(source)/$(mact)
mact_src := $(mact_root)/src
mact_inc := $(mact_root)/include
mact_obj := $(obj)/$(mact)
mact_objs := \
file_lib.cpp \
control.cpp \
keyboard.cpp \
joystick.cpp \
scriplib.cpp \
animlib.cpp \
#### AudioLib
audiolib := audiolib
audiolib_objs := \
drivers.cpp \
fx_man.cpp \
multivoc.cpp \
mix.cpp \
mixst.cpp \
pitch.cpp \
formats.cpp \
vorbis.cpp \
flac.cpp \
xa.cpp \
xmp.cpp \
driver_nosound.cpp \
audiolib_root := $(source)/$(audiolib)
audiolib_src := $(audiolib_root)/src
audiolib_inc := $(audiolib_root)/include
audiolib_obj := $(obj)/$(audiolib)
audiolib_cflags :=
audiolib_deps :=
ifeq ($(PLATFORM),WINDOWS)
ifeq ($(MIXERTYPE),WIN)
audiolib_objs += driver_directsound.cpp
endif
endif
ifeq ($(MIXERTYPE),SDL)
ifeq (,$(filter $(PLATFORM),DARWIN WINDOWS WII))
audiolib_cflags += `$(PKG_CONFIG) --cflags vorbis`
endif
audiolib_objs += driver_sdl.cpp
endif
ifneq (0,$(HAVE_XMP))
audiolib_cflags += -I$(libxmplite_inc)
audiolib_deps += libxmplite
endif
#### Tools
tools := tools
tools_objs := \
compat_tools.cpp \
tools_root := $(source)/$(tools)
tools_src := $(tools_root)/src
tools_obj := $(obj)/$(tools)
tools_cflags := $(engine_cflags)
tools_deps := engine_tools
tools_targets := \
kextract \
kgroup \
transpal \
wad2art \
wad2map \
kmd2tool \
md2tool \
generateicon \
cacheinfo \
arttool \
givedepth \
mkpalette \
unpackssi \
bsuite \
ivfrate \
map2stl \
ifeq ($(PLATFORM),WINDOWS)
tools_targets += enumdisplay getdxdidf
endif
ifeq ($(RENDERTYPE),SDL)
tools_targets += makesdlkeytrans
endif
#### KenBuild (Test Game)
kenbuild := kenbuild
kenbuild_root := $(source)/$(kenbuild)
kenbuild_src := $(kenbuild_root)/src
kenbuild_rsrc := $(kenbuild_root)/rsrc
kenbuild_obj := $(obj)/$(kenbuild)
kenbuild_cflags := -I$(kenbuild_src)
kenbuild_game := ekenbuild
kenbuild_editor := ekenbuild-editor
kenbuild_game_proper := EKenBuild
kenbuild_editor_proper := EKenBuild Editor
kenbuild_game_objs := \
game.cpp \
sound_stub.cpp \
common.cpp \
config.cpp \
kenbuild_editor_objs := \
bstub.cpp \
common.cpp \
kenbuild_game_rsrc_objs :=
kenbuild_editor_rsrc_objs :=
kenbuild_game_gen_objs :=
kenbuild_editor_rsrc_objs :=
ifeq (1,$(HAVE_GTK2))
kenbuild_game_objs += startgtk.game.cpp
kenbuild_game_gen_objs += game_banner.c
kenbuild_editor_gen_objs += build_banner.c
endif
ifeq ($(RENDERTYPE),SDL)
kenbuild_game_rsrc_objs += game_icon.c
kenbuild_editor_rsrc_objs += build_icon.c
endif
ifeq ($(PLATFORM),WINDOWS)
kenbuild_game_objs += startwin.game.cpp
kenbuild_game_rsrc_objs += gameres.rc
kenbuild_editor_rsrc_objs += buildres.rc
endif
ifeq ($(PLATFORM),DARWIN)
ifeq ($(STARTUP_WINDOW),1)
kenbuild_game_objs += StartupWinController.game.mm
endif
endif
#### Duke Nukem 3D
duke3d := duke3d
duke3d_game_ldflags :=
duke3d_editor_ldflags :=
duke3d_game_stripflags :=
duke3d_editor_stripflags :=
duke3d_root := $(source)/$(duke3d)
duke3d_src := $(duke3d_root)/src
duke3d_rsrc := $(duke3d_root)/rsrc
duke3d_obj := $(obj)/$(duke3d)
duke3d_cflags := -I$(duke3d_src)
common_editor_deps := duke3d_common_editor engine_editor
duke3d_game_deps := duke3d_common_midi audiolib mact
duke3d_editor_deps := audiolib
ifneq (0,$(NETCODE))
duke3d_game_deps += enet
endif
ifneq (0,$(LUNATIC))
duke3d_game_deps += lunatic lunatic_game lpeg
duke3d_editor_deps += lunatic lunatic_editor lpeg
endif
duke3d_game := eduke32
duke3d_editor := mapster32
ifneq (,$(APPBASENAME))
duke3d_game := $(APPBASENAME)
endif
duke3d_game_proper := EDuke32
duke3d_editor_proper := Mapster32
duke3d_common_editor_objs := \
m32common.cpp \
m32def.cpp \
m32exec.cpp \
m32vars.cpp \
duke3d_game_objs := \
game.cpp \
global.cpp \
actors.cpp \
gamedef.cpp \
gameexec.cpp \
gamevars.cpp \
player.cpp \
premap.cpp \
sector.cpp \
anim.cpp \
common.cpp \
config.cpp \
demo.cpp \
input.cpp \
menus.cpp \
namesdyn.cpp \
net.cpp \
savegame.cpp \
rts.cpp \
osdfuncs.cpp \
osdcmds.cpp \
grpscan.cpp \
sounds.cpp \
soundsdyn.cpp \
cheats.cpp \
sbar.cpp \
screentext.cpp \
screens.cpp \
cmdline.cpp \
duke3d_editor_objs := \
astub.cpp \
common.cpp \
grpscan.cpp \
sounds_mapster32.cpp \
duke3d_game_rsrc_objs :=
duke3d_editor_rsrc_objs :=
duke3d_game_gen_objs :=
duke3d_editor_gen_objs :=
duke3d_game_miscdeps :=
duke3d_editor_miscdeps :=
duke3d_game_orderonlydeps :=
duke3d_editor_orderonlydeps :=
## Lunatic devel
lunatic := lunatic
lunatic_src := $(duke3d_src)/$(lunatic)
lunatic_obj := $(duke3d_obj)
ifneq (0,$(LUNATIC))
COMPILERFLAGS += -I$(lunatic_src) -DLUNATIC
# Determine size of _defs*.lua bytecode once.
ifndef DEFS_BC_SIZE
DEFS_BC_SIZE := $(shell $(LUAJIT) -bg -t h $(lunatic_src)/_defs_game.lua -)
DEFS_BC_SIZE := $(word 3, $(DEFS_BC_SIZE))
endif
ifndef DEFS_M32_BC_SIZE
DEFS_M32_BC_SIZE := $(shell $(LUAJIT) -bg -t h $(lunatic_src)/_defs_editor.lua -)
DEFS_M32_BC_SIZE := $(word 3, $(DEFS_M32_BC_SIZE))
endif
duke3d_cflags += -DLUNATIC_DEFS_BC_SIZE=$(DEFS_BC_SIZE) -DLUNATIC_DEFS_M32_BC_SIZE=$(DEFS_M32_BC_SIZE)
# Lunatic object base names. These are not used in targets directly.
lunatic_objs := \
defs_common.lua \
engine_maptext.lua \
engine.lua \
bcarray.lua \
bcheck.lua \
bitar.lua \
xmath.lua \
v.lua \
dump.lua \
dis_x86.lua \
dis_x64.lua \
lunatic_game_objs := \
lunatic_game.cpp \
_defs_game.lua \
con_lang.lua \
lunacon.lua \
randgen.lua \
stat.lua \
control.lua \
lunasave.lua \
fs.lua \
lunatic_editor_objs := \
lunatic_editor.cpp \
_defs_editor.lua \
# TODO: remove debugging modules from release build
# now, take care of having the necessary symbols (sector, wall, etc.) in the
# executable no matter what the debugging level
ifeq ($(PLATFORM),DARWIN)
# strip on OSX says: removing global symbols from a final linked no longer supported.
# Use -exported_symbols_list at link time when building
# But, following _their_ directions does not give us the symbols! wtf?
# Instead of using -alias_list and -exported_symbols_list, prevent stripping them.
duke3d_game_stripflags += -s $(duke3d_obj)/lunatic_dynsymlist_game_osx
duke3d_editor_stripflags += -s $(duke3d_obj)/lunatic_dynsymlist_editor_osx
duke3d_game_orderonlydeps += $(duke3d_obj)/lunatic_dynsymlist_game_osx
duke3d_editor_orderonlydeps += $(duke3d_obj)/lunatic_dynsymlist_editor_osx
LINKERFLAGS += -pagezero_size 10000 -image_base 100000000
endif
ifeq ($(PLATFORM),WINDOWS)
override STRIP :=
duke3d_game_miscdeps += $(duke3d_obj)/lunatic_dynsymlist_game.def
duke3d_editor_miscdeps += $(duke3d_obj)/lunatic_dynsymlist_editor.def
endif
ifeq ($(SUBPLATFORM),LINUX)
override STRIP :=
duke3d_game_ldflags += -Wl,--dynamic-list=$(lunatic_src)/dynsymlist_game.lds
duke3d_editor_ldflags += -Wl,--dynamic-list=$(lunatic_src)/dynsymlist_editor.lds
endif
endif
ifeq ($(SUBPLATFORM),LINUX)
LIBS += -lFLAC -lvorbisfile -lvorbis -logg
endif
ifeq ($(PLATFORM),BSD)
LIBS += -lFLAC -lvorbisfile -lvorbis -logg -lexecinfo
endif
ifeq ($(PLATFORM),DARWIN)
LIBS += -lFLAC -lvorbisfile -lvorbis -logg -lm \
-Wl,-framework,Cocoa -Wl,-framework,Carbon -Wl,-framework,OpenGL \
-Wl,-framework,CoreMIDI -Wl,-framework,AudioUnit \
-Wl,-framework,AudioToolbox -Wl,-framework,IOKit -Wl,-framework,AGL
ifneq (00,$(DARWIN9)$(DARWIN10))
LIBS += -Wl,-framework,QuickTime -lm
endif
ifeq ($(STARTUP_WINDOW),1)
duke3d_game_objs += GrpFile.game.mm GameListSource.game.mm startosx.game.mm
endif
endif
ifeq ($(PLATFORM),WINDOWS)
LIBS += -lFLAC -lvorbisfile -lvorbis -logg
duke3d_game_objs += winbits.cpp
duke3d_game_rsrc_objs += gameres.rc
duke3d_editor_rsrc_objs += buildres.rc
ifeq ($(STARTUP_WINDOW),1)
duke3d_game_objs += startwin.game.cpp
endif
ifeq ($(MIXERTYPE),WIN)
LIBS += -ldsound
duke3d_common_midi_objs := music.cpp midi.cpp mpu401.cpp
endif
endif
ifeq ($(PLATFORM),WII)
LIBS += -lvorbisidec
endif
ifeq (11,$(HAVE_GTK2)$(STARTUP_WINDOW))
duke3d_game_objs += startgtk.game.cpp
duke3d_game_gen_objs += game_banner.c
duke3d_editor_gen_objs += build_banner.c
endif
ifeq ($(RENDERTYPE),SDL)
duke3d_game_rsrc_objs += game_icon.c
duke3d_editor_rsrc_objs += build_icon.c
endif
ifeq ($(MIXERTYPE),SDL)
duke3d_common_midi_objs := sdlmusic.cpp
endif
#### Shadow Warrior
sw := sw
sw_root := $(source)/$(sw)
sw_src := $(sw_root)/src
sw_rsrc := $(sw_root)/rsrc
sw_obj := $(obj)/$(sw)
sw_cflags := -I$(sw_src)
sw_game_deps := duke3d_common_midi audiolib mact
sw_editor_deps := audiolib
sw_game := voidsw
sw_editor := voidsw-editor
sw_game_proper := VoidSW
sw_editor_proper := VoidSW Editor
sw_game_objs := \
actor.cpp \
ai.cpp \
anim.cpp \
border.cpp \
break.cpp \
bunny.cpp \
cache.cpp \
cheats.cpp \
colormap.cpp \
common.cpp \
config.cpp \
console.cpp \
coolg.cpp \
coolie.cpp \
copysect.cpp \
demo.cpp \
draw.cpp \
eel.cpp \
game.cpp \
girlninj.cpp \
goro.cpp \
grpscan.cpp \
hornet.cpp \
interp.cpp \
interpsh.cpp \
inv.cpp \
jplayer.cpp \
jsector.cpp \
jweapon.cpp \
lava.cpp \
light.cpp \
mclip.cpp \
mdastr.cpp \
menus.cpp \
miscactr.cpp \
morph.cpp \
net.cpp \
ninja.cpp \
panel.cpp \
player.cpp \
predict.cpp \
quake.cpp \
ripper.cpp \
ripper2.cpp \
rooms.cpp \
rotator.cpp \
rts.cpp \
save.cpp \
scrip2.cpp \
sector.cpp \
serp.cpp \
setup.cpp \
skel.cpp \
skull.cpp \
slidor.cpp \
sounds.cpp \
spike.cpp \
sprite.cpp \
sumo.cpp \
swconfig.cpp \
sync.cpp \
text.cpp \
track.cpp \
vator.cpp \
vis.cpp \
wallmove.cpp \
warp.cpp \
weapon.cpp \
zilla.cpp \
zombie.cpp \
saveable.cpp \
sw_editor_objs := \
jnstub.cpp \
brooms.cpp \
bldscript.cpp \
jbhlp.cpp \
colormap.cpp \
grpscan.cpp \
common.cpp \
sw_game_rsrc_objs :=
sw_editor_rsrc_objs :=
sw_game_gen_objs :=
sw_editor_gen_objs :=
ifeq (1,$(HAVE_GTK2))
sw_game_objs += startgtk.game.cpp
sw_game_gen_objs += game_banner.c
sw_editor_gen_objs += build_banner.c
endif
ifeq ($(RENDERTYPE),SDL)
sw_game_rsrc_objs += game_icon.c
sw_editor_rsrc_objs += game_icon.c
endif
ifeq ($(PLATFORM),WINDOWS)
sw_game_objs += startwin.game.cpp
sw_game_rsrc_objs += gameres.rc
sw_editor_rsrc_objs += buildres.rc
endif
#### Final setup
COMPILERFLAGS += -I$(engine_inc) -I$(mact_inc) -I$(audiolib_inc) -I$(enet_inc) -I$(glad_inc)
##### Recipes
games := \
kenbuild \
duke3d \
sw \
libraries := \
engine \
audiolib \
mact \
enet \
libxmplite \
lpeg \
glad \
components := \
$(games) \
$(libraries) \
tools \
roles := \
game \
editor \
ifeq ($(PRETTY_OUTPUT),1)
.SILENT:
endif
.PHONY: \
all \
start \
$(addprefix clean,$(games) test utils tools) \
veryclean \
clean \
printutils \
printtools \
rev \
$(engine_obj)/rev.$o \
clang-tools \
.SUFFIXES:
.SECONDEXPANSION:
#### Targets
all: duke3d
start:
$(BUILD_STARTED)
tools: $(addsuffix $(EXESUFFIX),$(tools_targets)) | start
@$(call LL,$^)
$(games): $$(foreach i,$(roles),$$($$@_$$i)$(EXESUFFIX)) | start
@$(call LL,$^)
ebacktrace: $(ebacktrace_dll) | start
@$(call LL,$^)
ifeq ($(PLATFORM),WII)
ifneq ($(ELF2DOL),)
%$(DOLSUFFIX): %$(EXESUFFIX)
endif
endif
define BUILDRULE
$$($1_$2)$$(EXESUFFIX): $$(foreach i,$(call getdeps,$1,$2),$$(call expandobjs,$$i)) $$($1_$2_miscdeps) | $$($1_$2_orderonlydeps)
$$(LINK_STATUS)
$$(RECIPE_IF) $$(LINKER) -o $$@ $$^ $$(GUI_LIBS) $$($1_$2_ldflags) $$(LIBDIRS) $$(LIBS) $$(RECIPE_RESULT_LINK)
ifeq ($$(PLATFORM),WII)
ifneq ($$(ELF2DOL),)
$$(ELF2DOL) $$@ $$($1_$2)$$(DOLSUFFIX)
endif
endif
ifneq ($$(STRIP),)
$$(STRIP) $$@ $$($1_$2_stripflags)
endif
ifeq ($$(PLATFORM),DARWIN)
cp -RPf "platform/Apple/bundles/$$($1_$2_proper).app" "./"
$(call MKDIR,"$$($1_$2_proper).app/Contents/MacOS")
cp -f "$$($1_$2)$$(EXESUFFIX)" "$$($1_$2_proper).app/Contents/MacOS/"
endif
endef
$(foreach i,$(games),$(foreach j,$(roles),$(eval $(call BUILDRULE,$i,$j))))
include $(lpeg_root)/Dependencies.mak
include $(engine_root)/Dependencies.mak
include $(duke3d_root)/Dependencies.mak
include $(sw_root)/Dependencies.mak
#### Rules
$(ebacktrace_dll): platform/Windows/src/backtrace.c
$(COMPILE_STATUS)
$(RECIPE_IF) $(CC) $(CONLYFLAGS) -O2 -ggdb -shared -Wall -Wextra -static-libgcc -I$(engine_inc) -o $@ $^ -lbfd -liberty -limagehlp $(RECIPE_RESULT_COMPILE)
libcache1d$(DLLSUFFIX): $(engine_src)/cache1d.cpp
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER_C) -DCACHE1D_COMPRESS_ONLY -shared -fPIC $< -o $@ $(RECIPE_RESULT_COMPILE)
# to debug the tools link phase, make a copy of this rule explicitly replacing % with the name of a tool, such as kextract
%$(EXESUFFIX): $(tools_obj)/%.$o $(foreach i,tools $(tools_deps),$(call expandobjs,$i))
$(LINK_STATUS)
$(RECIPE_IF) $(LINKER) -o $@ $^ $(LIBDIRS) $(LIBS) $(RECIPE_RESULT_LINK)
enumdisplay$(EXESUFFIX): $(tools_obj)/enumdisplay.$o
$(LINK_STATUS)
$(RECIPE_IF) $(LINKER) -o $@ $^ $(LIBDIRS) $(LIBS) -lgdi32 $(RECIPE_RESULT_LINK)
getdxdidf$(EXESUFFIX): $(tools_obj)/getdxdidf.$o
$(LINK_STATUS)
$(RECIPE_IF) $(LINKER) -o $@ $^ $(LIBDIRS) $(LIBS) -ldinput $(RECIPE_RESULT_LINK)
### Lunatic
# Create object files directly with luajit
$(duke3d_obj)/%.$o: $(lunatic_src)/%.lua | $(duke3d_obj)
$(COMPILE_STATUS)
$(RECIPE_IF) $(LUAJIT) -bg $(LUAJIT_BCOPTS) $< $@ $(RECIPE_RESULT_COMPILE)
$(duke3d_obj)/%.$o: $(lunatic_src)/%.cpp | $(duke3d_obj)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER_CXX) $(duke3d_cflags) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
# List of exported symbols, OS X
$(duke3d_obj)/lunatic_%_osx: $(lunatic_src)/%.lds | $(duke3d_obj)
sed 's/[{};]//g;s/[A-Za-z_][A-Za-z_0-9]*/_&/g' $< > $@
# List of exported symbols, Windows
$(duke3d_obj)/lunatic_%.def: $(lunatic_src)/%.lds | $(duke3d_obj)
echo EXPORTS > $@
sed 's/[{};]//g' $< >> $@
### Main Rules
define OBJECTRULES
$$($1_obj)/%.$$o: $$($1_src)/%.nasm | $$($1_obj)
$$(COMPILE_STATUS)
$$(RECIPE_IF) $$(AS) $$(ASFLAGS) $$< -o $$@ $$(RECIPE_RESULT_COMPILE)
$$($1_obj)/%.$$o: $$($1_src)/%.yasm | $$($1_obj)
$$(COMPILE_STATUS)
$$(RECIPE_IF) $$(AS) $$(ASFLAGS) $$< -o $$@ $$(RECIPE_RESULT_COMPILE)
$$($1_obj)/%.$$o: $$($1_src)/%.c | $$($1_obj)
$$(COMPILE_STATUS)
$$(RECIPE_IF) $$(COMPILER_C) $$($1_cflags) -c $$< -o $$@ $$(RECIPE_RESULT_COMPILE)
$$($1_obj)/%.$$o: $$($1_src)/%.cpp | $$($1_obj)
$$(COMPILE_STATUS)
$$(RECIPE_IF) $$(COMPILER_CXX) $$($1_cflags) -c $$< -o $$@ $$(RECIPE_RESULT_COMPILE)
$$($1_obj)/%.$$o: $$($1_src)/%.m | $$($1_obj)
$$(COMPILE_STATUS)
$$(RECIPE_IF) $$(COMPILER_OBJC) $$($1_cflags) -c $$< -o $$@ $$(RECIPE_RESULT_COMPILE)
$$($1_obj)/%.$$o: $$($1_src)/%.mm | $$($1_obj)
$$(COMPILE_STATUS)
$$(RECIPE_IF) $$(COMPILER_OBJCXX) $$($1_cflags) -c $$< -o $$@ $$(RECIPE_RESULT_COMPILE)
$$($1_obj)/%.$$o: $$($1_obj)/%.c
$$(COMPILE_STATUS)
$$(RECIPE_IF) $$(COMPILER_C) $$($1_cflags) -c $$< -o $$@ $$(RECIPE_RESULT_COMPILE)
## Cosmetic stuff
$$($1_obj)/%.$$o: $$($1_rsrc)/%.rc | $$($1_obj)
$$(COMPILE_STATUS)
$$(RECIPE_IF) $$(RC) -i $$< -o $$@ --include-dir=$$(engine_inc) --include-dir=$$($1_src) --include-dir=$$($1_rsrc) -DPOLYMER=$$(POLYMER) $$(RECIPE_RESULT_COMPILE)
$$($1_obj)/%.$$o: $$($1_rsrc)/%.c | $$($1_obj)
$$(COMPILE_STATUS)
$$(RECIPE_IF) $$(COMPILER_C) $$($1_cflags) -c $$< -o $$@ $$(RECIPE_RESULT_COMPILE)
$$($1_obj)/%_banner.c: $$($1_rsrc)/%.bmp | $$($1_obj)
echo "#include \"gtkpixdata_shim.h\"" > $$@
gdk-pixbuf-csource --extern --struct --raw --name=startbanner_pixdata $$^ | sed 's/load_inc//' >> $$@
endef
$(foreach i,$(components),$(eval $(call OBJECTRULES,$i)))
### Other special cases
# Comment out the following rule to debug a-c.o
$(engine_obj)/a-c.$o: $(engine_src)/a-c.cpp | $(engine_obj)
$(COMPILE_STATUS)
$(RECIPE_IF) $(subst -O$(OPTLEVEL),-O2,$(subst $(ASAN_FLAGS),,$(COMPILER_CXX))) $(engine_cflags) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
$(engine_obj)/rev.$o: $(engine_src)/rev.cpp | $(engine_obj)
$(COMPILE_STATUS)
$(RECIPE_IF) $(COMPILER_CXX) $(engine_cflags) $(REVFLAG) -c $< -o $@ $(RECIPE_RESULT_COMPILE)
### Directories
$(foreach i,$(components),$($i_obj)):
-$(call MKDIR,$@)
### Phonies
clang-tools: $(filter %.c %.cpp,$(foreach i,$(call getdeps,duke3d,game),$(call expandsrcs,$i)))
echo $^ -- -x c++ $(CXXONLYFLAGS) $(COMPILERFLAGS) $(CWARNS) $(foreach i,$(components),$($i_cflags))
$(addprefix clean,$(games)):
-$(call RM,$(foreach i,$(roles),$($(subst clean,,$@)_$i)$(EXESUFFIX)))
-$(call RMDIR,$($(subst clean,,$@)_obj))
ifeq ($(PLATFORM),DARWIN)
-$(call RMDIR,$(foreach i,$(roles),"$($(subst clean,,$@)_$i_proper).app"))
endif
cleantools:
-$(call RM,$(addsuffix $(EXESUFFIX),$($(subst clean,,$@)_targets)))
-$(call RMDIR,$($(subst clean,,$@)_obj))
clean: cleanduke3d cleantools
-$(call RMDIR,$(obj))
-$(call RM,$(ebacktrace_dll))
printtools:
echo "$(addsuffix $(EXESUFFIX),$(tools_targets))"
rev: $(engine_obj)/rev.$o
### Compatibility
test: kenbuild
utils: tools
printutils: printtools
veryclean: clean
cleanutils: cleantools
cleantest: cleankenbuild