如何在Makefile中使用条件判断结合Bash命令预处理工作目录?
Makefile 前置条件预处理实现方案
要让条件预处理逻辑在所有规则执行前自动运行,且不阻塞后续规则,核心是通过伪目标(.PHONY)+ 依赖链实现,具体步骤如下:
1. 创建预处理伪目标
把你的条件处理逻辑放到一个伪目标中,并用.PHONY标记,确保每次执行make都会触发它,不受同名文件影响。
2. 关联默认目标与预处理目标
让你的默认目标(通常是all)依赖这个预处理伪目标,这样执行make时会先完成预处理,再执行后续构建规则。
针对你给出的简单示例修改后的代码
.PHONY: preprocess preprocess: ifeq ($(VAR),true) @mv dir/test.f . endif # 默认目标依赖预处理和其他构建目标 all: preprocess test.x test.o # 后续构建规则示例 test.x: test.o # 这里写你的链接命令 test.o: test.f # 这里写你的编译命令
针对实际复杂条件代码的完整实现
.PHONY: preprocess preprocess: ifeq ($(VAR),"./") @if [ -d mod ]; then \ mv mod/* .; \ rm -rf mod; \ fi @if [ -d gen ]; then \ mv gen/* .; \ rm -rf gen; \ fi @if [ -d extra ]; then \ mv extra/* .; \ rm -rf extra; \ fi @if [ -d lnk ]; then \ mv lnk/* .; \ rm -rf lnk; \ fi else @if [ ! -d mod ]; then \ mkdir -p mod; \ mv mod_*.f* mod; \ fi @if [ ! -d txt ]; then \ mkdir -p txt; \ mv *.txt txt; \ fi @if [ ! -d gen ]; then \ mkdir -p gen; \ mv *.f* gen; \ fi @if [ ! -d lnk ]; then \ mkdir -p lnk; \ mv *.o lnk; \ mv *.mod lnk; \ fi endif # 将默认目标关联到预处理,再添加你的构建目标 all: preprocess # 比如你的实际构建目标: # all: preprocess app.exe lib.so # 后续构建规则示例 app.exe: main.o utils.o # 链接命令 main.o: main.f # 编译命令
关键说明
- 伪目标
preprocess被.PHONY标记后,Make不会检查是否存在同名文件,每次都会执行其中的逻辑。 - 所有需要依赖预处理的目标,都要把
preprocess加到自己的依赖列表里;如果用all作为默认目标,只需让all依赖preprocess即可覆盖所有子目标。
内容的提问来源于stack exchange,提问作者user5759106
相关产品推荐
相关产品推荐

