我已經閱讀了幾個關於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)/[email protected] -c $(TARGET_TEMP_DIR)/$<
以上Makefile
總是重新編譯所有文件。在閱讀了我在這裏找到的所有問題之後,我成功做的唯一一件事是從不重新編譯Makefile
,所以當我更改ppx
文件時,它什麼也沒做。
你能幫我發現錯誤嗎?
您的變量「PPX_FILES」和「CPP_FILES」具有誤導性,因爲「PPX_FILES」列出了C++源文件,「CPP_FILES」列出了目標文件。您也不需要從磁盤中爲每個變量獲取文件名,只需替換第一個變量的後綴即可。 –
您的ppx工具是否會重新生成尚未更改的文件?他們的時間戳是否改變? –
@RetiredNinja是的,它的確如此。我試圖用'make'來避免這種情況。 – senseiwa