1ifneq ($(PLATFORM),MacOSX) 2# Exclude building for any platform except MacOSX, due to arch/target incompatibility 3EXCLUDED_SOURCES += sched/clutch_runqueue.c 4else 5 6SCHED_HARNESS := sched/sched_test_harness 7SCHED_HARNESS_SHADOW := $(SCHED_HARNESS)/shadow_headers 8SCHED_CLUTCH_DISABLED_WARNINGS := -Wno-declaration-after-statement -Wno-nullability-completeness -Wno-missing-prototypes -Wno-gnu-statement-expression-from-macro-expansion -Wno-implicit-int-conversion -Wno-sign-conversion -Wno-c++98-compat -Wno-language-extension-token 9SCHED_HARNESS_DEFINES := -DSCHED_TEST_HARNESS=1 -DCONFIG_SCHED_CLUTCH=1 -DCONFIG_SCHED_TIMESHARE_CORE=1 10# Configure osmfk/kern/queue.h to define symbol __queue_element_linkage_invalid() 11SCHED_HARNESS_DEFINES += -DDRIVERKIT_FRAMEWORK_INCLUDE=1 12 13# Enable some ASan/UBSan in the test binary for MacOS target 14SCHED_HARNESS_DEBUG_FLAGS := -fsanitize=bounds -fsanitize=null -fsanitize=address -O0 -g 15 16XNU_SRC := .. 17# List the shadow_headers directory first before ../osfmk/ so that headers present in the 18# harness directory override the versions in xnu source proper 19SCHED_HARNESS_COMPILER_SEARCH_ORDER := -I $(SCHED_HARNESS_SHADOW)/ -I $(XNU_SRC)/osfmk/ 20 21# Track file modifications correctly in the recipe 22SCHED_HARNESS_DEPS := $(shell find $(SCHED_HARNESS) -name "*.c" -o -name "*.h") 23SCHED_CLUTCH_DEPS := $(XNU_SRC)/osfmk/kern/sched_clutch.c $(XNU_SRC)/osfmk/kern/sched_clutch.h $(XNU_SRC)/osfmk/kern/queue.h $(XNU_SRC)/osfmk/kern/circle_queue.h $(XNU_SRC)/osfmk/kern/bits.h $(XNU_SRC)/osfmk/kern/sched.h 24 25# Guard-out some unwanted includes without needing to modify the original header files 26SCHED_CLUTCH_UNWANTED_HDRS := mach/policy.h kern/smp.h kern/ast.h kern/timer_call.h 27clutch_setup_placehold_hdrs: 28 mkdir -p $(SCHED_HARNESS_SHADOW)/mach 29 for hdr in $(SCHED_CLUTCH_UNWANTED_HDRS); do \ 30 echo "/* Empty file used as a placeholder for " $$hdr " that we don't want to import */" > $(SCHED_HARNESS_SHADOW)/$$hdr; \ 31 done 32 # Replace osfmk/mach/mach_types.h with smaller set of dependencies combined in misc_needed_defines.h, 33 # ultimately satisfying dependencies needed by osfmk/kern/sched.h 34 echo '#include "misc_needed_defines.h"' > $(SCHED_HARNESS_SHADOW)/mach/mach_types.h 35 36# Link together all the object files (built below) with the unit tests into a final binary 37sched/clutch_runqueue: INVALID_ARCHS = $(filter-out arm64e%,$(ARCH_CONFIGS)) 38sched/clutch_runqueue: OTHER_CFLAGS += $(SCHED_HARNESS_DEFINES) $(SCHED_HARNESS_DEBUG_FLAGS) $(SCHED_HARNESS_COMPILER_SEARCH_ORDER) -Wno-gnu-binary-literal 39sched/clutch_runqueue: OTHER_LDFLAGS += -ldarwintest_utils $(SCHED_HARNESS_DEBUG_FLAGS) $(OBJROOT)/sched_clutch_harness.o $(OBJROOT)/priority_queue.o $(OBJROOT)/sched_runqueue_harness.o 40sched/clutch_runqueue: $(OBJROOT)/sched_clutch_harness.o $(OBJROOT)/priority_queue.o $(OBJROOT)/sched_runqueue_harness.o 41 42# Runqueue harness 43$(OBJROOT)/sched_runqueue_harness.o: OTHER_CFLAGS += $(SCHED_HARNESS_DEBUG_FLAGS) 44$(OBJROOT)/sched_runqueue_harness.o: $(SCHED_HARNESS)/sched_runqueue_harness.c 45 $(MAKE) clutch_setup_placehold_hdrs 46 $(CC) $(OTHER_CFLAGS) $(CFLAGS) -c $< -o $@ 47 48# Clutch harness 49$(OBJROOT)/sched_clutch_harness.o: OTHER_CFLAGS += $(SCHED_HARNESS_DEFINES) $(SCHED_HARNESS_DEBUG_FLAGS) $(SCHED_CLUTCH_DISABLED_WARNINGS) $(SCHED_HARNESS_COMPILER_SEARCH_ORDER) 50$(OBJROOT)/sched_clutch_harness.o: $(SCHED_HARNESS)/sched_clutch_harness.c $(SCHED_HARNESS_DEPS) $(SCHED_CLUTCH_DEPS) 51 $(MAKE) clutch_setup_placehold_hdrs 52 $(CC) $(OTHER_CFLAGS) $(CFLAGS) -c $< -o $@ 53 54# Priority queue C++ dependency 55$(OBJROOT)/priority_queue.o: OTHER_CXXFLAGS += -std=c++11 $(SCHED_HARNESS_DEFINES) $(SCHED_HARNESS_DEBUG_FLAGS) $(SCHED_HARNESS_COMPILER_SEARCH_ORDER) 56$(OBJROOT)/priority_queue.o: $(SCHED_HARNESS_SHADOW)/priority_queue.cpp 57 $(CXX) $(OTHER_CXXFLAGS) $(CXXFLAGS) -c $< -o $@ 58 59endif 60