# Makefile for FBNeo, for use with GNU make & GCC (MinGW) # # The first pass makes sure all intermediary targets are present. The second pass updates # any targets, if necessary. (Intermediary) targets which have their own unique rules # are generated as required. unexport # # Flags. Uncomment any of these declarations to enable their function. # # Check for changes in header files ifndef SKIPDEPEND #DEPEND = 1 endif # Note: DEPEND = 1 is a hassle and slows build time by about 500x # it's easier to "rm -rf obj" and rebuild than deal with DEPEND = 1 # # Declare variables # # Specify the name of the executable file, without ".exe" WINDRES=windres NAME = fbneo COMPILENAME = 3 ifdef BUILD_X64_EXE ifdef BUILD_A68K undefine BUILD_A68K endif ifdef BUILD_X86_ASM undefine BUILD_X86_ASM endif endif ifndef DEBUG undefine BUILD_A68K endif ifndef CPUTYPE CPUTYPE = i686 endif ifdef BUILD_X86_ASM MMX = 1 else MMX = 0 endif ifndef BUILD_X86_ASM NAME := $(NAME)x COMPILENAME := $(COMPILENAME)x endif ifdef BUILD_X64_EXE NAME = fbneo64 COMPILENAME = 6 endif ifdef DEBUG NAME := $(NAME)d COMPILENAME := $(COMPILENAME)d endif ifdef SYMBOL NAME := $(NAME)s COMPILENAME := $(COMPILENAME)s endif ifndef UNICODE NAME := $(NAME)a COMPILENAME := $(COMPILENAME)a endif ifeq ($(CPUTYPE),i686) ppro = ppro else NAME := $(NAME)$(CPUTYPE) endif # # Specify paths/files # ifdef GCC345 objdir = obj/34/$(COMPILENAME)/ endif ifdef GCC452 objdir = obj/45/$(COMPILENAME)/ endif ifdef GCC471 objdir = obj/47/$(COMPILENAME)/ endif ifdef GCC510 objdir = obj/51/$(COMPILENAME)/ endif srcdir = src/ include makefile.burn_rules include makefile.burner_win32_rules ifdef GCC345 incdir = $(foreach dir,$(alldir),-I$(srcdir)$(dir)) -I$(objdir)dep/generated -I$(srcdir)dep/mingw/include -I- -I$(srcdir)dep/mingw/include/directx9 -I$(srcdir)dep/mingw/include/xaudio2 endif ifdef GCC452 incdir = $(foreach dir,$(alldir),-I$(srcdir)$(dir)) -I$(objdir)dep/generated -I$(srcdir)dep/mingw/include -I$(srcdir)dep/mingw/include/directx9 -I$(srcdir)dep/mingw/include/xaudio2 endif ifdef GCC471 incdir = $(foreach dir,$(alldir),-I$(srcdir)$(dir)) -I$(objdir)dep/generated -I$(srcdir)dep/mingw/include -I$(srcdir)dep/mingw/include/directx9 -I$(srcdir)dep/mingw/include/xaudio2 endif ifdef GCC510 incdir = $(foreach dir,$(alldir),-I$(srcdir)$(dir)) -I$(objdir)dep/generated -I$(srcdir)dep/mingw/include -I$(srcdir)dep/mingw/include/directx9 -I$(srcdir)dep/mingw/include/xaudio2 endif ifdef UNICODE # lib = -lunicows endif lib += -luser32 -lgdi32 -lcomdlg32 -lcomctl32 -lshell32 -lwinmm -lshlwapi -ladvapi32 -lsetupapi -lole32 -luuid -lwininet ifdef INCLUDE_AVI_RECORDING lib += -lvfw32 endif depobj += resource.o \ autdep = $(depobj:.o=.d) drvdep = $(drvsrc:.o=.d) ifdef BUILD_A68K a68k.o = $(objdir)cpu/a68k/a68k.o endif app_gnuc.rc = $(srcdir)dep/generated/app_gnuc.rc license.rtf = $(srcdir)dep/generated/license.rtf driverlist.h = $(srcdir)dep/generated/driverlist.h ctv.h = $(srcdir)dep/generated/ctv.h toa_gp9001_func.h = $(srcdir)dep/generated/toa_gp9001_func.h neo_sprite_func.h = $(srcdir)dep/generated/neo_sprite_func.h cave_tile_func.h = $(srcdir)dep/generated/cave_tile_func.h cave_sprite_func.h = $(srcdir)dep/generated/cave_sprite_func.h psikyo_tile_func.h = $(srcdir)dep/generated/psikyo_tile_func.h pgm_sprite.h = $(srcdir)dep/generated/pgm_sprite.h build_details.h = $(srcdir)dep/generated/build_details.h allobj = $(objdir)cpu/m68k/m68kcpu.o $(objdir)cpu/m68k/m68kops.o \ $(foreach file,$(autobj:.o=.c), \ $(foreach dir,$(alldir),$(subst $(srcdir),$(objdir), \ $(firstword $(subst .c,.o,$(wildcard $(srcdir)$(dir)/$(file))))))) \ $(foreach file,$(autobj:.o=.cpp), \ $(foreach dir,$(alldir),$(subst $(srcdir),$(objdir), \ $(firstword $(subst .cpp,.o,$(wildcard $(srcdir)$(dir)/$(file))))))) \ $(foreach file,$(autobj:.o=.asm), \ $(foreach dir,$(alldir),$(subst $(srcdir),$(objdir), \ $(firstword $(subst .asm,.o,$(wildcard $(srcdir)$(dir)/$(file))))))) \ $(foreach file,$(autobj:.o=.rc), \ $(foreach dir,$(alldir),$(subst $(srcdir),$(objdir), \ $(firstword $(subst .rc,.o,$(wildcard $(srcdir)$(dir)/$(file))))))) ifdef BUILD_A68K allobj += $(a68k.o) endif alldep = $(foreach file,$(autobj:.o=.c), \ $(foreach dir,$(alldir),$(subst $(srcdir),$(objdir), \ $(firstword $(subst .c,.d,$(wildcard $(srcdir)$(dir)/$(file))))))) \ $(foreach file,$(autobj:.o=.cpp), \ $(foreach dir,$(alldir),$(subst $(srcdir),$(objdir), \ $(firstword $(subst .cpp,.d,$(wildcard $(srcdir)$(dir)/$(file))))))) \ $(foreach file,$(autobj:.o=.rc), \ $(foreach dir,$(alldir),$(subst $(srcdir),$(objdir), \ $(firstword $(subst .rc,.d,$(wildcard $(srcdir)$(dir)/$(file))))))) autdrv := $(drvsrc:.cpp=.o) # # # Specify compiler/linker/assembler # # CC = gcc CXX = g++ LD = $(CXX) AS = nasm LDFLAGS = -static ifdef GCC345 CFLAGS = -pipe \ -std=gnu99 -march=$(CPUTYPE) -O1 -ffloat-store \ -mno-cygwin -mwindows \ -fforce-mem -fforce-addr -finline-limit=1200 -fthread-jumps \ -freduce-all-givs -fmove-all-movables -fexpensive-optimizations \ -Wall -Wno-long-long -Wno-sign-compare -Wno-uninitialized -Wno-unused \ $(DEF) $(incdir) CXXFLAGS = -pipe \ -march=$(CPUTYPE) -O1 -ffloat-store \ -mno-cygwin -mwindows \ -fforce-mem -fforce-addr -finline-limit=1200 -fthread-jumps \ -freduce-all-givs -fmove-all-movables -fexpensive-optimizations \ -fcheck-new \ -Wall -W -pedantic -Wno-long-long \ -Wunknown-pragmas -Wundef -Wconversion -Wno-missing-braces \ -Wuninitialized -Wpointer-arith -Winline -Wno-multichar \ $(DEF) $(incdir) endif ifdef GCC452 CFLAGS = -pipe \ -std=gnu99 -march=$(CPUTYPE) -O3 -ffloat-store \ -mno-cygwin -mwindows \ -fforce-addr -finline-limit=1200 -fthread-jumps \ -fexpensive-optimizations \ -Wall -Wno-long-long -Wno-sign-compare -Wno-uninitialized -Wno-unused \ -Wno-sequence-point \ $(DEF) $(incdir) CXXFLAGS = -pipe \ -march=$(CPUTYPE) -O3 -ffloat-store \ -mno-cygwin -mwindows \ -fforce-addr -finline-limit=1200 -fthread-jumps \ -fexpensive-optimizations -fcheck-new \ -Wall -W -pedantic -Wshadow -Wno-long-long -Wno-write-strings \ -Wunknown-pragmas -Wundef -Wno-conversion -Wno-missing-braces -Wno-multichar \ -Wuninitialized -Wpointer-arith -Wno-inline -Wno-address -Wno-unused-value \ -Wno-sequence-point \ $(DEF) $(incdir) endif ifdef GCC471 CFLAGS = -pipe \ -std=gnu99 -O3 -ffloat-store \ -mwindows \ -fforce-addr -finline-limit=1200 -fthread-jumps \ -fexpensive-optimizations \ -Wall -Wno-long-long -Wno-sign-compare -Wno-uninitialized -Wno-unused \ -Wno-sequence-point \ $(DEF) $(incdir) CXXFLAGS = -pipe \ -std=gnu++11 -O3 -ffloat-store \ -mwindows \ -fforce-addr -finline-limit=1200 -fthread-jumps \ -fexpensive-optimizations -fcheck-new \ -Wall -W -pedantic -Wshadow -Wno-long-long -Wno-write-strings \ -Wunknown-pragmas -Wundef -Wno-conversion -Wno-missing-braces -Wno-multichar \ -Wuninitialized -Wpointer-arith -Wno-inline -Wno-address -Wno-unused-value \ -Wno-unused-but-set-variable -Wno-sequence-point -Wno-narrowing -Wno-extra \ $(DEF) $(incdir) ifdef BUILD_X64_EXE CFLAGS += -m64 CXXFLAGS += -m64 LDFLAGS += -m64 else CFLAGS += -m32 CXXFLAGS += -m32 LDFLAGS += -m32 endif endif ifdef GCC510 CFLAGS = -pipe \ -std=gnu99 -O3 -ffloat-store \ -mwindows \ -fforce-addr -finline-limit=1200 -fthread-jumps \ -fexpensive-optimizations \ -Wall -Wno-long-long -Wno-sign-compare -Wno-uninitialized -Wno-unused \ -Wno-sequence-point -Wno-pedantic \ $(DEF) $(incdir) CXXFLAGS = -pipe \ -std=gnu++11 -O3 -ffloat-store \ -mwindows \ -fforce-addr -finline-limit=1200 -fthread-jumps \ -fexpensive-optimizations -fcheck-new \ -Wall -W -pedantic -Wshadow -Wno-long-long -Wno-write-strings \ -Wunknown-pragmas -Wundef -Wno-conversion -Wno-missing-braces -Wno-multichar \ -Wuninitialized -Wpointer-arith -Wno-inline -Wno-address -Wno-unused-value \ -Wno-unused-but-set-variable -Wno-sequence-point -Wno-narrowing -Wno-extra \ -Wno-pedantic \ $(DEF) $(incdir) ifdef BORKYCRT #return back to msvcrt-style swprintf CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 CXXFLAGS += -D__USE_MINGW_ANSI_STDIO=0 endif ifdef BUILD_X64_EXE CFLAGS += -m64 CXXFLAGS += -m64 LDFLAGS += -m64 # allow nasty C code in i8051.cpp CXXFLAGS += -fpermissive else CFLAGS += -m32 CXXFLAGS += -m32 LDFLAGS += -m32 endif endif ASFLAGS = -O1 -f coff -w-orphan-labels # D3DUtils & D3DMath need these # DEF = -Dsinf=\(float\)sin -Dcosf=\(float\)cos -Dasinf=\(float\)asin -Dacosf=\(float\)acos -Dsqrtf=\(float\)sqrt DEF := -DBUILD_WIN32 -DUSE_SPEEDHACKS -DFILENAME=$(NAME) -DMMX=$(MMX) ifdef UNICODE DEF := $(DEF) -D_UNICODE endif ifdef SPECIALBUILD DEF := $(DEF) -DSPECIALBUILD=$(SPECIALBUILD) endif ifdef FASTCALL DEF := $(DEF) -DFASTCALL endif ifdef DEBUG ifdef GCC345 CFLAGS += -mconsole endif ifdef GCC452 CFLAGS += -mconsole endif DEF := $(DEF) -DFBNEO_DEBUG endif ifdef ROM_VERIFY DEF := $(DEF) -DROM_VERIFY endif ifdef INCLUDE_7Z_SUPPORT DEF := $(DEF) -DINCLUDE_7Z_SUPPORT endif ifdef INCLUDE_AVI_RECORDING DEF := $(DEF) -DINCLUDE_AVI_RECORDING endif ifdef LSB_FIRST DEF := $(DEF) -DLSB_FIRST endif ifdef INCLUDE_LIB_PNGH DEF := $(DEF) -DINCLUDE_LIB_PNGH endif ifdef BUILD_A68K DEF := $(DEF) -DBUILD_A68K endif ifdef BUILD_X86_ASM DEF := $(DEF) -DBUILD_X86_ASM endif ifdef BUILD_X64_EXE DEF := $(DEF) -DBUILD_X64_EXE # -DXBYAK_NO_OP_NAMES -DMIPS3_X64_DRC endif ifdef SYMBOL CFLAGS += -ggdb3 CXXFLAGS += -ggdb3 ASFLAGS += -g DEF := $(DEF) -D_DEBUG ifdef PROFILE CFLAGS += -pg CXXFLAGS += -pg else CFLAGS += -fomit-frame-pointer CXXFLAGS += -fomit-frame-pointer endif else LDFLAGS += -s endif ifdef BUILD_X86_ASM CFLAGS += -mmmx CXXFLAGS += -mmmx endif ifdef BUILD_NATIVE CFLAGS += -march=native -mtune=native CXXFLAGS += -march=native -mtune=native endif # For zlib DEF := $(DEF) -DNO_VIZ -D_LARGEFILE64_SOURCE=0 -D_FILE_OFFSET_BITS=32 # For lib7z ifdef INCLUDE_7Z_SUPPORT DEF := $(DEF) -D_7ZIP_PPMD_SUPPPORT -D_7ZIP_ST endif # While cross-compiling, tools need to be compiled for host so that they can be executed by host. # if HOST_CC is not set, then we aren't cross-compiling, so we'll use target compiler as host compiler # Those values need to be duplicated late, so that C(XX)FLAGS modifications are accounted ifeq ($(HOST_CC),) HOST_CC := $(CC) HOST_CXX := $(CXX) HOST_CFLAGS := $(CFLAGS) -mconsole HOST_CXXFLAGS := $(CXXFLAGS) -mconsole HOST_LDFLAGS := $(LDFLAGS) endif # # # Specify paths # # vpath %.asm $(foreach dir,$(alldir),$(srcdir)$(dir)/ ) vpath %.cpp $(foreach dir,$(alldir),$(srcdir)$(dir)/ ) vpath %.c $(foreach dir,$(alldir),$(srcdir)$(dir)/ ) vpath %.h $(foreach dir,$(alldir),$(srcdir)$(dir)/ ) vpath %.rc $(foreach dir,$(alldir),$(srcdir)$(dir)/ ) vpath %.o $(foreach dir,$(alldir),$(objdir)$(dir)/ ) vpath %.d $(foreach dir,$(alldir),$(objdir)$(dir)/ ) # # # Rules # # # backward compatibility (make less than 4.4 doesn't support .WAIT) .WAIT: .PHONY: all init cleandep touch clean ifeq ($(MAKELEVEL),1) ifdef DEPEND all: init .WAIT $(drvdep) $(autdep) $(autobj) $(autdrv) ifdef GCC345 @$(MAKE) -f makefile.mingw -s GCC345=1 endif ifdef GCC452 @$(MAKE) -f makefile.mingw -s GCC452=1 endif ifdef GCC471 @$(MAKE) -f makefile.mingw -s GCC471=1 endif ifdef GCC510 @$(MAKE) -f makefile.mingw -s GCC510=1 endif else all: init .WAIT $(autobj) $(autdrv) ifdef GCC345 @$(MAKE) -f makefile.mingw -s GCC345=1 endif ifdef GCC452 @$(MAKE) -f makefile.mingw -s GCC452=1 endif ifdef GCC471 @$(MAKE) -f makefile.mingw -s GCC471=1 endif ifdef GCC510 @$(MAKE) -f makefile.mingw -s GCC510=1 endif endif else all: $(NAME).exe endif # # # Rule for linking the executable # # ifeq ($(MAKELEVEL),2) $(objdir)/drivers.o: $(autdrv) @echo Linking drivers... ifdef BUILD_X64_EXE @$(LD) -m64 -r -nostdlib -o $@ $^ else @$(LD) -m32 -r -nostdlib -o $@ $^ endif $(NAME).exe: $(allobj) $(objdir)/drivers.o @echo @echo Linking executable... $(NAME).exe @$(LD) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(lib) ifdef DEBUG # Don't compress when making a debug build else ifdef COMPRESS @upx --best $@ endif endif endif ifeq ($(MAKELEVEL),1) ifdef FORCE_UPDATE $(build_details.h): FORCE endif endif # # Generate the gamelist # burn.o burn.d: driverlist.h $(driverlist.h): $(drvsrc) $(srcdir)dep/scripts/gamelist.pl ifdef PERL @$(srcdir)dep/scripts/gamelist.pl -o $@ -l gamelist.txt \ $(filter %.cpp,$(foreach file,$(drvsrc:.o=.cpp),$(foreach dir,$(alldir), \ $(firstword $(wildcard $(srcdir)$(dir)/$(file)))))) else ifeq ($(MAKELEVEL),2) @echo @echo Warning: Perl is not available on this system. @echo $@ cannot be updated or created! @echo endif endif # # Verify if driverlist.h needs to be updated # #ifeq ($(MAKELEVEL),1) #ifdef FORCE_UPDATE #$(driverlist.h): FORCE #endif #endif # # Fix the .rc file # resource.o resource.d: $(app_gnuc.rc) string.rc version.rc version.h $(build_details.h) $(license.rtf): $(srcdir)license.txt $(srcdir)dep/scripts/license2rtf.pl ifdef PERL @$(srcdir)dep/scripts/license2rtf.pl $< -o $(srcdir)dep/generated/$(@F:.rc=.rtf) else ifeq ($(MAKELEVEL),2) @echo @echo Warning: Perl is not available on this system. @echo $@ cannot be updated or created! @echo endif endif $(app_gnuc.rc): app.rc $(license.rc) $(license.rtf) $(srcdir)dep/scripts/fixrc.pl $(srcdir)burner/resource/fba.ico $(srcdir)burner/resource/about.bmp $(srcdir)burner/resource/splash.bmp $(srcdir)burner/resource/misc.bmp ifdef PERL @$(srcdir)dep/scripts/fixrc.pl $< -o $@ else ifeq ($(MAKELEVEL),2) @echo @echo Warning: Perl is not available on this system. @echo $@ cannot be updated or created! @echo endif endif # # Generate some info on the build details # about.o about.d: $(build_details.h) $(build_details.h): $(srcdir)dep/scripts/build_details.cpp @$(HOST_CXX) $(HOST_CXXFLAGS) $(HOST_LDFLAGS) $< -o $(objdir)dep/generated/build_details.exe @$(objdir)dep/generated/build_details.exe >$@ # # Compile 68000 cores # # A68K ifdef BUILD_A68K $(a68k.o): fba_make68k.c @echo Compiling A68K MC68000 core... @$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -DWIN32 -Wno-unused -Wno-conversion -Wno-missing-prototypes \ -s $< -o $(subst $(srcdir),$(objdir),$($@ # # Extra rules for generated header file toa_gp9001_func.h, needed by toa_gp9001.cpp # toa_bcu2.d toa_bcu2.o toa_gp9001.d toa_gp9001.o: $(toa_gp9001_func.h) $(toa_gp9001_func.h): $(srcdir)dep/scripts/toa_gp9001_func.pl @$(srcdir)dep/scripts/toa_gp9001_func.pl -o $(toa_gp9001_func.h) # # Extra rules for generated header file neo_sprite_func.h, needed by neo_sprite.cpp # neo_sprite.d neo_sprite.o: $(neo_sprite_func.h) $(neo_sprite_func.h): $(srcdir)dep/scripts/neo_sprite_func.pl @$(srcdir)dep/scripts/neo_sprite_func.pl -o $(neo_sprite_func.h) # # Extra rules for generated header file cave_tile_func.h, needed by cave_tile.cpp # cave_tile.d cave_tile.o: $(cave_tile_func.h) $(cave_tile_func.h): $(srcdir)dep/scripts/cave_tile_func.pl @$(srcdir)dep/scripts/cave_tile_func.pl -o $(cave_tile_func.h) # # Extra rules for generated header file cave_sprite_func.h, needed by cave_sprite.cpp # cave_sprite.d cave_sprite.o: $(cave_sprite_func.h) $(cave_sprite_func.h): $(srcdir)dep/scripts/cave_sprite_func.pl @$(srcdir)dep/scripts/cave_sprite_func.pl -o $(cave_sprite_func.h) # # Extra rules for generated header file psikyo_tile_func.h / psikyo_sprite_func.h, needed by psikyo_tile.cpp / psikyo_sprite.cpp # psikyo_tile.d psikyo_tile.o psikyosprite.d psikyo_sprite.o: $(psikyo_tile_func.h) $(psikyo_tile_func.h): $(srcdir)dep/scripts/psikyo_tile_func.pl $(srcdir)dep/scripts/psikyo_tile_func.pl -o $(psikyo_tile_func.h) # # Extra rules for generated header file pgm_sprite.h, needed by pgm_draw.cpp # pgm_draw.d pgm_draw.o: $(pgm_sprite.h) $(pgm_sprite.h): pgm_sprite_create.cpp @echo Generating $(srcdir)dep/generated/$(@F)... @$(HOST_CC) $(HOST_CXXFLAGS) $(HOST_LDFLAGS) $< \ -o $(subst $(srcdir),$(objdir),$($@ ifeq ($(MAKELEVEL),2) ifdef DEPEND include $(alldep) endif endif # # Generic rule for resource files # %.o: %.rc @echo Compiling resource file $($(subst $(srcdir),$(objdir),$($(subst $(srcdir),$(objdir),$($(subst $(srcdir),$(objdir),$(