make ARCH_CONFIGS=X86_64
-2) Building a Component
-
- Go to the top directory in your XNU project.
-
- If you are using a sh-style shell, run the following command:
- $ . SETUP/setup.sh
-
- If you are using a csh-style shell, run the following command:
- % source SETUP/setup.csh
-
- This will define the following environmental variables:
- SRCROOT, OBJROOT, DSTROOT, SYMROOT
-
- From a component top directory:
-
- $ make all
-
- This builds a component for all architectures, kernel configurations, and
- machine configurations defined in TARGET_CONFIGS (or alternately ARCH_CONFIGS
- and KERNEL_CONFIGS).
-
- Example:
- $(OBJROOT)/RELEASE_X86_64/osfmk/RELEASE/osfmk.filelist: list of objects in osfmk component
-
- From the component top directory:
-
- $ make mach_kernel
-
- This includes your component in the bootable image, mach_kernel, and
- in the kernel binary with symbols, mach_kernel.sys.
-
- WARNING: If a component header file has been modified, you will have to do
- the above procedure 1.
-
-3) Building DEBUG
+2) Building DEBUG
Define kernel configuration to DEBUG in your environment or when running a
make command. Then, apply procedures 4, 5
$(OBJROOT)/DEBUG_X86_64/osfmk/DEBUG/osfmk.filelist: list of objects in osfmk component
$(OBJROOT)/DEBUG_X86_64/mach_kernel: bootable image
-4) Building fat
+3) Building fat
Define architectures in your environment or when running a make command.
Apply procedures 3, 4, 5
$ export ARCH_CONFIGS="I386 X86_64"
$ make exporthdrs all
-5) Verbose make
+4) Verbose make
To display complete tool invocations rather than an abbreviated version,
$ make VERBOSE=YES
-6) Debug information formats
+5) Debug information formats
By default, a DWARF debug information repository is created during the install phase; this is a "bundle" named mach_kernel.dSYM
To select the older STABS debug information format (where debug information is embedded in the mach_kernel.sys image), set the BUILD_STABS environment variable.
$ export BUILD_STABS=1
$ make
-7) Build check before integration
+6) Build check before integration
From the top directory, run:
produce different results. Each build alias supports the standard
"clean", "install", "installsrc", "installhdrs" targets, but
conditionalize their behavior on the RC_ProjectName make variable
- which is passed as the -project argument to ~rc/bin/buildit, which
+ which is passed as the -buildAlias argument to ~rc/bin/buildit, which
can be one of:
- -project xnu # the default, builds /mach_kernel, kernel-space
- # headers, user-space headers, man pages,
- # symbol-set kexts
+ -buildAlias xnu # the default, builds /mach_kernel, kernel-space
+ # headers, user-space headers, man pages,
+ # symbol-set kexts
+
+ -buildAlias xnu_debug # a DEBUG kernel in /AppleInternal with dSYM
- -project xnu_debug # a DEBUG kernel in /AppleInternal with dSYM
+ -buildAlias libkxld # user-space version of kernel linker
- -project libkxld # user-space version of kernel linker
+ -buildAlias libkmod # static library automatically linked into kexts
- -project libkmod # static library automatically linked into kexts
+ -buildAlias Libsyscall # automatically generate BSD syscall stubs
- -project Libsyscall # automatically generate BSD syscall stubs
+ -buildAlias xnu_quick_test # install xnu unit tests
-8) Creating tags and cscope
+7) Creating tags and cscope
Set up your build environment as per instructions in 2a
$ make cscope # this will build cscope database
+8) Reindenting files
+
+ Source files can be reindented using clang-format setup in .clang-format. XNU follow a variant of WebKit style for source code formatting. Please refer to format styles at http://www.webkit.org/coding/coding-style.html. Further options about style options is available at http://clang.llvm.org/docs/ClangFormatStyleOptions.html
+
+ Note: clang-format binary may not be part of base installation. It can be compiled from llvm clang sources and is reachable in $PATH.
+
+ From the top directory, run:
+
+ $ make reindent # reindent all source files using clang format.
+
+
9) Other makefile options
- $ make MAKEJOBS=-j8 # this will use 8 processes during the build. The default is 2x the number of active cores
+ $ make MAKEJOBS=-j8 # this will use 8 processes during the build. The default is 2x the number of active CPUS.
+ $ make -j8 # the standard command-line option is also accepted
$ make -w # trace recursive make invocations. Useful in combination with VERBOSE=YES
- $ make BUILD_LTO=1 # build with LLVM Link Time Optimization (experimental)
+ $ make BUILD_LTO=0 # build without LLVM Link Time Optimization
+
+ $ make REMOTEBUILD=user@remotehost # perform build on remote host
- $ make BUILD_INTEGRATED_ASSEMBLER=1 # build with LLVM integrated assembler (experimental)
+ $ make BUILD_JSON_COMPILATION_DATABASE=1 # Build Clang JSON Compilation Database
=============================================
B. How to install a new header file from XNU
-[Note: This does not cover installing header files in IOKit framework]
+[To install IOKit headers, see additional comments in iokit/IOKit/Makefile.]
1) XNU installs header files at the following locations -
a. $(DSTROOT)/System/Library/Frameworks/Kernel.framework/Headers
b. $(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders
- c. $(DSTROOT)/System/Library/Frameworks/System.framework/Headers
+ c. $(DSTROOT)/usr/include/
d. $(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeaders
- e. $(DSTROOT)/usr/include/
Kernel.framework is used by kernel extensions. System.framework
and /usr/include are used by user level applications. The header
from each file list are -
a. DATAFILES : To make header file available in user level -
- $(DSTROOT)/System/Library/Frameworks/System.framework/Headers
- $(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeaders
- $(DSTROOT)/usr/include/
+ $(DSTROOT)/usr/include
b. PRIVATE_DATAFILES : To make header file available to Apple internal in
user level -
by adding the appropriate file lists. The default install lists, its
member file lists and their default location are described below -
- a. INSTALL_MI_LIST : Installs header file to location that is available to
+ a. INSTALL_MI_LIST : Installs header file to a location that is available to
everyone in user level.
Locations -
- $(DSTROOT)/System/Library/Frameworks/System.framework/Headers
- $(DSTROOT)/usr/include/
+ $(DSTROOT)/usr/include
Definition -
INSTALL_MI_LIST = ${DATAFILES}
- b. INSTALL_MI_LCL_LIST : Installs header file to location that is available
+ b. INSTALL_MI_LCL_LIST : Installs header file to a location that is available
for Apple internal in user level.
Locations -
$(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeaders
Definition -
- INSTALL_MI_LCL_LIST = ${DATAFILES} ${PRIVATE_DATAFILES}
+ INSTALL_MI_LCL_LIST = ${PRIVATE_DATAFILES}
c. INSTALL_KF_MI_LIST : Installs header file to location that is available
to everyone for kernel extensions.