2017-12-18 152 views
-2

我試圖複製文件befoe編譯(我有兩個源文件具有相同的名稱,因此我將這些文件複製到具有不同名稱的文件),並在最後刪除它們的MAKEFILE。 我正在嘗試做下列事情,但可能在執行順序中存在不匹配。 我該如何正確地做到這一點?使用MAKEFILE在編譯之前複製文件並在刪除它們之後刪除它們

all: copy_dup_files $(dst_dir) $(APP_TARGET_LIB) delete_dup_files 

copy_dup_files: 
    @echo "COPYING DUP FILES" 
    $(shell cp /aaa/hmac.c /aaa/hmac1.c) 
    $(shell cp /bbb/hmac.c /bbb/hmac2.c) 

delete_dup_files: 
    @echo "DELETING DUP FILES" 
    $(shell rm /aaa/hmac1.c) 
    $(shell rm /bbb/hmac2.c) 

由於

回答

2

$(shell)的目的是,以產生使讀取的輸出。配方行根本不應該有這個結構。

# this is evaluated when the Makefile is read 
value := $(shell echo "Use the shell to produce a value for a variable") 

# this is evaluated when you say "make foo" 
foo: 
    echo 'No $$(shell ...) stuff here' 

所以,當讀Makefile都在你的企圖$(shell ...)東西被評估,但在執行任何實際的目標之前。

+4

順便說一句,在編譯之前複製文件本身就像是一個反模式。你爲什麼這麼做,你究竟在做什麼*試圖完成......? – tripleee

0

您的生成文件試圖說/aaa/hmac1.c取決於/aaa/hmac.c。 因此,我們有:

/aaa/hmac1.c: /aaa/hmac.c 
    cp $< [email protected] 

/bbb/hmac2.c: /bbb/hmac.c 
    cp $< [email protected] 

/aaa/hmac1.o /bbb/hmac2.o: %.o: %.c 
    gcc $< -o [email protected] 

myprog: /aaa/hmac1.o /bbb/hmac2.o 
    gcc $^ -o [email protected] 

這是乾淨的,安全的平行(任何生成文件的一個很好的測試)。

有無數風格的改進,你可以做,像

  • 擺脫了絕對路徑的
  • 使用符號鏈接,而不是複製
  • 自動依存產生的(對於.h文件等)
  • 不要污染源樹—將所有中間文件(.o和臨時.c s)放在它們自己的生成文件夾中

& c。 & c。

+0

我還需要在最後刪除hmac1.c&hmac2.c。如何做到這一點? –

+0

@RanTeshuva我個人會離開他們。想想他們的方式與您對'.o'文件的思考方式相同。由於它們是構建產品,因此我會在與目標文件相同的臨時文件夾中創建它們。 – bobbogo

+0

@RanTeshuva如果您確實想刪除它們,請在配方中創建並刪除它們以進行編譯。有一個重量級的'copy_dup_files'步驟可以一次完成所有的拷貝,這是一個錯誤的步驟。 _Make_更喜歡細粒度的依賴關係(然後在並行構建中運行良好)。 – bobbogo

相關問題