仅重新编译更改的文件(两步)

Recompile only changed files (two-steps)

我在这里阅读了几个关于 SO 的问题,但我的 Makefile 仍然无法满足我的要求。与其他问题相反,我这里有一个两步编译。步骤如下:

所有这些都在 Xcode 环境(自定义构建目标)中,因此您可以看到所有这些 $(TARGET_TEMP_DIR) 和类似的变量。

调用make命令其中ppx文件,但我需要放置所有生成的文件(.cpp.h.o.dylib) 在正确的目录中(参见 $(LIB))。

注意:ppx 工具 不保留时间戳

这是我失败的尝试:

# target and compiler
LIB=$(TARGET_TEMP_DIR)/$(TARGET_NAME).dylib
PPX=$(HOME)/bin/ppx

# c++ compiler
CXXFLAGS=-std=c++14 

# files 
PPX_FILES := $(patsubst %.ppx, %.cpp, $(wildcard *.ppx))
CPP_FILES := $(patsubst %.ppx, %.o, $(wildcard *.ppx))
OBJ_FILES := $(addprefix $(TARGET_TEMP_DIR)/,$(CPP_FILES:%.cpp=%.o))

# link library
all: $(LIB)

$(LIB): $(PPX_FILES) $(CPP_FILES) $(OBJ_FILES)
    $(CXX) -dynamiclib -o $(LIB) $(OBJ_FILES)

# preprocess, generating source and header
%.cpp: %.ppx 
    $(PPX) -o $(TARGET_TEMP_DIR) $<

# compile cpp source files
%.o: %.cpp
    $(CXX) $(CXXFLAGS) -Ofast -o $(TARGET_TEMP_DIR)/$@ -c $(TARGET_TEMP_DIR)/$<

以上Makefile总是重新编译所有文件。在阅读了我在这里发现的所有问题之后,我唯一成功的就是拥有一个永不重新编译的 Makefile,这样当我更改 ppx 文件时它什么也没做。

你能帮我找出错误吗?

第 1 步:foo.ppx 构建 foo.cppfoo.h,并将它们放在正确的目录中。 (我理解你的意思是 "the right directory" 是 $(TARGET_TEMP_DIR),但你有点神秘。)

# preprocess, generating source and header
$(TARGET_TEMP_DIR)/%.cpp: %.ppx
    $(PPX) -o $(TARGET_TEMP_DIR) $< 

或更好:

# preprocess, generating source and header
$(TARGET_TEMP_DIR)/%.cpp: %.ppx
    $(PPX) -o $(dir $@) $< 

第 2 步:foo.cppfoo.h(以及 bar.hbaz.h 构建 foo.o,根据需要。我建议你接下来研究一下自动依赖处理。)

# compile cpp source files
%.o: %.cpp
    $(CXX) $(CXXFLAGS) -Ofast -o $@ -c $<

步骤 3: 构建所需目标文件列表,并使用合理的名称:

# files                                     
PPX_FILES := $(wildcard *.ppx)
OBJ_FILES := $(patsubst %.ppx, $(TARGET_TEMP_DIR)/%.o, $(PPX_FILES))

第 4 步: 构建库:

$(LIB): $(OBJ_FILES)
    $(CXX) -dynamiclib -o $@ $^

如果由于时间戳和 ppx 的问题(我不必对此进行试验)仍然出现故障,请在评论中告诉我们;我很确定修复很容易。