makefile的一些技巧

    技术2025-04-19  21

    .判断是否为绝对路径:   $(if $(filter /%,$(dir)),$(dir),$(top_dir)/$(dir))

    .依赖FORCE伪目标来强制执行一个目标,例如:   foo:FORCE       @echo "Hello"   FORCE: ;   不管是否存在foo文件,都会执行echo "Hello"

    .分号可以作为空命令,例如FORCE伪规则,也可以使用shell提供的冒号命令作为空命令,例如:   foo:       @:

    .ifdef, ifndef不对对变量进行展开,而ifeq,ifneq则会展开变量,因此如果一个变量名是要展开的,就不能用ifdef/ifndef来判断,而要用ifeq/ifneq例如:     ifeq ($(__$(CURDIR)_VAR),1) .如果一个目标被定义为PHONY,则模式目标不会对该目标有效    例如:下面的%_bar不对对foo_bar进行匹配, make foo_bar将不会执行echo命令    .PHONY: foo_bar    %_bar:        @echo $@ .模式目标中的%不会匹配空,例如:%config不会匹配config

    .如果一个目标同时匹配多个模式目标,则匹配先出现的模式目标:   %config:       @echo "1"   %fig:       @echo "2"   make xconfig会匹配%config,如果颠倒上面的模式目标,则会匹配%fig .使用make -n, make -d 和 make -p 来调试Makefile, make --debug=[a b v i j m]

    .隐含规则和隐含变量可以通过make -p -f /dev/null 查看。 

    .include 不存在的文件时,make会尝试重建该文件,即使使用了-include或者sinclude。可以为不存在的文件写一个规则来自动生成文件。如果不希望make去尝试重建该文件,应该为该文件定义一个空目标。

    .万用规则:%,可以用万用规则来匹配所有没有定义的目标,如果加上FORCE伪目录则会无条件执行,即使该目标对应的文件/目录已经存在。但万用规则会影响make的性能,因为所有没有定义的目标(包括隐含规则的依赖)都要进入该万用规则。   例如:   %::       echo "No target for $@, create it temporary."       touch $@   也可以用       $(MAKECMDGOALS)::         @$(MAKE) $(ebuild) $@ .注意:规则的依赖是立即展开的,而变量赋值是可以后展开的,例如:     var1=1     var=$(var1)_$(var2)     $(var):             @echo "in depend target: $@"     expand:$(var)             @echo $(var)             @echo depend: $^     var2=2     将显示:         in depend target: 1_         1_2         depend: 1_ .在定义变量时执行命令,输出信息到文件     dummy:=$(shell echo "$(MAKEFILE_LIST)" >> m.log) .如果一个文件作为一个目标的依赖,该文件不存在,但是定义了一个该文件的空目标,则该文件总是最新,会导致目标强制执行。   例如:       test.c: ;       test.o: test.c           @echo "make $@"       如果test.c不存在,则test.o目标的命令总是会执行。

    .make的自动变量只能在命令中使用,依赖中不能使用。例如下面目标的依赖中的$@为空,但能echo出$@     %:: $(if $(filter-out $(MAKECMDGOALS), $@), sub-make)         @echo $@ .如果vpath命令指定的路径不存在,则make不会对该目录进行搜索,即使在之后创建了该目录。因此,必须保证vpath命令时该目录存在。

    .如果一个目标没有任何命令,则make会尝试查找隐含规则来生成目标,使用:命令来避免,以提高make效率。 使用;作为依赖也可以达到目的。   例如:       foo: bar           @:       foo_bar: ;

    最新回复(0)