出于某些实际原因,在工作目录中为 Makefile 规则准备位置对我来说会很有用。考虑假设的情况,如果
$(VAR)
值为 true,我需要在编译之前将 test.f
文件移动到实际目录中。我尝试将 ifeq
条件与 mv
命令一起使用,但仅当我将其封闭为规则时才有效:
VAR=true
cond:
ifeq ($(VAR),true)
@mv dir/test.f .
endif
test.x: test.o
ifort -o test.x test.o
test.o: test.f
ifort -c -o test.o test.f
但是,在这种情况下,仅执行
cond
规则,而 test.x
和 test.o
不执行。
有什么办法吗
ifeq ($(VAR),true)
@mv dir/test.f .
endif
应该始终执行而不阻止 Makefile 中(其他)规则的执行?
为了完整起见,我附上了我想要处理的真实条件块:
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
VAR=true
ifeq ($(VAR),true)
dummy_prerequisite:
@mv dir/test.f .
endif
test.x: dummy_prerequisite test.o
ifort -o test.x test.o
test.o: dummy_prerequisite test.f
ifort -c -o test.o test.f
这样,
dummy_prerequisite
目标将始终在任何其他规则之前执行,确保条件块的执行不会影响Makefile中的其他规则。