2011-11-12 79 views
0

我想編寫一個makefile來編譯一個簡單的模擬實時操作系統,用c語言編寫。來自makefile的多個可執行文件

的目錄結構看起來像這樣

**KB** 

    SOURCE 
    ------- 
     - Keyboard.c (helper process) 
    Incl 
    -------- 
     - Include files needed by keyboard.c 

    **CRT** 

    SOURCE 
    ------- 
     - crt.c (helper process) 
    Incl 
    -------- 
     - Include files needed by crt.c 

    **RTX** 

    SOURCE 
    ------- 
     - SOURCE Files 

    INCLUDE 
    -------- 
     - Include Files 

的RTX要求輔助程序被編譯成兩個可執行文件,它然後使用這些可執行文件運行。

我不知道如何在同一個Makefile中生成三個不同的可執行文件,甚至不知道如何在甚至一個可執行文件的不同包含文件中包含文件。我以前從未創建過makefile,並且在線教程後遇到問題。

這裏是我迄今爲止的RTX(我怎麼在不同的路徑添加?)

#For RTX Exexutable 
OBJS = api.o init_table.o k_rtx.o msg.o pcb.o queue.o user_proc.o main.o 

iRTX-G29 : $(OBJS) 
    gcc -o iRTX-G29 $(OBJS) 

api.o : api.h 
    gcc -c api.c 
init_table.o : init_table.h 
    gcc -c init_table.c 
k_rtx.o : unistd.h string.h k_rtx.h 
    gcc -c k_rtx.c 
main.o : fcntl.h sys/mman.h sys/wait.h stdio.h stdio.h sys/types.h sys/ipc.h sys/shm.h errno.h string.h stdlib.h signal.h k_rtx.h buffer.h global.h 
    gcc -c main.c 
msg.o : msg.h 
    gcc -c msg.c 
queue.o : queue.h 
    gcc -c queue.c 
user_proc.o : user_proc.h 
    gcc -c user_proc.c 

任何幫助將不勝感激!謝謝!

+0

這看起來像一個非常簡單的佈局。 1)makefile在哪裏? 2)你想在哪裏得到目標文件('msg.o')和可執行文件(iRTX-G29)? 3)這三個分支是否相互依賴(例如,RTX需要'Keyboard.h'還是'crt.h')? – Beta

+0

makefile位於名爲project的主目錄中。 「Project」目錄包含目錄RTX,KB和CRT。每個目錄包含源文件和頭文件所在的源文件和頭文件夾。 makefile應該爲鍵盤生成三個可執行文件,一個用於crt,一個用於RTX本身。 – Falcata

+0

RTX可執行文件需要運行KB和CRT可執行文件,但不需要頭文件。每個可執行文件都是不同的過程 – Falcata

回答

0

我不知道如何在同一個Makefile中生成三個不同的可執行文件,甚至不知道如何將文件包含在不同的包含文件中,即使是一個可執行文件。

這是開始使用automake的最佳時機。 Sarah George已經寫了一個很好的教程。

+0

我應該提到我需要手工編寫一個makefile = [ – Falcata

+0

@Falcata:你應該在這種情況下添加homework標籤。 – thiton

1

Makefile中,你可以寫目標是不符合實際的文件:

all: executable1 executable2 

executable1: a.o b.o 
<TAB HERE>gcc -o [email protected] $^ 

executable2: c.o d.o 
<TAB HERE>gcc -o [email protected] $^ 
4

首先讓我們簡化現有makefile。您有多個具有相同的形式很多對象的規則:

msg.o : msg.h 
    gcc -c msg.c 

一個更清潔的方式來寫它是這樣的:

msg.o : msg.c msg.h 
    gcc -c $< -o [email protected] 

(我已經添加了依賴msg.c,把一些automatic variables和規定現在所有這些對象規則看起來都是一樣的,我們可以爲此製作一個pattern rule,但是現在我要分開標題依賴關係,因爲main.o不取決於main.h

api.o : api.h 
init_table.o : init_table.h 
k_rtx.o : unistd.h string.h k_rtx.h 
main.o : fcntl.h sys/mman.h sys/wait.h stdio.h stdio.h sys/types.h sys/ipc.h sys/shm.h errno.h string.h stdlib.h signal.h k_rtx.h buffer.h global.h 
msg.o : msg.h 
queue.o : queue.h 
user_proc.o : user_proc.h 

%.o : %.c 
    gcc -c $< -o [email protected] 

大多數對象有一個頭的依賴,所以我們可以把這些分開洗出來,並使其短一點:

api.o init_table.o k_rtx.o msg.o queue.o user_proc.o : %.o : %.h 

k_rtx.o : unistd.h string.h 
main.o : fcntl.h sys/mman.h sys/wait.h stdio.h stdio.h sys/types.h sys/ipc.h sys/shm.h errno.h string.h stdlib.h signal.h k_rtx.h buffer.h global.h 

%.o : %.c 
    gcc -c $< -o [email protected] 

這將在RTX /工作,但要獲得當執行它的工作父目錄,我們必須改變一些東西。我假設存在文件名衝突的危險(即在RTX中存在main.c,並且在CRT /中存在不同main.c,因此我們不能將main.o混合起來)。因此,讓我們將RTX對象文件保留在RTX /中(爲了方便起見,我會將main.o帶出對象列表,並省略sys/***依賴項,因爲我不知道您保留的位置sys/)。而且這個答案越來越長,所以我會摺疊其他可執行文件和主目標來構建它們:

# This is the first target, so it will be the default: run "make", and you'll get this. 
.PHONY: all 
all: iRTX-G29 iCRT-G29 iKBD-G29 
    @echo all done 

#For RTX Executable 
RTX_OBJS = $(addprefix RTX/, api.o init_table.o k_rtx.o msg.o pcb.o queue.o user_proc.o) 
iRTX-G29 : $(RTX_OBJS) RTX/main.o 

# This is a little clumsy, but it can't (easily) be helped. 
RTX/k_rtx.o : RTX/unistd.h RTX/string.h 
RTX/main.o : $(addprefix RTX/, fcntl.h stdio.h stdio.h errno.h string.h stdlib.h signal.h k_rtx.h buffer.h global.h) 

#Now we can throw in the CRT and Keyboard executables: 

CRT_OBJS = $(addprefix CRT/, this.o that.o theOther.o) 
iCRT-G29 : $(CRT_OBJS) CRT/main.o 

CRT/this.o: CRT/whatever.h 

KBRD_OBJS = $(addprefix SOURCE/, red.o green.o blue.o)  
iKBD-G29 : $(KBRD_OBJS) SOURCE/main.o 

SOURCE/green.o: SOURCE/chlorophyll.h 

# Now for the stuff common to all three 

iRTX-G29 iCRT-G29 iKBD-G29 : 
    gcc -o [email protected] $^ 

$(RTX_OBJS) $(CRT_OBJS) $(KBRD_OBJS): %.o : %.h 

%.o : %.c 
    gcc -c $< -o [email protected]