raze/GNUmakefile
pogokeen 1df7127609 Support software renderer upscaling engine-side in sdlayer and sdlayer12 with various scaling factors (beyond just pixel doubling).
When glsurface is available, use GL to upscale the render buffer.
Additionally, fix build issues with sdlayer12 introduced by GLAD changes (r6656).

git-svn-id: https://svn.eduke32.com/eduke32@6939 1a8010ca-5511-0410-912e-c29ae57300e0
2018-07-14 21:36:44 +00:00

1038 lines
23 KiB
Makefile

#
# 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