diff --git a/Makefile b/Makefile index e84abad4ab..abc9566abe 100644 --- a/Makefile +++ b/Makefile @@ -111,6 +111,8 @@ # # UNIVERSAL_BINARY: builds a universal binary for OSX. Make sure you got both PPC and x86 libs. Only works with GCC 4 or newer # TRIPLE_BINARY: builds a universal binary with the addition of code optimised for G5 (which means a total of 3 binaries in one file) +# OTTD_PPC, OTTD_PPC970, OTTD_i386: compile for target architecture. +# Multiple flags can be used so OTTD_PPC:=1 OTTD_i386:=1 produces the same result as UNIVERSAL_BINARY # # JAGUAR: Crosscompiling for OSX 1.2.8 (codenamed Jaguar). Only works if OSX is defined too. Only works with GCC 4 or newer # This can be changed to any PPC version of OSX by changing the ppc flags in Makefile.config @@ -133,7 +135,7 @@ # Makefile version tag # it checks if the version tag in Makefile.config is the same and force update outdated config files -MAKEFILE_VERSION:=9 +MAKEFILE_VERSION:=10 # CONFIG_WRITER has to be found even for manual configuration CONFIG_WRITER=makefiledir/Makefile.config_writer @@ -341,11 +343,6 @@ endif ifdef OSX # these compilerflags makes the app run as fast as possible without making the app unstable. It works on G3 or newer BASECFLAGS += -O3 -funroll-loops -fsched-interblock -falign-loops=16 -falign-jumps=16 -falign-functions=16 -falign-jumps-max-skip=15 -falign-loops-max-skip=15 -mdynamic-no-pic -ifdef IS_G5 -ifndef UNIVERSAL_BINARY -BASECFLAGS += $(G5_FLAGS) -endif -endif else ifdef MORPHOS BASECFLAGS += -I/gg/os-include -O2 -noixemul -fstrict-aliasing -fexpensive-optimizations @@ -824,9 +821,12 @@ $(ENDIAN_CHECK): endian_check.c $(Q)$(CC_HOST) $(CFLAGS_HOST) $(CDEFS) $< -o $@ +ifndef NATIVE_OSX +# OSX links in os/macosx/Makefile to handle universal binaries better $(TTD): $(OBJS) $(MAKE_CONFIG) @echo '===> Linking $@' $(Q)$(CC) $(LDFLAGS) $(TTDLDFLAGS) $(OBJS) $(LIBS) -o $@ +endif $(STRGEN): strgen/strgen.c endian_host.h @echo '===> Compiling and Linking $@' @@ -893,7 +893,7 @@ FORCE: clean: @echo '===> Cleaning up' # endian.h is out-dated and no longer in use, so it can be removed soon - $(Q)rm -rf .deps *~ $(TTD) $(STRGEN) core table/strings.h $(LANGS) $(OBJS) $(OSX_MIDI_PLAYER_FILE) endian.h endian_host.h endian_target.h $(ENDIAN_CHECK) + $(Q)rm -rf .deps *~ $(TTD) $(STRGEN) core table/strings.h $(LANGS) $(OBJS) $(OSX_MIDI_PLAYER_FILE) endian.h endian_host.h endian_target.h $(ENDIAN_CHECK) .OSX mrproper: clean $(Q)rm -rf $(MAKE_CONFIG) @@ -1000,20 +1000,19 @@ endif $(Q)$(CC) $(OBJCFLAGS) $(CDEFS) -MM $< | sed 's#^$(@F:%.d=%.o):#$@ $(@:.deps/%.d=%.o):#' > $@ -ifndef TRIPLE_BINARY -# building tripple binary object files is handled in os/macosx/Makefile -# TARGET_CPU_FLAGS is used to set target CPUs in OSX universal binaries. It's empty for all other builds +ifndef NATIVE_OSX +# OSX uses os/macosx/Makefile to compile files %.o: %.c $(MAKE_CONFIG) @echo '===> Compiling $<' - $(Q)$(CC) $(TARGET_CPU_FLAGS) $(CFLAGS) $(CDEFS) -c -o $@ $< + $(Q)$(CC) $(CFLAGS) $(CDEFS) -c -o $@ $< %.o: %.cpp $(MAKE_CONFIG) @echo '===> Compiling $<' - $(Q)$(CXX) $(TARGET_CPU_FLAGS) $(CFLAGS) $(CDEFS) -c -o $@ $< + $(Q)$(CXX) $(CFLAGS) $(CDEFS) -c -o $@ $< %.o: %.m $(MAKE_CONFIG) @echo '===> Compiling $<' - $(Q)$(CC) $(TARGET_CPU_FLAGS) $(CFLAGS) $(CDEFS) -c -o $@ $< + $(Q)$(CC) $(CFLAGS) $(CDEFS) -c -o $@ $< endif %.o: %.rc diff --git a/makefiledir/Makefile.config_writer b/makefiledir/Makefile.config_writer index fa5223fb87..a66fc025b7 100644 --- a/makefiledir/Makefile.config_writer +++ b/makefiledir/Makefile.config_writer @@ -85,17 +85,6 @@ $(MAKE_CONFIG): $(call CONFIG_LINE,MINGW:=$(MINGW)) $(call CONFIG_LINE,) - $(call CONFIG_LINE,\# Universal binary setup) - $(call CONFIG_LINE,\# use these settings for building universal binaries. Most systems should work with the default settings) - $(call CONFIG_LINE,CFLAGS_UNIVERSAL:=$(CFLAGS_UNIVERSAL)) - $(call CONFIG_LINE,LDFLAGS_UNIVERSAL:=$(LDFLAGS_UNIVERSAL)) - - $(call CONFIG_LINE,CFLAGS_JAGUAR:=$(CFLAGS_JAGUAR)) - $(call CONFIG_LINE,LDFLAGS_JAGUAR:=$(LDFLAGS_JAGUAR)) - $(call CONFIG_LINE,) - $(call CONFIG_LINE,G5_FLAGS:=$(G5_FLAGS)) - $(call CONFIG_LINE,) - $(call CONFIG_LINE,\# For cross-compiling) $(call CONFIG_LINE,CC_TARGET:=$(CC_TARGET)) $(call CONFIG_LINE,CC_HOST:=$(CC_HOST)) diff --git a/os/macosx/Makefile b/os/macosx/Makefile index 0af7173927..6cdcaad622 100644 --- a/os/macosx/Makefile +++ b/os/macosx/Makefile @@ -2,38 +2,80 @@ # This makefile is not a standalone makefile, but is called from the general one # it contains targets specific to MacOS X -ifdef TRIPLE_BINARY -# this is to add G5_FLAGS to ppc970 builds only. If the ability to add flags to a single arch only shows up in the future -# we can get rid of this. Xcode supports arch dependant flags, but we can't do it in the makefile (yet?) -%.o: %.c $(MAKE_CONFIG) - @echo '===> Compiling $<' - $(Q)$(CC) $(CFLAGS) $(CDEFS) -arch ppc -c -arch i386 -o $@.uni $< - $(Q)$(CC) $(CFLAGS) $(CDEFS) $(G5_FLAGS) -arch ppc970 -c -o $@.ppc970 $< - $(Q)lipo -create -output $@ $@.uni $@.ppc970 - $(Q)rm $@.uni $@.ppc970 +ifdef NATIVE_OSX -%.o: %.cpp $(MAKE_CONFIG) - @echo '===> Compiling $<' - $(Q)$(CXX) $(CFLAGS) $(CDEFS) -arch ppc -arch i386 -c -o $@.uni $< - $(Q)$(CXX) $(CFLAGS) $(CDEFS) $(G5_FLAGS) -arch ppc970 -c -o $@.ppc970 $< - $(Q)lipo -create -output $@ $@.uni $@.ppc970 - $(Q)rm $@.uni $@.ppc970 +DEPS_MAGIC := $(shell mkdir -p $(sort $(dir $(OBJS:%.o=.OSX/%)))) -%.o: %.m $(MAKE_CONFIG) - @echo '===> Compiling $<' - $(Q)$(CC) $(CFLAGS) $(CDEFS) -arch ppc -arch i386 -c -o $@.uni $< - $(Q)$(CC) $(CFLAGS) $(CDEFS) -arch ppc970 $(G5_FLAGS) -c -o $@.ppc970 $< - $(Q)lipo -create -output $@ $@.uni $@.ppc970 - $(Q)rm $@.uni $@.ppc970 +ifdef OTTD_PPC +OTTD_PPC :=.OSX/openttd.ppc +OBJS_ppc := $(OBJS:%.o=.OSX/%.o.ppc) endif -ifdef UNIVERSAL_PPC_PART -# the bundle is build by the PPC compile when making universal binaries -BUILD_OSX_BUNDLE:= -else -BUILD_OSX_BUNDLE:=build_OSX_bundle +ifdef OTTD_i386 +OTTD_i386 :=.OSX/openttd.i386 +OBJS_i386 := $(OBJS:%.o=.OSX/%.o.i386) endif +ifdef OTTD_PPC970 +OTTD_PPC970 :=.OSX/openttd.ppc970 +OBJS_ppc970 := $(OBJS:%.o=.OSX/%.o.ppc970) +endif + +# targets to link OpenTTD +$(TTD): $(OTTD_PPC) $(OTTD_i386) $(OTTD_PPC970) + @echo '===> Linking $@ into a single file' + $(Q)lipo -create -output $@ $(OTTD_PPC) $(OTTD_i386) $(OTTD_PPC970) + +$(OTTD_PPC): $(MAKE_CONFIG) $(OBJS_ppc) + @echo '[PowerPC] Linking $(TTD)' + $(Q)$(CC) $(LDFLAGS) $(TTDLDFLAGS) $(OBJS_ppc) $(LIBS) $(LDFLAGS_PPC) -arch ppc -o $@ + +$(OTTD_i386): $(MAKE_CONFIG) $(OBJS_i386) + @echo '[i386] Linking $(TTD)' + $(Q)$(CC) $(LDFLAGS) $(TTDLDFLAGS) $(OBJS_i386) $(LIBS) $(LDFLAGS_i386) -arch i386 -o $@ + +$(OTTD_PPC970): $(MAKE_CONFIG) $(OBJS_ppc970) + @echo '[PowerPC G5] Linking $(TTD)' + $(Q)$(CC) $(LDFLAGS) $(TTDLDFLAGS) $(OBJS_ppc970) $(LIBS) $(LDFLAGS_PPC) $(G5_FLAGS) -arch ppc970 -o $@ + +# targets to compile each c, m and cpp file +.OSX/%.o.ppc: %.c .deps/%.d + @echo '[PowerPC] Compiling $<' + $(Q)$(CC) $(CFLAGS) $(CFLAGS_PPC) $(CDEFS) -arch ppc -c -o $@ $< + +.OSX/%.o.ppc: %.cpp .deps/%.d + @echo '[PowerPC] Compiling $<' + $(Q)$(CPP) $(CFLAGS) $(CFLAGS_PPC) $(CDEFS) -arch ppc -c -o $@ $< + +.OSX/%.o.ppc: %.m .deps/%.d + @echo '[PowerPC] Compiling $<' + $(Q)$(CC) $(CFLAGS) $(CFLAGS_PPC) $(CDEFS) -arch ppc -c -o $@ $< + +.OSX/%.o.i386: %.c .deps/%.d + @echo '[i386] Compiling $<' + $(Q)$(CC) $(CFLAGS) $(CFLAGS_i386) $(CDEFS) -arch i386 -c -o $@ $< + +.OSX/%.o.i386: %.cpp .deps/%.d + @echo '[i386] Compiling $<' + $(Q)$(CPP) $(CFLAGS) $(CFLAGS_i386) $(CDEFS) -arch i386 -c -o $@ $< + +.OSX/%.o.i386: %.m .deps/%.d + @echo '[i386] Compiling $<' + $(Q)$(CC) $(CFLAGS) $(CFLAGS_i386) $(CDEFS) -arch i386 -c -o $@ $< + +.OSX/%.o.ppc970: %.c .deps/%.d + @echo '[PowerPC G5] Compiling $<' + $(Q)$(CC) $(CFLAGS) $(CFLAGS_PPC) $(G5_FLAGS) $(CDEFS) -arch ppc970 -c -o $@ $< + +.OSX/%.o.ppc970: %.cpp .deps/%.d + @echo '[PowerPC G5] Compiling $<' + $(Q)$(CPP) $(CFLAGS) $(CFLAGS_PPC) $(G5_FLAGS) $(CDEFS) -arch ppc970 -c -o $@ $< + +.OSX/%.o.ppc970: %.m .deps/%.d + @echo '[PowerPC G5] Compiling $<' + $(Q)$(CC) $(CFLAGS) $(CFLAGS_PPC) $(G5_FLAGS) $(CDEFS) -arch ppc970 -c -o $@ $< + +endif ifdef JAGUAR JAGUAR_POSTFIX := -jaguar diff --git a/os/macosx/Makefile.setup b/os/macosx/Makefile.setup index 95b346ab3a..fe84c36e7d 100644 --- a/os/macosx/Makefile.setup +++ b/os/macosx/Makefile.setup @@ -18,7 +18,7 @@ endif ifdef TRIPLE_BINARY ifdef DEBUG -$(error no G5 optimisation is made in debug builds, so tripple binaries aren't possible. Use UNIVERSAL_BINARY instead if you really want a universal debug build) +$(error no G5 optimisation is made in debug builds, so triple binaries aren't possible. Use UNIVERSAL_BINARY instead if you really want a universal debug build) endif UNIVERSAL_BINARY:=1 endif @@ -46,24 +46,16 @@ $(warning Compiling a release build, that is a debug build) endif endif -# setup flags if none are defined -ifndef CFLAGS_JAGUAR - CFLAGS_JAGUAR:= -isysroot /Developer/SDKs/MacOSX10.2.8.sdk -endif -ifndef LDFLAGS_JAGUAR - LDFLAGS_JAGUAR:= -Wl,-syslibroot,/Developer/SDKs/MacOSX10.2.8.sdk +ifeq ($(shell uname), Darwin) + # it's a hardware mac, not crosscompiling + NATIVE_OSX:=1 endif -ifndef CFLAGS_UNIVERSAL - CFLAGS_UNIVERSAL:= -isysroot /Developer/SDKs/MacOSX10.4u.sdk +ifndef PPC_OSX_TARGET +PPC_OSX_TARGET:=10.3.9 endif -ifndef LDFLAGS_UNIVERSAL - LDFLAGS_UNIVERSAL:= -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -endif - -ifdef JAGUAR - CFLAGS:= $(CFLAGS_JAGUAR) -arch ppc - LDFLAGS:= $(LDFLAGS_JAGUAR) +ifndef i386_OSX_TARGET +i386_OSX_TARGET:=10.4u endif ifndef G5_FLAGS @@ -71,23 +63,67 @@ G5_FLAGS := -mtune=970 -mcpu=970 -mpowerpc-gpopt endif ifdef UNIVERSAL_BINARY -TARGET_CPU_FLAGS:= -arch ppc -arch i386 -LDFLAGS := $(LDFLAGS_UNIVERSAL) -arch ppc -arch i386 -CFLAGS += $(CFLAGS_UNIVERSAL) -ifdef TRIPLE_BINARY -LDFLAGS += -arch ppc970 + OTTD_PPC:=1 + OTTD_i386:=1 + ifdef TRIPLE_BINARY + OTTD_PPC970:=1 + endif endif + +# if any targets have been defined by now, we are crosscompiling and we will set up paths accordingly +ifdef OTTD_PPC + CFLAGS_PPC += -isysroot /Developer/SDKs/MacOSX$(PPC_OSX_TARGET).sdk + LDFLAGS_PPC += -Wl,-syslibroot,/Developer/SDKs/MacOSX$(PPC_OSX_TARGET).sdk +endif + +ifdef OTTD_i386 + CFLAGS_i386 += -isysroot /Developer/SDKs/MacOSX$(i386_OSX_TARGET).sdk + LDFLAGS_i386 += -Wl,-syslibroot,/Developer/SDKs/MacOSX$(i386_OSX_TARGET).sdk +endif + +ifdef OTTD_PPC970 + ifndef OTTD_PPC + CFLAGS_PPC += -isysroot /Developer/SDKs/MacOSX$(PPC_OSX_TARGET).sdk + LDFLAGS_PPC += -Wl,-syslibroot,/Developer/SDKs/MacOSX$(PPC_OSX_TARGET).sdk + endif +endif + +ifdef JAGUAR + CFLAGS += -isysroot /Developer/SDKs/MacOSX10.2.8.sdk + LDFLAGS += -Wl,-syslibroot,/Developer/SDKs/MacOSX10.2.8.sdk + OTTD_PPC:=1 endif # setting up flags to make a binary, that fits the system it builds on -ifndef FAT_BINARY - ifndef JAGUAR - ifeq ($(shell uname), Darwin) - # it's a hardware mac, not crosscompiling +ifdef NATIVE_OSX + ifndef UNIVERSAL_BINARY + # we are not crosscompiling for other macs + ifndef JAGUAR ifeq ($(shell uname -r), 6.8) # OSX 10.2.8 uses Darwin 6.8, so we better set JAGUAR so we avoid the stuff that was added in 10.3 or later JAGUAR:=1 + OTTD_PPC:=1 endif endif endif endif + +ifdef NATIVE_OSX + ifndef OTTD_PPC + ifndef OTTD_i386 + ifndef OTTD_PPC970 + # no flags have been set for target versions of OSX, so we will set it to compile for the current host + ifeq ($(shell uname -p), powerpc) + ifdef IS_G5 + OTTD_PPC970:=1 + else + OTTD_PPC:=1 + endif + else + # we are not using a PowerPC CPU, so we assume that it's an Intel mac + OTTD_i386:=1 + endif + endif + endif + endif +endif \ No newline at end of file