Makefile   [plain text]


# Simple makefile for building CoreFoundation on Darwin
#
# These make variables (or environment variables) are used
# if defined:
#	SRCROOT		path location of root of source hierarchy;
#			defaults to ".", but must be set to a
#			destination path for installsrc target.
#	OBJROOT		path location where .o files will be put;
#			defaults to "/tmp/CoreFoundation.obj".
#	SYMROOT		path location where build products will be
#			put; defaults to "/tmp/CoreFoundation.sym".
#	DSTROOT		path location where installed products will
#			be put; defaults to "/tmp/CoreFoundation.dst".
# OBJROOT and SYMROOT should not be directories shared with other
# built projects, and should not be the same directory.
#	PLATFORM	name of platform being built on
#	USER		name of user building the project
#	ARCHS		list of archs for which to build
#	RC_ARCHS	more archs for which to build (build system)
#	OTHER_CFLAGS	other flags to be passed to compiler
#	RC_CFLAGS	more flags to be passed to compiler (build system)
#	OTHER_LFLAGS	other flags to be passed to the link stage
#

CURRENT_PROJECT_VERSION = 299.3

# First figure out the platform if not specified, so we can use it in the
# rest of this file.  Currently defined values: Darwin, Linux, FreeBSD, WIN32
ifeq "$(PLATFORM)" ""
PLATFORM := $(shell uname)
endif

ifeq "$(PLATFORM)" "Darwin"
PLATFORM_CFLAGS = -D__MACH__=1 -fconstant-cfstrings
endif

ifeq "$(PLATFORM)" "Linux"
PLATFORM_CFLAGS = -D__LINUX__=1
endif

ifeq "$(PLATFORM)" "FreeBSD"
PLATFORM_CFLAGS = -D__FREEBSD__=1
endif

ifeq "$(PLATFORM)" "WIN32"
PLATFORM_CFLAGS = -D__WIN32__=1
OBJROOT = CoreFoundation.obj
SYMROOT = CoreFoundation.sym
DSTROOT = CoreFoundation.dst
endif

ifndef SRCROOT
SRCROOT = .
endif

ifndef OBJROOT
OBJROOT = /tmp/CoreFoundation.obj
endif

ifndef SYMROOT
SYMROOT = /tmp/CoreFoundation.sym
endif

ifndef DSTROOT
DSTROOT = /tmp/CoreFoundation.dst
endif

SILENT = @
ifeq "$(PLATFORM)" "WIN32"
CC = gcc
ECHO = echo
MKDIRS = mkdir -p
COPY = cp
COPY_RECUR = cp -r
REMOVE = rm
REMOVE_RECUR = rm -rf
SYMLINK = ln -s
CHMOD = chmod
CHOWN = chown
TAR = tar
STRIP = strip
DLLTOOL = dlltool
else
ifeq "$(PLATFORM)" "Darwin"
CC = /usr/bin/cc
else
CC = /usr/bin/gcc
endif
ECHO = /bin/echo
MKDIRS = /bin/mkdir -p
COPY = /bin/cp
COPY_RECUR = /bin/cp -r
REMOVE = /bin/rm
REMOVE_RECUR = /bin/rm -rf
SYMLINK = /bin/ln -s
CHMOD = /bin/chmod
CHOWN = /usr/sbin/chown
TAR = /usr/bin/tar
STRIP = /usr/bin/strip
endif

ifeq "$(PLATFORM)" "Darwin"
WARNING_FLAGS = -Wno-precomp -Wno-four-char-constants
endif

ifeq "$(PLATFORM)" "Darwin"
ifneq "$(ARCHS)" ""
ARCH_FLAGS = $(foreach A, $(ARCHS), $(addprefix -arch , $(A)))
else
ifneq "$(RC_ARCHS)" ""
ARCH_FLAGS = $(foreach A, $(RC_ARCHS), $(addprefix -arch , $(A)))
else
ARCH_FLAGS = -arch ppc
endif
endif
endif

