1
0
Fork 0

(svn r3882) -Codechange: [OSX] changed the way universal and tripple binaries are build

Instead of compiling a binary for each arch and then join them in the end, each .o file is now compiled as a fat file
	This means that the makefile will not call itself to make a binary for each target and we don't have to make clean between each build
	it also means that if one file changed, we don't have to recompile all files
	Another benefit is since it's handled at .o level and though LDFLAGS, no special code is needed if we decide to compile more binaries (like a lot of stuff used to happen at post linking)
	We also needs much less flags to set up, so it should be even easier to get to work out of the box now
	The tradeoff in doing so is that now the binary needs at least OSX 10.3.9 to execute
	To deal with this issue, the JAGUAR flag can be used to compile for older OSes. We will release a binary for old OSes at next release to see if anybody even downloads it (not that many people use OSX 10.2 anymore)
	GPMI will not work on 10.2 anyway so we will cut support for it some day anyway
release/0.5
bjarni 2006-03-15 14:03:09 +00:00
parent 4689031f19
commit bb47ecddf4
4 changed files with 60 additions and 119 deletions

View File

@ -130,7 +130,7 @@
# Makefile version tag # Makefile version tag
# it checks if the version tag in Makefile.config is the same and force update outdated config files # 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 has to be found even for manual configuration
CONFIG_WRITER=makefiledir/Makefile.config_writer CONFIG_WRITER=makefiledir/Makefile.config_writer
@ -346,7 +346,9 @@ ifdef OSX
# these compilerflags makes the app run as fast as possible without making the app unstable. It works on G3 or newer # 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 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 ifdef IS_G5
BASECFLAGS += -mtune=970 -mcpu=970 -mpowerpc-gpopt ifndef UNIVERSAL_BINARY
BASECFLAGS += $(G5_FLAGS)
endif
endif endif
else else
ifdef MORPHOS ifdef MORPHOS
@ -995,17 +997,21 @@ endif
$(Q)$(CC) $(OBJCFLAGS) $(CDEFS) -MM $< | sed 's#^$(@F:%.d=%.o):#$@ $(@:.deps/%.d=%.o):#' > $@ $(Q)$(CC) $(OBJCFLAGS) $(CDEFS) -MM $< | sed 's#^$(@F:%.d=%.o):#$@ $(@:.deps/%.d=%.o):#' > $@
ifndef TRIPPLE_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) %.o: %.c $(MAKE_CONFIG)
@echo '===> Compiling $<' @echo '===> Compiling $<'
$(Q)$(CC) $(CFLAGS) $(CDEFS) -c -o $@ $< $(Q)$(CC) $(TARGET_CPU_FLAGS) $(CFLAGS) $(CDEFS) -c -o $@ $<
%.o: %.cpp $(MAKE_CONFIG) %.o: %.cpp $(MAKE_CONFIG)
@echo '===> Compiling $<' @echo '===> Compiling $<'
$(Q)$(CXX) $(CFLAGS) $(CDEFS) -c -o $@ $< $(Q)$(CXX) $(TARGET_CPU_FLAGS) $(CFLAGS) $(CDEFS) -c -o $@ $<
%.o: %.m $(MAKE_CONFIG) %.o: %.m $(MAKE_CONFIG)
@echo '===> Compiling $<' @echo '===> Compiling $<'
$(Q)$(CC) $(CFLAGS) $(CDEFS) -c -o $@ $< $(Q)$(CC) $(TARGET_CPU_FLAGS) $(CFLAGS) $(CDEFS) -c -o $@ $<
endif
%.o: %.rc %.o: %.rc
@echo '===> Compiling resource $<' @echo '===> Compiling resource $<'

View File

