2016-08-01 85 views
0

我有一堆文件(*.txt),我使用python腳本來分析並生成代碼(*.cpp)。代碼生成完成後,我希望將生成的代碼編譯到目標文件(*.o)中。gnu make兩步編譯過程

我想用gnu-make來設置它。我的問題是,我無法弄清楚一個可行的Makefile語法來完成這個。

這裏有一些額外的細節,使這個困難:

因爲我不知道有多少* .TXT檔案如何存在擺在首位,我想用一個shell find命令來發現它們。

files := $(shell find $(TXT_FILE_DIR) -type f -name '*.txt')

不過,我還是想GNU-make的罰款依賴功能在這裏工作。也就是說,如果有任何txt文件發生更改,我希望make自動發現這些更改並僅爲這些更改生成新的.cpp文件,並將它們重新編譯爲.o文件。

我正在尋找一個解決方案,其中make可以並行運行(並尊重-j標誌)並調用python腳本將*.txt文件轉換爲*.cpp文件。

我的操作系統是Linux。

[新信息]

謝謝Grexis,爲您解答!但是,因爲我在src和dst-paths之間有一些奇怪的映射關係,所以實際上我正在尋找一種不同的解決方案。這裏

$(TXT_DIR)/a/XXX.*XXX/b/c/file1.txt -> $(CPP_DIR)/a/YYY/b/c/file1.cpp $(TXT_DIR)/a/XXX.*XXX/b/c/file2.txt -> $(CPP_DIR)/a/YYY/b/c/file2.cpp $(TXT_DIR)/b/XXX.*XXX/c/d/file3.txt -> $(CPP_DIR)/b/YYY/c/d/file3.cpp

注意,路徑被操縱兩次:

在這裏翻譯我的src和dst的路徑時是「異類」的一個例子。因此,兩個:

  1. $(TXT_DIR)替換$(CPP_DIR)
  2. 正則表達式XXX.*XXX被替換爲固定字符串YYY

然而,由於其很難做到多個字符串替換在gnu-make,例如,gnu-make一次只支持一個%(幹)字符串替換,我想我必須使用更高級的gnu-make語法。因此,我正在尋找一種方法來定義「每個.txt - >.cpp對的不同配方」。我曾嘗試以下:

cleanPath = $(shell echo $(1) | sed s/XXX.*XXX/YYY/g) txt2cpp = $(subst $(TXT_DIR),$(CPP_DIR),$(patsubst %.txt,%.cpp,$(call cleanPath,$(1)))) txt2obj = $(subst $(TXT_DIR),$(OBJ_DIR),$(patsubst %.txt,%.o,$(call cleanPath,$(1)))) define analyse = $(2): $(1) python.py $(2) $(3) endef txt_files := $(shell find $(TXT_DIR) -type f -name '*.txt') cpps := $(foreach file,$(txt_files),$(eval $(call analyse,$(file),$(call txt2cpp,$(file)),$(call txt2obj,$(file))))) all: $(cpps)

然而,似乎我的python.py腳本不會被調用。這是爲什麼?

如果我將python.py的呼叫附在shell命令中,例如$(shell python.py $(2) $(3)),則實際調用python.py腳本。但是,使用shell命令會使並行性不可行。不幸的是,無法並行執行python.py腳本不適合我。

回答

0

如果每個文本文件都創建一個具有匹配名稱的C++源代碼(即'foo.txt'被處理成'foo.cpp'然後'foo.o'),有點不清楚。

假設它是一個直接關係,您要查找的功能稱爲Pattern Rules

TXT_FILES := $(wildcard $(TXT_FILE_DIR)/*.txt) 
OBJ_FILES := $(patsubst $(TXT_FILE_DIR)/%.txt,$(OUT_DIR)/%.o,$(TXT_FILES)) 

main: $(OBJ_FILES) 
    $(CXX) $(LDFLAGS) -o [email protected] $^ 

$(SRC_DIR)/%.cpp: $(TXT_FILE_DIR)/%.txt 
    $(PYTHON) process.py $< 

$(OUT_DIR)/%.o: $(SRC_DIR)/%.cpp 
    $(CXX) -c $(CPPFLAGS) -o [email protected] $< 

分解上面的代碼片段。 $(TXT_FILES)設置爲每個*.txt文件中的$(TXT_FILE_DIR),並在make中使用通配符操作。 $(OBJ_FILES)使用$(TXT_FILES)中所有值的模式替換。然後將每個obj文件作爲依賴項添加到main可執行文件中。

如上鍊接的模式規則鏈接文檔中說明的那樣,每.o文件需要在$(SRC_DIR)關聯.cpp文件(的自動變量[email protected]$^,和$<也記錄在所提供的鏈接)。反過來,每個.cpp文件都需要具有相同名稱的.txt

儘管你可能需要調整python腳本的確切調用。如果需要指定特定的輸出文件,則應使用[email protected]自動變量。

頂部用於檢測所有源文件的部分源自this answer

+0

我喜歡這個答案,但我認爲通過將模式規則更改爲_static模式規則_將會得到改善。在這種情況下很容易:'$ {OBJ_FILES}:$ {OUT_DIR} /%。o:$ {SRC_DIR} /%。cpp' – bobbogo