Skip to content

Instantly share code, notes, and snippets.

@HerrSpace
Last active January 6, 2022 00:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save HerrSpace/65153211a33a5e2108f3ee2719c99a16 to your computer and use it in GitHub Desktop.
Save HerrSpace/65153211a33a5e2108f3ee2719c99a16 to your computer and use it in GitHub Desktop.
# -*- mode: makefile;-*-
#
# Apple XNU build prep
# Jeremy C. Andrus
#
# This Makefile contains commands necessary to download
# and build the XNU kernel for macOS High Sierra through
# Big Sur. It will not actually build XNU, but it will
# build and install all of the prerequisites.
#
macos_version ?= 11.0.1
PKGS = dtrace AvailabilityVersions libdispatch xnu Libsystem
ifeq ($(findstring 10.1,$(macos_version)),10.1)
PKGS += libplatform
endif
default: xnudeps
xnudeps: xnu
xnu: check_tools
check_tools: TOOLS = xcrun xcodebuild clang
check_tools:
$(foreach tool,$(TOOLS),$(if $(shell which $(tool)),,$(error Missing '$(tool)': you can download Xcode here: https://developer.apple.com/xcode/)))
APPLEOPENSOURCE = https://opensource.apple.com
TARBALL_URL = $(APPLEOPENSOURCE)/tarballs
RELEASE_URL = $(APPLEOPENSOURCE)/release/macos-$(subst .,,$(macos_version)).html
TOOLCHAIN_PATH=$(shell cd `xcrun -sdk macosx -show-sdk-platform-path`/../../Toolchains/XcodeDefault.xctoolchain && pwd)
SDKPATH=$(shell xcrun -sdk macosx -show-sdk-path)
XCODEPATH=$(shell xcrun -sdk macosx -show-sdk-path | sed 's,\(.*/Xcode[^/]*\.app\)/.*,\1,')
ifeq ($(findstring 10.13,$(macos_version)),10.13)
dtrace: dtrace-pre10.15
else ifeq ($(findstring 10.14,$(macos_version)),10.14)
dtrace: dtrace-pre10.15
else ifeq ($(findstring 10.1,$(macos_version)),10.1)
dtrace: dtrace-10.15
else
dtrace: dtrace-11.x
endif
.SECONDEXPANSION:
dtrace-pre10.15: $$(dtrace_src)/.src
.SECONDEXPANSION:
dtrace-10.15: $$(dtrace_src)/.src
.SECONDEXPANSION:
dtrace-11.x: $$(dtrace_src)/.src
dtrace-11.x:
@echo "[INFO] Building ctf tools from dtrace..."
@$(HELP) cd "$(SRCDIR)" && $(HELP) xcodebuild install -sdk macosx -target ctfconvert \
-target ctfdump -target ctfmerge ARCHS='x86_64 arm64' VALID_ARCHS='x86_64 arm64' DSTROOT="$(SRCDIR)/dst"
$(HELP) sudo ditto "$(SRCDIR)/dst/$(TOOLCHAIN_PATH)" "$(TOOLCHAIN_PATH)"
dtrace-10.15:
@echo "[INFO] Building ctf tools from dtrace..."
@$(HELP) mkdir -p "$(SRCDIR)/obj" "$(SRCDIR)/sym" "$(SRCDIR)/dst"
@$(HELP) echo "#include <stdint.h>" > $(SRCDIR)/include/llvm-Support/DataTypes.h && \
$(HELP) sed -i -e 's,include "llvm/Support/DataTypes,include "llvm-Support/DataTypes,' $(SRCDIR)/include/llvm-Support/PointerLikeTypeTraits.h
@$(HELP) cd "$(SRCDIR)" && $(HELP) xcodebuild install -sdk macosx \
-target ctfconvert -target ctfdump -target ctfmerge ARCHS="x86_64" VALID_ARCHS="x86_64" \
SRCROOT="$(SRCDIR)" OBJROOT="$(SRCDIR)/obj" SYMROOT="$(SRCDIR)/sym" DSTROOT="$(SRCDIR)/dst"
$(HELP) sudo ditto "$(SRCDIR)/dst/$(TOOLCHAIN_PATH)" "$(TOOLCHAIN_PATH)"
dtrace-pre10.15:
@echo "[INFO] Building ctf tools from dtrace..."
@$(HELP) mkdir -p "$(SRCDIR)/obj" "$(SRCDIR)/sym" "$(SRCDIR)/dst"
@$(HELP) cd "$(SRCDIR)" && $(HELP) xcodebuild install -sdk macosx \
-target ctfconvert -target ctfdump -target ctfmerge ARCHS="x86_64" VALID_ARCHS="x86_64" \
SRCROOT="$(SRCDIR)" OBJROOT="$(SRCDIR)/obj" SYMROOT="$(SRCDIR)/sym" DSTROOT="$(SRCDIR)/dst" \
HEADER_SEARCH_PATHS="$(SRCDIR)/compat/opensolaris/** $(SRCDIR)/lib/**"
$(HELP) sudo ditto "$(SRCDIR)/dst/$(XCODEPATH)/Contents/Developer/Toolchains/XcodeDefault.xctoolchain" "$(TOOLCHAIN_PATH)"
AvailabilityVersions:
@echo "[INFO] Installing AvailabilityVersions content..."
@$(HELP) mkdir -p "$(SRCDIR)/dst"
@$(HELP) rm -rf "$(SRCDIR)/dst/"*
@$(HELP) make -C "$(SRCDIR)" install SRCROOT="$(SRCDIR)" DSTROOT="$(SRCDIR)/dst"
$(HELP) sudo ditto "$(SRCDIR)/dst/usr/local/libexec" "$(SDKPATH)/usr/local/libexec"
libplatform: INTPATH = usr/local/include/os/internal
libplatform:
@echo "[INFO] Installing libplatform headers to SDK..."
$(HELP) sudo mkdir -p "$(SDKPATH)/$(INTPATH)"
$(HELP) sudo ditto "$(SRCDIR)/private/os/internal" "$(SDKPATH)/$(INTPATH)"
ifeq ($(findstring 10.14,$(macos_version)),10.14)
libdispatch: libdispatch-1014
libdispatch: ARCHS=x86_64
else ifeq ($(findstring 10.15,$(macos_version)),10.15)
libdispatch: libdispatch-1015
libdispatch: ARCHS=x86_64
else
libdispatch: libdispatch-11.x
libdispatch: ARCHS=x86_64 arm64
endif
.SECONDEXPANSION:
libdispatch: $$(xnu_src)/.src
.SECONDEXPANSION:
libdispatch-1014: $$(libdispatch_src)/.src
.SECONDEXPANSION:
libdispatch-1015: $$(libdispatch_src)/.src
.SECONDEXPANSION:
libdispatch-11.x: $$(libdispatch_src)/.src
libdispatch-11.x: xnu-installhdrs
@echo "[INFO] Building libfirehose_kernel.a from libdispatch..."
# next we need to install the firehose headers for the kernel
@$(HELP) cd $(SRCDIR) && $(HELP) xcodebuild install -sdk macosx -target libfirehose_kernel PRODUCT_NAME=firehose_kernel ARCHS='$(ARCHS)' VALID_ARCHS='$(ARCHS)' SRCROOT="$(SRCDIR)" OBJROOT="$(SRCDIR)/obj" SYMROOT="$(SRCDIR)/sym" DSTROOT="$(SRCDIR)/dst"
$(HELP) sudo ditto "$(SRCDIR)/dst/usr/local" "$(SDKPATH)/usr/local"
libdispatch-1015: XCCONF_D = xcodeconfig/libdispatch.xcconfig
libdispatch-1015: libplatform
@echo "[INFO] Building libfirehose_kernrel.a from libdispatch (10.15.x)..."
# Cleanup a bit of cruft in the 10.15.x open source drop
@$(HELP) awk '/include "<DEVELOPER/ { next; } /SDKROOT =/ { print "SDKROOT = macosx"; next; } { print $0 }' "$(libdispatch_path)/$(XCCONF_D)" > "$(libdispatch_path)/.__tmp__" \
&& $(HELP) mv -f "$(libdispatch_path)/.__tmp__" "$(libdispatch_path)/$(XCCONF_D)"
@$(HELP) mkdir -p "$(libdispatch_path)/obj" "$(libdispatch_path)/sym" "$(libdispatch_path)/dst"
@$(HELP) cd $(libdispatch_path) && $(HELP) xcodebuild install -sdk macosx -target libfirehose_kernel \
SRCROOT="$(libdispatch_path)" OBJROOT="$(libdispatch_path)/obj" \
SYMROOT="$(libdispatch_path)/sym" DSTROOT="$(libdispatch_path)/dst"
$(HELP) sudo ditto "$(libdispatch_path)/dst/usr/local" "$(libdispatch_path)/usr/local"
libdispatch-1014: XCCONF_D = xcodeconfig/libdispatch.xcconfig
libdispatch-1014: XCCONF_FH = xcodeconfig/libfirehose_kernel.xcconfig
libdispatch-1014: libplatform
@echo "[INFO] Building libfirehose_kernel.a from libdispatch (10.14.x)..."
# Cleanup a bit of cruft in the 10.14.x open source drop
@$(HELP) awk '/include "<DEVELOPER/ { next; } /SDKROOT =/ { print "SDKROOT = macosx"; next; } { print $0 }' "$(libdispatch_path)/$(XCCONF_D)" > "$(libdispatch_path)/.__tmp__" \
&& $(HELP) mv -f "$(libdispatch_path)/.__tmp__" "$(libdispatch_path)/$(XCCONF_D)"
@$(HELP) awk '/#include / { next; } { print $0 }' "$(libdispatch_path)/$(XCCONF_FH)" > "$(libdispatch_path)/.__tmp__" \
&& $(HELP) mv -f "$(libdispatch_path)/.__tmp__" "$(libdispatch_path)/$(XCCONF_FH)"
@$(HELP) mkdir -p "$(libdispatch_path)/obj" "$(libdispatch_path)/sym" "$(libdispatch_path)/dst"
@$(HELP) cd $(libdispatch_path) && $(HELP) xcodebuild install -sdk macosx -target libfirehose_kernel \
SRCROOT="$(libdispatch_path)" OBJROOT="$(libdispatch_path)/obj" \
SYMROOT="$(libdispatch_path)/sym" DSTROOT="$(libdispatch_path)/dst"
ifeq ($(findstring 11.,$(macos_version)),11.)
xnu-installhdrs: ARCHS=X86_64 ARM64
else
xnu-installhdrs: libplatform
xnu-installhdrs: ARCHS=X86_64
endif
xnu-installhdrs: dtrace AvailabilityVersions
@echo "[INFO] Installing XNU headers into the SDK..."
@$(HELP) cd "$(xnu_path)" && $(HELP) make XNU_LOGCOLORS=y SDKROOT=macosx ARCH_CONFIGS="$(ARCHS)" installhdrs
$(HELP) sudo ditto "$(xnu_path)/BUILD/dst" "$(SDKPATH)"
.SECONDEXPANSION:
xnu-installhdrs: $$(xnu_src)/.src
ifeq ($(findstring 10.15,$(macos_version)),10.15)
xnu: xnu-fixups
else ifeq ($(findstring 10.14,$(macos_version)),10.14)
xnu: xnu-fixups
else ifeq ($(findstring 10.13,$(macos_version)),10.13)
xnu: xnu-fixups
endif
xnu: dtrace AvailabilityVersions libdispatch xnu-fixups
@echo
@echo "--------------------------------------------------"
@echo "XNU is now ready to build!"
@echo "You can:"
@echo "cd $(xnu_src)"
@echo "make SDKROOT=macosx ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=RELEASE"
@echo
@echo "See xnu's top-level README file for additional build and configuration variables"
@echo "which can be passed on the command line, e.g.,"
@echo " Speed up the build with: BUILD_LTO=0"
@echo " Build the development kernel with: KERNEL_CONFIGS=DEVELOPMENT"
@echo
@echo "Use LOGCOLORS=y to colorize the output"
@echo "Use CONCISE=y to keep all the build output on a single line"
@echo "--------------------------------------------------"
@echo
#
# macOS version-specific source fixups necessary to compile and link a kernel
#
.PHONY: xnu-fixups
xnu-fixups:
@echo
ifeq ($(findstring 10.13,$(macos_version)),10.13)
xnu-fixups: xnu-fixups-10.13
else ifeq ($(findstring 10.14,$(macos_version)),10.14)
xnu-fixups: xnu-fixups-10.14.1
else ifeq ($(findstring 10.15.6,$(macos_version)),10.15.6)
xnu-fixups: xnu-fixups-10.15.6
else ifeq ($(findstring 10.15.5,$(macos_version)),10.15.5)
xnu-fixups: xnu-fixups-10.15.4
else ifeq ($(findstring 10.15.4,$(macos_version)),10.15.4)
xnu-fixups: xnu-fixups-10.15.4
else ifeq ($(findstring 10.15.3,$(macos_version)),10.15.3)
xnu-fixups: xnu-fixups-10.15.3
else ifeq ($(findstring 10.15,$(macos_version)),10.15)
xnu-fixups: xnu-fixups-10.15
endif
.SECONDEXPANSION:
xnu-fixups: $$(xnu_src)/.src
.SECONDEXPANSION:
xnu-fixups-10.13: $$(xnu_src)/.src
xnu-fixups-10.13:
# Fixup KASAN build on 10.13.x
@$(HELP) touch "$(xnu_src)/san/kasan-blacklist-dynamic"
.SECONDEXPANSION:
xnu-fixups-10.14.1: $$(xnu_src)/.src
xnu-fixups-10.14.1:
# Fixup 10.14.1 build
@echo "[FIXUP] IOPerfControl..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__1" ]; then \
$(HELP) echo "iokit/Kernel/IOPerfControl.cpp optional iokitcpp" >> "$(xnu_src)/iokit/conf/files"; \
$(HELP) touch "$(xnu_src)/.$@__1"; \
fi
@echo "[FIXUP] mach_bridge_remote_time..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__2" ]; then \
$(HELP) echo "uint64_t mach_bridge_remote_time(uint64_t a); uint64_t mach_bridge_remote_time(uint64_t a) { (void)a; return 0; }" >> "$(xnu_src)/osfmk/kern/timer.c"; \
$(HELP) echo "void mach_bridge_register_regwrite_timestamp_callback(void (*func)(uint64_t)); void mach_bridge_register_regwrite_timestamp_callback(void (*func)(uint64_t)) { (void)func; return; }" >> "$(xnu_src)/osfmk/kern/timer.c"; \
$(HELP) touch "$(xnu_src)/.$@__2"; \
fi
@echo "[FIXUP] networking (1/3)..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__3" ]; then \
$(HELP) echo "__attribute__((noreturn)) int network__stub__(void);" >> "$(xnu_src)/bsd/kern/kern_xxx.c"; \
$(HELP) echo "int network__stub__(void) { panic(\"unimplemented network stub\"); __builtin_unreachable(); }" >> "$(xnu_src)/bsd/kern/kern_xxx.c"; \
$(HELP) echo "__attribute__((noreturn)) int network__stub1__(void);" >> "$(xnu_src)/bsd/kern/kern_xxx.c"; \
$(HELP) echo "int network__stub1__(void) { panic(\"unimplemented network stub\"); __builtin_unreachable(); }" >> "$(xnu_src)/bsd/kern/kern_xxx.c"; \
$(HELP) touch "$(xnu_src)/.$@__3"; \
fi
@echo "[FIXUP] networking (2/3)..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__4" ]; then \
$(HELP) echo "const OSSymbol *IOSKCopyKextIdentifierWithAddress(vm_address_t a);" >> "$(xnu_src)/iokit/Kernel/IOWorkLoop.cpp"; \
$(HELP) echo "const OSSymbol *IOSKCopyKextIdentifierWithAddress(vm_address_t a) { OSKext *k = OSKext::lookupKextWithAddress(a); if (k) { const OSSymbol *s = k->getIdentifier(); k->release(); if (s) { s->retain(); return s; } } return NULL; }" >> "$(xnu_src)/iokit/Kernel/IOWorkLoop.cpp"; \
$(HELP) touch "$(xnu_src)/.$@__4"; \
fi
@echo "[FIXUP] networking (3/3)..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__5" ]; then \
$(HELP) echo "_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "__Z33IOSKCopyKextIdentifierWithAddressm" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_buflet_get_data_length:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_buflet_get_data_limit:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_buflet_get_data_offset:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_buflet_get_object_address:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_buflet_get_object_offset:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_buflet_get_object_segment:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_buflet_set_data_length:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_buflet_set_data_offset:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_advance_slot:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_available_slot_count:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_get_context:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_get_next_slot:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_get_service_class:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_increment_ring_net_stats:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_increment_ring_stats:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_notify:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_reclaim:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_ring_get_container:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_ring_get_context:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_slot_attach_packet:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_slot_detach_packet:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_slot_get_context:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_slot_get_packet:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_channel_tx_refill:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_copy_and_inet_checksum:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_inet_checksum:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_attr_clone:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_attr_create:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_attr_destroy:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_attr_get:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_attr_set:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_controller_alloc_net_provider_instance:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_controller_alloc_provider_instance:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_controller_bind_provider_instance:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_controller_create:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_controller_deregister_provider:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_controller_destroy:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_controller_free_provider_instance:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_controller_read_provider_attr:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_controller_register_provider:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_controller_unbind_provider_instance:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_deregister_domain_provider:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_get_builtin_domain_provider:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_get_context:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_get_pbufpool:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_nexus_register_domain_provider:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_clear_flow_uuid:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_finalize:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_buflet_count:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_data_length:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_euuid:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_flow_uuid:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_inet_checksum:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_link_broadcast:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_link_ethfcs:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_link_header_offset:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_link_multicast:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_network_header_offset:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_next_buflet:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_object_index:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_policy_id:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_service_class:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_service_class_index:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_timestamp:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_timestamp_requested:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_traffic_class:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_transport_header_offset:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_transport_last_packet:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_transport_new_flow:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_transport_retransmit:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_transport_traffic_background:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_transport_traffic_realtime:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_get_tx_completion_status:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_flow_uuid:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_inet_checksum:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_link_broadcast:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_link_ethfcs:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_link_header_offset:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_link_multicast:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_network_header_offset:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_policy_id:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_service_class:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_timestamp:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_traffic_class:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_transport_header_offset:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_set_tx_completion_status:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_packet_tx_completion:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_pbufpool_alloc:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_pbufpool_alloc_batch:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_pbufpool_alloc_batch_nosleep:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_pbufpool_alloc_nosleep:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_pbufpool_create:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_pbufpool_destroy:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_pbufpool_free:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_pbufpool_free_batch:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_pbufpool_get_context:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_pbufpool_get_memory_info:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_kern_segment_get_index:_network__stub__" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) touch "$(xnu_src)/.$@__5"; \
fi
@echo "[FIXUP] xcpm..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__6" ]; then \
$(HELP) echo "uint32_t xcpm_bios_mbox_cmd_read(uint32_t a); static uint32_t __xcpm_reg[64] = {};" >> "$(xnu_src)/osfmk/x86_64/loose_ends.c"; \
$(HELP) echo "uint32_t xcpm_bios_mbox_cmd_read(uint32_t a) { return __xcpm_reg[a%64]; }" >> "$(xnu_src)/osfmk/x86_64/loose_ends.c"; \
$(HELP) echo "void xcpm_bios_mbox_cmd_write(uint32_t a, uint32_t b);" >> "$(xnu_src)/osfmk/x86_64/loose_ends.c"; \
$(HELP) echo "void xcpm_bios_mbox_cmd_write(uint32_t a, uint32_t b) { __xcpm_reg[a%64] = b; }" >> "$(xnu_src)/osfmk/x86_64/loose_ends.c"; \
$(HELP) echo "boolean_t xcpm_is_hwp_enabled(void);" >> "$(xnu_src)/osfmk/x86_64/loose_ends.c"; \
$(HELP) echo "boolean_t xcpm_is_hwp_enabled(void) { return 0; }" >> "$(xnu_src)/osfmk/x86_64/loose_ends.c"; \
$(HELP) echo "void xcpm_mbox_lock(void);" >> "$(xnu_src)/osfmk/x86_64/loose_ends.c"; \
$(HELP) echo "void xcpm_mbox_lock(void) {}" >> "$(xnu_src)/osfmk/x86_64/loose_ends.c"; \
$(HELP) echo "_xcpm_bios_mbox_cmd_read" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_xcpm_bios_mbox_cmd_unsafe_read:_xcpm_bios_mbox_cmd_read" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_xcpm_bios_mbox_cmd_write" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_xcpm_is_hwp_enabled" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_xcpm_mbox_lock" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_xcpm_mbox_unlock:_xcpm_mbox_lock" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) touch "$(xnu_src)/.$@__6"; \
fi
@echo "[FIXUP] pmap..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__7" ]; then \
$(HELP) echo "bool pmap_is_trust_cache_loaded(void);" >> "$(xnu_src)/osfmk/x86_64/pmap.c"; \
$(HELP) echo "bool pmap_is_trust_cache_loaded(void) { return false; }" >> "$(xnu_src)/osfmk/x86_64/pmap.c"; \
$(HELP) echo "int pmap_load_image4_trust_cache(void);" >> "$(xnu_src)/osfmk/x86_64/pmap.c"; \
$(HELP) echo "int pmap_load_image4_trust_cache(void) { return -1; }" >> "$(xnu_src)/osfmk/x86_64/pmap.c"; \
$(HELP) echo "kern_return_t pmap_load_legacy_trust_cache(void);" >> "$(xnu_src)/osfmk/x86_64/pmap.c"; \
$(HELP) echo "kern_return_t pmap_load_legacy_trust_cache(void) { return KERN_NOT_SUPPORTED; }" >> "$(xnu_src)/osfmk/x86_64/pmap.c"; \
$(HELP) echo "_pmap_is_trust_cache_loaded" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_pmap_load_image4_trust_cache" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_pmap_load_legacy_trust_cache" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_pmap_lookup_in_loaded_trust_cache:_pmap_is_trust_cache_loaded" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) echo "_pmap_lookup_in_static_trust_cache:_pmap_is_trust_cache_loaded" >> "$(xnu_src)/config/Private.exports"; \
$(HELP) touch "$(xnu_src)/.$@__7"; \
fi
@echo "[FIXUP] done."
.SECONDEXPANSION:
xnu-fixups-10.15: $$(xnu_src)/.src
xnu-fixups-10.15:
@echo "[FIXUP] cpuid.c ..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__1" ]; then \
$(HELP) sed -i -e 's/outl(cfgAdr, XeonCapID5);//; s/uint32_t cap5reg = inl(cfgDat);/uint32_t cap5reg = 0;/' $(xnu_src)/osfmk/i386/cpuid.h; \
$(HELP) touch "$(xnu_src)/.$@__1"; \
fi
@echo "[FIXUP] squashing Werror warnings ..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__2" ]; then \
$(HELP) awk '/^subr_prof.o_CFLAGS/ { print "nfs_subs.o_CFLAGS_ADD += -Wno-unused-parameter"; print "nfs_vfsops.o_CFLAGS_ADD += -Wno-unused-parameter -Wno-unused-variable"; print "nfs_vnops.o_CFLAGS_ADD += -Wno-unused-function"; print "if_ipsec.o_CFLAGS_ADD += -Wno-unused-function"; } { print $0 }' $(xnu_src)/bsd/conf/Makefile.template > $(xnu_src)/.__tmp__ && mv $(xnu_src)/.__tmp__ $(xnu_src)/bsd/conf/Makefile.template; \
$(HELP) touch "$(xnu_src)/.$@__2"; \
fi
@echo "[FIXUP] networking ..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__3" ]; then \
$(HELP) sed -i -e 's/^notsup:$$//' $(xnu_src)/bsd/nfs/nfs_node.c; \
$(HELP) awk '/include <net\/if_utun.h>/ { print "#include <net/if_vlan_var.h>"; } { print $0 }' $(xnu_src)/bsd/net/dlil.c > $(xnu_src)/.__tmp__ && mv $(xnu_src)/.__tmp__ $(xnu_src)/bsd/net/dlil.c; \
$(HELP) sed -i -e 's/\(if_headless_init.*\)/\1;void \1/' $(xnu_src)/bsd/net/if_headless.c; \
$(HELP) sed -i -e '/if (pcb->ipsec_kpipe_count == 0.*/{N;N;N;N;d;}' $(xnu_src)/bsd/net/if_ipsec.c; \
$(HELP) touch "$(xnu_src)/.$@__3"; \
fi
@echo "[FIXUP] export lists ..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__exp" ]; then \
$(HELP) echo "_pmap_in_ppl\n_pmap_free_reserved_ppl_page\n_pmap_claim_reserved_ppl_page" >> $(xnu_src)/config/Private.exports; \
$(HELP) touch "$(xnu_src)/.$@__exp"; \
fi
.SECONDEXPANSION:
xnu-fixups-10.15.3: $$(xnu_src)/.src
xnu-fixups-10.15.3: xnu-fixups-10.15
@echo "[FIXUP] networking (10.15.3) ..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__4" ]; then \
$(HELP) sed -i -e '/nfs4_delegreturn_rpc(.*/{N;d;}' $(xnu_src)/bsd/nfs/nfs_node.c; \
$(HELP) touch "$(xnu_src)/.$@__4"; \
fi
@echo "[FIXUP] dtrace link error ..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__5" ]; then \
$(HELP) sed -i -e '1{x;p;x;}' osfmk/vm/vm_fault.c; \
$(HELP) touch "$(xnu_src)/.$@__5"; \
fi
.SECONDEXPANSION:
xnu-fixups-10.15.4: $$(xnu_src)/.src
xnu-fixups-10.15.4: xnu-fixups-10.15
@echo "[FIXUP] networking (10.15.3) ..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__6" ]; then \
$(HELP) sed -i -e '/nfs4_delegreturn_rpc(.*/{N;d;}' $(xnu_src)/bsd/nfs/nfs_node.c; \
$(HELP) touch "$(xnu_src)/.$@__6"; \
fi
@echo "[FIXUP] networking (10.15.4) ..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__7" ]; then \
$(HELP) awk '/include <net\/net_api_stats.h>/ { print "#include <net/pfvar.h>"; } { print $0 }' $(xnu_src)/bsd/net/if_bridge.c > $(xnu_src)/.__tmp__ && mv $(xnu_src)/.__tmp__ $(xnu_src)/bsd/net/if_bridge.c; \
$(HELP) touch "$(xnu_src)/.$@__7"; \
fi
.SECONDEXPANSION:
xnu-fixups-10.15.6: $$(xnu_src)/.src
xnu-fixups-10.15.6: xnu-fixups-10.15.4
@echo "[FIXUP] unused variable ..."
@$(HELP) if [ ! -f "$(xnu_src)/.$@__8" ]; then \
$(HELP) sed -i -e '/cwa_classifier_e wa_reqd;/d' $(xnu_src)/osfmk/i386/cpuid.c; \
awk '/IOPMrootDomain.cpo_CXX/{ print "IODMACommand.iig.cpo_CXXWARNFLAGS_ADD += -Wno-duplicate-decl-specifier"; } { print $0 }' $(xnu_src)/iokit/conf/Makefile.template > $(xnu_src)/.__tmp__ && mv $(xnu_src)/.__tmp__ $(xnu_src)/iokit/conf/Makefile.template; \
$(HELP) touch "$(xnu_src)/.$@__8"; \
fi
ifeq ($(findstring 11.,$(macos_version)),11.)
Libsystem: ARCHS = x86_64 arm64
libsyscall: ARCHS = x86_64 arm64
else
Libsystem: ARCHS = x86_64 i386
libsyscall: ARCHS = x86_64 i386
endif
Libsystem:
@$(HELP) mkdir -p $(SRCDIR)/dst $(SRCDIR)/obj $(SRCDIR)/sym
@$(HELP) cd $(SRCDIR) && $(HELP) xcodebuild installhdrs -sdk macosx ARCHS='$(ARCHS)' VALID_ARCHS='$(ARCHS)' SRCROOT="$(SRCDIR)" OBJROOT="$(SRCDIR)/obj" DSTROOT="$(SRCDIR)/dst"
$(HELP) sudo ditto "$(SRCDIR)/dst" "$(SDKPATH)"
libsyscall: BUILDDIR=$(xnu_path)/BUILD.libsyscall
libsyscall: dtrace AvailabilityVersions libdispatch Libsystem
# install XNU and Libsyscall headers
@$(HELP) mkdir -p "$(xnu_path)/BUILD.hdrs/dst" "$(xnu_path)/BUILD.hdrs/obj" "$(xnu_path)/BUILD.hdrs/sym"
@$(HELP) cd "$(xnu_path)" && $(HELP) make installhdrs XNU_LOGCOLORS=y SDKROOT=macosx ARCH_CONFIGS=X86_64 SRCROOT="$(xnu_path)" OBJROOT="$(xnu_path)/BUILD.hdrs/obj" SYMROOT="$(xnu_path)/BUILD.hdrs/sym" DSTROOT="$(xnu_path)/BUILD.hdrs/dst"
ifeq ($(findstring 10.14.1,$(macos_version)),10.14.1)
# There are a few missing bits in libsyscall :-(
@$(HELP) touch "$(xnu_path)/libsyscall/os/thread_self_restrict.h"
@$(HELP) mkdir -p "$(xnu_path)/libsyscall/wrappers/skywalk"
@$(HELP) touch "$(xnu_path)/libsyscall/wrappers/skywalk/os_packet.c"
@$(HELP) touch "$(xnu_path)/libsyscall/wrappers/skywalk/os_channel.c"
@$(HELP) touch "$(xnu_path)/libsyscall/wrappers/skywalk/os_nexus.c"
@$(HELP) touch "$(xnu_path)/libsyscall/wrappers/skywalk/cpu_in_cksum_gen.c"
@$(HELP) touch "$(xnu_path)/libsyscall/wrappers/skywalk/cpu_copy_in_cksum_gen.c"
@$(HELP) touch "$(xnu_path)/libsyscall/wrappers/skywalk/cpu_in_cksum.s"
@$(HELP) touch "$(xnu_path)/libsyscall/wrappers/skywalk/cpu_copy_in_cksum.s"
@$(HELP) sed -iE 's/ -lCrashReporterClient//' "$(xnu_path)/libsyscall/Libsyscall.xcconfig"
endif
@$(HELP) cd "$(xnu_path)" && $(HELP) make installhdrs XNU_LOGCOLORS=y RC_ProjectName=Libsyscall SDKROOT=macosx RC_ARCHS='$(ARCHS)' VALID_ARCHS='$(ARCHS)' OBJROOT="$(xnu_path)/BUILD.hdrs/obj" SYMROOT="$(xnu_path)/BUILD.hdrs/sym" DSTROOT="$(xnu_path)/BUILD.hdrs/dst"
$(HELP) sudo ditto "$(xnu_path)/BUILD.hdrs/dst" "$(SDKPATH)"
# Build Libsyscall
@$(HELP) mkdir -p "$(BUILDDIR)/dst" "$(BUILDDIR)/obj" "$(BUILDDIR)/sym"
@$(HELP) cd "$(xnu_path)" && $(HELP) make install XNU_LOGCOLORS=y RC_ProjectName=Libsyscall RC_ARCHS='x86_64 i386' SDKROOT=macosx OBJROOT="$(BUILDDIR)/obj" SYMROOT="$(BUILDDIR)/sym" DSTROOT="$(BUILDDIR)/dst"
help-libsyscall: HELP=echo CMD:
help-libsyscall: libsyscall
.SECONDEXPANSION:
libsyscall: $$(xnu_src)/.src
libsyscall_install: libsyscall
$(HELP) sudo ditto "$(xnu_src)/BUILD.libsyscall/dst/usr/lib/system" "/usr/lib/system"
$(HELP) sudo update_dyld_shared_cache
@echo
@echo "A new libsyscall has been installed in: /usr/lib/system"
@echo "You must reboot for this change to take effect."
@echo
help-libsyscall_install: HELP=echo CMD:
help-libsyscall_install: libsyscall
# --------------------------------------------------
#
# Below this point are macros which download, and
# extract source. The URLs from which the source is
# downloaded is calculated by scraping the Apple
# opensource website for the specified macos_version
# (see RELEASE_URL definition).
#
# --------------------------------------------------
download:
@echo "All source downloaded"
define download_tarball
$(1)_version ?= $$(shell curl -s $$(RELEASE_URL) | grep "$(1)" | grep tarballs/ | sed "s/.*\/$(1)-\(.*\).tar.gz\".*/\1/")
$(1)_tarball := $(1)-$$($(1)_version).tar.gz
$(1)_tarball_url := $$(TARBALL_URL)/$(1)/$(1)-$$($(1)_version).tar.gz
$(1)_src := $(1)-$$($(1)_version)
$(1)_path := $$(shell pwd)/$(1)-$$($(1)_version)
$(1)_ver_err := Couldn't determine version of $(1) ($$($(1)_version)) from $$(RELEASE_URL). Are you connected to the Internet?
#$(1)-$$($(1)_version).tar.gz:
$$($(1)_tarball):
@echo "Downloading $(1) v$$($(1)_version)..."
@if [ -z "$$($(1)_version)" ]; then $(MAKE) -f $(lastword $(MAKEFILE_LIST)) ERROR="$$($(1)_ver_err)" err; fi
@$$(HELP) curl -O $$($(1)_tarball_url)
$$($(1)_src)/.src: $$($(1)_tarball)
@echo "Unpacking $(1)..."
@$$(HELP) tar zxf $$<
@$$(HELP) touch $$@
$(1): $$($(1)_src)/.src
$(1): SRCDIR=$$($(1)_path)
.PHONY: clean-$(1) $$($(1)_vers)
clean-$(1):
rm -rf $$($(1)_src)
rm -f $$($(1)_tarball)
help-$(1): HELP=echo CMD:
help-$(1): $(1)
echo
download: $$($(1)_src)/.src
download-$(1): $$($(1)_tarball)
ver-$(1):
@if [ -z "$$($(1)_version)" ]; then $(MAKE) -f $(lastword $(MAKEFILE_LIST)) ERROR="$$($(1)_ver_err)" err; fi
@echo "$(1)-$$($(1)_version) : $$($(1)_tarball_url)"
endef
$(foreach pkg,$(PKGS),$(eval $(call download_tarball,$(pkg))))
getvers: $(foreach pkg,$(PKGS),ver-$(pkg))
@echo "macOS: $(macos_version)"
err:
$(error $(ERROR))
clean: $(foreach pkg,$(PKGS),clean-$(pkg))
help: check_tools
@echo "Available targets:"
@echo " xnudeps"
@echo " download"
@echo " clean"
@echo " $(PKGS) libsyscall libsyscall_install"
@echo " $(PKGS:%=help-%) help-libsyscall help-libsyscall_install"
@echo
@echo "default: xnudeps"
@echo
@echo "Use the macos_version variable to set the version of "
@echo "macOS for which you would like to compile, e.g."
@echo
@echo "default: macos_version=$(macos_version)"
@echo
@echo "TOOLCHAIN_PATH: $(TOOLCHAIN_PATH)"
@echo "SDKPATH: $(SDKPATH)"
@echo "XCODEPATH: $(XCODEPATH)"
.PHONY: err getvers help clean check_tools
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment