Search notes:

Linux kernel compilation: make

make targets

make or make all builds the targets: vmlinux, bzImage and modules, see also the ./README file.
make help prints a summary of make targets:

Cleaning targets

clean Remove most generated files but keep the .config and enough build support to build external modules
mrproper Remove all generated files, config and various backup files
distclean mrproper and remove editor backup and patch files

Configuration targets

config Update current config utilising a line-oriented («plain-text») program
nconfig Update current config utilising a ncurses menu based program (requires ncurses)
menuconfig Update current config utilising a menu based (menus, radiolists, dialogs) program: mconf, see scripts/kconfig/mconf.c. Requires ncurses.
xconfig Update current config utilising a Qt based front-end (qconf, see scripts/kconfig/qconf.cc)
gconfig Update current config utilising a GTK+ based front-end
oldconfig Update current config utilising a provided .config as base (Default all questions based on the contents of your existing ./.config file and asking about new config symbols.)
olddefconfig Same as oldconfig but sets new symbols to their default value without prompting
defconfig Creates a new configuration file (typically .config) with default values from arch/$SRCARCH/configs/defconfig or arch/$SRCARCH/configs/${PLATFORM}_defconfig, depending on the architecture.
localmodconfig Update current config disabling modules not loaded (lsmod) except those preserved by LMC_KEEP environment variable. Disables any module option that is not needed for the loaded modules.
localyesconfig Update current config converting local mods to core except those preserved by LMC_KEEP environment variable
savedefconfig Save current config as ./defconfig (minimal config)
allnoconfig New config where all options are answered with no (n)
allyesconfig New config where all options are accepted with yes (y)
allmodconfig New config selecting modules (answering with m) when possible
alldefconfig New config with all symbols set to default
randconfig New config with random answers to all options
yes2modconfig Change answers from yes to mod if possible
mod2yesconfig Change answers from mod to yes if possible
mod2noconfig Change answers from mod to no if possible
listnewconfig List new CONFIG options
helpnewconfig List new options and help text
tinyconfig Configure the tiniest possible kernel
testconfig Run Kconfig unit tests (requires python3 and pytest)
${PLATFORM}_defconfig creates a ./.config file by using the default symbol values from arch/$ARCH/configs/${PLATFORM}_defconfig. Use make help to get a list of all available platforms of your architecture.
Most (if not all) of the configuration targets are defined in scripts/kconfig/Makefile.
When executing make with one of these targets, the executable scripts/kconfig/conf is called with the corresponding command line option.
Documentation/kbuild/kconfig.rst contains some notes on using make *config.

Generation of «identifier index files» for editors

The following four targes implicitly call scripts/tags.sh.
tags Generate tags file for editors. Requires ctags binary to be installed separately..
TAGS Generate tags file for editors. Requires etags binary to be installed separately.
cscope Generates a cscope index. Requires cscope binary to be installed separately.
gtags Generate GNU global index. Requires gtags binary to be installed separately.

Other generic targets

all Build vmlinux, modules and bzImage.
vmlinux Build the bare kernel (i. e. vmlinux). Compare with target bzImage.
modules Build all modules
modules_install Install all modules to INSTALL_MOD_PATH (default: /). This target essentially invokes make -f ./scripts/Makefile.modinst and ./scripts/depmod.sh depmod …
dir/ Build all files in dir and below
dir/file.[ois] Build specified target only
dir/file.ll Build the LLVM assembly file (requires compiler support for LLVM assembly generation)
dir/file.lst Build specified mixed source/assembly target only (requires a recent binutils and recent build (System.map))
dir/file.ko Build module including final link
modules_prepare Set up for building external modules
kernelrelease Output the release version string (use with make -s)
kernelversion Output the version stored in Makefile (use with make -s)
image_name Output the image name (use with make -s)
headers_install Installs kernel headers to INSTALL_HDR_PATH (default: ./usr). The headers are sanitized to make them suitable for use by userspace programs. Requires rsync. See also scripts/headers_install.sh and Documentation/kbuild/headers_install.rst.

Static analysers

checkstack Generate a list of stack hogs
versioncheck Sanity check on version.h usage
includecheck Check for duplicate included header files
export_report List the usages of all exported symbols
headerdep Detect inclusion cycles in headers
coccicheck Check with Coccinelle
clang-analyzer Check with clang static analyzer
clang-tidy Check with clang-tidy

Tools

nsdeps Generate missing symbol namespace dependencies

Kernel selftest

kselftest Build and run kernel selftest Build, install, and boot kernel before running kselftest on it. Run as root for full coverage
kselftest-all Build kernel selftest
kselftest-install Build and install kernel selftest
kselftest-clean Remove all generated kselftest files
kselftest-merge Merge all the config dependencies of kselftest to existing .config.

