summaryrefslogtreecommitdiff
path: root/patch/GNUmakefile
diff options
context:
space:
mode:
Diffstat (limited to 'patch/GNUmakefile')
-rw-r--r--patch/GNUmakefile1004
1 files changed, 1004 insertions, 0 deletions
diff --git a/patch/GNUmakefile b/patch/GNUmakefile
new file mode 100644
index 0000000..1541d75
--- /dev/null
+++ b/patch/GNUmakefile
@@ -0,0 +1,1004 @@
+#
+# 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
+
+
+##### 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_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 \
+ mmulti_null.cpp \
+ mutex.cpp \
+ xxhash.c \
+ md4.cpp \
+ colmatch.cpp \
+ screenshot.cpp \
+ mhk.cpp \
+ pngwrite.cpp \
+ miniz.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 \
+
+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 += glbuild.cpp voxmodel.cpp mdsprite.cpp
+ ifeq (1,$(POLYMER))
+ engine_objs += 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)
+ LIBS += -lfluidsynth
+ 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)
+
+
+##### Recipes
+
+games := \
+ kenbuild \
+ duke3d \
+ sw \
+
+libraries := \
+ engine \
+ audiolib \
+ mact \
+ enet \
+ libxmplite \
+ lpeg \
+
+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) $(foreach i,$(components),$($i_cflags)) $(CWARNS)
+
+$(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