Команда оболочки Linux для чтения текстового файла и открытия документов, перечисленных в

#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 всегда оставляет мне пустой вывод.