仅重新编译更改的文件(两步)
Recompile only changed files (two-steps)
我在这里阅读了几个关于 SO 的问题,但我的 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 步: 从 foo.ppx
构建 foo.cpp
和 foo.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.cpp
和 foo.h
(以及 bar.h
和 baz.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 的问题(我不必对此进行试验)仍然出现故障,请在评论中告诉我们;我很确定修复很容易。
我在这里阅读了几个关于 SO 的问题,但我的 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 步: 从 foo.ppx
构建 foo.cpp
和 foo.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.cpp
和 foo.h
(以及 bar.h
和 baz.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 的问题(我不必对此进行试验)仍然出现故障,请在评论中告诉我们;我很确定修复很容易。