makefile具有不同依赖关系的同一可执行文件



我正在尝试编写一个生成文件,该文件创建相同的可执行文件(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 myexe1make myexe2调用make并构建EXE
但由于EXE不是myexe1myexe2,因此每次调用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了。当调用myexe1myexe2时,是否应该检查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)中的那个。

最新更新