#linux #bash #shell #makefile
#linux #bash #оболочка #makefile
Вопрос:
Я написал сценарий оболочки (bin / bash). Скрипт просматривает папки startup, source и objects, которые все расположены в текущей папке. Затем он создает списки (текстовые файлы) с именами 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 позже, но сейчас мне нужна командная команда оболочки, чтобы открывать файлы .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 и проверить, что мне нужно проверить?
С уважением, Зига
Вот мой полный 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.
Я не уверен, что я делаю неправильно, но я думаю, что я не совсем понимаю, как правильно использовать команды bash в makefile, особенно переменные. Иногда я использую их как $ (BOO), а иногда как $BOO. Первая работает в makefile, но не работает в интерфейсе командной строки, тогда как вторая работает наоборот. Как я могу это исправить?
Ответ №1:
Вам знаком -M
флаг gcc
? (Есть несколько вариантов, все начинающиеся с -M, где вы можете определить, куда записывать зависимости — этот вызов не зависит от последующей компиляции, никакой код / объектные файлы не будут сгенерированы, это просто синтаксический анализ deps)
Комментарии:
1. Это выглядит ОЧЕНЬ полезным, и мой скрипт частично не нужен… Я посмотрю на флаг -M, а затем вернусь сюда, если у меня возникнут какие-либо проблемы.
2. Таким образом, я могу использовать команду «arm-none-eabi-gcc -W $ LDFILE» (LDFILE — это переменная, которая содержит objects_list). Затем я получаю зависимости makefile для всех объектных файлов. Теперь мне нужно только поместить команды для компиляции (arm-none-eabi-gcc -c) объектов между этими зависимостями. Есть идеи, как это сделать?
3. Здравствуйте, я изучил это, и мне удалось создать список зависимостей для файлов .c, но как я могу создать список зависимостей для файлов .s (assembly)? Использование опции -M всегда оставляет мне пустой вывод.