例子:
#drivers/pci/Makefile
hostprogs-y := gen-devlist
$(obj)/devlist.h: $(src)/pci.ids$(obj)/gen-devlist
( cd $(obj); ./gen-devlist ) < $<
只有当$(obj)/gen-devlist更新后,目标$(obj)/devlist.h才会被编译。注意特殊规则中对主机程序的引用必须使用前缀$(obj)。
(2)使用$(always)变量
当没有合适的特殊规则,并且在kbuild进入makefile的时候就要生成主机程序,那么就应该使用$(always)变量。
例子:
#scripts/lxdialog/Makefile
hostprogs-y := lxdialog
always := $(hostprogs-y)
这将告诉kbuild编译lxdialog,即使它没有在任何规则中引用。
--- 4.7 使用 hostprogs-$(CONFIG_FOO)
Kbuild文件中的一种典型形式是这样的:
例子:
#scripts/Makefile
hostprogs-$(CONFIG_KALLSYMS)= kallsyms
Kbuild知道‘y’是将文件编译进内核,而‘m’是将文件作为模块。所以如果一个文件的配置标志等于‘m’,kbuild还是会将它编译成二进制代码。换句话说,Kbuild处理hostprogs-m完全和处理hostprogs-y的方法一样。不过在没有CONFIG标志的时候,只建议使用hostprogs-y。
=== 5 Kbuild的清除机制
“make clean”命令删除大多数内核编译目录的目标树中生成的文件。要删除的文件包括所
编译过程中生成的文件,比如主机程序。Kbuild知道(hostprogs-y), $(hostprogs-m), $(always),
$(extra-y) 和$(targets)这些列表中存在的目标,这些目标都会在执行"make clean"命令后删除。
匹配"*.[oas]", "*.ko"模式的文件加上一些由kbuild生成的附加文件,在"makeclean"执行时都
会从内核源码树中删除。
在kbuild makefiles中可以使用(clean-files)变量来指定一些额外要删除的文件。
例子:
#drivers/pci/Makefile
clean-files := devlist.h classlist.h
当执行"make clean"后,"devlist.h classlist.h"这两个文件也将会被删除。如果没有给出文件
的绝对地址(以‘/’开头),那么kbuild就会假设该文件与makefile在同一目录下。
可以使用下面的方法删除一个多层次目录:
例子:
#scripts/package/Makefile
clean-dirs := $(objtree)/debian/
上面的例子中将会删除目录debian,以及它包含的所有子目录。如果没有给出目录
的绝对地址(以‘/’开头),那么kbuild就会假设该目录与makefile在同一目录下。
如果makefile中存在类"obj-* := dir/"的语句,那么kbuild就必须进入到指定的子目录中去,
但是在于体系架构相关的makefiles中kbuild的机制不够全面,这种情况需要明确指出来。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40628-9.html
而且我认为现在等他们宣布再处理的方式已经过时
加油吧