diff options
Diffstat (limited to 'patch/GNUmakefile')
| -rw-r--r-- | patch/GNUmakefile | 1004 |
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 |