makefile笔记

  1. 打印信息:
    [1.1] 不需要tab直接打印的:
    $(info this is info)
    $(warning this is warning)
    $(error this is error)

    [1.2]需要tab放在命令位置的:
    @echo $(var)

  2. 自动化变量
    ojects = main.o a.o b.o c.o d.o e.o f.o
    mylabel:$(ojects )
    @echo $@
    @echo $%
    @echo $<
    @echo $?
    @echo $^
    @echo $+
    @echo $*
    $@: 表示目标文件,这里是mylabel
    $%:仅表示目标文件为函数库时的目标成员,这里为空
    $<:依赖目标的第一个目标名字,这里是main.o
    $?:所有比目标新的依赖目标的集合,这里是main.o a.o b.o c.o d.o e.o f.o
    $^:所有的依赖目标的集合,去除重复的,这里是main.o a.o b.o c.o d.o e.o f.o
    $+:所有的依赖目标的集合,不去除重复的,这里是main.o a.o b.o c.o d.o e.o f.o
    $*: 表示目标模式中"%"及其之前的部分,这里为空

  3. 函数用法
    格式: $(function p1,p2,p3)
    [1]. 字符串替换函数:subst
    $(subst is,IS,This is my first makefile)
    This is my first makefile ---->ThIS IS my first makefile
    [2]. 模式字符串替换函数: patsubst
    $(patsubst %.c,%.o,main.c file1.c file2.c file3.c)
    main.c file1.c file2.c file3.c—>main.o file1.o file2.o file3.o
    [3].获取参数指定目录下的所有.c文件
    $(wildcard .c ./sub/.c)
    [4]. 获取目录函数
    $(dir tmp/project/main.c aa.c bb.c)返回值是: “tmp/project/ ./”
    [5]. 获取文件函数
    $(notdir tmp/project/main.c aa.c bb.c)返回值是: “main.c aa.c bb.c”
    [6]取后缀函数
    $(suffix src/main.c barfiles/bar.c object)返回值是“.c .c”
    [7]取前缀函数
    $(basename src/main.c barfiles/bar.c object)返回值是
    “src/main barfiles/bar object”
    [8] 加后缀函数
    $(addsuffix .c,foo bar)返回值是“foo.c bar.c”
    [9]加前缀函数
    $(addprefix src/,foo bar)返回值是“src/foo src/bar”。
    [10]连接函数
    $(join aaa bbb , 111 222 333)返回值是“aaa111 bbb222 333”
    [11]过滤函数

         				sources := foo.c bar.c baz.s ugh.h
         				foo: $(sources)
         				cc $(filter %.c %.s,$(sources)) -o foo
    
     		$(filter %.c %.s,$(sources))返回的值是---> "foo.c bar.c baz.s"
    

    [12]反过滤函数

       					objects=main1.o foo.o main2.o bar.o
         				mains=main1.o main2.o
         	$(filter-out $(mains),$(objects)) 返回值是---->“foo.o bar.o”
    

    [13]foreach函数
    $(foreach ,, )
    这个函数的意思是,把参数中的单词逐一取出放到参数 所指定的变量中,然后再执行 所包含的表达式
    每一次 会返回一个字符串,循环过程中, 的所返回的每个字符串会以空格分隔,最后当整个循环结束时,
    所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值,如下例子:

            names := a b c d
            files := $(foreach n,$(names),$(n).o)
     上面的例子中,$(name)中的单词会被挨个取出,并存到变量“n”中,
     “$(n).o”每次根据“$(n)”计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以,
     $(files)的值是“a.o b.o c.o d.o”
    
  4. 变量高级用法
    aa:= main.o aa.o bb.o cc.o
    obj := $(aa:%.o=%.c)
    将变量aa中所有以.o结尾的字符改成.c结尾,所以变量obj它的值是main.c aa.c bb.c cc.c

5.条件表达式,不要有TAB键:

	判断关键词有:  ifeq,ifneq,ifdef,ifndef
	如:
	ifeq(0,$(MAKELEVEL))
	
	示例一:
	bar =
	foo = $(bar)
	ifdef foo
	frobozz = yes
	else
	frobozz = no
	endif
	
	
	示例二:
	foo =
	ifdef foo
	frobozz = yes
	else
	frobozz = no
	endif

6.静态模式

   静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。
	规则:
    <targets...>: <target-pattern>: <prereq-patterns ...>
    	   <commands>
    ...
	
	例如:
	
	objects = foo.o bar.o
    all: $(objects)
    $(objects): %.o: %.c
			$(CC) -c $(CFLAGS) $< -o $@
			
	规则展开等价于如下:

	foo.o : foo.c
			$(CC) -c $(CFLAGS) foo.c -o foo.o
	bar.o : bar.c
   		    $(CC) -c $(CFLAGS) bar.c -o bar.o

7.变量赋值

	=  延时变量,只有被使用时才展开定义 ,使用时!!
	:= 立即变量,定义时的赋值立即有效 ,立刻!!
	?= 条件变量,当变量为空时才赋值 
	+= 追加赋值
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值