我编写了一个shell脚本(bin / bash)。该脚本将查看位于当前文件夹中的文件夹启动,源和对象。然后,它会生成名为 startup_list 的列表(文本文件)(包括扩展名为.s的文件), sources_list (扩展名为.c的文件)和 objects_list (包括扩展名为.o的文件)。我们将所有.s文件设置为变量ASFILE,将所有.c文件设置为GCCFILE,将所有.o文件设置为LDFILE。
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 中,但我现在需要一个shell命令来一个接一个地打开.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”或“make clean”命令时,我收到错误:
makefile:21: *** missing separator. Stop.
我不确定我做错了什么,但我想我不太明白如何在makefile中正确使用bash命令,尤其是变量。有时我用它们作为$(BOO),有时候用作$ BOO。第一个在makefile中工作,但在命令行界面中失败,而第二个工作则相反。我怎样才能解决这个问题?
答案 0 :(得分:2)
您知道-M
的{{1}}标志了吗? (有几个选项都以-M开头,你可以在哪里定义编写哪些依赖项 - 这个调用独立于以后的编译,不会生成代码/目标文件只是解析deps)