ifeq "$(PLATFORM)" "FreeBSD"
ARCH_FLAGS = -march=i386
endif

ifeq "$(PLATFORM)" "Linux"
ARCH_FLAGS = 
endif

ifeq "$(USER)" ""
USER = unknown
endif

CFLAGS = -DCF_BUILDING_CF=1 -g -fno-common -pipe $(PLATFORM_CFLAGS) \
	$(WARNING_FLAGS) -I$(SYMROOT)/ProjectHeaders -I.

ifeq "$(PLATFORM)" "WIN32"
LFLAGS = -lmsvcrt -lnetapi32 -lobjc -lole32 -lws2_32
else
LFLAGS =
endif

ifeq "$(wildcard /System/Library/Frameworks)" ""
LIBRARY_STYLE = Library
LIBRARY_EXT = .so
ifeq "$(PLATFORM)" "Linux"
LIBRARY_EXT = .a
endif
ifeq "$(PLATFORM)" "WIN32"
LIBRARY_EXT = .dll
endif
HEADER_INSTALLDIR = /usr/local/include/CoreFoundation
INSTALLDIR = /usr/local/lib
CHARACTERSETS_INSTALLDIR = /usr/local/share/CoreFoundation
else
LIBRARY_STYLE = Framework
INSTALLDIR = /System/Library/Frameworks
FRAMEWORK_DIR = /System/Library/Frameworks/CoreFoundation.framework
CHARACTERSETS_INSTALLDIR = /System/Library/CoreServices
endif

ifeq "$(PLATFORM)" "Darwin"
CFLAGS += $(ARCH_FLAGS) -F$(SYMROOT)
LFLAGS += $(ARCH_FLAGS) -dynamiclib -dynamic -compatibility_version 150 \
	-current_version $(CURRENT_PROJECT_VERSION) -Wl,-init,___CFInitialize
endif

ifeq "$(PLATFORM)" "FreeBSD"
LFLAGS += -shared
endif

ifeq "$(PLATFORM)" "Linux"
LFLAGS += -lpthread
endif

CFLAGS += $(OTHER_CFLAGS) $(RC_CFLAGS)
LFLAGS += $(OTHER_LFLAGS)


SUBPROJECTS = AppServices Base Collections Locale NumberDate Parsing PlugIn \
		RunLoop String StringEncodings URL

AppServices_PUBHEADERS = CFUserNotification.h
AppServices_SOURCES = CFUserNotification.c
Base_PROJHEADERS = CFPriv.h CFInternal.h ForFoundationOnly.h CFRuntime.h \
		CFUtilities.h
Base_PUBHEADERS = CFBase.h CFByteOrder.h CoreFoundation.h CFUUID.h
Base_SOURCES = CFBase.c CFUtilities.c CFSortFunctions.c \
		CFRuntime.c CFFileUtilities.c CFPlatform.c CFUUID.c uuid.c
Collections_PROJHEADERS = CFStorage.h
Collections_PUBHEADERS = CFArray.h CFBag.h CFBinaryHeap.h CFBitVector.h \
		CFData.h CFDictionary.h CFSet.h CFTree.h
Collections_SOURCES = CFArray.c CFBag.c CFBinaryHeap.c CFBitVector.c \
		CFData.c CFDictionary.c CFSet.c CFStorage.c CFTree.c
Locale_PUBHEADERS = CFLocale.h
NumberDate_PROJHEADERS = 
NumberDate_PUBHEADERS = CFDate.h CFNumber.h CFTimeZone.h 
NumberDate_SOURCES = CFDate.c CFNumber.c CFTimeZone.c
Parsing_PROJHEADERS = CFXMLInputStream.h
Parsing_PUBHEADERS = CFPropertyList.h CFXMLParser.h CFXMLNode.h
Parsing_SOURCES = CFBinaryPList.c CFPropertyList.c CFXMLParser.c \
		CFXMLInputStream.c CFXMLNode.c CFXMLTree.c