Rust targets

rustavailable Checks whether the Rust toolchain is available and, if not, explains why. (make LLVM=1 rustavailable triggers the same logic used by Kconfig to determine whter RUST_IS_AVAILABLE should be enabled).
rustfmt Reformat all the Rust code in the kernel
rustfmtcheck Checks if all the Rust code in the kernel is formatted, printing a diff otherwise.
rustdoc Generate Rust documentation (requires kernel .config)
rusttest Runs the Rust tests (requires kernel .config; downloads external repos)
rust-analyzer Generate rust-project.json rust-analyzer support file (requires kernel .config)
dir/file.[os] Build specified target only
dir/file.rsi Build macro expanded source, similar to C preprocessing. Run with RUSTFMT=n to skip reformatting if needed. The output is not intended to be compilable.
dir/file.ll Build the LLVM assembly file

Userspace tools targets

use make tools/help or cd tools; make help

Kernel packaging

rpm-pkg Build both source and binary RPM kernel packages
srcrpm-pkg Build only the source kernel RPM package
binrpm-pkg Build only the binary kernel RPM package
deb-pkg Build both source and binary deb kernel packages
srcdeb-pkg Build only the source kernel deb package
bindeb-pkg Build only the binary kernel deb package
snap-pkg Build only the binary kernel snap package (will connect to external hosts)
dir-pkg Build the kernel as a plain directory structure
tar-pkg Build the kernel as an uncompressed tarball
targz-pkg Build the kernel as a gzip compressed tarball
tarbz2-pkg Build the kernel as a bzip2 compressed tarball
tarxz-pkg Build the kernel as a xz compressed tarball
tarzst-pkg Build the kernel as a zstd compressed tarball
perf-tar-src-pkg Build the perf source tarball with no compression
perf-targz-src-pkg Build the perf source tarball with gzip compression
perf-tarbz2-src-pkg Build the perf source tarball with bz2 compression
perf-tarxz-src-pkg Build the perf source tarball with xz compression
perf-tarzst-src-pkg Build the perf source tarball with zst compression

Documentation targets

Linux kernel internal documentation in different formats from ReST:
htmldocs HTML
texinfodocs Texinfo
infodocs Info
latexdocs LaTeX
pdfdocs PDF
epubdocs EPUB
xmldocs XML
linkcheckdocs check for broken external links (will connect to external hosts)
refcheckdocs check for references to non-existing files under Documentation
cleandocs clean all generated files
make SPHINXDIRS="s1 s2" [target] Generate only docs of folder s1, s2
valid values for SPHINXDIRS are: PCI RCU accel accounting admin-guide arch block bpf cdrom core-api cpu-freq crypto dev-tools devicetree doc-guide driver-api fault-injection fb filesystems firmware-guide fpga gpu hid hwmon i2c iio infiniband input isdn kbuild kernel-hacking leds livepatch locking loongarch maintainer mhi mips misc-devices mm netlabel networking pcmcia peci power powerpc process riscv rust s390 scheduler scsi security sound spi staging target timers tools trace translations usb userspace-api virt w1 watchdog wmi
make SPHINX_CONF={conf-file} [target]: use additional sphinx-build configuration. This is e.g. useful to build with nit-picking config.
make DOCS_THEME={sphinx-theme}: selects a different Sphinx theme.
make DOCS_CSS={a .css file}: adds a DOCS_CSS override file for html/epub output.
The default location for the generated documents is Documentation/output
The generated (html) documentation can also be read online at https://www.kernel.org/doc/html/latest/.

Architecture specific targets (x86)

bzImage Compressed kernel image (arch/x86/boot/bzImage). Compare with vmlinux
install Install kernel using (your) ~/bin/installkernel or (distribution) /sbin/installkernel or install to $(INSTALL_PATH) and run LILO
fdimage Create 1.4MB boot floppy image (arch/x86/boot/fdimage)
fdimage144 Create 1.4MB boot floppy image (arch/x86/boot/fdimage)
fdimage288 Create 2.8MB boot floppy image (arch/x86/boot/fdimage)
hdimage Create a BIOS/EFI hard disk image (arch/x86/boot/hdimage)
isoimage Create a boot CD-ROM image (arch/x86/boot/image.iso)
kvm_guest.config Enable Kconfig items for running this kernel as a KVM guest
xen.config Enable Kconfig items for running this kernel as a Xen guest
x86_debug.config Enable tip tree debugging options for testing. See also kernel/configs/x86_debug.config
i386_defconfig Build for i386
x86_64_defconfig Build for x86_64
Targets bzdisk, fdimage*, hdimage and isoimage also accept: FDARGS="…" arguments and FDINITRD=file for the booted kernel

