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

时间:2017-09-27 12:38:28

标签: c++ makefile timestamp preprocessor

我在这里已经阅读了几个问题,但我的Makefile仍然不会做我想要的。与其他问题相反,我在这里有一个两步编译。步骤如下:

  • 使用预生成器工具(称为ppx)生成.cpp.h个文件,
  • 然后编译它们生成.o个文件,
  • 最后创建一个动态库。

所有这些都在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 个答案:

答案 0 :(得分:1)

第1步:foo.cpp构建foo.hfoo.ppx,并将它们放在正确的目录中。 (我理解你的意思是“正确的目录”是$(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.ofoo.cpp(以及foo.hbar.h构建baz.h。我建议你接下来要研究自动依赖处理。)

# 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(我不需要进行实验)问题仍然出现故障,请在评论中告诉我们;我很确定修复很容易。