2017-01-11 105 views
0

我有一個項目,我想從遞歸轉換爲非遞歸製作。結構如下所示非遞歸製作

+--app 
| +-- Makefile 
+--lib1 
| +-- Makefile 
| +-- x.c 
| +-- y.c 
| 
+--lib2 
| +-- Makefile 
| +-- x.c 

我所試圖做的是後一個版本是有這樣

+--app 
| +-- build/ 
| | +-- debug(or release or test)/ 
| | | +-- lib1/ 
| | | | +-- *.o 
| | | | +-- *.d 
| | | +-- lib2/ 
| | | | +-- *.o 
| | | | +-- *.d 
| | 
| +-- target/ 
| | +-- main.bin 
| | 
| +-- Makefile 
| 
+--lib1 
| +-- module.mk 
| +-- x.c 
| +-- y.c 
| 
+--lib2 
| +-- module.mk 
| +-- x.c 

主要思想是構建文件夾中包含的所有對象和相關文件的結構並且target有應該加載的程序文件。

我遇到的問題是make永遠不會想要創建這個結構。當我定義我的規則時,make只會運行隱式規則,而不會運行我定義的規則。

我已經閱讀了所有有關非遞歸製作的資源,現在它只是沒有點擊。任何幫助深表感謝。

+0

讓我建議你我的非遞歸模板庫:https://github.com/igagis/prorab它有教程。如果您需要幫助,我可以幫助您將其應用到您的項目中。 – igagis

+0

我們不是「提供我的代碼!」社區。如果您有**特定的**問題,請將它與您迄今所做的一起說明。並且不要使用不相關的標籤。這與嵌入式系統無關。 – Olaf

+0

這與嵌入式系統有關,因爲它用於生成嵌入式處理器所需的二進制文件。目前,我們正致力於從專用IDE轉向更加簡化的IDE方法。 – user7404994

回答

0

對於構建結果具有這樣的源的相同的目錄結構中,圖案規則必須是以下形式:

${obj_dir}/%.o : ${src_dir}/%.c 

%部分包括所有的子目錄。對象文件也必須取決於其目錄make先建立的目錄:

.SECONDEXPANSION: 
${obj_dir}/%.o : ${src_dir}/%.c | $$(dir [email protected]) 
${obj_dir}/% : mkdir -p [email protected] 

根據目標,一個源文件可以用被編譯/無多線程,作爲位置無關/非位置無關的代碼,等等。來處理那些的一種方式是具有單獨的頂層對象文件目錄(除了調試/發佈頂級目錄),例如:

${obj_dir}/obj 
${obj_dir}/obj-pic 
${obj_dir}/obj-mt 
${obj_dir}/obj-mt-pic 

一旦你有這些規則正常工作,並嘗試一個並行版本,你會注意到mkdir -p失敗時,其中兩人競相創建/a/b/a/a/b/b。修復是:

${obj_dir}/% : while ! mkdir -p [email protected]; do echo -n ""; done