diff --git a/Makefile b/Makefile index 4cbd3053ec..bad6540aac 100644 --- a/Makefile +++ b/Makefile @@ -109,7 +109,8 @@ # # Special for crosscompiling there are some commands available: # -# FAT_BINARY: builds a universal binary for OSX. Make sure you got both PPC and x86 libs. Only works with GCC 4 or newer +# 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) # # 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 @@ -132,7 +133,7 @@ # Makefile version tag # it checks if the version tag in Makefile.config is the same and force update outdated config files -MAKEFILE_VERSION:=8 +MAKEFILE_VERSION:=9 # CONFIG_WRITER has to be found even for manual configuration CONFIG_WRITER=makefiledir/Makefile.config_writer @@ -340,6 +341,11 @@ 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 @@ -994,17 +1000,21 @@ 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 %.o: %.c $(MAKE_CONFIG) @echo '===> Compiling $<' - $(Q)$(CC) $(CFLAGS) $(CDEFS) -c -o $@ $< + $(Q)$(CC) $(TARGET_CPU_FLAGS) $(CFLAGS) $(CDEFS) -c -o $@ $< %.o: %.cpp $(MAKE_CONFIG) @echo '===> Compiling $<' - $(Q)$(CXX) $(CFLAGS) $(CDEFS) -c -o $@ $< + $(Q)$(CXX) $(TARGET_CPU_FLAGS) $(CFLAGS) $(CDEFS) -c -o $@ $< %.o: %.m $(MAKE_CONFIG) @echo '===> Compiling $<' - $(Q)$(CC) $(CFLAGS) $(CDEFS) -c -o $@ $< + $(Q)$(CC) $(TARGET_CPU_FLAGS) $(CFLAGS) $(CDEFS) -c -o $@ $< +endif %.o: %.rc @echo '===> Compiling resource $<' diff --git a/makefiledir/Makefile.config_writer b/makefiledir/Makefile.config_writer index 8b0d2da4df..fa5223fb87 100644 --- a/makefiledir/Makefile.config_writer +++ b/makefiledir/Makefile.config_writer @@ -87,25 +87,13 @@ $(MAKE_CONFIG): $(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,SDL_PPC_CONFIG:=$(SDL_PPC_CONFIG)) - $(call CONFIG_LINE,SDL_x86_CONFIG:=$(SDL_x86_CONFIG)) + $(call CONFIG_LINE,CFLAGS_UNIVERSAL:=$(CFLAGS_UNIVERSAL)) + $(call CONFIG_LINE,LDFLAGS_UNIVERSAL:=$(LDFLAGS_UNIVERSAL)) - $(call CONFIG_LINE,\# if you got a fat libpng you should not need to change this. It is recommended to get a fat libpng lib) - $(call CONFIG_LINE,LIBPNG_PPC_CONFIG:=$(LIBPNG_PPC_CONFIG)) - $(call CONFIG_LINE,LIBPNG_x86_CONFIG:=$(LIBPNG_x86_CONFIG)) - - $(call CONFIG_LINE,\# autodetected SDL lib path, but it is not detected in a reliable way, so verify it. It needs to be the x86 lib) - $(call CONFIG_LINE,x86_SDL_LIB:=$(x86_SDL_LIB)) - - $(call CONFIG_LINE,\# default values should be good enough for the rest of the universal binary flags, but check them anyway) - $(call CONFIG_LINE,SKIP_LIB_TEST:=$(SKIP_LIB_TEST)) - $(call CONFIG_LINE,PPC_CC:=$(PPC_CC)) - $(call CONFIG_LINE,CFLAGS_PPC:=$(CFLAGS_PPC)) - $(call CONFIG_LINE,LDFLAGS_PPC:=$(LDFLAGS_PPC)) - - $(call CONFIG_LINE,x86_CC:=$(x86_CC)) - $(call CONFIG_LINE,CFLAGS_x86:=$(CFLAGS_x86)) - $(call CONFIG_LINE,LDFLAGS_x86:=$(LDFLAGS_x86)) + $(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) diff --git a/os/macosx/G5_detector.c b/os/macosx/G5_detector.c new file mode 100644 index 0000000000..b4831c772b --- /dev/null +++ b/os/macosx/G5_detector.c @@ -0,0 +1,29 @@ +/* $Id$ */ + +#include +#include +#include +#include +#include + + +#ifndef CPU_SUBTYPE_POWERPC_970 +#define CPU_SUBTYPE_POWERPC_970 ((cpu_subtype_t) 100) +#endif + +// this function is a lightly modified version of some code from Apple's developer homepage to detect G5 CPUs at runtime +main() +{ + host_basic_info_data_t hostInfo; + mach_msg_type_number_t infoCount; + boolean_t is_G5; + + infoCount = HOST_BASIC_INFO_COUNT; + host_info(mach_host_self(), HOST_BASIC_INFO, + (host_info_t)&hostInfo, &infoCount); + + is_G5 = ((hostInfo.cpu_type == CPU_TYPE_POWERPC) && + (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970)); + if (is_G5) + printf("1"); +} diff --git a/os/macosx/Makefile b/os/macosx/Makefile index 0cd98d27f7..0af7173927 100644 --- a/os/macosx/Makefile +++ b/os/macosx/Makefile @@ -2,31 +2,38 @@ # This makefile is not a standalone makefile, but is called from the general one # it contains targets specific to MacOS X -ifdef FAT_BINARY -FAT_BINARY:=build_universal_binary +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 + +%.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 + +%.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 endif -ifdef UNIVERSAL_x86_PART +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 endif -# building an universal binary -# since we can only compile for PPC or x86 at any one time, we compile one and then -# we make clean and compile the other one. In the end we use lipo to join them together -# when this is done, we can continue with the targets from the first run, which is build_OSX_bundle - -$(FAT_BINARY): $(TTD) - $(Q)mkdir -p temp_binary_dir - $(Q)cp $(TTD) temp_binary_dir/$(TTD)_a - $(Q)rm -rf $(TTD) $(OBJS) # delete all .o files so we can compile for a new endian - $(Q)make UNIVERSAL_x86_PART:=1 - $(Q)cp $(TTD) temp_binary_dir/$(TTD)_b - @echo '===> Joining the PPC and x86 binaries into one universal one' - $(Q)lipo temp_binary_dir/$(TTD)_a temp_binary_dir/$(TTD)_b -create -output $(TTD) - $(Q)rm -rf temp_binary_dir ifdef JAGUAR JAGUAR_POSTFIX := -jaguar @@ -35,7 +42,7 @@ endif # build the bundle. OSX wants to keep apps in bundles, so we will give it one # the good thing about bundles is that you can keep extra files in them, so we keep lng files and a data dir in it -$(BUILD_OSX_BUNDLE): $(TTD) $(FAT_BINARY) +$(BUILD_OSX_BUNDLE): $(TTD) @echo '===> Building application bundle' $(Q)rm -fr "$(OSXAPP)" $(Q)mkdir -p "$(OSXAPP)"/Contents/MacOS @@ -71,4 +78,4 @@ release: all $(OSX): $(TTD) $(BUILD_OSX_BUNDLE) -.PHONY: release $(BUILD_OSX_BUNDLE) $(FAT_BINARY) +.PHONY: release $(BUILD_OSX_BUNDLE) $(UNIVERSAL_BINARY) diff --git a/os/macosx/Makefile.setup b/os/macosx/Makefile.setup index c33c877e5d..95b346ab3a 100644 --- a/os/macosx/Makefile.setup +++ b/os/macosx/Makefile.setup @@ -11,12 +11,29 @@ endif endif ifdef RELEASE -ifndef FAT_BINARY +ifndef UNIVERSAL_BINARY $(warning Compiling a release build, that is not a universal binary) endif endif -ifdef FAT_BINARY +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) +endif +UNIVERSAL_BINARY:=1 +endif + +ifndef UNIVERSAL_BINARY +ifndef JAGUAR +ifeq ($(shell uname), Darwin) +# it's a hardware mac, not crosscompiling +$(shell $(CC) os/macosx/G5_detector.c -o os/macosx/G5_detector) +IS_G5:=$(shell os/macosx/G5_detector) +endif +endif +endif + +ifdef UNIVERSAL_BINARY ifndef STATIC $(warning Compiling a universal binary, that is not static. Adding static flag) STATIC:=1 @@ -30,83 +47,36 @@ endif endif # setup flags if none are defined -ifndef CFLAGS_PPC - CFLAGS_PPC:= -isysroot /Developer/SDKs/MacOSX10.2.8.sdk +ifndef CFLAGS_JAGUAR + CFLAGS_JAGUAR:= -isysroot /Developer/SDKs/MacOSX10.2.8.sdk endif -ifndef LDFLAGS_PPC - LDFLAGS_PPC:= -Wl,-syslibroot,/Developer/SDKs/MacOSX10.2.8.sdk +ifndef LDFLAGS_JAGUAR + LDFLAGS_JAGUAR:= -Wl,-syslibroot,/Developer/SDKs/MacOSX10.2.8.sdk endif -ifndef PPC_CC - PPC_CC:=powerpc-apple-darwin8-gcc-4.0.0 + +ifndef CFLAGS_UNIVERSAL + CFLAGS_UNIVERSAL:= -isysroot /Developer/SDKs/MacOSX10.4u.sdk endif -ifndef CFLAGS_x86 - CFLAGS_x86:= -isysroot /Developer/SDKs/MacOSX10.4u.sdk -endif -ifndef LDFLAGS_x86 - LDFLAGS_x86:= -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -endif -ifndef x86_CC - x86_CC:=i686-apple-darwin8-gcc-4.0.0 -endif -ifdef WITH_PNG - ifndef LIBPNG_PPC_CONFIG - LIBPNG_PPC_CONFIG:=$(LIBPNG-CONFIG) - endif - ifndef LIBPNG_x86_CONFIG - LIBPNG_x86_CONFIG:=$(LIBPNG-CONFIG) - endif -endif -ifdef WITH_SDL - ifndef SDL_PPC_CONFIG - SDL_PPC_CONFIG:=$(SDL-CONFIG) - endif - ifndef SDL_x86_CONFIG - SDL_x86_CONFIG:=$(SDL-CONFIG) - endif - ifndef x86_SDL_LIB - x86_SDL_LIB:=$(shell echo "`$(SDL_x86_CONFIG) --prefix`/lib/libSDL-1.2.0.dylib") - endif +ifndef LDFLAGS_UNIVERSAL + LDFLAGS_UNIVERSAL:= -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk endif ifdef JAGUAR - LIBPNG-CONFIG:=$(LIBPNG_PPC_CONFIG) - SDL-CONFIG:=$(SDL_PPC_CONFIG) - CC_TARGET:=$(PPC_CC) - CFLAGS:= $(CFLAGS_PPC) -arch ppc - LDFLAGS:= $(LDFLAGS_PPC) + CFLAGS:= $(CFLAGS_JAGUAR) -arch ppc + LDFLAGS:= $(LDFLAGS_JAGUAR) endif -ifdef FAT_BINARY - # set up config files - ifndef SKIP_LIB_TEST - ifdef WITH_PNG - TEST:=$(shell lipo -info `$(LIBPNG_PPC_CONFIG) --prefix`/lib/libpng.a | xargs -n 1 | grep "ppc")) - ifndef TEST -$(error no PPC libpng found) - endif - TEST:=$(shell lipo -info `$(LIBPNG_x86_CONFIG) --prefix`/lib/libpng.a | xargs -n 1 | grep "i386")) - ifndef TEST -$(error no x86 libpng found) - endif - endif - endif +ifndef G5_FLAGS +G5_FLAGS := -mtune=970 -mcpu=970 -mpowerpc-gpopt +endif - ifdef UNIVERSAL_x86_PART - LIBPNG-CONFIG:=$(LIBPNG_x86_CONFIG) - SDL-CONFIG:=$(SDL_x86_CONFIG) - CC_TARGET:=$(x86_CC) - # clear the cached list of PPC libs - LIBS:= - OBJS:= - CFLAGS:= $(CFLAGS_x86) -arch i386 - LDFLAGS:= $(LDFLAGS_x86) - else - LIBPNG-CONFIG:=$(LIBPNG_PPC_CONFIG) - SDL-CONFIG:=$(SDL_PPC_CONFIG) - CC_TARGET:=$(PPC_CC) - CFLAGS:= $(CFLAGS_PPC) -arch ppc - LDFLAGS:= $(LDFLAGS_PPC) - 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 +endif endif # setting up flags to make a binary, that fits the system it builds on