# Copyright (c) 1999,2000 Apple Computer, Inc.
# All rights reserved.
# Define reasonable root values, to be overridden by default
# Build intermediates go into TEMP_ROOT which defaults to
# build/intermediates in current directory, or OBJROOT if defined
TEMP_ROOT default = $(OBJROOT) ;
TEMP_ROOT default = .$(/)build$(/)intermediates ;
# Builds go into the BUILD_ROOT which defaults to
# build/products in current directory, or SYMROOT if defined
BUILD_ROOT default = $(SYMROOT) ;
BUILD_ROOT default = .$(/)build$(/)products ;
# Installation root defaults to root, or DSTROOT if defined
INSTALL_ROOT default = $(DSTROOT) ;
INSTALL_ROOT default = / ;
# Set initial values for installation information and framework version
BUILD_PHASING default = YES ;
export INSTALL_OWNER default = $(USER) ;
export INSTALL_GROUP default = $(GROUP) ;
export INSTALL_MODE_FLAG default = "a-w,a+rX" ;
export FRAMEWORK_VERSION default = "A" ;
STRIP_INSTALLED_PRODUCT default = YES ;
REMOVE_CVS_FROM_RESOURCES default = YES ;
COPY_PHASE_STRIP default = YES ;
# Set initial optimization level, debug, and profile settings
export OPTIMIZATION_LEVEL default = 0 ;
export DEBUGGING_SYMBOLS default = YES ;
export PROFILING_CODE default = NO ;
# Carbon framework reference locations
CARBONINTDIR = /System/Library/Frameworks/Carbon.framework/Libraries ;
# Default settings for Java builds
JAVA_ARCHIVE_CLASSES default = YES ;
JAVA_ARCHIVE_TYPE default = JAR ;
JAVA_APP_STUB default = /System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub ;
JAVA_JAR_FLAGS default = cv ;
JAVA_SOURCE_SUBDIR default = . ;
JAVA_FRAMEWORK_RESOURCES_DIRS default = Resources ;
export JAVA_FRAMEWORK_JARS default = ;
JAVA_USE_DEPENDENCIES default = YES ;
JAVA_ZIP_FLAGS default = -ug ;
# BeginProduct <product>
#
# Initializes the directory and file list variables
#
# Variable references:
# BUILD_ROOT Base directory for builds
# BUILD_PATH Subdirectory in root where product is located
# TARGET_NAME Name of the target that builds this product
# PRODUCT_NAME Name of the product that's built
# TEMP_ROOT Base directory for intermediates
# BASE_PROJECT_HEADER_DIR Base directory for project headers
# HEADER_SUBDIRECTORY Path prefix in header #include lines
# INSTALL_ROOT Base directory for installations
# INSTALL_PATH Subdirectory where product is installed
# PUBLIC_HEADER_DIR Location for public headers
#
# Variables set:
# BUILD_DIR Target-specific directory for builds
# TEMP_DIR For target-specific intermediates
# PROJECT_HEADER_DIR Project header file directory in $(TEMP_DIR)
# OBJECT_FILE_DIR Object file directory in $(TEMP_DIR)
# CLASS_FILE_DIR Class file directory in $(TEMP_DIR)
# DERIVED_FILE_DIR Derived source directory in $(TEMP_DIR)
# INSTALL_DIR Directory in $(INSTALL_ROOT) for installations
# HEADER_SEARCH_PATHS Project header directories prepended
# FRAMEWORK_SEARCH_PATHS Product build root appended
# DERIVED_FILES Initialized empty
# OBJECT_FILES Initialized empty
# LINKED_FILES Initialized empty
# PRODUCT_FILES Initialized with product
# PRECOMP_TRUSTFILE TrustedPrecomps.txt in $(TEMP_DIR)
#
rule BeginProduct
{
# default mapping of build actions to build variants
switch $(ACTION) {
case build : BUILD_COMPONENTS default = headers build ;
case install : BUILD_COMPONENTS default = headers build ;
case installhdrs : BUILD_COMPONENTS default = headers ;
case installsrc : BUILD_COMPONENTS default = source ;
}
# Set reasonable optimization flags for installs if not already set
DEPLOYMENT_OPTIMIZATION_CFLAGS default = -O ;
if $(ACTION) = install {
OPTIMIZATION_CFLAGS = $(DEPLOYMENT_OPTIMIZATION_CFLAGS) ;
}
# C++ options match C options by default
OTHER_CPLUSPLUSFLAGS default = $(OTHER_CFLAGS) ;
WARNING_CPLUSPLUSFLAGS default = $(WARNING_CFLAGS) ;
# Set up architecture options for product
INCLUDED_ARCHS default = $(SUPPORTED_ARCHITECTURES) ;
SUPPORTED_ARCHITECTURE_FLAGS = ;
ARCHS = ;
if ! $(RC_ARCHS) {
$(NATIVE_ARCH) = YES ;
RC_$(NATIVE_ARCH) = YES ;
}
for SUPPORTED_ARCHITECTURE in $(SUPPORTED_ARCHITECTURES) {
if $($(SUPPORTED_ARCHITECTURE)) = YES
&& ( $(SUPPORTED_ARCHITECTURE) in $(INCLUDED_ARCHS) )
&& ( $(SUPPORTED_ARCHITECTURE) in $(VALID_ARCHS) ) {
SUPPORTED_ARCHITECTURE_FLAGS += -arch $(SUPPORTED_ARCHITECTURE) ;
ARCHS += $(SUPPORTED_ARCHITECTURE) ;
}
}
ARCH_FLAGS default = $(SUPPORTED_ARCHITECTURE_FLAGS) ;
# Initialize the directory variables
SOURCE_DIR default = $(INSTALL_ROOT) ;
if $(BUILD_PATH) {
BUILD_DIR default = $(BUILD_ROOT)$(/)$(BUILD_PATH) ;
}
else {
BUILD_DIR default = $(BUILD_ROOT) ;
}
TEMP_DIR default = $(TEMP_ROOT)$(/)$(TARGET_NAME).build ;
BASE_PROJECT_HEADER_DIR default = $(BUILD_DIR)$(/)ProjectHeaders ;
#!!!:cmolick:20001214 maybe add an option to use temporary directory instead?
# BASE_PROJECT_HEADER_DIR default = $(TEMP_DIR)$(/)ProjectHeaders ;
# Header subdirectory has "include" prefix to handle
# header references that don't name a subdirectory.
# !!!:cmolick:20000926 commented out ... seemed wrong
# PUBLIC_HEADER_DIR default = include$(/)$(HEADER_SUBDIRECTORY) ;
if $(HEADER_SUBDIRECTORY) {
PROJECT_HEADER_DIR default = $(BASE_PROJECT_HEADER_DIR)$(/)$(HEADER_SUBDIRECTORY) ;
}
else {
PROJECT_HEADER_DIR default = $(BASE_PROJECT_HEADER_DIR) ;
}
OBJECT_FILE_DIR default = $(TEMP_DIR)$(/)Objects ;
# any unarchived java class files should go in wrapper
if $(JAVA_ARCHIVE_CLASSES) != YES {
# need to set CLASS_FILE_DIR if we're not a wrapped product (in which case it'll be set below)
if ( $(PRODUCT_TYPE) != Application ) && ( $(PRODUCT_TYPE) != Framework ) && ( $(PRODUCT_TYPE) != Bundle ) {
export CLASS_FILE_DIR default = $(BUILD_DIR)$(/)$(1:G=) ;
}
}
else {
export CLASS_FILE_DIR default = $(TEMP_DIR)$(/)JavaClasses ;
# DJE!!! - needing a RESOURCE_DIR is probably obsolete for Java Tools/Libraries
if $(PURE_JAVA) = YES {
RESOURCE_DIR default = $(BUILD_DIR) ;
}
}
FILE_LIST default = $(OBJECT_FILE_DIR)$(/)LinkFileList ;
DERIVED_FILE_DIR default = $(TEMP_DIR)$(/)DerivedSources ;
if $(INSTALL_PATH) {
INSTALL_DIR default = $(INSTALL_ROOT)$(/)$(INSTALL_PATH) ;
}
else {
INSTALL_DIR default = $(INSTALL_ROOT) ;
}
# Initialize the search paths
HEADER_SEARCH_PATHS = $(PROJECT_HEADER_DIR) $(BUILD_DIR)$(/)include $(HEADER_SEARCH_PATHS) ;
LIBRARY_SEARCH_PATHS = $(BUILD_ROOT) $(LIBRARY_SEARCH_PATHS) ;
FRAMEWORK_SEARCH_PATHS = $(BASE_PROJECT_HEADER_DIR) $(BUILD_ROOT) $(FRAMEWORK_SEARCH_PATHS) ;
# Initialize the file lists
DERIVED_FILES = ;
OBJECT_FILES = ;
LINKED_FILES = ;
if $(ACTION) != installsrc {
PRODUCT_FILES = $(1) ;
}
if $(OS) in MACOS DARWIN {
PRECOMP_TRUSTFILE default = $(TEMP_DIR)$(/)TrustedPrecomps.txt ;
}
DEPENDS all : $(PRODUCT_NAME) ;
if ! $(PRODUCT_NAME:G=) = $(1:G=) {
DEPENDS $(PRODUCT_NAME) : $(1) ;
}
}
# EndProduct <product>
#
# Sets LOCATE for intermediates and creates required directories.
rule EndProduct
{
# Create required directories. This is done here to allow
# variables to be overridden before this rule is evaluated.
Mkdir $(BUILD_DIR) ;
if $(PROJECT_HEADER_DIR) {
Mkdir $(PROJECT_HEADER_DIR) ;
}
Mkdir $(OBJECT_FILE_DIR) ;
Mkdir $(CLASS_FILE_DIR) ;
Mkdir $(DERIVED_FILE_DIR) ;
# ensure that the product goes into the correct place
LOCATE on $(1) $(PRODUCT_FILES) = $(BUILD_DIR) ;
LOCATE on $(1:D) $(PRODUCT_FILES:D:G) = $(BUILD_DIR) ;
for FILE in $(1) $(PRODUCT_FILES) {
if $(FILE:D) != "" {
Mkdir $(FILE:D) ;
DEPENDS $(FILE) : $(FILE:D) ;
} else {
DEPENDS $(FILE) : $(BUILD_DIR) ;
}
}
# ensure that anytime we build the primary product we also build
# the resource directories, inner executables, etc.
if ! $(1) = $(PRODUCT_FILES) {
INCLUDES $(1) : $(PRODUCT_FILES) ;
}
# ensure that the derived source files go into the correct place
# If any source files were in subdirectories, we must ensure
# that the corresponding derived source subdirectory is created before
# the file is compiled.
LOCATE on $(DERIVED_FILES) = $(DERIVED_FILE_DIR) ;
DERIVED_PATHS = $(DERIVED_FILE_DIR) ;
for FILE in $(DERIVED_FILES) {
if $(FILE:D) != "" {
local JUST_GRIST = $(FILE:G) ;
local JUST_DIRECTORY = $(FILE:D) ;
local DIRECTORY = $(JUST_DIRECTORY:G=Derived$(JUST_GRIST)) ;
Mkdir $(DIRECTORY) ;
local FULL_DERIVED_DIR default = $(DERIVED_FILE_DIR)$(/)$(JUST_DIRECTORY) ;
if ! ( $(FULL_DERIVED_DIR) in $(DERIVED_PATHS) ) {
DERIVED_PATHS += $(FULL_DERIVED_DIR) ;
}
DEPENDS $(FILE) : $(DIRECTORY) ;
} else {
DEPENDS $(FILE) : $(DERIVED_FILE_DIR) ;
}
}
# Run the hack script to build debug and profile variants, if appropriate.
if $(BUILD_VARIANTS) && $(BLOCK_BUILD_VARIANTS) != YES {
RunVariantHackScript varianthack : $(1) ;
}
# Basic definitions in place, define actions for this target
Actions $(1) ;
}
# BeginWrappedProduct <product>
#
# Sets additional variables required for wrapped products,
# primarily to assign locations within the product wrapper.
# The WRAPPER variable is set locally within this rule for convenience.
#
# Variables set:
# HEADER_SUBDIRECTORY Base product name
# WRAPPER_SUFFIX Text to append to product wrapper based on WRAPPER_EXTENSION
# RESOURCE_DIR Directory for resource files
# APPLESCRIPTS_DIR Directory for Compiled AppleScript files
# PUBLIC_HEADER_DIR Public header destination
# PRIVATE_HEADER_DIR Private header destination
# CURRENT_VERSION_DIR Subdirectory holding current version of versioned wrapper
# *_LINK Link to directory in versioned wrapper
# *_LINK_PATH Path used by link to directory in versioned wrapper
#
rule BeginWrappedProduct
{
# define the header subdirectory before BeginProduct uses it to
# compute the project header directory
HEADER_SUBDIRECTORY = $(1:B) ;
# set up the basic product variables
BeginProduct $(1) ;
# set up new variables for the wrapper and derive suffix
# from wrapper extension
local WRAPPER = $(1:G=) ;
if $(WRAPPER_EXTENSION) {
WRAPPER_SUFFIX = .$(WRAPPER_EXTENSION) ;
}
if $(WRAPPER_SUFFIX) {
$(WRAPPER) = $(WRAPPER:S=$(WRAPPER_SUFFIX)) ;
}
if $(PRODUCT_TYPE) = Application {
# Application wrappers
if $(PURE_JAVA) = YES {
RESOURCE_DIR default = $(WRAPPER) ;
}
else {
RESOURCE_DIR default = $(WRAPPER)$(/)Contents$(/)Resources ;
}
RESOURCE_LINK = "" ;
APPLESCRIPTS_DIR default = $(RESOURCE_DIR)$(/)Scripts ;
PUBLIC_HEADER_DIR default = $(INSTALL_PATH)$(/)Headers ;
PUBLIC_HEADER_LINK = "" ;
PRIVATE_HEADER_DIR default = $(INSTALL_PATH)$(/)PrivateHeaders ;
PRIVATE_HEADER_LINK = "" ;
CURRENT_VERSION_DIR = "" ;
CURRENT_VERSION_LINK = "" ;
PUBLIC_HEADER_CLONE_DIR = ;
PUBLIC_HEADER_CLONE_LINK = ;
PRIVATE_HEADER_CLONE_DIR = ;
PRIVATE_HEADER_CLONE_LINK = ;
CURRENT_VERSION_CLONE_DIR = ;
CURRENT_VERSION_CLONE_LINK = ;
} # application wrappers
else if $(PRODUCT_TYPE) = Framework {
# Framework wrappers
RESOURCE_DIR default = $(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)Resources ;
RESOURCE_LINK default = $(WRAPPER)$(/)Resources ;
RESOURCE_LINK_PATH default = Versions$(/)Current$(/)Resources ;
APPLESCRIPTS_DIR default = $(RESOURCE_DIR)$(/)Scripts ;
HAS_PUBLIC_HEADERS = "NO" ;
PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)Headers ;
PUBLIC_HEADER_LINK default = $(WRAPPER)$(/)Headers ;
PUBLIC_HEADER_LINK_PATH default = Versions$(/)Current$(/)Headers ;
PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)PrivateHeaders ;
PRIVATE_HEADER_LINK default = $(WRAPPER)$(/)PrivateHeaders ;
PRIVATE_HEADER_LINK_PATH default = Versions$(/)Current$(/)PrivateHeaders ;
CURRENT_VERSION_DIR default = $(WRAPPER:G=)$(/)Versions$(/)$(FRAMEWORK_VERSION) ;
CURRENT_VERSION_LINK default = $(WRAPPER:G=)$(/)Versions$(/)Current ;
CURRENT_VERSION_LINK_PATH default = Versions$(/)Current ;
PUBLIC_HEADER_CLONE_DIR default = $(BASE_PROJECT_HEADER_DIR)$(/)$(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)Headers ;
PUBLIC_HEADER_CLONE_LINK default = $(BASE_PROJECT_HEADER_DIR)$(/)$(WRAPPER)$(/)Headers ;
PUBLIC_HEADER_CLONE_LINK_PATH default = Versions$(/)Current$(/)Headers ;
PRIVATE_HEADER_CLONE_DIR default = $(BASE_PROJECT_HEADER_DIR)$(/)$(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION)$(/)PrivateHeaders ;
PRIVATE_HEADER_CLONE_LINK default = $(BASE_PROJECT_HEADER_DIR)$(/)$(WRAPPER)$(/)PrivateHeaders ;
PRIVATE_HEADER_CLONE_LINK_PATH default = Versions$(/)Current$(/)PrivateHeaders ;
CURRENT_VERSION_CLONE_DIR default = $(BASE_PROJECT_HEADER_DIR)$(/)$(WRAPPER)$(/)Versions$(/)$(FRAMEWORK_VERSION) ;
CURRENT_VERSION_CLONE_LINK default = $(BASE_PROJECT_HEADER_DIR)$(/)$(WRAPPER)$(/)Versions$(/)Current ;
CURRENT_VERSION_CLONE_LINK_PATH default = Versions$(/)Current ;
# Create current version directory and link now because
# they are implicit and needed by almost everything else:
# Current version dir
PRODUCT_FILES += $(CURRENT_VERSION_DIR) ;
NOUPDATE $(CURRENT_VERSION_DIR) ;
# Current version link
SymLink $(CURRENT_VERSION_LINK) : $(FRAMEWORK_VERSION) ;
PRODUCT_FILES += $(CURRENT_VERSION_LINK) ;
NOUPDATE $(CURRENT_VERSION_LINK) ;
PRODUCT_FILES += $(CURRENT_VERSION_CLONE_DIR) ;
NOUPDATE $(CURRENT_VERSION_CLONE_DIR) ;
# Current version link
SymLink $(CURRENT_VERSION_CLONE_LINK) : $(FRAMEWORK_VERSION) ;
PRODUCT_FILES += $(CURRENT_VERSION_CLONE_LINK) ;
NOUPDATE $(CURRENT_VERSION_CLONE_LINK) ;
# Make sure someone depends on the clone current symlink so it will get created.
DEPENDS $(PUBLIC_HEADER_CLONE_LINK) : $(CURRENT_VERSION_CLONE_LINK) ;
DEPENDS $(PRIVATE_HEADER_CLONE_LINK) : $(CURRENT_VERSION_CLONE_LINK) ;
} # framework wrappers
else {
# Default bundle wrappers
RESOURCE_DIR default = $(WRAPPER)$(/)"Contents"$(/)Resources ;
RESOURCE_LINK default = "" ;
APPLESCRIPTS_DIR default = $(RESOURCE_DIR)$(/)Scripts ;
PUBLIC_HEADER_DIR default = $(WRAPPER)$(/)"Contents"$(/)Headers ;
PUBLIC_HEADER_LINK default = "" ;
PRIVATE_HEADER_DIR default = $(WRAPPER)$(/)"Contents"$(/)PrivateHeaders ;
PRIVATE_HEADER_LINK default = "" ;
CURRENT_VERSION_DIR default = "" ;
CURRENT_VERSION_LINK default = "" ;
PUBLIC_HEADER_CLONE_DIR default = $(BASE_PROJECT_HEADER_DIR)$(/)$(WRAPPER)$(/)"Contents"$(/)Headers ;
PUBLIC_HEADER_CLONE_LINK default = "" ;
PRIVATE_HEADER_CLONE_DIR default = $(BASE_PROJECT_HEADER_DIR)$(/)$(WRAPPER)$(/)"Contents"$(/)PrivateHeaders ;
PRIVATE_HEADER_CLONE_LINK default = "" ;
CURRENT_VERSION_CLONE_DIR default = "" ;
CURRENT_VERSION_CLONE_LINK default = "" ;
} # all bundle layouts
# if we're building both a jar and a class hierarchy, we can't put the classes at the same level
# they need to go one level deeper.
if $(JAVA_ARCHIVE_CLASSES) = BOTH {
export CLASS_FILE_DIR default = $(BUILD_DIR)$(/)$(RESOURCE_DIR)$(/)Java$(/)$(1:B:G=) ;
}
else if $(JAVA_ARCHIVE_CLASSES) = NO {
export CLASS_FILE_DIR default = $(BUILD_DIR)$(/)$(RESOURCE_DIR)$(/)Java ;
}
}
rule EndWrappedProduct
{
if $(OBJECT_FILES) {
if $(INNER_PRODUCT) {
DEPENDS $(INNER_PRODUCT) : $(OBJECT_FILES) ;
}
if $(PUBLIC_HEADER_DIR) && $(HAS_PUBLIC_HEADERS) = YES {
DEPENDS $(OBJECT_FILES) : $(PUBLIC_HEADER_DIR) ;
}
if $(PUBLIC_HEADER_LINK) && $(HAS_PUBLIC_HEADERS) = YES {
DEPENDS $(OBJECT_FILES) : $(PUBLIC_HEADER_LINK) ;
}
if $(PRIVATE_HEADER_DIR) && $(HAS_PRIVATE_HEADERS) = YES {
DEPENDS $(OBJECT_FILES) : $(PRIVATE_HEADER_DIR) ;
}
if $(PRIVATE_HEADER_LINK) && $(HAS_PRIVATE_HEADERS) = YES {
DEPENDS $(OBJECT_FILES) : $(PRIVATE_HEADER_LINK) ;
}
if $(CURRENT_VERSION_DIR) {
DEPENDS $(OBJECT_FILES) : $(CURRENT_VERSION_DIR) ;
}
if $(CURRENT_VERSION_LINK) {
DEPENDS $(OBJECT_FILES) : $(CURRENT_VERSION_LINK) ;
}
}
if $(INNER_PRODUCT) {
local WRAPPER = $(1) ;
TouchConditionally $(WRAPPER) : $(INNER_PRODUCT) ;
}
EndProduct $(1) ;
}