makefile的一些技巧

.判断是否为绝对路径:
  $(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: ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值