0%

Makefile

2018年1月25日 上午9:55

最重要的内容:

下面的注释就是我现在对makefile的理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#一些变量习惯性的放在最前面(下面10行都是变量)
objs = a.o b.o c.o

#字符串处理函数
dep_files := $(patsubst %,.%.d, $(objs))
#判断文件是否存在的函数,将结果返回
dep_files := $(wildcard $(dep_files))

CFLAGS = -Werror -Iinclude

#首要目标一定要放在最前面
test: $(objs)
gcc -o test $^

#文件存在你才可以包含进来呀(是针对第一次make或者clean之后第一次make优化)
ifneq ($(dep_files),)
include $(dep_files)
endif

%.o : %.c
gcc $(CFLAGS) -c -o $@ $< -MD -MF .$@.d

clean:
rm *.o test
#这里是这个程序的一个bug,如果执行make distclean 那么就必须make clean初始化程序。
#否则.h文件修改就不起作用了

#这个程序现在的功能是没有能力单独生成.d文件的,是和.o文件绑定在一起
#只有两种情况能让.h文件一种正常1.clean之后make 2..d文件存在
#这个程序要是优化的化,就是让其具有单独生产.d文件的能力,并且在程序执行一开始就产生,那么任何时候都是正确的
distclean:
rm $(dep_files)

.PHONY: clean

注:配套的源码在:D:\005_ARM裸机1期加强版\源码文档图片\源码_201180109_添加gcc_pointer_makefile_printf\008_gcc_pointer_Makefile_009\003_Makefile\003_example_009_008

调试过程:

为了体现上面makefile的bug

Makefile的详细笔记:

Makefile目标,伪目标,头文件自动依赖 - Abnor - 博客园
Makefile是根据依赖关系,时间戳和生成规则来判断哪些文件需要更新

  1. makefile每次执行,要保证生成的对象的所有依赖串中的依赖都必须检查一遍是否更新过

  2. Makefile的核心1—规则 :

    1
    2
    目标1 : 依赖1 依赖2 ...
    [TAB]命令
    1. 指令执行条件:
      1. 当”目标文件”不存在,
      2. 某个依赖文件比目标文件”新”,
      3. 则: 执行”命令”
  3. Makefile的核心2—规则 :

    1
    目标2 : 依赖1 依赖2 ...
    1. 当执行条件成立时,如何找到对应执行的语句?
      1. 去找 目标1=目标2
      2. 执行目标2的[TAB]命令
  4. Makefile的语法

    1. 通配符: %.o
    2. $@ 表示目标
    3. $< 表示第1个依赖文件
    4. $^ 表示所有依赖文件
    5. 假想目标: .PHONY
    6. 即时变量、延时变量, export
      1
      2
      3
      4
      5
      6
      7
      8
      简单变量(即时变量) :
      A := xxx # A的值即刻确定,在定义时即确定
      B = xxx # B的值使用到时才确定

      := # 即时变量
      = # 延时变量
      ?= # 延时变量, 如果是第1次定义才起效, 如果在前面该变量已定义则忽略这句
      += # 附加, 它是即时变量还是延时变量取决于前面的定义
      参考文档:
      a. 百度搜 “gnu make 于凤昌”
      b. 官方文档: http://www.gnu.org/software/make/manual/
  5. Makefile函数

    1. $(foreach var,list,text)
    2. $(filter pattern…,text)
      1. 在text中取出符合patten格式的值

    3. $(filter-out pattern…,text)
      1. 在text中取出不符合patten格式的值

    4. $(wildcard pattern)
      1. pattern定义了文件名的格式,

      2. wildcard取出其中存在的文件

    5. $(patsubst pattern,replacement,$(var))
      1. 从列表中取出每一个值

      2. 如果符合pattern

      3. 则替换为replacement

  6. Makefile实例
    改进: 支持头文件依赖
    Linux Makefile生成*.d依赖文件及 gcc -M -MF -MP等相关选项说明 - CSDN博客

    1
    2
    3
    gcc -M c.c // 打印出依赖
    gcc -M -MF c.d c.c // 把依赖写入文件c.d
    gcc -c -o c.o c.c -MD -MF c.d // 编译c.o, 把依赖写入文件c.d

    b. 添加CFLAGS