我正在尝试编写一个生成文件,该文件创建相同的可执行文件(EXE
(,但用于不同的目的,(OBJ_DIR
中的*.o
文件使用单独的规则构建,此处未显示(
FILE1 = ... some list of files ...
FILE2 = ... different list of files...
myexe1: $(patsubst %, $(OBJ_DIR)/%.o, $(FILE1))| $(BIN_DIR)
$(F90) -o $(EXE) $^ $(FFLAGS)
myexe2: $(patsubst %, $(OBJ_DIR)/%.o, $(FILE2))| $(BIN_DIR)
$(F90) -o $(EXE) $^ $(FFLAGS)
我可以用make myexe1
和make myexe2
调用make并构建EXE
但由于EXE
不是myexe1
或myexe2
,因此每次调用make myexe1/myexe2
时都会触发构建。但我想要的是,当调用myexe1
时,它应该检查EXE
是否更新,然后它应该触发构建。我可以让myexe1
成为一个虚假的目标来部分实现这一点,就像一样
FILE1 = ... some list of files ...
FILE2 = ... different list of files...
myexe1 : $(EXE)
$(EXE): $(patsubst %, $(OBJ_DIR)/%.o, $(FILE1))| $(BIN_DIR)
$(F90) -o $(EXE) $^ $(FFLAGS)
但是我不能再运行myexe2
了。当调用myexe1
或myexe2
时,是否应该检查EXE
和相关对象文件是否已更新,然后才应该触发构建过程?
这是一个奇怪的要求。但我建议您构建唯一目标,然后将其复制到通用目标作为副作用:
FILE1 = ... some list of files ...
FILE2 = ... different list of files...
myexe1: $(patsubst %, $(OBJ_DIR)/%.o, $(FILE1))| $(BIN_DIR)
$(F90) -o $@ $^ $(FFLAGS)
cp $@ $(EXE)
myexe2: $(patsubst %, $(OBJ_DIR)/%.o, $(FILE2))| $(BIN_DIR)
$(F90) -o $@ $^ $(FFLAGS)
cp $@ $(EXE)
现在,无论myexe1
还是myexe2
中的哪一个是最后构建的,都将是$(EXE)
中的那个。