2012-10-11 48 views
1

我有一個項目Makefile。這是有效的,它的工作原理:如果我輸入make,我會得到一個在當前文件夾中編譯的二進制文件。我想找到一種以編程方式(從腳本)獲取二進制名稱的方法,或者如果make生成多個文件,則可以獲取這些文件的完整列表。如何從Makefile獲取已編譯文件的列表?

我想可以有三種方式來做到這一點:

  1. 執行make -d或類似的東西,並分析其輸出來獲得文件名。它有多可靠?它是否適用於所有Makefile或僅適用於最標準的?
  2. 要調用一些特殊的make命令來清除所有目標文件,所以我得到只有生成的目錄中的二進制文件。有這樣的命令嗎?
  3. 解析Makefile的內容,並從中獲得所有信息與外國公用事業。再說一次,它有多可靠?

我想找到任何Makefile基於項目的通用解決方案,但如果有一種通過CMake的生成的特定解決方案,這將有助於我在某些情況下,太。

+0

'make -p'的輸出可能比'make -d'更有用;它列出了具有擴展包含和完整內置規則等的完整生成文件。這爲您提供了一整套適用的規則。然後你必須知道'make'如何處理推斷的依賴關係(規定'給定一個目標'target',它可以從'target.c'構建,可能通過'target.o'鏈接推理)。請注意,大多數'makefile's可以創建大量未列出的目標。如果目錄中有一個'source.c'文件,無論是否有'makefile',通常都會輸入'make source'。 –

回答

1

這是一個有趣的問題。一個問題:什麼是二進制文件?

假設我有一個Makefile文件,它看起來像

foo.pdf foo.aux: foo.tex 
    pdflatex foo 

foo.tex: foo.tex.in edits.sed 
    sed -f edits.sed foo.tex.in >foo.tex 

PRODUCTS: foo.pdf 

(即不只是一個Makefile它建立一個可執行程序)。 foo.pdf是二進制文件嗎?是foo.aux,是次要產品?是foo.tex,這是一箇中間的標準意義上的「二元」嗎?是PRODUCTS,它是一個虛擬目標,但它仍然是依賴規則的目標,即使是「二進制」?按照這些思路思考,我懷疑沒有什麼真正有用的,甚至是稍微固定的定義,即你看起來在尋找的「二元」是什麼。也就是說,我懷疑你提出的問題可能比看起來更模糊。

因此,最好升級一級,忘記二進制文件,並詢問是否有任何方法來提取Makefile的依賴關係圖。一旦你有了這些,你可以看看它,並從你所需要的意義上識別那些「二元」的東西。

你怎麼得到這個依賴關係圖? GNU的'make'信息頁面提到了依賴關係圖,但沒有更多的細節,特別是沒有提供一種內部生成的方式。

實際上,通過分析Makefile可以簡單地構建自己的圖形,這可能相當容易。並且,我們開始搜索「makefile parser」,它確實會產生一些結果:只有我能看到Perl,但你可以用這個做一些事情。

這是一個很長的說法,我不能想到一個漂亮的更快的方式(修補automake將是一條路線,如果你是通過這條路線生成這些Makefiles,但你的問題表明否則)。

+0

這是很多文字只是說「人造」和「LMGTFY」。 – suprjami

0

這是很常見的發現,在一個Makefile中,有這樣一個定義命名clean目標:

clean: 
    rm -rf *.o core *.stackdump 

調用make clean然後導致這個目標是「建」,那就是在所有文件具有指定名稱的當前工作目錄將被極端偏見地移除。

這是,大約,你的選擇2建議;你可以編寫你的makefile文件,這樣clean就是每次執行make時建立的。我認爲這比解析Makefile或分析make -d的輸出要容易。這可能也是一個簡單的方法來繞過@Norman Gray的答案中提出的問題。

+0

理想情況下,我希望能夠解析*任何* Makefile,不僅是我自己的。它與IDE所做的相似:它從Makefile獲取源文件列表,並且我想在不編輯Makefile的情況下獲取生成的文件。 –

+0

如果你真的想分析一個Makefile,首先檢查一個已經包含Makefile解析器的程序的源代碼。像GNU Make這樣的程序。如果你認爲合適,就適應,這就是開源的意義。 –

相關問題