如何将 Makefile 条件与 bash 命令一起使用作为 Makefile 规则的准备步骤?

问题描述 投票:0回答:1

出于某些实际原因,在工作目录中为 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
bash makefile conditional-statements
1个回答
0
投票
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中的其他规则。

© www.soinside.com 2019 - 2024. All rights reserved.