PlugIn_PROJHEADERS = CFBundlePriv.h CFBundle_BinaryTypes.h CFBundle_Internal.h \
		CFPlugIn_Factory.h
PlugIn_PUBHEADERS = CFBundle.h CFPlugIn.h CFPlugInCOM.h
PlugIn_SOURCES = CFBundle.c CFBundle_Resources.c CFPlugIn.c CFPlugIn_Factory.c \
		CFPlugIn_Instance.c CFPlugIn_PlugIn.c
ifeq "$(PLATFORM)" "Darwin"
RunLoop_PROJHEADERS = CFWindowsMessageQueue.h
RunLoop_PUBHEADERS = CFRunLoop.h CFSocket.h CFMachPort.h CFMessagePort.h
RunLoop_SOURCES = CFMachPort.c CFMessagePort.c CFRunLoop.c CFSocket.c \
		CFWindowsMessageQueue.c 
endif
ifeq "$(PLATFORM)" "WIN32"
RunLoop_PROJHEADERS =
RunLoop_PUBHEADERS = CFRunLoop.h CFMachPort.h CFMessagePort.h
RunLoop_SOURCES = CFMachPort.c CFMessagePort.c CFRunLoop.c
endif
String_PROJHEADERS = CFCharacterSetPriv.h
String_PUBHEADERS = CFCharacterSet.h CFString.h
String_SOURCES = CFCharacterSet.c CFString.c CFStringEncodings.c \
		CFStringScanner.c CFStringUtilities.c
StringEncodings_PROJHEADERS = CFStringEncodingConverter.h CFUniChar.h \
		CFStringEncodingConverterExt.h CFUniCharPriv.h \
		CFStringEncodingConverterPriv.h CFUnicodeDecomposition.h \
		CFUnicodePrecomposition.h
StringEncodings_PUBHEADERS = 
StringEncodings_SOURCES = CFStringEncodingConverter.c CFBuiltinConverters.c \
		CFUnicodeDecomposition.c CFUnicodePrecomposition.c CFUniChar.c
URL_PROJHEADERS = 
URL_PUBHEADERS = CFURL.h CFURLAccess.h
URL_SOURCES = CFURL.c CFURLAccess.c

OTHER_SOURCES = version.c Makefile APPLE_LICENSE PropertyList.dtd

default: build
all: build
build: prebuild actual-build postbuild

# These are the main targets:
#    build		builds the library to OBJROOT and SYMROOT
#    installsrc		copies the sources to SRCROOT
#    installhdrs	install only the headers to DSTROOT
#    install		build, then install the headers and library to DSTROOT
#    clean		removes build products in OBJROOT and SYMROOT

installsrc:
	$(SILENT) $(ECHO) "Installing source..."
ifeq "$(SRCROOT)" "."
	$(SILENT) $(ECHO) "SRCROOT must be defined to be the destination directory; it cannot be '.'"
	exit 1
endif
	$(SILENT) $(MKDIRS) $(SRCROOT)
	$(SILENT) $(MKDIRS) $(foreach S, $(SUBPROJECTS), $(SRCROOT)/$(S).subproj)
	-$(SILENT) $(foreach S, $(SUBPROJECTS), $(COPY) $(foreach F, $($(S)_SOURCES), $(S).subproj/$(F)) $(SRCROOT)/$(S).subproj;)
	-$(SILENT) $(foreach S, $(SUBPROJECTS), $(COPY) $(foreach F, $($(S)_PROJHEADERS), $(S).subproj/$(F)) $(SRCROOT)/$(S).subproj;)
	-$(SILENT) $(foreach S, $(SUBPROJECTS), $(COPY) $(foreach F, $($(S)_PUBHEADERS), $(S).subproj/$(F)) $(SRCROOT)/$(S).subproj;)
	$(SILENT) $(COPY) $(OTHER_SOURCES) $(SRCROOT)
	$(SILENT) $(COPY_RECUR) CharacterSets $(SRCROOT)
	$(SILENT) $(REMOVE_RECUR) $(SRCROOT)/CharacterSets/CVS

