我正在编写一个用于使用微控制器的 makefile。
各种 PHONY 目标包括:
- 构建 - 构建项目
- flash - 闪烁 MCU
- 串行 - 打开 Minicom 串行接口
这些都不严格依赖于另一个 - 例如我可以打开串行而不重建或重新刷新。
但是,如果还指定了其他目标(例如make flash serial
),则需要遵守一定的顺序(在刷新之前构建,在打开串行之前刷新)。
Make 正在启用并发 ( -j
) 的情况下运行,我不想更改它。
如何定义可选依赖项,以确保目标的排序,而不需要每次都检查/更新这些依赖项(除非有要求)?
答案1
这是为 GNU Make 编写的,我不知道 MAKECMDGOALS 是 GNU-only 还是 POSIX。
Make 明确要求构建的目标位于MAKECMDGOALS
变量中。
我们可以过滤它来定义可选依赖项,以用于排序目的:
after = $(filter $(strip $1), $(MAKECMDGOALS))
post_build = $(call after, build)
post_flash = $(call after, flash) $(post_build)
...
.PHONY: build flash serial debug
...
flash: | $(post_build)
st-flash ...
serial: | $(post_flash)
minicom ...
debug: | $(post_flash)
$(GDB) ...
那样:
make build
将构建该项目make flash
将使用当前版本刷新 MCUmake serial
将打开串行接口make flash serial
(或反之亦然)将刷新 MCU,然后打开串行接口。make build flash
将构建项目,然后刷新 MCU。make build flash serial
(以任何顺序)将首先构建,然后闪存,然后打开串行接口。