例子:
#arch/i386/kernel/Makefile
extra-y:= head.o init_task.o
在这个例子中,extra-y用来列出将要被建立的目标文件,但是这些文件不应该被链接 作为built-in.o的一部分。
--- 6.6 用来建立启动映像的命令
Kbuild提供了一些宏用来帮助建立启动映像。makefile 语法
if_changed
if_changed是下面命令行的基础。
Usage:
target:source(s) FORCE
$(callif_changed,ld/objcopy/gzip)
当一个规则被求的时候,会检查规则相对于上次被调用是否有文件被更新或者命令行 被改变。如果任何可执行文件的选项被改变,那么就会强制执行rebuild。
如果任何目标使用了if_changed,那么它必须放进$(targets)列表中,不然命令行的检查 会失败,并且目标会一直被建立。
$(targets)的等式中没有使用 $(obj)/前缀。
if_changed可以结合和6.7节"Customkbuild commands"中定义的用户命令。
注意:一个典型的错误就是忘记了 FORCE 先决条件。
另外一个常见的陷阱就是空有时很显著;比如,下面的例子将会失败(注意逗号后面 的多余空):
target:source(s) FORCE
#WRONG!# $(call if_changed, ld/objcopy/gzip)
ld
链接目标。LDFLAGS_$@经常用来指定ld的选项。
objcopy
复制二进制。OCOPYFLAGS的使用经常在arch/$(ARCH)/Makefile文件中指定。
OCOPYFLAGS_$@可以用来设置附加的选项。
Gzip
压缩目标。使用最大的压缩限度来压缩目标。
例子:
#arch/i386/boot/Makefile
LDFLAGS_bootsect:= -Ttext 0x0 -s --oformat binary
LDFLAGS_setup := -Ttext 0x0 -s --oformat binary -ebegtext
targets= setup setup.o bootsect bootsect.o
$(obj)/setup$(obj)/bootsect: %: %.o FORCE
$(callif_changed,ld)
在这个例子中,有两个可能的目标,在它们在链接的时候需要不同的选项。通过使用 LDFLAGS_$@语法式来指定链接选项 -每一个可能的目标都需要指定。
$(targets)代表的是所有可能的目标,kbuild通过$(targets)来知道这些目标,然后执行 下面的操作:
1)检查命令行的改变
2)执行make clean时删除目标
先决条件中的":%: %.o" 部分是一个简写方式,它可以让我们不用列出setup.o和 bootsect.o文件。
注意:一个常见的错误就是忘记"target :="赋表达式,导致目标文件在没有明显原因 的情况下被重新编译。
--- 6.7 自定义kbuild命令
当kbuild运行时KBUILD_VERBOSE=0,那么只正常显示一个命令的简写方式。
为了使能自定义命令这一行为,kbuild需要设置两个变量:
quiet_cmd_<command> -被显示的部分
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40628-13.html
#吴亦凡##挑战者吴亦凡#虽然不能去
猛禽配凡凡