2011-04-08 68 views
1

我有一個baremetal項目,其中包括.s文件旁邊的.s文件。我想知道如何編寫一個makefile文件,其中我明確指出從.c文件編譯.s文件。文件位於程序的子文件夾(源文件,包含文件,啓動文件)中。我正在尋找這樣的事情。這個好嗎?那麼我怎樣才能把對象鏈接到exe文件呢?makefile與.c文件旁邊的.c文件

SHELL := /bin/bash 
ROOT := $(shell pwd) 
VPATH := $(ROOT)/source:/$(ROOT)/startup:$(ROOT)/include 
EXE := exe 
OBJECTS_GCC := $(patsubst %.c,%.o,$(wildcard *.c)) 
OBJECTS_AS := $(patsubst %.s,%.o,$(wildcard *.s)) 
AS := arm-none-eabi-as -mcpu=arm926ej-s -Wall 
GCC := arm-none-eabi-gcc -mcpu=arm926ej-s -Wall 
LD := arm-none-eabi-ld -T test.ld -o $(EXE) 

all: $(EXE) 
$(EXE): startups sources 

startups: $(OBJECTS_AS) 
    $(AS) $(OBJECTS_AS) 

sources: $(OBJECTS_GCC) 
    $(GCC) $(OBJECTS_GCC) 

我很難找到任何包含.s文件和.c文件的例子。

問候。


這裏是makefile文件的最新版本,其中header.h心不是發現:

SHELL := /bin/bash 
ROOT := $(shell pwd) 
INC := $(ROOT)/inc 
SRC := $(ROOT)/src 
STR := $(ROOT)/str 
EXE := exe 
AS := arm-none-eabi-as -mcpu=arm926ej-s -c -Wall -I $(INC) -I$(SRC) -I $(STR) 
GCC := arm-none-eabi-gcc -mcpu=arm926ej-s -c -Wall -I $(INC) -I$(SRC) -I $(STR) 
LDSCRIPT := test.ld 
LD := arm-none-eabi-ld -T $(LDSCRIPT) 
HEADERS := $(notdir $(wildcard $(INC)/*.h)) 
SOURCES_GCC := $(notdir $(wildcard $(SRC)/*.c)) 
SOURCES_AS := $(notdir $(wildcard $(STR)/*.s)) 
OBJECTS_GCC := $(SOURCES_GCC:.c=.o) 
OBJECTS_AS := $(SOURCES_AS:.s=.o) 
VPATH := $(STR):$(SRC):$(INC) 

all : $(EXE) 
    @echo konec postopka: izvrsljiv program po imenu $(EXE) se nahaja v mapi $(ROOT) 

$(EXE) : $(OBJECTS_AS) $(OBJECTS_GCC) 
    @echo objekti so: $(OBJECTS_AS) $(OBJECTS_GCC) 
    @echo headerji so: $(HEADERS) 
    @echo linkanje objektov v izvrsljiv program... 
    $(LD) -o [email protected] $^ 

%.o : %.s %.h 
    @echo prevajanje ASSEMBLY izvornih datotek... 
    $(AS) -o [email protected] $< 

%.o : %.c %.h 
    @echo prevajanje C izvornih datotek... 
    $(GCC) -o [email protected] $< 

.PHONY : clean 
clean : 
    @echo brisanje objektov 
    rm *.o 
    @echo brisanje izvrsljivega programa 
    rm $(EXE) 
+0

針對更新生成文件,我不知道爲什麼header.h沒有找到,如果它確實在目錄INC存在。但是我注意到,你在其中一個註釋中說過,header.h是你唯一的頭文件,但是你定義的隱式規則爲每個目標文件尋找一個單獨的頭文件。如果只有一個頭文件,並且每個目標文件都依賴於它,則應該明確提及它,而不是使用模式%.h。將模式規則更改爲'%.o:%.s header.h',或從模式規則中刪除%.h,並放入以下行:'$(OBJECTS_AS)$(OBJECTS_GCC):header.h'。 – eriktous 2011-04-11 19:43:38

+0

也許你應該爲這個缺少標題的新問題開始一個新的問題。包含最新的makefile以及運行時收到的確切錯誤消息。 – eriktous 2011-04-11 19:46:18

+0

我確實開始了新的話題,並且設法解決了一些問題。 makefile似乎現在可以工作。這個makefile是另一個具有相同樹結構和inc文件夾中更多頭文件的項目,所以將%.h改爲header.h不是一個選項。請看看這裏:http:// stackoverflow。com/questions/5626606/make-uses-cc-instead-of-arm-none-eabi-as – 71GA 2011-04-14 20:31:49

回答

4

想想什麼命令,你會不make問題。你會採取哪些步驟?你首先創建了哪些文件,以及文件如何在可以創建之前依賴於其他文件的存在?
一旦你清楚地瞭解了這些,編寫模仿這些命令的規則,但是包含make變量。

如果你有這個問題,你可以通過使用諸如隱式規則,自動變量等等的東西來增強你的makefile,但是要保持簡單,直到你掌握了make的工作方式。

幾個要點:

  • 我不認爲通配符功能將拿起任何文件名用這種方式。它只在當前目錄中查找,並且不使用VPATH在其他目錄中搜索。
  • 您可以使用gcc和對象作爲輸入。這樣它會(嘗試)創建一個可執行文件。
  • 您沒有規則來創建對象文件。如果您依賴make的內置隱式或模式規則,這可能沒問題,但它不會使用您想要使用的gcc版本及其關聯的標誌。您必須設置一些其他變量才能正常工作(如CCCFLAGS等)。
  • 您已定義LD,但從不使用它。在配方中使用它來創建可執行文件。

我想你應該有更多的東西是這樣的:

all: $(EXE) 

$(EXE): $(OBJECTS_AS) $(OBJECTS_GCC) 
    $(LD) $^ 

%.o: %.s 
    $(AS) $< 

%.o: %.c 
    $(GCC) -c $< 
+0

這段代碼是否循環直到所有.s文件被讀取? %.o:%.s $(AS)$ < – 71GA 2011-04-08 13:00:42

+0

@ 71GA:它提供了從相應的* .s文件創建* .o文件的一般模式。 $(EXE):$(OBJECTS_AS)$(OBJECTS_GCC)'行通知在嘗試創建$(EXE)之前需要所有這些目標文件。對於每個對象文件分別'make',然後看它是否可以找到一個規則來構建它。如果存在一個* .s文件,它具有相同的名稱(沒有擴展名)作爲* .o文件,它會在'%.o:%.s'後面執行該命令。如果找不到這樣的* .s文件,它會查看它是否可以找到與* .o文件相匹配的* .c文件,然後在'%.o:%.c'後執行該命令。 – eriktous 2011-04-08 13:30:03

+0

還有一件事。如果我使用$(OBJECTS_AS)$(OBJECTS_GCC)作爲目標$(EXE)的先決條件,我會得到未解析的引用,但是如果我將我的文件(即startup.o和test.c)的實際名稱作爲先決條件,我的make文件。必須再犯一個錯誤。 – 71GA 2011-04-08 13:49:34