Others

Other, undocumented(?) targets include:
prepare scripts/setlocalversion suggests to run make prepare if include/config/auto.conf does not exist.
syncconfig This target seems to eventually result in calling scripts/kconfig/conf --syncconfig Kconfig. (scripts/kconfig/Makefile notes that syncconfig has become an internal implementation detail and is deprecated for external use). TODO: Does syncconfig create include/config/auto.conf, include/config/tristate.conf, include/generated/autoconf.h and some (empty?) include/config/*.h files?

Variables

KCONFIG_CONFIG

KCONFIG_CONFIG allows to specify a non-default config file (the default being .config):
make KCONFIG_CONFIG=config-lean

V

make V=n [targets]
1 verbose build - echoes the whole command line
2 give reason why target is rebuilt
V=1 and V=2 can be combined with V=12
The value that was passed with V= is assigned to the KBUILD_VERBOSE variable in makefiles.
The macro why (defined in scripts/Kbuild.include) is enabled if V contains 2.
This macro can be used in makefiles to tell why a target got built.

C

Call a source code checker (named $CHECK) as part of the C compilation.
make C=1 [targets]
1 Check re-compiled c source with $CHECK
2 Force check of all c source with $CHECK (regardless of whether they're re-compiled or not)
The default of $CHECK is sparse.
Documentation/dev-tools/sparse.rst has more details on sparse.
The value that was passed with C= is assigned to the KBUILD_CHECKSRC variable in makefiles.

M

make M=… (or the environment variable KBUILD_EXTMOD) specifies the directory of external modules to build.
The value that was passed with V= is assigned to the KBUILD_EXTMOD variable in makefiles.

O

make O=dir [targets]: Locate all output files in dir, including .config
O (or the environment variable KBUILD_OUTPUT specifies the directory where output (= generated?) files will be saved.
By default, this directory is the current working directory.
The value that was passed with V= is assigned to the KBUILD_OUTPUT variable in makefiles.

W

make W=n [targets] - Enable extra build checks, value of n:
1 warnings which may be relevant and do not occur too often
2 warnings which occur quite often but may still be relevant
3 more obscure warnings, can most likely be ignored
e warnings are being treated as errors
Multiple levels can be combined with W=12 or W=123

ARCH

ARCH can be set for cross compiling and select a different set of gcc/bin-utils.
make ARCH=ia64
Note: ARCH (for example i386 or x86_64) is not necessarily the same as SRCARCH (x86 in these two cases).
See also the CROSS_COMPILE variable to set the prefix for executables used during compilation.
If ARCH is not specfied, the value is taken from SUBARCH which is determined by scripts/subarch.include.

LLVM

make LLVM=1 …: builds the kernel with a complete LLVM toolchain (which is currently (Aug. 2023)) the best supported setup.
For architectures that don't suppert a full LLVM toolchain, make CC=clang … should be used.

CLIPPY

make CLIPPY=1 enables clippy (a linter) as part of the Rust compilation.
The value that was passed with C= is assigned to the KBUILD_CLIPPY variable in makefiles.

Others

make RECORDMCOUNT_WARN=1 [targets]: Warn about ignored mcount sections
make CLIPPY=1 … runs clippy (a Rust linter).

tools

Make and install a tool:
$ make -C tools <tool>_install

Creating a localmodconfig for another machine

To create a localmodconfig for another machine, store the lsmod of that machine into a file and pass it in as a LSMOD parameter.
Also, you can preserve modules in certain folders or kconfig files by specifying their paths in parameter LMC_KEEP.
target$ lsmod > /tmp/mylsmod
target$ scp /tmp/mylsmod host:/tmp

host$ make LSMOD=/tmp/mylsmod LMC_KEEP="drivers/usb:drivers/gpu:fs" localmodconfig
The above also works when cross compiling.

Warnings

Not all compiler warnings are enabled by default. To enable the full set, use
$ make KCFLAGS=-W

Kbuild output format

The Kbuild output has two components and is written with the following printf format: " %-7s %s\n", for example:
  CC      drivers/gpu/drm/virtio/virtgpu_ioctl.o
  CC      drivers/gpu/drm/virtio/virtgpu_prime.o
  CC      drivers/gpu/drm/virtio/virtgpu_trace_points.o
  CC      drivers/gpu/drm/virtio/virtgpu_submit.o
  AR      drivers/gpu/drm/virtio/built-in.a

See also

The Makefile
Linux kernel compilation

Index