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
  • command1command2,…:是生成或处理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