1# 2# Copyright (C) 1999-2020 Apple Inc. All rights reserved. 3# 4ifndef VERSDIR 5export VERSDIR := $(shell /bin/pwd) 6endif 7 8ifndef SRCROOT 9export SRCROOT := $(shell /bin/pwd) 10endif 11ifndef OBJROOT 12export OBJROOT = $(SRCROOT)/BUILD/obj 13endif 14ifndef DSTROOT 15export DSTROOT = $(SRCROOT)/BUILD/dst 16endif 17ifndef SYMROOT 18export SYMROOT = $(SRCROOT)/BUILD/sym 19endif 20ifndef MallocNanoZone 21export MallocNanoZone := 1 22endif 23 24# Avoid make default rules, make becomes faster 25MAKEFLAGS+=r 26 27export MakeInc_top=${VERSDIR}/makedefs/MakeInc.top 28export MakeInc_kernel=${VERSDIR}/makedefs/MakeInc.kernel 29export MakeInc_cmd=${VERSDIR}/makedefs/MakeInc.cmd 30export MakeInc_def=${VERSDIR}/makedefs/MakeInc.def 31export MakeInc_rule=${VERSDIR}/makedefs/MakeInc.rule 32export MakeInc_dir=${VERSDIR}/makedefs/MakeInc.dir 33 34.DEFAULT_GOAL := default 35 36export PATCH_PREFIX ?= change-under-test_ 37export PATCH_GLOB ?= $(PATCH_PREFIX)*.diff 38 39 40skip: 41 @echo "Skipping $(RC_ProjectName)" 42 43.PHONY: skip 44 45# 46# Dispatch non-xnu build aliases to their own build 47# systems. All xnu variants start with MakeInc_top. 48# 49 50ifneq ($(findstring Libsyscall,$(RC_ProjectName)),) 51 52include $(MakeInc_cmd) 53include $(MakeInc_def) 54include $(MakeInc_rule) 55 56ifeq ($(RC_ProjectName),Libsyscall_headers_Sim) 57TARGET=-target Libsyscall_headers_Sim 58endif 59 60ifeq ($(RC_ProjectName),Libsyscall_driverkit) 61TARGET=-target Libsyscall_driverkit 62endif 63 64# default to OS X 65SDKROOT ?= macosx.internal 66 67default: install 68 69Libsyscall_driverkit: install 70 71.PHONY: Libsyscall_driverkit 72 73installhdrs install:: 74 cd libsyscall ; \ 75 xcodebuild $@ $(TARGET) \ 76 $(MAKEOVERRIDES) \ 77 "SRCROOT=$(SRCROOT)/libsyscall" \ 78 "OBJROOT=$(OBJROOT)" \ 79 "SYMROOT=$(SYMROOT)" \ 80 "DSTROOT=$(DSTROOT)" \ 81 "SDKROOT=$(SDKROOT)" 82 83installhdrs install:: do_unifdef_headers 84 85$(eval $(call LIBSYSCALL_DO_UNIFDEF_HEADERS_RULE_template,$(DSTROOT)/$(INCDIR),$(SINCFRAME_UNIFDEF))) 86$(eval $(call LIBSYSCALL_DO_UNIFDEF_HEADERS_RULE_template,$(DSTROOT)/$(LCLDIR),$(SPINCFRAME_UNIFDEF))) 87ifeq ($(DRIVERKIT),1) 88$(eval $(call LIBSYSCALL_DO_UNIFDEF_HEADERS_RULE_template,$(DSTROOT)/$(DRIVERKITINCDIR),$(DKINCFRAME_UNIFDEF))) 89$(eval $(call LIBSYSCALL_DO_UNIFDEF_HEADERS_RULE_template,$(DSTROOT)/$(DRIVERKITLCLDIR),$(DKPINCFRAME_UNIFDEF))) 90endif 91 92clean: 93 94installsrc: 95 pax -rw . $(SRCROOT) 96 97else ifneq ($(findstring libkxld_host,$(RC_ProjectName)),) 98 99include $(MakeInc_cmd) 100 101default: install 102 103installhdrs install clean: 104 $(MAKE) -C libkern/kxld $@ USE_APPLE_PB_SUPPORT=all PRODUCT_TYPE=ARCHIVE 105 106installsrc: 107 $(_v)$(MKDIR) $(SRCROOT) 108 $(_v)$(FIND) -x . \! \( \( -name BUILD -o -name .svn -o -name .git -o -name cscope.\* -o -name \*~ \) -prune \) -print0 | $(PAX) -rw -p a -d0 $(SRCROOT) 109 $(_v)$(CHMOD) -R go+rX $(SRCROOT) 110 111else ifneq ($(findstring libkxld,$(RC_ProjectName)),) 112 113include $(MakeInc_cmd) 114 115default: install 116 117installhdrs install clean: 118 $(MAKE) -C libkern/kxld $@ USE_APPLE_PB_SUPPORT=all 119 120installsrc: 121 $(_v)$(MKDIR) $(SRCROOT) 122 $(_v)$(FIND) -x . \! \( \( -name BUILD -o -name .svn -o -name .git -o -name cscope.\* -o -name \*~ \) -prune \) -print0 | $(PAX) -rw -p a -d0 $(SRCROOT) 123 $(_v)$(CHMOD) -R go+rX $(SRCROOT) 124 125else ifneq ($(findstring libkmod,$(RC_ProjectName)),) 126 127default: install 128 129installhdrs install: 130 cd libkern/kmod ; \ 131 xcodebuild $@ \ 132 $(MAKEOVERRIDES) \ 133 "SRCROOT=$(SRCROOT)/libkern/kmod" \ 134 "OBJROOT=$(OBJROOT)" \ 135 "SYMROOT=$(SYMROOT)" \ 136 "DSTROOT=$(DSTROOT)" \ 137 "SDKROOT=$(SDKROOT)" 138 139clean: 140 141installsrc: 142 pax -rw . $(SRCROOT) 143 144else ifneq ($(findstring xnu_tests,$(RC_ProjectName)),) 145 146export SYSCTL_HW_PHYSICALCPU := $(shell /usr/sbin/sysctl -n hw.physicalcpu) 147export SYSCTL_HW_LOGICALCPU := $(shell /usr/sbin/sysctl -n hw.logicalcpu) 148MAKEJOBS := --jobs=$(shell expr $(SYSCTL_HW_LOGICALCPU) + 1) 149 150default: install 151 152installhdrs: 153 154install: xnu_tests 155 156clean: 157 158installsrc: 159 pax -rw . $(SRCROOT) 160 161else ifeq ($(RC_ProjectName),xnu_tests_driverkit) 162 163export SYSCTL_HW_PHYSICALCPU := $(shell /usr/sbin/sysctl -n hw.physicalcpu) 164export SYSCTL_HW_LOGICALCPU := $(shell /usr/sbin/sysctl -n hw.logicalcpu) 165MAKEJOBS := --jobs=$(shell expr $(SYSCTL_HW_LOGICALCPU) + 1) 166 167default: install 168 169installhdrs: 170 171install: xnu_tests_driverkit 172 173clean: 174 175installsrc: 176 pax -rw . $(SRCROOT) 177 178else # all other RC_ProjectName 179 180ifndef CURRENT_BUILD_CONFIG 181 182# avoid having to include MakeInc.cmd 183ifeq ($(RC_XBS),YES) 184_v = 185else ifeq ($(VERBOSE),YES) 186_v = 187else 188_v = @ 189endif 190 191# 192# Setup for parallel sub-makes, taking into account physical and logical 193# CPUs. If the system does not support SMT, use N+1. 194# If MAKEJOBS or -jN is passed on the make line, that takes precedence. 195# 196export SYSCTL_HW_PHYSICALCPU := $(shell /usr/sbin/sysctl -n hw.physicalcpu) 197export SYSCTL_HW_LOGICALCPU := $(shell /usr/sbin/sysctl -n hw.logicalcpu) 198MAKEJOBS := --jobs=$(shell expr $(SYSCTL_HW_LOGICALCPU) + 1) 199 200TOP_TARGETS = \ 201 clean \ 202 installsrc \ 203 exporthdrs \ 204 all all_desktop all_embedded \ 205 all_release_embedded all_development_embedded \ 206 installhdrs installhdrs_desktop installhdrs_embedded \ 207 installhdrs_release_embedded installhdrs_development_embedded \ 208 install install_desktop install_embedded \ 209 install_release_embedded install_development_embedded \ 210 install_kernels \ 211 cscope tags TAGS \ 212 help 213 214DEFAULT_TARGET = all 215 216# Targets for internal build system debugging 217TOP_TARGETS += \ 218 print_exports print_exports_first_build_config \ 219 setup \ 220 build \ 221 config \ 222 install_textfiles \ 223 install_config 224 225ifeq ($(BUILD_JSON_COMPILATION_DATABASE),1) 226MAKEARGS += -B 227DEFAULT_TARGET := build 228endif 229 230.PHONY: $(TOP_TARGETS) 231 232default: $(DEFAULT_TARGET) 233 234ifneq ($(REMOTEBUILD),) 235$(TOP_TARGETS): 236 $(_v)$(VERSDIR)/tools/remote_build.sh _REMOTEBUILD_TARGET=$@ _REMOTEBUILD_MAKE=$(MAKE) $(if $(filter --,$(MAKEFLAGS)),-,)$(MAKEFLAGS) 237else 238$(TOP_TARGETS): 239 $(_v)$(MAKE) $(MAKEARGS) -r $(if $(filter -j,$(MAKEFLAGS)),,$(MAKEJOBS)) -f $(MakeInc_top) $@ 240endif 241 242else # CURRENT_BUILD_CONFIG 243 244include $(MakeInc_cmd) 245include $(MakeInc_def) 246 247ALL_SUBDIRS = \ 248 security \ 249 bsd \ 250 iokit \ 251 osfmk \ 252 pexpert \ 253 libkern \ 254 libsa \ 255 config \ 256 san 257 258CONFIG_SUBDIRS = config tools san 259# Hack to handle san external dependency on config_all allsymbols target 260config_all_recurse_into_san: config_all_recurse_into_config 261 262INSTINC_SUBDIRS = $(ALL_SUBDIRS) EXTERNAL_HEADERS 263INSTINC_SUBDIRS_X86_64 = $(INSTINC_SUBDIRS) 264INSTINC_SUBDIRS_X86_64H = $(INSTINC_SUBDIRS) 265INSTINC_SUBDIRS_ARM = $(INSTINC_SUBDIRS) 266INSTINC_SUBDIRS_ARM64 = $(INSTINC_SUBDIRS) 267 268EXPINC_SUBDIRS = $(ALL_SUBDIRS) 269EXPINC_SUBDIRS_X86_64 = $(EXPINC_SUBDIRS) 270EXPINC_SUBDIRS_X86_64H = $(EXPINC_SUBDIRS) 271EXPINC_SUBDIRS_ARM = $(EXPINC_SUBDIRS) 272EXPINC_SUBDIRS_ARM64 = $(EXPINC_SUBDIRS) 273 274SETUP_SUBDIRS = SETUP san bsd 275 276COMP_SUBDIRS_X86_64 = $(ALL_SUBDIRS) 277COMP_SUBDIRS_X86_64H = $(ALL_SUBDIRS) 278COMP_SUBDIRS_ARM = $(ALL_SUBDIRS) 279COMP_SUBDIRS_ARM64 = $(ALL_SUBDIRS) 280 281INSTTEXTFILES_SUBDIRS = \ 282 bsd 283INSTTEXTFILES_SUBDIRS_X86_64 = $(INSTTEXTFILES_SUBDIRS) 284INSTTEXTFILES_SUBDIRS_X86_64H = $(INSTTEXTFILES_SUBDIRS) 285INSTTEXTFILES_SUBDIRS_ARM = $(INSTTEXTFILES_SUBDIRS) 286INSTTEXTFILES_SUBDIRS_ARM64 = $(INSTTEXTFILES_SUBDIRS) 287 288include $(MakeInc_kernel) 289include $(MakeInc_rule) 290include $(MakeInc_dir) 291 292endif # CURRENT_BUILD_CONFIG 293 294endif # all other RC_ProjectName 295 296installapi_libkdd installhdrs_libkdd install_libkdd: 297 cd libkdd; \ 298 xcodebuild -target Default $(subst _libkdd,,$@) \ 299 $(MAKEOVERRIDES) \ 300 "SRCROOT=$(SRCROOT)/libkdd" \ 301 "OBJROOT=$(OBJROOT)" \ 302 "SYMROOT=$(SYMROOT)" \ 303 "DSTROOT=$(DSTROOT)" \ 304 "SDKROOT=$(SDKROOT)" 305 306 307installapi_libkdd_tests installhdrs_libkdd_tests install_libkdd_tests: 308 cd libkdd; \ 309 xcodebuild -target tests $(subst _libkdd_tests,,$@) \ 310 $(MAKEOVERRIDES) \ 311 "SRCROOT=$(SRCROOT)/libkdd" \ 312 "OBJROOT=$(OBJROOT)" \ 313 "SYMROOT=$(SYMROOT)" \ 314 "DSTROOT=$(DSTROOT)" \ 315 "SDKROOT=$(SDKROOT)" 316 317 318installapi_libkdd_host installhdrs_libkdd_host install_libkdd_host: 319 cd libkdd; \ 320 xcodebuild -configuration ReleaseHost -target kdd.framework $(subst _libkdd_host,,$@) \ 321 $(MAKEOVERRIDES) \ 322 "SRCROOT=$(SRCROOT)/libkdd" \ 323 "OBJROOT=$(OBJROOT)" \ 324 "SYMROOT=$(SYMROOT)" \ 325 "DSTROOT=$(DSTROOT)" \ 326 "SDKROOT=$(SDKROOT)" 327 328 329# "xnu_tests" and "testbots" are targets that can be invoked via a standalone 330# "make xnu_tests" or via buildit/XBS with the RC_ProjectName=xnu_tests. 331# Define the target here in the outermost scope of the initial Makefile 332 333xnu_tests: 334 $(MAKE) -C $(SRCROOT)/tools/tests $(if $(filter -j,$(MAKEFLAGS)),,$(MAKEJOBS)) \ 335 SRCROOT=$(SRCROOT)/tools/tests 336 $(MAKE) -C $(SRCROOT)/tests $(if $(filter -j,$(MAKEFLAGS)),,$(MAKEJOBS)) \ 337 SRCROOT=$(SRCROOT)/tests 338 339xnu_tests_driverkit: 340 $(MAKE) -C $(SRCROOT)/tests/driverkit $(if $(filter -j,$(MAKEFLAGS)),,$(MAKEJOBS)) \ 341 SRCROOT=$(SRCROOT)/tests/driverkit 342 343 344include $(MakeInc_cmd) 345 346# 347# The "analyze" target defined below invokes Clang Static Analyzer 348# with a predefined set of checks and options for the project. 349# 350 351# By default, analysis results are available in BUILD/StaticAnalyzer. 352# Set this variable in your make invocation to use a different directory. 353# Note that these results are only deleted when the build directory 354# is cleaned. They aren't deleted every time the analyzer is re-run, 355# but they are deleted after "make clean". 356STATIC_ANALYZER_OUTPUT_DIR ?= $(SRCROOT)/BUILD/StaticAnalyzer 357 358# By default, the default make target is analyzed. You can analyze 359# other targets by setting this variable in your make invocation. 360STATIC_ANALYZER_TARGET ?= 361 362# You can pass additional flags to scan-build by setting this variable 363# in your make invocation. For example, you can enable additional checks. 364STATIC_ANALYZER_EXTRA_FLAGS ?= 365 366analyze: 367# This is where the reports are going to be available. 368# Old reports are deleted on make clean only. 369 $(_v)$(MKDIR) $(STATIC_ANALYZER_OUTPUT_DIR) 370 371# Recursively build the requested target under scan-build. 372# Exclude checks that weren't deemed to be security critical, 373# like null pointer dereferences. 374 $(_v)$(XCRUN) $(SCAN_BUILD) -o $(STATIC_ANALYZER_OUTPUT_DIR) \ 375 -disable-checker deadcode.DeadStores \ 376 -disable-checker core.NullDereference \ 377 -disable-checker core.DivideZero \ 378 --exclude BUILD \ 379 $(STATIC_ANALYZER_EXTRA_FLAGS) \ 380 $(MAKE) $(STATIC_ANALYZER_TARGET) QUIET=1 2>&1 | $(GREP) "^scan-build:" 381 382.PHONY: analyze 383