2011-04-05 106 views
1
中列出的文檔

我寫了一個shell腳本(bin/bash)。該腳本查看文件夾的啓動,源和對象都位於當前文件夾中。然後它使列表(文本文件)名爲startup_list(包括具有擴展名的文件),sources_list(文件的擴展名爲.c)和objects_list(包括擴展名爲.o的文件)。我們將所有.s文件分配給變量ASFILE,將所有.c文件分配給GCCFILE,並將所有.o分配給LDFILE。Linux shell命令讀取文本文件並打開

ASDIR="$(pwd)/startup" 
GCCDIR="$(pwd)/source" 
LDDIR="$(pwd)/objects" 
INCDIR="$(pwd)/include" 

ls $ASDIR/*.s > startup_list 
sed -i 's|..*/||g' startup_list 
ASFILE=$(cat startup_list) 

ls $GCCDIR/*.c > sources_list 
sed -i 's|..*/||g' sources_list 
GCCFILE=$(cat sources_list) 

cat startup_list sources_list > objects_list 
sed -e 's/\.c/\.o/g' objects_list > objects_list_tmp 
sed -e 's/\.s/\.o/g' objects_list_tmp > objects_list 
LDFILE=$(cat objects_list) 

該腳本將被整合到一個makefile文件後,但我現在需要一個殼COMAND打開.c文件一個又一個檢查什麼的#include命令後面列出的依賴關係。還有一件事。文本文件startup_list,sources_list和object_list在每行中列出一個文件。它看起來像這樣:

ea3131_startup_entry.c 
pad.c 
ea3131_board.c 
lpc313x_cgu_default.c 
lpc313x_cgu_driver.c 
lpc313x_dma_driver.c 
lpc313x_evt_driver.c 

如果我省略命令

sed -i 's|..*/||g' sources_list 
sed -i 's|..*/||g' startup_list 

我還可以得到在它前面的文件的絕對路徑,所以文本文件看起來像這樣:

/home/ziga/Dropbox/diploma/86x_linux/IDE_eclipse/eclipse_projects/LPC3141_SHELL_timer_makefile/startup/ea3131_startup_entry.c 
/home/ziga/Dropbox/diploma/86x_linux/IDE_eclipse/eclipse_projects/LPC3141_SHELL_timer_makefile/startup/pad.c 
/home/ziga/Dropbox/diploma/86x_linux/IDE_eclipse/eclipse_projects/LPC3141_SHELL_timer_makefile/source/ea3131_board.c 
/home/ziga/Dropbox/diploma/86x_linux/IDE_eclipse/eclipse_projects/LPC3141_SHELL_timer_makefile/source/lpc313x_cgu_default.c 
/home/ziga/Dropbox/diploma/86x_linux/IDE_eclipse/eclipse_projects/LPC3141_SHELL_timer_makefile/source/lpc313x_cgu_driver.c 

那麼我在這裏有什麼選擇?我如何打開這些.c文件並檢查我需要檢查的內容?

問候Ziga


這裏是我的全部的makefile我沒有寫把你的意見。它尚未完成。我仍然需要添加編譯* .c文件的行。

#!/bin/bash 
# najprej nastavimo shell, ki je v nasem primeru bash 

# nastavitev asemblerja, compilerja in linkerja 
AS="arm-none-eabi-as" 
GCC="arm-none-eabi-gcc" 
LD="arm-none-eabi-ld" 

# nastavitev nastavitev za asembler, compiler in linker 
ASOPT="-mcpu=arm926ej-s -c -Wall" 
GCCOPT="-mcpu=arm926ej-s -c -Wall" 
LDOPT="-Tldscript_iram_gnu.ld" 

# nastavitev direktorij v katerih se nahajajo kljucne datoteke za sestavo programa 
ASDIR="$(pwd)/startup" 
GCCDIR="$(pwd)/source" 
LDDIR="$(pwd)/objects" 
INCDIR="$(pwd)/include" 

# potrebno je locirati vse startup, source in objektne datoteke. Ker objektnih datotek še ni, jih je potrebno sproti narediti in jih vse premakniti v mapo objects 
ls $ASDIR/*.s > startup_list 
sed -i 's|..*/||g' startup_list 
ASFILE=$(cat startup_list) 

ls $GCCDIR/*.c > sources_list 
sed -i 's|..*/||g' sources_list 
GCCFILE=$(cat sources_list) 

cat startup_list sources_list > objects_list 
sed -e 's/\.c/\.o/g' objects_list > objects_list_tmp 
sed -e 's/\.s/\.o/g' objects_list_tmp > objects_list 
LDFILE=$(cat objects_list) 

all: executable 

executable: $(LDFILE) 
    $(GCC) -M $(LDFILE) 

clean: 
    rm startup_list sources_list objects_list objects_list_tmp 
    echo Pocistili ste vse datoteke. 

出於某種原因,當我運行「make」或「使清潔」命令,我得到一個錯誤:

makefile:21: *** missing separator. Stop. 

我不知道我做錯了,但我認爲我不很明白如何正確使用makefile中的bash命令,特別是變量。有時我用它們作爲$(BOO),有時候用$ BOO。第一個在makefile中工作,但在命令行界面中失敗,而第二個在相反的方向工作。我怎樣才能解決這個問題?

回答

2

您知道嗎-M flag of gcc? (有幾個選項都以-M開頭,你可以在哪裏定義哪些依賴關係 - 這個調用與以後的編譯無關,不會生成代碼/目標文件只是解析代碼)

+0

這看起來很有用我的腳本部分是不需要的......我會看看-M標誌,然後返回這裏以防萬一遇到任何問題。 – 71GA 2011-04-05 13:33:42

+0

所以這樣我可以使用命令「arm-none-eabi-gcc -W $ LDFILE」(LDFILE是一個包含objects_list的變量)。然後我得到所有目標文件的makefile依賴關係。現在我只需要將命令編譯(arm-none-eabi-gcc -c)這些依賴關係之間的對象。任何想法如何做到這一點? – 71GA 2011-04-06 09:32:31

+0

你好,我已經看過它,並設法創建.c文件的依賴列表,但我如何創建.s(程序集)文件的依賴列表?使用-M選項總是給我一個空的輸出。 – 71GA 2011-04-07 18:50:53

相關問題