2012-10-11 40 views
0

我有一個Linux GNU C項目,需要使用通用的C源代碼庫,但使用不同的makefile,爲兩個不同的硬件設備構建輸出。目前我在同一個文件夾中有兩個makefile,每個設備都有一個makefile,當我修改代碼時,我必須先做「clean clean」來製作第一個模型,然後「make clean」製作第二個模型。這是因爲他們使用不同的編譯器和處理器。即使代碼文件沒有更改,我也必須重新編譯其他設備。使用Linux中的makefile將源文件更新到不同的文件夾

我想要做的是爲第二個模型使用不同的文件夾,因此它存儲* .d和* .o文件的單獨副本。我不必「乾淨」,只重新編譯更改的源代碼。我研究過makefile的語法,並且對於Linux來說是新手,只能在這些東西的神祕性質上搔頭。

我正在考慮的一種方法是將.c & .h文件從model_1文件夾更新到model_2文件夾。有人能給我提供一個簡單的makefile文件,它只會將新的* .c和* .h文件從一個文件夾複製到另一個文件夾中?

或者,必須有一種方法可以有一個共同的源文件夾和單獨的輸出文件夾,因此不需要重複的源文件。任何幫助實現這一點,表示讚賞。如果你想看看他們,我可以提供makefile。

+2

顯示您嘗試的'Makefile'-s的相關規則。 –

+0

如果你向我們展示了你的目錄結構和makefile,那真的會有所幫助。否則,我們所能做的最好的是提供高水平的建議,您可能會發現難以實施。 – Beta

回答

0

你可以將你的源文件編譯成不同目錄中的目標文件(「文件夾」在Unix上並不是真正適合的文字)。您只需設置適當的make規則。你可能會使用其他製造商一樣omakescons,...

你可以使用remake調試你的GNU Makefile -s。你可以像

$(OBJDIR)/%.o: $(SRCDIR)/%.c 
     $(COMPILE.c) -c $^ -o [email protected] 

的規則內,你可以(在你的前面Makefile)與例如設置的變量

OBJDIR:=obj-$(shell uname -m) 

或更好的東西

我建議閱讀GNU make的manual;它有一個makefile的介紹。

+0

如果我只是創建一個簡單的makefile(目前稱爲'test'),將源文件從model1目錄更新到model2目錄,我認爲它會更容易。這是我的。它從'model2'目錄運行。 \ *。c:../model1/\*.c cp $ <$ @我正在用'make -f test -n'來測試它,所以它實際上並沒有做任何事情,只是告訴我結果。它只顯示第一個更改的文件,而不是所有更改的文件。 (注意:兩個空格不能用作換行符。) – pwrgreg007

+0

\ *。c:../model1/\*.c cp $ <$ @ @不起作用。這看起來應該如何? – pwrgreg007

+0

在* make *規則中使用'%',而不是'*' –

0

您希望生成的文件(對象和依賴關係)在編譯時放入每個構建類型的單獨文件夾中。這是我不得不做,可能會爲你工作:

$(PRODUCT1_OBJDIR)/%.o $(PRODUCT1_OBJDIR)/%.d: %.cpp 
     @mkdir -p $(@D) 
     $(CXX) $(PRODUCT1_DEPSFLAGS) $(CXXFLAGS) $(INCLUDE_DIR) $< -o $(PRODUCT1_OBJDIR)/$*.o 

$(PRODUCT2_OBJDIR)/%.o $(PRODUCT2_OBJDIR)/%.d: %.cpp 
     @mkdir -p $(@D) 
     $(CXX) $(PRODUCT2_DEPSFLAGS) $(CXXFLAGS) $(INCLUDE_DIR) $< -o $(PRODUCT2_OBJDIR)/$*.o 

$ PRODUCT1_OBJDIR和$ PRODUCT2_OBJDIR是目錄,你希望有存儲生成的文件變量的名稱。這將檢查對依賴關係的更改並在需要時重新編譯。

如果您仍有問題,請回復並提供反饋意見,並嘗試將您整理出來。

+0

如果我只是創建一個簡單的makefile(目前稱爲'test'),將源文件從model1目錄更新到model2目錄,我認爲它會更容易。 model2目錄具有自己的makefile,專門用於構建此模型。這是我的。它從'model2'目錄運行。 %.c:../model1/%.c cp $ < [email protected]我正在用'make -f test -n'來測試它,所以它實際上沒有做任何事情,只是告訴我結果。它回覆「make:*** no targets。Stop」。我已閱讀了GNU Make文檔,沒有得到它。 (注意:兩個空格不能用作換行符。) – pwrgreg007

+0

主持人:該線程是否可以刪除?我原來的問題可能太模糊了,我從來沒有得到我期待的答案。 – pwrgreg007

0

這可以通過makepp的存儲庫機制輕鬆實現。如果您撥打makepp -R../src ARCH=whatever,那麼它將象徵性地鏈接當前目錄下../src的所有部分並在此編譯。

你甚至可以創建一個文件.makepprc並放入特定於此體系結構的任何選項,以便您永遠不會混淆哪個命令調用哪裏。

如果您的不同體系結構具有相同的生成文件(如生成的源文件),您甚至可以在../src中構建,而其他體系結構將挑選與當前編譯選項無關的所有內容。

makepp還有很多。除了幾乎所有的GNU make功能之外,還有更多有用的東西,甚至可以用一些Perl編程擴展makefile。

相關問題