installhdrs:
	$(SILENT) $(ECHO) "Installing headers..."
ifeq "$(LIBRARY_STYLE)" "Framework"
	$(SILENT) $(REMOVE) -f $(DSTROOT)/$(FRAMEWORK_DIR)/Headers
	$(SILENT) $(REMOVE) -f $(DSTROOT)/$(FRAMEWORK_DIR)/PrivateHeaders
	$(SILENT) $(REMOVE) -f $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/Current
	$(SILENT) $(MKDIRS) $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/Headers
	$(SILENT) $(MKDIRS) $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/PrivateHeaders
	$(SILENT) $(SYMLINK) A $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/Current
	$(SILENT) $(SYMLINK) Versions/Current/Headers $(DSTROOT)/$(FRAMEWORK_DIR)/Headers
	$(SILENT) $(SYMLINK) Versions/Current/PrivateHeaders $(DSTROOT)/$(FRAMEWORK_DIR)/PrivateHeaders
	-$(SILENT) $(CHMOD) +w $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/Headers/*.h
	-$(SILENT) $(CHMOD) +w $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/PrivateHeaders/*.h
	$(SILENT) $(COPY) $(foreach S, $(SUBPROJECTS), $(foreach F, $($(S)_PUBHEADERS), $(SRCROOT)/$(S).subproj/$(F))) $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/Headers
	$(SILENT) $(COPY) Base.subproj/CFPriv.h Base.subproj/CFRuntime.h $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/PrivateHeaders
	$(SILENT) $(CHOWN) -R root:wheel $(DSTROOT)/$(FRAMEWORK_DIR)
	-$(SILENT) $(CHMOD) -w $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/Headers/*.h
	-$(SILENT) $(CHMOD) -w $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/PrivateHeaders/*.h
endif
ifeq "$(LIBRARY_STYLE)" "Library"
	$(SILENT) $(MKDIRS) $(DSTROOT)/$(HEADER_INSTALLDIR)
	-$(SILENT) $(CHMOD) +w $(DSTROOT)/$(HEADER_INSTALLDIR)/*.h
	$(SILENT) $(COPY) $(foreach S, $(SUBPROJECTS), $(foreach F, $($(S)_PUBHEADERS), $(SRCROOT)/$(S).subproj/$(F))) $(DSTROOT)/$(HEADER_INSTALLDIR)
	$(SILENT) $(CHMOD) -w $(DSTROOT)/$(HEADER_INSTALLDIR)/*.h
endif

install: build
	$(SILENT) $(ECHO) "Installing..."
ifeq "$(LIBRARY_STYLE)" "Framework"
	$(SILENT) $(MKDIRS) $(DSTROOT)/$(FRAMEWORK_DIR)
	-$(SILENT) $(CHMOD) -R +w $(DSTROOT)/$(FRAMEWORK_DIR)
	$(SILENT) $(REMOVE_RECUR) $(DSTROOT)/$(FRAMEWORK_DIR)
	$(SILENT) (cd $(SYMROOT) && $(TAR) -cf - CoreFoundation.framework) | (cd $(DSTROOT)/$(INSTALLDIR) && $(TAR) -xf -)
	$(SILENT) $(STRIP) -S $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/CoreFoundation
	$(SILENT) $(STRIP) -S $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/CoreFoundation_debug
	$(SILENT) $(STRIP) -S $(DSTROOT)/$(FRAMEWORK_DIR)/Versions/A/CoreFoundation_profile
	$(SILENT) $(CHMOD) -R ugo-w $(DSTROOT)/$(FRAMEWORK_DIR)
	$(SILENT) $(CHMOD) -R o+rX $(DSTROOT)/$(FRAMEWORK_DIR)
	$(SILENT) $(CHOWN) -R root:wheel $(DSTROOT)/$(FRAMEWORK_DIR)
endif
ifeq "$(LIBRARY_STYLE)" "Library"
	$(SILENT) $(MKDIRS) $(DSTROOT)/$(INSTALLDIR)
	-$(SILENT) $(CHMOD) +w $(DSTROOT)/$(INSTALLDIR)
	$(SILENT) $(REMOVE) -f $(DSTROOT)/$(INSTALLDIR)/libCoreFoundation$(LIBRARY_EXT)
	$(SILENT) $(REMOVE) -f $(DSTROOT)/$(INSTALLDIR)/libCoreFoundation_debug$(LIBRARY_EXT)
	$(SILENT) $(REMOVE) -f $(DSTROOT)/$(INSTALLDIR)/libCoreFoundation_profile$(LIBRARY_EXT)
	$(SILENT) $(COPY) $(SYMROOT)/libCoreFoundation$(LIBRARY_EXT) $(DSTROOT)/$(INSTALLDIR)/libCoreFoundation$(LIBRARY_EXT)
ifneq "$(LIBRARY_EXT)" ".a"
	$(SILENT) $(COPY) $(SYMROOT)/libCoreFoundation_debug$(LIBRARY_EXT) $(DSTROOT)/$(INSTALLDIR)/libCoreFoundation_debug$(LIBRARY_EXT)
	$(SILENT) $(COPY) $(SYMROOT)/libCoreFoundation_profile$(LIBRARY_EXT) $(DSTROOT)/$(INSTALLDIR)/libCoreFoundation_profile$(LIBRARY_EXT)
endif
	-$(SILENT) $(CHOWN) root:wheel $(DSTROOT)/$(INSTALLDIR)/libCoreFoundation$(LIBRARY_EXT)
	-$(SILENT) $(CHOWN) root:wheel $(DSTROOT)/$(INSTALLDIR)/libCoreFoundation_debug$(LIBRARY_EXT)
	-$(SILENT) $(CHOWN) root:wheel $(DSTROOT)/$(INSTALLDIR)/libCoreFoundation_profile$(LIBRARY_EXT)
	$(SILENT) $(CHMOD) 755 $(DSTROOT)/$(INSTALLDIR)/libCoreFoundation$(LIBRARY_EXT)
ifneq "$(LIBRARY_EXT)" ".a"
	$(SILENT) $(CHMOD) 755 $(DSTROOT)/$(INSTALLDIR)/libCoreFoundation_debug$(LIBRARY_EXT)
	$(SILENT) $(CHMOD) 755 $(DSTROOT)/$(INSTALLDIR)/libCoreFoundation_profile$(LIBRARY_EXT)
endif
	$(SILENT) $(MKDIRS) $(DSTROOT)/$(HEADER_INSTALLDIR)
	-$(SILENT) $(CHMOD) +w $(DSTROOT)/$(HEADER_INSTALLDIR)/*.h
	$(SILENT) $(COPY) $(foreach S, $(SUBPROJECTS), $(foreach F, $($(S)_PUBHEADERS), $(SRCROOT)/$(S).subproj/$(F))) $(DSTROOT)/$(HEADER_INSTALLDIR)
	$(SILENT) $(CHMOD) -w $(DSTROOT)/$(HEADER_INSTALLDIR)/*.h
endif
	$(SILENT) $(MKDIRS) $(DSTROOT)/$(CHARACTERSETS_INSTALLDIR)
	-$(SILENT) $(CHMOD) 755 $(DSTROOT)/$(CHARACTERSETS_INSTALLDIR)
	$(SILENT) $(MKDIRS) $(DSTROOT)/$(CHARACTERSETS_INSTALLDIR)/CharacterSets
	-$(SILENT) $(CHMOD) -R +w $(DSTROOT)/$(CHARACTERSETS_INSTALLDIR)/CharacterSets
	$(SILENT) $(REMOVE_RECUR) $(DSTROOT)/$(CHARACTERSETS_INSTALLDIR)/CharacterSets
	$(SILENT) $(COPY_RECUR) $(SRCROOT)/CharacterSets $(DSTROOT)/$(CHARACTERSETS_INSTALLDIR)
	$(SILENT) $(REMOVE_RECUR) $(DSTROOT)/$(CHARACTERSETS_INSTALLDIR)/CharacterSets/CVS
	$(SILENT) $(CHOWN) -R root:wheel $(DSTROOT)/$(CHARACTERSETS_INSTALLDIR)/CharacterSets
	$(SILENT) $(CHMOD) 444 $(DSTROOT)/$(CHARACTERSETS_INSTALLDIR)/CharacterSets/*
	$(SILENT) $(CHMOD) 755 $(DSTROOT)/$(CHARACTERSETS_INSTALLDIR)/CharacterSets

clean:
	$(SILENT) $(ECHO) "Deleting build products..."
	$(SILENT) $(REMOVE_RECUR) $(SYMROOT)/ProjectHeaders
ifeq "$(LIBRARY_STYLE)" "Framework"
	$(SILENT) $(REMOVE_RECUR) $(SYMROOT)/CoreFoundation.framework
endif
ifeq "$(LIBRARY_STYLE)" "Library"
	$(SILENT) $(REMOVE) -f $(SYMROOT)/libCoreFoundation$(LIBRARY_EXT)
	$(SILENT) $(REMOVE) -f $(SYMROOT)/libCoreFoundation_debug$(LIBRARY_EXT)
	$(SILENT) $(REMOVE) -f $(SYMROOT)/libCoreFoundation_profile$(LIBRARY_EXT)
endif
ifeq "$(PLATFORM)" "WIN32"
	$(SILENT) $(REMOVE) -f $(SYMROOT)/CoreFoundation*$(LIBRARY_EXT)
	$(SILENT) $(REMOVE) -f $(SYMROOT)/CoreFoundation*.lib
endif
	$(SILENT) $(REMOVE) -f $(OBJROOT)/*.o

prebuild:
	$(SILENT) $(ECHO) "Prebuild-setup..."
ifeq "$(LIBRARY_STYLE)" "Framework"
	$(SILENT) $(MKDIRS) $(SYMROOT)
	$(SILENT) $(REMOVE_RECUR) $(SYMROOT)/ProjectHeaders
	$(SILENT) $(MKDIRS) $(SYMROOT)/ProjectHeaders
#	$(SILENT) $(REMOVE_RECUR) $(SYMROOT)/CoreFoundation.framework
	$(SILENT) $(REMOVE) -f $(SYMROOT)/CoreFoundation.framework/Versions/Current
	$(SILENT) $(REMOVE) -f $(SYMROOT)/CoreFoundation.framework/Headers
	$(SILENT) $(REMOVE) -f $(SYMROOT)/CoreFoundation.framework/PrivateHeaders
	$(SILENT) $(REMOVE) -f $(SYMROOT)/CoreFoundation.framework/Resources
	$(SILENT) $(MKDIRS) $(SYMROOT)/CoreFoundation.framework/Versions/A/Headers
	$(SILENT) $(MKDIRS) $(SYMROOT)/CoreFoundation.framework/Versions/A/PrivateHeaders
	$(SILENT) $(MKDIRS) $(SYMROOT)/CoreFoundation.framework/Versions/A/Resources
	$(SILENT) $(SYMLINK) A $(SYMROOT)/CoreFoundation.framework/Versions/Current
	$(SILENT) $(SYMLINK) Versions/Current/Headers $(SYMROOT)/CoreFoundation.framework/Headers
	$(SILENT) $(SYMLINK) Versions/Current/PrivateHeaders $(SYMROOT)/CoreFoundation.framework/PrivateHeaders
	$(SILENT) $(SYMLINK) Versions/Current/Resources $(SYMROOT)/CoreFoundation.framework/Resources
	$(SILENT) $(ECHO) "Copying headers..."
	$(SILENT) $(COPY) $(foreach S, $(SUBPROJECTS), $(foreach F, $($(S)_PROJHEADERS), $(SRCROOT)/$(S).subproj/$(F))) $(SYMROOT)/ProjectHeaders
	$(SILENT) $(COPY) $(foreach S, $(SUBPROJECTS), $(foreach F, $($(S)_PUBHEADERS), $(SRCROOT)/$(S).subproj/$(F))) $(SYMROOT)/CoreFoundation.framework/Versions/A/Headers
	$(SILENT) $(COPY) Base.subproj/CFPriv.h Base.subproj/CFRuntime.h $(SYMROOT)/CoreFoundation.framework/Versions/A/PrivateHeaders
endif
ifeq "$(LIBRARY_STYLE)" "Library"
	$(SILENT) $(MKDIRS) $(SYMROOT)
	$(SILENT) $(REMOVE_RECUR) $(SYMROOT)/ProjectHeaders
	$(SILENT) $(MKDIRS) $(SYMROOT)/ProjectHeaders
	$(SILENT) $(ECHO) "Copying headers..."
	$(SILENT) $(COPY) $(foreach S, $(SUBPROJECTS), $(foreach F, $($(S)_PROJHEADERS), $(SRCROOT)/$(S).subproj/$(F))) $(SYMROOT)/ProjectHeaders
	$(SILENT) $(MKDIRS) $(SYMROOT)/ProjectHeaders/CoreFoundation
	$(SILENT) $(COPY) $(foreach S, $(SUBPROJECTS), $(foreach F, $($(S)_PUBHEADERS), $(SRCROOT)/$(S).subproj/$(F))) $(SYMROOT)/ProjectHeaders/CoreFoundation
endif

actual-build:
	$(SILENT) $(ECHO) "Building..."
	$(SILENT) $(MKDIRS) $(OBJROOT)
	$(SILENT) for x in $(foreach S, $(SUBPROJECTS), $(foreach F, $($(S)_SOURCES), $(SRCROOT)/$(S).subproj/$(F))) ; do \
		if [ ! $(OBJROOT)/`basename $$x .c`.opt.o -nt $$x ] ; then \
		$(ECHO) "    ..." $$x " (optimized)" ; \
		$(CC) $(CFLAGS) $$x -O -c -o $(OBJROOT)/`basename $$x .c`.opt.o ; \
		fi ; \
		if [ ! $(OBJROOT)/`basename $$x .c`.debug.o -nt $$x ] ; then \
		$(ECHO) "    ..." $$x " (debug)" ; \
		$(CC) $(CFLAGS) $$x -DDEBUG -c -o $(OBJROOT)/`basename $$x .c`.debug.o ; \
		fi ; \
		if [ ! $(OBJROOT)/`basename $$x .c`.profile.o -nt $$x ] ; then \
		$(ECHO) "    ..." $$x " (profile)" ; \
		$(CC) $(CFLAGS) $$x -DPROFILE -pg -O -c -o $(OBJROOT)/`basename $$x .c`.profile.o ; \
		fi \
	done
	$(SILENT) $(CC) $(CFLAGS) $(SRCROOT)/version.c -DVERSION=$(CURRENT_PROJECT_VERSION) -DUSER=$(USER) -O -c -o $(OBJROOT)/version.opt.o
	$(SILENT) $(CC) $(CFLAGS) $(SRCROOT)/version.c -DVERSION=$(CURRENT_PROJECT_VERSION) -DUSER=$(USER) -DDEBUG -c -o $(OBJROOT)/version.debug.o
	$(SILENT) $(CC) $(CFLAGS) $(SRCROOT)/version.c -DVERSION=$(CURRENT_PROJECT_VERSION) -DUSER=$(USER) -DPROFILE -pg -O -c -o $(OBJROOT)/version.profile.o
	$(SILENT) $(ECHO) "Linking..."
ifeq "$(PLATFORM)" "Darwin"
	$(SILENT) $(CC) $(LFLAGS) -O -install_name $(FRAMEWORK_DIR)/Versions/A/CoreFoundation -o $(SYMROOT)/CoreFoundation.framework/Versions/A/CoreFoundation $(OBJROOT)/*.opt.o
	$(SILENT) $(CC) $(LFLAGS) -install_name $(FRAMEWORK_DIR)/Versions/A/CoreFoundation_debug -o $(SYMROOT)/CoreFoundation.framework/Versions/A/CoreFoundation_debug $(OBJROOT)/*.debug.o
	$(SILENT) $(CC) $(LFLAGS) -pg -O -install_name $(FRAMEWORK_DIR)/Versions/A/CoreFoundation_profile -o $(SYMROOT)/CoreFoundation.framework/Versions/A/CoreFoundation_profile $(OBJROOT)/*.profile.o
endif
ifeq "$(PLATFORM)" "Linux"
	$(SILENT) $(ECHO) "NOTE: Producing static libraries on Linux"
	$(SILENT) ar cr $(SYMROOT)/libCoreFoundation$(LIBRARY_EXT) $(OBJROOT)/*.opt.o
	$(SILENT) ar cr $(SYMROOT)/libCoreFoundation_debug$(LIBRARY_EXT) $(OBJROOT)/*.debug.o
	$(SILENT) ar cr $(SYMROOT)/libCoreFoundation_profile$(LIBRARY_EXT) $(OBJROOT)/*.profile.o
endif
ifeq "$(PLATFORM)" "FreeBSD"
	$(SILENT) $(CC) $(LFLAGS) -O -o $(SYMROOT)/libCoreFoundation$(LIBRARY_EXT) (OBJROOT)/*.opt.o
	$(SILENT) $(CC) $(LFLAGS) -o $(SYMROOT)/libCoreFoundation_debug$(LIBRARY_EXT) (OBJROOT)/*.debug.o
	$(SILENT) $(CC) $(LFLAGS) -pg -O -o $(SYMROOT)/libCoreFoundation_profile$(LIBRARY_EXT) (OBJROOT)/*.profile.o
endif
ifeq "$(PLATFORM)" "WIN32"
	$(SILENT) $(DLLTOOL) -e CoreFoundation -l CoreFoundation.lib $(OBJROOT)/*.opt.o
	$(SILENT) $(CC) -mdll $(OBJROOT)/*.opt.o CoreFoundation -o CoreFoundation$(LIBRARY_EXT) $(LFLAGS)
	$(SILENT) $(DLLTOOL) -e CoreFoundation_debug -l CoreFoundation_debug.lib $(OBJROOT)/*.debug.o
	$(SILENT) $(CC) -mdll $(OBJROOT)/*.debug.o CoreFoundation_debug -o CoreFoundation_debug$(LIBRARY_EXT) $(LFLAGS)
	$(SILENT) $(COPY) *.lib $(SYMROOT)
	$(SILENT) $(COPY) *.dll $(SYMROOT)
	$(SILENT) $(REMOVE) *.dll *.lib CoreFoundation CoreFoundation_debug
endif
	$(SILENT) $(ECHO) "Done!"

postbuild:
ifeq "$(LIBRARY_STYLE)" "Framework"
	-$(SILENT) $(SYMLINK) Versions/Current/CoreFoundation $(SYMROOT)/CoreFoundation.framework/CoreFoundation
	-$(SILENT) $(SYMLINK) Versions/Current/CoreFoundation_debug $(SYMROOT)/CoreFoundation.framework/CoreFoundation_debug
	-$(SILENT) $(SYMLINK) Versions/Current/CoreFoundation_profile $(SYMROOT)/CoreFoundation.framework/CoreFoundation_profile
endif