2017-08-07 42 views
0

情況很簡單。我有一組文件(.extA)和一個( .extB)。從所有的* .extB我用shell腳本生成.extA。然後我想將所有* .extA文件複製到安裝目錄。這不會發生在生成的文件中。Makefile生成的文件不被複制

convert: 
    ./convertFile.sh 

DATA = $(wildcard ./data/*.extA) 
TARGET := $(patsubst ./data/%.extA, ../install/data/%.extA, $(DATA)) 
install: $(TARGET) 
../install/data/%.extA: ./data/%.extA 
    cp -f $< [email protected] 

因此,DATA不包含myfile.extA,並且cp不會複製它。作爲蠻力來解決這個問題我改變的數據到:

DATA = $(wildcard ./data/*.extA) ./data/targetFile.extA 

雖然這解決了這個問題,我也很難相信,這不能以更優雅的方式來完成。如果我有100個生成的文件怎麼辦?在這種情況下我錯過了什麼?我如何確保在隱式規則完成之前不對數據進行評估?我也嘗試使用一個叫做convert的規則,但是我不能讓這個變量取決於規則...

我的選擇是什麼?

謝謝!

更新: convertFile.sh腳本選取所有* .extB文件並從它們創建extA文件。這實際上是在文件中的某些條目上進行base64編碼。所以這兩個文件是不可互換的。 將轉換規則更改回原始,因爲這只是一個最小樣本:)。現在這裏是場景:

01.extA 
02.extA 
03.extA 
... 
10.extA 
11.extB 
12.extB 
... 
98.extB 
99.extA 

所有這些* .extB文件都轉換爲extA使用轉換。但是,由於DATA不包含任何這些文件,因此它們不會被複制到安裝目標中。

在一個理想的世界,我要實現以下目標: 轉換的EXTB文件EXTA文件 - >複製所有axtA文件來安裝(包括產生的)

乾淨規則刪除所有轉換EXTA文件,因爲它們應該永遠不會在存儲庫中結束,但這僅僅是爲了獲得額外的信息,所以我不能在一天中的其他時間進行前期轉換並使用make。

回答

0

如果你不知道什麼*.extA將被創建:

convert: 
    ./convertFile.sh 

install: convert 
    install -d data/*.extA ../install/data/ 

.PHONY: convert install 

如果你能確定(運行./convertFile.sh之前)*.extA名字可以更換install: convertinstall: names_of_extA

+0

兩個問題:爲什麼使用'mkdir -p'而不是'install -D -d'?爲什麼用'@'隱藏這些命令? –

+0

我不能直接包含任何extB,因爲它們的格式不正確。我會更新我的帖子。 –

+0

@TobySpeight問題1:我使用FreeBSD,在其Makefile中定義了幾個宏而不創建目錄('COPYTREE_SHARE','COPYTREE_BIN'等),並且應該用'mkdir'創建目錄。 Q2:它是可選的。 – uzsolt

0

你在做什麼可能是正確的。原因是在處理Makefile時擴展$(wildcard),這是在創建./data/myfile.extA之前擴展的,所以它不會出現在擴展中。

很難知道其他的方法可能適用什麼,因爲有這麼多在Makefile中失蹤(我猜INSTALLDATATARGET某種程度上得到,但你沒有告訴我們該位,例如)。

+0

你是對的,我完全錯誤的那一點。這是TARGET,而不是INSTALL,只是蓋住並鍵入規則名稱。除此之外,我的Makefile中沒有其他信息。只有名稱已更改。 –

+0

你建議你可能有100個生成的文件,但不清楚它們是否會使用模式規則生成;我也無法分辨'TARGET'中是否有文件使用這個Makefile沒有生成。 –