make
make概述
make工具本质上就是提供了一套依赖、增量构建的系统,主要提供了以下功能:
- 依赖关系管理:
Makefile中通过指定目标(targets)和他们的依赖关系(dependencies),make工具能够了解到哪些文件或目标依赖于其他文件或目标。 - 自动化构建:根据依赖关系,
make判断出哪些文件需要重新构建(例如编译源文件生成目标文件),并自动执行必要的命令来完成构建过程。 - 增量构建:
make会比较目标文件和其他依赖文件的时间戳(timestamp),只重新构建发生了变化的文件,从而避免不必要的重复工作,提高构建效率。 - 并行构建:如果
Makefile中的规则允许,并且系统资源够,make可以并行执行独立的构建任务,加快整体的构建速率。 - 错误处理:如果某个命令执行失败,
make会及时停止后续的操作,并显示相应的错误信息,帮助开发者快速定位和解决问题。
.PHONY
.PHONY : clean run report_txt report_json.PHONY的作用是,告诉make工具,这些目标是伪目标,不是真正的文件,因此不会检查他们是否存在或者是否需要重新构建。
目标声明语法
普遍写法
target: dependencies
command1
command2
...
其中:
target:是要生成的文件或者操作的名称。可以是一个实际文件名(也即真实目标),也可以是一个伪目标(phony target),后者通常使用.PHONY来声明。dependencies:是生成target所需要的文件或者其他目标。如果target依赖于某些文件或其他目标,make会先检查这些依赖是否存在或是否需要更新,然后再决定是否执行target。command1,command2,…:是生成或处理target的具体命令。这些命令通常是shell命令,make或按照顺序执行这些命令或完成目标的生成或操作。
定义变量
autoschedule: AUTOSCHEDULE_OPTS = auto_schedule=true -p $(HALIDE_ROOT)/lib/libauto_schedule.so -s Adams2019
autoschedule: run- 这种写法中第一行先定义了
autoschedule依赖于一个变量定义,第二行autoschedule依赖于目标run。 - 在执行的时候会先定义变量,随后依赖于
run。
通配符
$(BIN)/src/%_stub.c $(BIN)/src/%_skel.c $(BIN)/src/%.h: rpc/%.idl
mkdir -p $(@D)
$(HEXAGON_QAIC) $(IDL_INCLUDES) $^ -o $(@D)
- 这段中
$(BIN)指取先前定义的BIN的值。 %是一个通配符,匹配任意字符串。$(BIN)/src/%_stub.c $(BIN)/src/%_skel.c $(BIN)/src/%.h: rpc/%.idl这行表示stub.c、skel.c、.h文件的生成依赖.idl文件。$^是自动变量,表示所有的依赖列表,这里就是指.idl文件。$(@D)是自动变量,表示目标文件所在的目录。其中$(BIN)/src/%_stub.c $(BIN)/src/%_skel.c $(BIN)/src/%.h这些就是指目标文件。$@是一个自动变量,表示当前规则的所有目标文件列表中的第一个目标文件。$<也是一个自动变量,表示在当前规则的第一个依赖项文件名。$*是一个自动变量,表示当前匹配到的模式部分,具体来说它是指模式规则中%匹配到的部分内容。
编译项目
make -C directory_to_your_project target