@ -85,25 +85,13 @@ $(MAKE_CONFIG):
$(call CONFIG_LINE,\# Universal binary setup) $(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,\# 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,CFLAGS_UNIVERSAL:=$(CFLAGS_UNIVERSAL))
$(call CONFIG_LINE,SDL_x86_CONFIG:=$(SDL_x86_CONFIG)) $(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,CFLAGS_JAGUAR:=$(CFLAGS_JAGUAR))
$(call CONFIG_LINE,LIBPNG_PPC_CONFIG:=$(LIBPNG_PPC_CONFIG)) $(call CONFIG_LINE,LDFLAGS_JAGUAR:=$(LDFLAGS_JAGUAR))
$(call CONFIG_LINE,LIBPNG_x86_CONFIG:=$(LIBPNG_x86_CONFIG)) $(call CONFIG_LINE,)
$(call CONFIG_LINE,G5_FLAGS:=$(G5_FLAGS))
$(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,) $(call CONFIG_LINE,)
$(call CONFIG_LINE,\# For cross-compiling) $(call CONFIG_LINE,\# For cross-compiling)

View File

@ -2,11 +2,29 @@
# This makefile is not a standalone makefile, but is called from the general one # This makefile is not a standalone makefile, but is called from the general one
# it contains targets specific to MacOS X # it contains targets specific to MacOS X
ifdef UNIVERSAL_BINARY
ifdef TRIPPLE_BINARY ifdef TRIPPLE_BINARY
TRIPPLE_BINARY:=tripple_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
endif # we can get rid of this. Xcode supports arch dependant flags, but we can't do it in the makefile (yet?)
UNIVERSAL_BINARY:=build_universal_binary %.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 endif
ifdef UNIVERSAL_PPC_PART ifdef UNIVERSAL_PPC_PART
@ -16,31 +34,6 @@ else
BUILD_OSX_BUNDLE:=build_OSX_bundle BUILD_OSX_BUNDLE:=build_OSX_bundle
endif 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
$(UNIVERSAL_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 CPU
$(Q)make UNIVERSAL_PPC_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
$(TRIPPLE_BINARY): $(UNIVERSAL_BINARY)
$(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 CPU
$(Q)make UNIVERSAL_PPC_PART:=1 IS_G5:=1
$(Q)cp $(TTD) temp_binary_dir/$(TTD)_b
@echo '===> Joining the Universal and G5 binaries into a tripple binary'
$(Q)lipo temp_binary_dir/$(TTD)_a temp_binary_dir/$(TTD)_b -create -output $(TTD)
$(Q)rm -rf temp_binary_dir
# build the bundle. OSX wants to keep apps in bundles, so we will give it one # 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 # 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

View File

@ -47,80 +47,34 @@ endif
endif endif
# setup flags if none are defined # setup flags if none are defined
ifndef CFLAGS_PPC ifndef CFLAGS_JAGUAR
CFLAGS_PPC:= -isysroot /Developer/SDKs/MacOSX10.2.8.sdk CFLAGS_JAGUAR:= -isysroot /Developer/SDKs/MacOSX10.2.8.sdk
endif endif
ifndef LDFLAGS_PPC ifndef LDFLAGS_JAGUAR
LDFLAGS_PPC:= -Wl,-syslibroot,/Developer/SDKs/MacOSX10.2.8.sdk LDFLAGS_JAGUAR:= -Wl,-syslibroot,/Developer/SDKs/MacOSX10.2.8.sdk
endif endif
ifndef PPC_CC
PPC_CC:=$(shell ls /usr/bin/powerpc-apple-darwin*-gcc* | tail -n 1) ifndef CFLAGS_UNIVERSAL
CFLAGS_UNIVERSAL:= -isysroot /Developer/SDKs/MacOSX10.4u.sdk
endif endif
ifndef CFLAGS_x86 ifndef LDFLAGS_UNIVERSAL
CFLAGS_x86:= -isysroot /Developer/SDKs/MacOSX10.4u.sdk LDFLAGS_UNIVERSAL:= -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk
endif
ifndef LDFLAGS_x86
LDFLAGS_x86:= -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk
endif
ifndef x86_CC
x86_CC:=$(shell ls /usr/bin/i686-apple-darwin*-gcc* | tail -n 1)
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
endif endif
ifdef JAGUAR ifdef JAGUAR
LIBPNG-CONFIG:=$(LIBPNG_PPC_CONFIG) CFLAGS:= $(CFLAGS_JAGUAR) -arch ppc
SDL-CONFIG:=$(SDL_PPC_CONFIG) LDFLAGS:= $(LDFLAGS_JAGUAR)
CC_TARGET:=$(PPC_CC) endif
CFLAGS:= $(CFLAGS_PPC) -arch ppc
LDFLAGS:= $(LDFLAGS_PPC) ifndef G5_FLAGS
G5_FLAGS := -mtune=970 -mcpu=970 -mpowerpc-gpopt
endif endif
ifdef UNIVERSAL_BINARY ifdef UNIVERSAL_BINARY
# set up config files TARGET_CPU_FLAGS:= -arch ppc -arch i386
ifndef SKIP_LIB_TEST LDFLAGS := $(LDFLAGS_UNIVERSAL) -arch ppc -arch i386
ifdef WITH_PNG CFLAGS += $(CFLAGS_UNIVERSAL)
TEST:=$(shell lipo -info `$(LIBPNG_PPC_CONFIG) --prefix`/lib/libpng.a | xargs -n 1 | grep "ppc")) ifdef TRIPPLE_BINARY
ifndef TEST LDFLAGS += -arch ppc970
$(error no PPC libpng found) endif
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
LIBS:=
OBJS:=
ifdef UNIVERSAL_PPC_PART
LIBPNG-CONFIG:=$(LIBPNG_PPC_CONFIG)
SDL-CONFIG:=$(SDL_PPC_CONFIG)
CC_TARGET:=$(PPC_CC)
CFLAGS:= $(CFLAGS_PPC) -arch ppc
LDFLAGS:= $(LDFLAGS_PPC)
else
LIBPNG-CONFIG:=$(LIBPNG_x86_CONFIG)
SDL-CONFIG:=$(SDL_x86_CONFIG)
CC_TARGET:=$(x86_CC)
# clear the cached list of PPC libs
CFLAGS:= $(CFLAGS_x86) -arch i386
LDFLAGS:= $(LDFLAGS_x86)
endif
endif endif