1# -*- mode: makefile;-*- 2# 3# Copyright (C) 1999-2012 Apple Inc. All rights reserved. 4# 5# MakeInc.cmd contains command paths for use during 6# the build, as well as make fragments and text 7# strings that may be evaluated as utility functions. 8# 9 10# 11# Commands for the build environment 12# 13## 14# Verbosity 15## 16ifeq ($(RC_XBS),YES) 17VERBOSE = YES 18else 19VERBOSE = NO 20endif 21ifeq ($(VERBOSE),YES) 22_v = 23_vstdout = 24else 25_v = @ 26_vstdout = > /dev/null 27endif 28 29VERBOSE_GENERATED_MAKE_FRAGMENTS = NO 30 31ifeq ($(VERBOSE),YES) 32 XCRUN = /usr/bin/xcrun -verbose 33else 34 XCRUN = /usr/bin/xcrun 35endif 36 37SDKROOT ?= macosx.internal 38HOST_SDKROOT ?= macosx 39HOST_SPARSE_SDKROOT ?= / 40 41# SDKROOT may be passed as a shorthand like "iphoneos.internal". We 42# must resolve these to a full path and override SDKROOT. 43 44ifeq ($(SDKROOT_RESOLVED),) 45export SDKROOT_RESOLVED := $(shell $(XCRUN) -sdk $(SDKROOT) -show-sdk-path) 46ifeq ($(strip $(SDKROOT)_$(SDKROOT_RESOLVED)),/_) 47export SDKROOT_RESOLVED := / 48endif 49endif 50override SDKROOT = $(SDKROOT_RESOLVED) 51 52ifeq ($(HOST_SDKROOT_RESOLVED),) 53export HOST_SDKROOT_RESOLVED := $(shell $(XCRUN) -sdk $(HOST_SDKROOT) -show-sdk-path) 54endif 55override HOST_SDKROOT = $(HOST_SDKROOT_RESOLVED) 56 57ifeq ($(PLATFORM),) 58 export PLATFORMPATH := $(shell $(XCRUN) -sdk $(SDKROOT) -show-sdk-platform-path) 59 export PLATFORM := $(shell echo $(PLATFORMPATH) | sed 's,^.*/\([^/]*\)\.platform$$,\1,') 60 ifeq ($(PLATFORM),) 61 export PLATFORM := MacOSX 62 endif 63endif 64 65ifeq ($(SDKVERSION),) 66 export SDKVERSION := $(shell $(XCRUN) -sdk $(SDKROOT) -show-sdk-version) 67endif 68 69ifneq ($(filter iPhoneOS iPhoneOSNano,$(PLATFORM)),) 70 ifeq ($(HOST_SPARSE_SDKROOT),/) 71 export HOST_SPARSE_SDKROOT := $(shell $(XCRUN) -sdk iphonehost.internal -show-sdk-path) 72 endif 73endif 74 75# CC/CXX get defined by make(1) by default, so we can't check them 76# against the empty string to see if they haven't been set 77ifeq ($(origin CC),default) 78 export CC := $(shell $(XCRUN) -sdk $(SDKROOT) -find clang) 79endif 80ifeq ($(origin CXX),default) 81 export CXX := $(shell $(XCRUN) -sdk $(SDKROOT) -find clang++) 82endif 83ifeq ($(MIG),) 84 export MIG := $(shell $(XCRUN) -sdk $(SDKROOT) -find mig) 85endif 86ifeq ($(MIGCOM),) 87 export MIGCOM := $(shell $(XCRUN) -sdk $(SDKROOT) -find migcom) 88endif 89ifeq ($(MIGCC),) 90 export MIGCC := $(CC) 91endif 92ifeq ($(STRIP),) 93 export STRIP := $(shell $(XCRUN) -sdk $(SDKROOT) -find strip) 94endif 95ifeq ($(LIPO),) 96 export LIPO := $(shell $(XCRUN) -sdk $(SDKROOT) -find lipo) 97endif 98ifeq ($(LIBTOOL),) 99 export LIBTOOL := $(shell $(XCRUN) -sdk $(SDKROOT) -find libtool) 100endif 101ifeq ($(NM),) 102 export NM := $(shell $(XCRUN) -sdk $(SDKROOT) -find nm) 103endif 104ifeq ($(UNIFDEF),) 105 export UNIFDEF := $(shell $(XCRUN) -sdk $(SDKROOT) -find unifdef) 106endif 107ifeq ($(DSYMUTIL),) 108 export DSYMUTIL := $(shell $(XCRUN) -sdk $(SDKROOT) -find dsymutil) 109endif 110ifeq ($(CTFCONVERT),) 111 export CTFCONVERT := $(shell $(XCRUN) -sdk $(SDKROOT) -find ctfconvert) 112endif 113ifeq ($(CTFMERGE),) 114 export CTFMERGE := $(shell $(XCRUN) -sdk $(SDKROOT) -find ctfmerge) 115endif 116ifeq ($(CTFINSERT),) 117 export CTFINSERT := $(shell $(XCRUN) -sdk $(SDKROOT) -find ctf_insert) 118endif 119ifeq ($(NMEDIT),) 120 export NMEDIT := $(shell $(XCRUN) -sdk $(SDKROOT) -find nmedit) 121endif 122 123# Platform-specific tools 124ifneq ($(filter iPhoneOS iPhoneOSNano,$(PLATFORM)),) 125ifeq ($(EMBEDDED_DEVICE_MAP),) 126 export EMBEDDED_DEVICE_MAP := $(shell $(XCRUN) -sdk $(SDKROOT) -find embedded_device_map) 127endif 128EDM_DBPATH = $(PLATFORMPATH)/usr/local/standalone/firmware/device_map.db 129endif 130 131# Scripts or tools we build ourselves 132# 133# setsegname - Rename segments in a Mach-O object file 134# kextsymboltool - Create kext pseudo-kext Mach-O kexts binaries 135# decomment - Strip out comments to detect whether a file is comments-only 136# installfile - Atomically copy files, esp. when multiple architectures 137# are trying to install the same target header 138# replacecontents - Write contents to a file and update modtime *only* if 139# contents differ 140# 141SEG_HACK = $(OBJROOT)/SETUP/setsegname/setsegname 142KEXT_CREATE_SYMBOL_SET = $(OBJROOT)/SETUP/kextsymboltool/kextsymboltool 143DECOMMENT = $(OBJROOT)/SETUP/decomment/decomment 144NEWVERS = $(SRCROOT)/config/newvers.pl 145INSTALL = $(OBJROOT)/SETUP/installfile/installfile 146REPLACECONTENTS = $(OBJROOT)/SETUP/replacecontents/replacecontents 147 148# Standard BSD tools 149RM = /bin/rm -f 150RMDIR = /bin/rmdir 151CP = /bin/cp 152MV = /bin/mv 153LN = /bin/ln -fs 154CAT = /bin/cat 155MKDIR = /bin/mkdir -p 156CHMOD = /bin/chmod 157FIND = /usr/bin/find 158XARGS = /usr/bin/xargs 159PAX = /bin/pax 160BASENAME = /usr/bin/basename 161DIRNAME = /usr/bin/dirname 162TR = /usr/bin/tr 163TOUCH = /usr/bin/touch 164SLEEP = /bin/sleep 165AWK = /usr/bin/awk 166SED = /usr/bin/sed 167ECHO = /bin/echo 168PLUTIL = /usr/bin/plutil 169 170# 171# Command to generate host binaries. Intentionally not 172# $(CC), which controls the target compiler 173# 174ifeq ($(HOST_OS_VERSION),) 175 export HOST_OS_VERSION := $(shell sw_vers -productVersion) 176endif 177ifeq ($(HOST_CC),) 178 export HOST_CC := $(shell $(XCRUN) -sdk $(HOST_SDKROOT) -find clang) 179endif 180ifeq ($(HOST_FLEX),) 181 export HOST_FLEX := $(shell $(XCRUN) -sdk $(HOST_SDKROOT) -find flex) 182endif 183ifeq ($(HOST_BISON),) 184 export HOST_BISON := $(shell $(XCRUN) -sdk $(HOST_SDKROOT) -find bison) 185endif 186ifeq ($(HOST_GM4),) 187 export HOST_GM4 := $(shell $(XCRUN) -sdk $(HOST_SDKROOT) -find gm4) 188endif 189ifeq ($(HOST_CODESIGN),) 190 export HOST_CODESIGN := /usr/bin/codesign 191endif 192ifeq ($(HOST_CODESIGN_ALLOCATE),) 193 export HOST_CODESIGN_ALLOCATE := $(shell $(XCRUN) -sdk $(HOST_SDKROOT) -find codesign_allocate) 194endif 195 196# 197# The following variables are functions invoked with "call", and thus 198# behave similarly to externally compiled commands 199# 200 201# $(1) is an expanded kernel config from a TARGET_CONFIGS_UC tuple 202# $(2) is an expanded arch config from a TARGET_CONFIGS_UC tuple 203# $(3) is an expanded machine config from a TARGET_CONFIGS_UC tuple 204_function_create_build_configs_join = $(strip $(1))^$(strip $(2))^$(strip $(3)) 205 206# $(1) is an un-expanded kernel config from a TARGET_CONFIGS_UC tuple 207# $(2) is an un-expanded arch config from a TARGET_CONFIGS_UC tuple 208# $(3) is an un-expanded machine config from a TARGET_CONFIGS_UC tuple 209_function_create_build_configs_do_expand = $(call _function_create_build_configs_join, \ 210 $(if $(filter DEFAULT,$(1)), \ 211 $(DEFAULT_KERNEL_CONFIG), \ 212 $(1) \ 213 ), \ 214 $(if $(filter DEFAULT,$(2)), \ 215 $(DEFAULT_ARCH_CONFIG), \ 216 $(2) \ 217 ), \ 218 $(if $(filter DEFAULT,$(3)), \ 219 $(if $(filter DEFAULT,$(2)), \ 220 $(DEFAULT_$(DEFAULT_ARCH_CONFIG)_MACHINE_CONFIG), \ 221 $(DEFAULT_$(strip $(2))_MACHINE_CONFIG) \ 222 ), \ 223 $(3) \ 224 ) \ 225 ) 226 227# $(1) is an un-expanded TARGET_CONFIGS_UC list, which must be consumed 228# 3 elements at a time 229function_create_build_configs = $(sort \ 230 $(strip \ 231 $(call _function_create_build_configs_do_expand, \ 232 $(word 1,$(1)), \ 233 $(word 2,$(1)), \ 234 $(word 3,$(1)), \ 235 ) \ 236 $(if $(word 4,$(1)), \ 237 $(call function_create_build_configs, \ 238 $(wordlist 4,$(words $(1)),$(1)) \ 239 ), \ 240 \ 241 ) \ 242 ) \ 243 ) 244 245# $(1) is a fully-expanded kernel config 246# $(2) is a fully-expanded arch config 247# $(3) is a fully-expanded machine config. "NONE" is not represented in the objdir path 248function_convert_target_config_uc_to_objdir = $(if $(filter NONE,$(3)),$(strip $(1))_$(strip $(2)),$(strip $(1))_$(strip $(2))_$(strip $(3))) 249 250# $(1) is a fully-expanded build config (like "RELEASE^X86_64^NONE") 251function_convert_build_config_to_objdir = $(call function_convert_target_config_uc_to_objdir, \ 252 $(word 1,$(subst ^, ,$(1))), \ 253 $(word 2,$(subst ^, ,$(1))), \ 254 $(word 3,$(subst ^, ,$(1))) \ 255 ) 256 257# $(1) is a fully-expanded build config (like "RELEASE^X86_64^NONE") 258function_extract_kernel_config_from_build_config = $(word 1,$(subst ^, ,$(1))) 259function_extract_arch_config_from_build_config = $(word 2,$(subst ^, ,$(1))) 260function_extract_machine_config_from_build_config = $(word 3,$(subst ^, ,$(1))) 261 262# $(1) is an input word 263# $(2) is a list of colon-separate potential substitutions like "FOO:BAR BAZ:QUX" 264# $(3) is a fallback if no substitutions were made 265function_substitute_word_with_replacement = $(strip $(if $(2), \ 266 $(if $(filter $(word 1,$(subst :, ,$(word 1,$(2)))),$(1)), \ 267 $(word 2,$(subst :, ,$(word 1,$(2)))), \ 268 $(call function_substitute_word_with_replacement,$(1),$(wordlist 2,$(words $(2)),$(2)),$(3))), \ 269 $(3) \ 270 ) \ 271 ) 272 273# You can't assign a variable to an empty space without these 274# shenanigans 275empty := 276space := $(empty) $(empty) 277 278# Arithmetic 279# $(1) is the number to increment 280NUM32 = x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x 281increment = $(words x $(wordlist 1,$(1),$(NUM32))) 282decrement = $(words $(wordlist 2,$(1),$(NUM32))) 283 284# Create a sequence from 1 to $(1) 285# F(N) = if N > 0: return F(N-1) + "N" else: return "" 286sequence = $(if $(wordlist 1,$(1),$(NUM32)),$(call sequence,$(call decrement,$(1))) $(1),) 287 288# Reverse a list of words in $(1) 289reverse = $(if $(word 2,$(1)),$(call reverse,$(wordlist 2,$(words $(1)),$(1)))) $(word 1,$(1)) 290 291# vim: set ft=make: 292