one of the listed prefixes. The first prefix where there exist a PATH中若是prefix$(CC)的前缀和第一个参数前缀
prefix$(CC) in the PATH is returned - and if no prefix$(CC) is found 匹配,则返回在前缀。
then nothing is returned.
Additional prefixes are separated by a single space in the 附加前缀由一个空格分开。
call of cc-cross-prefix.
This functionality is useful for architecture Makefiles that try
to set CROSS_COMPILE to well-known values but may have several
values to select between.
It is recommended only to try to set CROSS_COMPILE if it is a cross
build (host arch is different from target arch). And if CROSS_COMPILE
is already set then leave it with the old value.
Example:
#arch/m68k/Makefile
ifneq ($(SUBARCH),$(ARCH))
ifeq ($(CROSS_COMPILE),)
CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu-)
endif
endif
=== 4 Host Program support
Kbuild supports building executables on the host for use during the 在编译内核的同时可生成主机的可执行程序。
compilation stage.
Two steps are required in order to use a host executable.
The first step is to tell kbuild that a host program exists. This is 第一步:使用变量hostprogs-y
done utilising the variable
hostprogs-y. 告诉kbuild系统要生成一个host program.
The second step is to
add an explicit dependency to the executable.
This can be done in two ways. Either
add the dependency in a rule,
or utilise the variable
$(always).
Both possibilities are described in the following.
--- 4.1 Simple Host Program
In some cases there is a need to compile and run a program on the 在某些状况下,编译正在进行时须要运行一个程序。
computer where the build is running.
The following line tells kbuild that the program bin2hex shall be 下面的一句告诉kbuild,须要编译生成bin2hex可执行程序。
built on the build host.
Example:
hostprogs-y := bin2hex
Kbuild assumes in the above example that bin2hex is made from a single kbuild编译bin2hex.c在当前目录生成bin2hex
c-source file named bin2hex.c located in the same directory as
the Makefile.
--- 4.2 Composite Host Programs
Host programs can be made up based on composite objects.
The syntax used to define composite objects for host programs is
similar to the syntax used for kernel objects.
$(<executable>-objs) lists all objects used to link the final
executable.
Example:
#scripts/lxdialog/Makefile
hostprogs-y := lxdialog
lxdialog-objs := checklist.o lxdialog.o
Objects with extension .o are compiled from the corresponding .c
files. In the above example, checklist.c is compiled to checklist.o
and lxdialog.c is compiled to lxdialog.o.
Finally, the two .o files are linked to the executable, lxdialog.
Note:
The syntax <executable>-y is not permitted for host-programs.
--- 4.3 Defining shared libraries
Objects with extension .so are considered shared libraries, and
will be compiled as position independent objects.
Kbuild provides support for shared libraries, but the usage
shall be restricted.
In the following example the libkconfig.so shared library is used
to link the executable conf.
Example:
#scripts/kconfig/Makefile
hostprogs-y := conf
conf-objs := conf.o
libkconfig.so
libkconfig-objs := expr.o type.o
Shared libraries always require a corresponding -objs line, and
in the example above the shared library libkconfig is composed by
the two objects expr.o and type.o.
expr.o and type.o will be built as
position independent code and
linked as a shared library libkconfig.so.
C++ is not supported for
shared libraries.
--- 4.4 Using C++ for host programs
kbuild offers support for host programs written in C++.
This was
introduced solely to support kconfig, and is not recommended
for general use.
Example:
#scripts/kconfig/Makefile
hostprogs-y := qconf
qconf-cxxobjs := qconf.o
In the example above the executable is composed of the C++ file
qconf.cc - identified by $(qconf-cxxobjs).
If qconf is composed by a mixture of .c and .cc files, then an
additional line can be used to identify this.
Example:
#scripts/kconfig/Makefile
hostprogs-y := qconf
qconf-cxxobjs := qconf.o
qconf-objs := check.o
--- 4.5 Controlling compiler options for host programs
When compiling host programs, it is possible to set specific flags.
The programs will always be compiled utilising
$(HOSTCC) passed
$(HOSTCC)和
$(HOSTCFLAGS)全局有效
the options specified in
$(HOSTCFLAGS).
To set flags that will take effect for all host programs created HOST_EXTRACFLAGS对当前Makefile生成的host programs 均
in that Makefile, use the variable
HOST_EXTRACFLAGS. 有效。
Example:
#scripts/lxdialog/Makefile
HOST_EXTRACFLAGS += -I/usr/include/ncurses
To set specific flags for a single file the following construction 针对某个目标的编译选项指定的方法:
is used:
Example:
#arch/ppc64/boot/Makefile
HOSTCFLAGS_piggyback.o := -DKERNELBASE=$(KERNELBASE)
It is also possible to specify additional options to the linker.
Example:
#scripts/kconfig/Makefile
HOSTLOADLIBES_qconf := -L$(QTDIR)/lib
When linking qconf, it will be passed the extra option
"-L$(QTDIR)/lib".
--- 4.6 When host programs are actually built
Kbuild will only build host-programs when they are referenced
as a prerequisite.
This is possible in two ways:
(1)
List the prerequisite explicitly in a special rule.
Example:
#drivers/pci/Makefile
hostprogs-y := gen-devlist
$(obj)/devlist.h: $(src)/pci.ids $(obj)/gen-devlist
( cd $(obj); ./gen-devlist ) < $<
The target $(obj)/devlist.h will not be built before
$(obj)/gen-devlist is updated. Note that references to
the host programs in special rules must be prefixed with $(obj).
(2)
Use $(always)
When there is no suitable special rule, and the host program
shall be built when a makefile is entered, the $(always)
variable shall be used.
Example:
#scripts/lxdialog/Makefile
hostprogs-y := lxdialog
always := $(hostprogs-y)
This will tell kbuild to build lxdialog even if not referenced in
any rule.
--- 4.7 Using hostprogs-$(CONFIG_FOO)
A typical pattern in a Kbuild file looks like this:
Example:
#scripts/Makefile
hostprogs-$(CONFIG_KALLSYMS) += kallsyms
Kbuild knows about both 'y' for built-in and 'm' for module.
So
if a config symbol evaluate to 'm', kbuild will still build
the binary. In other words, Kbuild handles hostprogs-m exactly
like hostprogs-y.
But only hostprogs-y is recommended to be used
when no CONFIG symbols are involved.
=== 5 Kbuild clean infrastructure
"make clean" deletes most generated files in the obj tree where the kernel
is compiled. This includes generated files such as host programs.
Kbuild knows targets listed in
$(hostprogs-y),
$(hostprogs-m),
$(always),
$(extra-y) and
$(targets).
They are all deleted during "make clean".
Files matching the patterns "
*.[oas]", "
*.ko", plus some additional files
generated by kbuild are deleted all over the kernel src tree when
"make clean" is executed.
Additional files can be specified in kbuild makefiles by use of
$(clean-files).
$(clean-files) 可指定要删除的文件
Example:
#drivers/pci/Makefile
clean-files := devlist.h classlist.h
When executing "make clean", the two files "devlist.h classlist.h" will
be deleted. Kbuild will assume files to be in same relative directory as the
Makefile except if an absolute path is specified (path starting with '/').
To delete a directory hierarchy use:
Example:
#scripts/package/Makefile
clean-dirs := $(objtree)/debian/
This will delete the directory debian, including all subdirectories.
Kbuild will assume the directories to be in the same relative path as the
Makefile if no absolute path is specified (path does not start with '/').
To
exclude certain files from make clean, use the $(no-clean-files) variable.
This is only a special case used in the top level Kbuild file:
Example:
#Kbuild
no-clean-files := $(bounds-file) $(offsets-file)
Usually kbuild descends down in subdirectories due to "obj-* := dir/",
but in the architecture makefiles where the kbuild infrastructure
is not sufficient this sometimes needs to be explicit.
Example:
#arch/x86/boot/Makefile
subdir- := compressed/
The above assignment instructs kbuild to descend down in the
directory compressed/ when "make clean" is executed.
To support the clean infrastructure in the Makefiles that builds the
final bootimage there is an optional target named archclean:
Example:
#arch/x86/Makefile
archclean:
$(Q)$(MAKE) $(clean)=arch/x86/boot
When "make clean" is executed, make will descend down in arch/x86/boot,
and clean as usual. The Makefile located in arch/x86/boot/ may use
the subdir- trick to descend further down.
Note 1:
arch/$(ARCH)/Makefile cannot use "subdir-", because that file is
included in the top level makefile, and the kbuild infrastructure
is not operational at that point.
Note 2: All directories listed in
core-y,
libs-y,
drivers-y and
net-y will
be visited during "make clean".
=== 6 Architecture Makefiles
The top level Makefile
sets up the environment and
does the preparation,
before starting to descend down in the individual directories.
The top level makefile contains the generic part, whereas
arch/$(ARCH)/Makefile contains what is required to set up kbuild
for said architecture.
To do so, arch/$(ARCH)/Makefile sets up a number of variables and defines
a few targets.
When kbuild executes, the following steps are followed (roughly):
1) Configuration of the kernel => produce .config 配置内核==〉生成 .config
2) Store kernel version in include/linux/version.h 写入内核版本信息到include/linux/version.h
3) Symlink include/asm to include/asm-$(ARCH) 将include/asm符号连接为include/asm-$(ARCH)
4) Updating
all other prerequisites to the target prepare: 更新全部目标依赖,附加依赖在
- Additional prerequisites are specified in arch/$(ARCH)/Makefile arch/$(ARCH)/Makefile中指定
5) Recursively descend down in all directories listed in 递归进入init-* core* drivers-* net-* libs-*中的
init-* core* drivers-* net-* libs-* and build all targets. 全部子目录并编译全部的目标对象
- The values of the above variables are expanded in arch/$(ARCH)/Makefile. 可在arch/$(ARCH)/Makefile扩展以上变量的值
6) All object files are then linked and the resulting file vmlinux is 连接全部的object文件生成vmlinux文件,
located at the root of the obj tree. 在代码树根目录下。
The very first objects linked are listed in head-y, assigned by 最早连接的几个object文件是在
arch/$(ARCH)/Makefile. arch/$(ARCH)/Makefile文件的head-y变量中指定
7) Finally, the architecture-specific part does any required post processing 指定体系架构部分完成任何须要的后期处理,
and builds the final bootimage. 生成bootimage
- This includes building boot records 包含生成boot引导记录
- Preparing initrd images and the like 准备initrd镜像等相似的事情
--- 6.1 Set variables to tweak the build to the architecture
LDFLAGS Generic $(LD) options
Flags used for all invocations of the linker.
Often specifying the emulation is sufficient.
Example:
#arch/s390/Makefile
LDFLAGS := -m elf_s390
Note:
ldflags-y can be used to further customise
the flags used. See chapter 3.7.
LDFLAGS_MODULE Options for $(LD) when linking modules
LDFLAGS_MODULE is used to set specific flags for $(LD) when
linking the .ko files used for modules.
Default is "-r", for relocatable output.
LDFLAGS_vmlinux Options for $(LD) when linking vmlinux
LDFLAGS_vmlinux is used to specify additional flags to pass to
the linker when linking the final vmlinux image.
LDFLAGS_vmlinux uses the LDFLAGS_$@ support.
Example:
#arch/x86/Makefile
LDFLAGS_vmlinux := -e stext
OBJCOPYFLAGS objcopy flags
When $(call if_changed,objcopy) is used to translate a .o file,
the flags specified in OBJCOPYFLAGS will be used.
$(call if_changed,objcopy) is often used to generate raw binaries on
vmlinux.
Example:
#arch/s390/Makefile
OBJCOPYFLAGS := -O binary
#arch/s390/boot/Makefile
$(obj)/image: vmlinux FORCE
$(call if_changed,objcopy)
In this example,
the binary $(obj)/image is a binary version of
vmlinux. The usage of $(call if_changed,xxx) will be described later.
KBUILD_AFLAGS $(AS) assembler flags
Default value - see top level Makefile
Append or modify as required per architecture.
Example:
#arch/sparc64/Makefile
KBUILD_AFLAGS += -m64 -mcpu=ultrasparc
KBUILD_CFLAGS $(CC) compiler flags
Default value - see top level Makefile
Append or modify as required per architecture.
Often, the KBUILD_CFLAGS variable depends on the configuration.
Example:
#arch/x86/Makefile
cflags-$(CONFIG_M386) += -march=i386
KBUILD_CFLAGS += $(cflags-y)
Many arch Makefiles dynamically run the target C compiler to
probe supported options:
#arch/x86/Makefile
...
cflags-$(CONFIG_MPENTIUMII) += $(call cc-option,\
-march=pentium2,-march=i686)
...
# Disable unit-at-a-time mode ...
KBUILD_CFLAGS += $(call cc-option,-fno-unit-at-a-time)
...
The first example utilises the trick that a config option expands
to 'y' when selected.
KBUILD_AFLAGS_KERNEL $(AS) options specific for built-in
$(KBUILD_AFLAGS_KERNEL) contains extra C compiler flags used to compile
resident kernel code.
KBUILD_AFLAGS_MODULE Options for $(AS) when building modules
$(KBUILD_AFLAGS_MODULE) is used to add arch specific options that
are used for $(AS).
From commandline AFLAGS_MODULE shall be used (see kbuild.txt).
KBUILD_CFLAGS_KERNEL $(CC) options specific for built-in
$(KBUILD_CFLAGS_KERNEL) contains extra C compiler flags used to compile
resident kernel code.
KBUILD_CFLAGS_MODULE Options for $(CC) when building modules
$(KBUILD_CFLAGS_MODULE) is used to add arch specific options that
are used for $(CC).
From commandline CFLAGS_MODULE shall be used (see kbuild.txt).
KBUILD_LDFLAGS_MODULE Options for $(LD) when linking modules
$(KBUILD_LDFLAGS_MODULE) is used to add arch specific options
used when linking modules. This is often a linker script.
From commandline LDFLAGS_MODULE shall be used (see kbuild.txt).
KBUILD_ARFLAGS Options for $(AR) when creating archives
$(KBUILD_ARFLAGS) set by the top level Makefile to "D" (deterministic
mode) if this option is supported by $(AR).
--- 6.2 Add prerequisites to archheaders: 为目标archheaders: 增长依赖
The archheaders: rule is used to generate header files that archheaders: 规则用于生成头文件,这些头文件可能会经过
may be installed into user space by "make header_install" or "make header_install" or "make headers_install_all" 安装到
"make headers_install_all". In order to support 用户空间。为了支持"make headers_install_all" ,该目标必须
"make headers_install_all", this target has to be able to run 能运行在一个未配置的树或是其余架构的树上。
on an unconfigured tree, or a tree configured for another
architecture.
It is run before "make archprepare" when run on the 该目标在"make archprepare" 以前运行。
architecture itself.
--- 6.3 Add prerequisites to archprepare:
The archprepare: rule is used to list prerequisites that need to be 这个规则用于列举开始进入子目录前编译时须要的依赖文件。
built before starting to descend down in the subdirectories.
This is usually used for header files containing assembler constants. 该规则一般用于包含汇编常量的头文件。(暂不明白什么意思?)
Example:
#arch/arm/Makefile
archprepare: maketools
In this example, the file target maketools will be processed 在递归子目录前先处理maketools
before descending down in the subdirectories.
See also chapter XXX-TODO that describe how kbuild supports
generating offset header files.
--- 6.4 List directories to visit when descending
An arch Makefile cooperates with the top Makefile to define variables arch Makefile 配合顶层Makefile定义一些用于编译vmlinux的变量。
which specify how to build the vmlinux file. Note that there is no
corresponding arch-specific section for modules; the module-building 内核模块编译都是与架构无关的。
machinery is all architecture-independent.
head-y, init-y, core-y, libs-y, drivers-y, net-y
$(head-y) lists objects to be linked first in vmlinux. $(head-y) 列出最早被编译进vmlinux的对象
$(libs-y) lists directories where a lib.a archive can be located. $(libs-y)列出包含lib.a的目录
The rest list directories where a built-in.o object file can be 其余部分列出built-in.o
located.
$(init-y) objects will be located after $(head-y). $(head-y)--->$(init-y) --->$(core-y), $(libs-y), $(drivers-y) and $(net-y)
Then the rest follows in this order:
$(core-y), $(libs-y), $(drivers-y) and $(net-y).
The top level Makefile defines values for all generic directories,
and arch/$(ARCH)/Makefile only adds architecture-specific directories.
Example:
#arch/sparc64/Makefile
core-y += arch/sparc64/kernel/
libs-y += arch/sparc64/prom/ arch/sparc64/lib/
drivers-$(CONFIG_OPROFILE) += arch/sparc64/oprofile/
--- 6.5 Architecture-specific boot images
An arch Makefile specifies goals that take the vmlinux file, compress arch Makefile 的做用是生成并压缩vmlinux,而后打包进引导启动代码,最后复制到合适的位置。
it, wrap it in bootstrapping code, and copy the resulting files
somewhere. This includes various kinds of installation commands. 该目标的完成须要各类安装命令。
The actual goals are not standardized across architectures. 实际的目标对象不能在各体系架构间造成标准化。
It is common to locate any additional processing in a boot/ 通常在arch/$(ARCH)/boot目录下进行额外的处理。
directory below arch/$(ARCH)/.
Kbuild does not provide any smart way to support building a Kbuild并无为构建boot/下的目标提供自动化的方法。
target specified in boot/. Therefore arch/$(ARCH)/Makefile shall 所以须要手动执行arch/$(ARCH)/Makefile来构建boot/下的目标
call make manually to build a target in boot/.
The recommended approach is to include shortcuts in 推荐的方式是在arch/$(ARCH)/Makefile中添加快捷方式,
arch/$(ARCH)/Makefile, and use the full path when calling down 而后在arch/$(ARCH)/boot/Makefile中使用绝对路径。
into the arch/$(ARCH)/boot/Makefile.
Example:
#arch/x86/Makefile
boot := arch/x86/boot
bzImage: vmlinux
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
"$(Q)$(MAKE) $(build)=<dir>" is the recommended way to invoke
make in a subdirectory.
There are no rules for naming architecture-specific targets,
but executing "make help" will list all relevant targets.
To support this, $(archhelp) must be defined.
Example:
#arch/x86/Makefile
define archhelp
echo '* bzImage - Image (arch/$(ARCH)/boot/bzImage)'
endif
When make is executed without arguments, the first goal encountered 当执行不带参数的make时,在脚本中最早遇到的目标将会被编译。
will be built. In the top level Makefile the first goal present 顶层Makefile的第一个目标是all:
is all:.
An architecture shall always, per default, build a bootable image. 默认每一个架构下都要构建一个可引导镜像。
In "make help", the default goal is highlighted with a '*'. 在"make help"中,默认目标用"*"高亮
Add a new prerequisite to all: to select a default goal different 给目标all:添加一个新的依赖来构建一个不一样于vmlinux的默认目标。
from vmlinux.
Example:
#arch/x86/Makefile
all: bzImage
When "make" is executed without arguments, bzImage will be built.
--- 6.6 Building non-kbuild targets
extra-y
extra-y specify additional targets created in the current extra-y指定了在当前目录下,生成除了obj-*指定的目标以外的其余目标。
directory, in addition to any targets specified by obj-*.
Listing all targets in extra-y is required for two purposes: extra-y列举的目标有两个目的:
1) Enable kbuild to check changes in command lines 1.使Kbuild能够检查命令行是否变化
- When $(call if_changed,xxx) is used
2) kbuild knows what files to delete during "make clean" 2.在make clean时,使Kbuild知道要删除哪些文件。
Example:
#arch/x86/kernel/Makefile
extra-y := head.o init_task.o
In this example, extra-y is used to list object files that 上例中,extra-y用于列出应被编译但不能连接进built-in.o的对象
shall be built, but shall not be linked as part of built-in.o.
--- 6.7 Commands useful for building a boot image
Kbuild provides a few macros that are useful when building a Kbuild 提供一些有用的宏来编译boot image
boot image.
if_changed
if_changed is the infrastructure used for the following commands.
Usage:
target: source(s) FORCE
$(call if_changed,ld/objcopy/gzip)
When the rule is evaluated,
it is checked to see if any files
need an update, or the command line has changed since the last
invocation. The latter will force a rebuild if any options
to the executable have changed.
Any target that utilises if_changed must be listed in $(targets),
otherwise the command line check will fail, and the target will
always be built.
Assignments to $(targets) are without $(obj)/ prefix.
if_changed may be used in conjunction with custom commands as
defined in 6.8 "Custom kbuild commands".
Note: It is a typical mistake to forget the FORCE prerequisite.
Another common pitfall is that whitespace is sometimes
significant; for instance,
the below will fail (note the extra space
after the comma):
target: source(s) FORCE
#WRONG!# $(call if_changed, ld/objcopy/gzip)
ld
Link target. Often, LDFLAGS_$@ is used to set specific options to ld.
objcopy
Copy binary. Uses OBJCOPYFLAGS usually specified in
arch/$(ARCH)/Makefile.
OBJCOPYFLAGS_$@ may be used to set additional options.
gzip
Compress target. Use maximum compression to compress target.
Example:
#arch/x86/boot/Makefile
LDFLAGS_bootsect := -Ttext 0x0 -s --oformat binary
LDFLAGS_setup := -Ttext 0x0 -s --oformat binary -e begtext
targets += setup setup.o bootsect bootsect.o
$(obj)/setup $(obj)/bootsect: %: %.o FORCE
$(call if_changed,ld)
In this example, there are two possible targets, requiring different
options to the linker. The linker options are specified using the
LDFLAGS_$@ syntax - one for each potential target.
$(targets) are assigned all potential targets, by which kbuild knows
the targets and will:
1) check for commandline changes
2) delete target during make clean
The ": %: %.o" part of the prerequisite is a shorthand that
free us from listing the setup.o and bootsect.o files.
Note: It is a common mistake to forget the "target :=" assignment,
resulting in the target file being recompiled for no
obvious reason.
dtc
Create flattened device tree blob object suitable for linking
into vmlinux. Device tree blobs linked into vmlinux are placed
in
an init section in the image. Platform code *must* copy the
blob to non-init memory prior to calling unflatten_device_tree().
Example:
#arch/x86/platform/ce4100/Makefile
clean-files := *dtb.S
DTC_FLAGS := -p 1024
obj-y += foo.dtb.o
$(obj)/%.dtb: $(src)/%.dts
$(call cmd,dtc)
--- 6.8 Custom kbuild commands
When kbuild is executing with KBUILD_VERBOSE=0, then only a shorthand
of a command is normally displayed.
To enable this behaviour for custom commands kbuild requires
two variables to be set:
quiet_cmd_<command> - what shall be echoed
cmd_<command> - the command to execute
Example:
#
quiet_cmd_image = BUILD $@
cmd_image = $(obj)/tools/build $(BUILDFLAGS) \
$(obj)/vmlinux.bin > $@
targets += bzImage
$(obj)/bzImage: $(obj)/vmlinux.bin $(obj)/tools/build FORCE
$(call if_changed,image)
@echo 'Kernel: $@ is ready'
When updating the $(obj)/bzImage target, the line
BUILD arch/x86/boot/bzImage
will be displayed with "make KBUILD_VERBOSE=0".
--- 6.9 Preprocessing linker scripts
When the vmlinux image is built, the linker script
arch/$(ARCH)/kernel/vmlinux.lds is used.
The script is a preprocessed variant of the file vmlinux.lds.S
located in the same directory.
kbuild knows .lds files and includes a rule *lds.S -> *lds.
Example:
#arch/x86/kernel/Makefile
always := vmlinux.lds
#Makefile
export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH)
The assignment to $(always) is used to tell kbuild to build the
target vmlinux.lds.
The assignment to $(CPPFLAGS_vmlinux.lds) tells kbuild to use the
specified options when building the target vmlinux.lds.
When building the *.lds target, kbuild uses the variables:
KBUILD_CPPFLAGS : Set in top-level Makefile
cppflags-y : May be set in the kbuild makefile
CPPFLAGS_$(@F) : Target specific flags.
Note that the full filename is used in this
assignment.
The kbuild infrastructure for *lds file are used in several
architecture-specific files.
--- 6.10 Generic header files
The directory include/asm-generic contains the header files
that may be shared between individual architectures.
The recommended approach how to use a generic header file is
to list the file in the Kbuild file.
See "7.4 generic-y" for further info on syntax etc.
=== 7 Kbuild syntax for exported headers
The kernel include a set of headers that is exported to userspace. 内核包含一组能够导出到用户空间的头文件.
Many headers can be exported as-is but other headers require a 许多头文件能够原样导出
minimal pre-processing before they are ready for user-space. 可是有一部分头文件在用户空间读取以前,须要作一些简单的预处理.
The pre-processing does:
- drop kernel specific annotations 去掉内核特定的注释
- drop include of compiler.h 去掉compiler.h头文件的包含
- drop all sections that are kernel internal (guarded by ifdef __KERNEL__) 去掉内核内部段(即,使用ifdef __KERNEL__声明的部分)
Each relevant directory contains a file name "Kbuild" which specifies the 每一个相关的目录都包含一个名为”Kbuild”的文件
headers to be exported. ,该文件指定了那些头文件要被导出.
See subsequent chapter for the syntax of the Kbuild file.
--- 7.1 header-y
header-y specify header files to be exported.
Example:
#include/linux/Kbuild
header-y += usb/
header-y += aio_abi.h
The convention is to list one file per line and
preferably in alphabetic order.
header-y also specify which subdirectories to visit.
A subdirectory is identified by a trailing '/' which
can be seen in the example above for the usb subdirectory.
Subdirectories are visited before their parent directories.
--- 7.2 objhdr-y
objhdr-y specifies generated files to be exported.
Generated files are special as they need to be looked
up in another directory when doing 'make O=...' builds.
Example:
#include/linux/Kbuild
objhdr-y += version.h
--- 7.3 destination-y
When an architecture have a set of exported headers that needs to be
exported to a different directory destination-y is used.
destination-y specify the destination directory for all exported
headers in the file where it is present.
Example:
#arch/xtensa/platforms/s6105/include/platform/Kbuild
destination-y := include/linux
In the example above all exported headers in the Kbuild file
will be located in the directory "include/linux" when exported.
--- 7.4 generic-y
If an architecture uses a verbatim copy of a header from
include/asm-generic then this is listed in the file
arch/$(ARCH)/include/asm/Kbuild like this:
Example:
#arch/x86/include/asm/Kbuild
generic-y += termios.h
generic-y += rtc.h
During the prepare phase of the build a wrapper include
file is generated in the directory:
arch/$(ARCH)/include/generated/asm
When a header is exported where the architecture uses
the generic header a similar wrapper is generated as part
of the set of exported headers in the directory:
usr/include/asm
The generated wrapper will in both cases look like the following:
Example: termios.h
#include <asm-generic/termios.h>
=== 8 Kbuild Variables The top Makefile exports the following variables: VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION These variables define the current kernel version. A few arch Makefiles actually use these values directly; they should use $(KERNELRELEASE) instead. $(VERSION), $(PATCHLEVEL), and $(SUBLEVEL) define the basic three-part version number, such as "2", "4", and "0". These three values are always numeric. $(EXTRAVERSION) defines an even tinier sublevel for pre-patches or additional patches. It is usually some non-numeric string such as "-pre4", and is often blank. KERNELRELEASE $(KERNELRELEASE) is a single string such as "2.4.0-pre4", suitable for constructing installation directory names or showing in version strings. Some arch Makefiles use it for this purpose. ARCH This variable defines the target architecture, such as "i386", "arm", or "sparc". Some kbuild Makefiles test $(ARCH) to determine which files to compile. By default, the top Makefile sets $(ARCH) to be the same as the host system architecture. For a cross build, a user may override the value of $(ARCH) on the command line: make ARCH=m68k ... INSTALL_PATH This variable defines a place for the arch Makefiles to install the resident kernel image and System.map file. Use this for architecture-specific install targets. INSTALL_MOD_PATH, MODLIB $(INSTALL_MOD_PATH) specifies a prefix to $(MODLIB) for module installation. This variable is not defined in the Makefile but may be passed in by the user if desired. $(MODLIB) specifies the directory for module installation. The top Makefile defines $(MODLIB) to $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE). The user may override this value on the command line if desired. INSTALL_MOD_STRIP If this variable is specified, will cause modules to be stripped after they are installed. If INSTALL_MOD_STRIP is '1', then the default option --strip-debug will be used. Otherwise, INSTALL_MOD_STRIP value will be used as the option(s) to the strip command.