Невозможно назначить список имен файлов переменной в GNU-make - PullRequest
1 голос
/ 24 января 2020

Первый пост здесь, не носитель английского языка sh спикер, рад постить и помогать другим!

У меня проблема с использованием make для компиляции проекта avr-g cc для меня. Более конкретно, при назначении списка *. c исходных файлов различных каталогов (в моем случае это подкаталоги) переменной в make, где она будет использоваться для генерации зависимостей.

Использование Этот метод, который я нашел, Renaud Pacalet использует этот синтаксис:

SRC = $(shell find src/ -name "*.cpp")

Использование команды поиска в моем случае выглядит так:

SOURCE_FILES = $(shell find -name '*.c')

И результат (на cmd):

C:\AVR_projetos\Balizar_reserva>find -name '*.c'
./main.c
./modules/i2c/i2c.c
./modules/rom/rom.c

Но, когда make вызывает shell для выполнения скрипта, переменная содержит только первое имя файла в последовательности.

Пока я пытался:

  • Использование функции $ (подстановочный знак *. c), та же проблема
  • Использование $ (shell echo *. c), та же проблема
  • Использование дополнительные аргументы от -print0 к -find для принудительного вывода в строке, но ничего не делают
  • Использование $ (shell find (path) -name '*. c') с использованием абсолютного пути к главному каталогу , относительный ../, и все в сочетании с дополнительными аргументами

Также я упоминал эти две справочные страницы:

Обе они объясняются в простой способ, что это возможно, я делаю то же самое и ничего не получаю.

Для записи, у меня был проблема, прежде чем иметь эту проблему:

avr-gcc -MM main.c > depend.d
  0 [main] sh 14484 sync_with_child: child 15780(0x1DC) died before initialization with status code 0xC0000142
158 [main] sh 14484 sync_with_child: *** child state waiting for longjmp
/usr/bin/sh: fork: Resource temporarily unavailable make: *** [depend] Error 128

Для которого я нашел Это исправление , которое ищет работу.

  • Os: Windows 10 профессиональный 1903 комп. 18362,535

  • GNU-make: 3,81

Ответы [ 2 ]

0 голосов
/ 25 января 2020

Спасибо всем за предложения, я действительно ценю это. Получил эту чертову работу, используя следующую команду:

$(shell find -name "*.c")

Таким образом, мы можем присвоить ее переменной и использовать. При этом мы можем использовать следующий make-файл для соответствующей предлагаемой структуры проекта.

  • Makefile (комментарии на португальском языке)

Этот проект настроен однако для программирования avr-g cc эта концепция применима к обычному программированию c и cpp. Файловая структура (пример, где i2 c может быть модулем generi c и специальным заголовком avr_config.ha при компиляции проектов, связанных с avr-g cc):

.
├── modules
│   └── i2c
│       ├── i2c.c
│       └── i2c.h
├── main.c
├── Makefile
└── avr_config.h

Может быть как много модулей, сколько вы хотите, так как переменная

SOURCE_FILES = $(shell find -name "*.c")

захватить все из них. Я установил это самым простым способом, которым это можно сделать, поэтому, как следствие, объектные файлы будут скомпилированы рядом с исходным и заголовочным файлами, а затем соединены вместе в главном каталоге. Также файл с именем

depend.d

будет создан для выполнения компиляции.

Makefile также содержит некоторые полезные команды, которые описаны в начале файла.

Надеюсь, это кому-нибудь поможет! Будет сделано специальное сообщение, объясняющее весь контекст и как настроить универсальный проект c avr-g cc для программирования микроконтроллеров в коде Visual Studio.

0 голосов
/ 24 января 2020

Добро пожаловать в SO, так как Вы упомянули, что ссылаетесь на функцию подстановочного знака, но в описании сказано:

Одно из применений функции подстановочного знака - получить список всех исходных файлов C в каталог, как это: $(wildcard *.c).

Тогда я думаю, что когда вы выполнили Make, main. c скомпилировано?

Вам нужно улучшить подстановочный знак для поиска подкаталогов или вручную добавить их. Посмотрите на этот ответ и вопрос.

...