Поиск и замена CFLAGS в цели

Мне нужно добавить -Werror к уже существующему (экспортированному?) CFLAGS для сборки. Прямо сейчас я просто пытаюсь извлечь данные, которые содержит CFLAGS. Я супер новичок в Make и Makefiles, но мне нужно добавить некоторые уже существующие файлы сборки.

Скажем, у меня есть цель в make-файле, подобном этому

   .PHONY: add_errors
   add_errors:
       @flags=$(CFLAGS);\
       echo $$flags;\

Но проблема в том, что CFLAGS — это действительно большая строка, в которой установлено множество параметров. Когда makefile выполняется, я получаю следующую ошибку

/bin/sh: 1: -marm: not found
make[2]: *** [add_errors] Error 127

Похоже, что что-то берет первый пробел в качестве строки, а затем отбрасывает остальную часть.

Внутри CFLAGS фрагмент текста находится

-march=armv5te -marm -mthumb-interwork -mtune=arm926ej-s --sysroot=/opt/dspg/v2.11-rc2/sysroots/cortexa9-neon-dspg-linux-gnueabi -Wno-psabi -ggdb -I/opt/dspg/v2.11-rc2/sysroots/cortexa9-neon-dspg-linux-gnueabi/usr/include/libxml2

Что я могу сделать?


person Onyxdragun    schedule 28.01.2021    source источник


Ответы (1)


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

Мой первый совет: НИКОГДА не используйте префикс @ в своих рецептах. Или, по крайней мере, никогда не используйте их, пока ПОСЛЕ того, как ваш make-файл не будет работать на 100% правильно. Такое подавление вывода make похоже на попытку отладки с завязанными глазами.

На самом деле проблема вообще не связана с make: это просто правила цитирования оболочки.

Если вы удалите @ и посмотрите, что выводит make, вы увидите, что он выполняет эту команду:

flags=-march=armv5te -marm -mthumb-interwork -mtune=arm926ej-s ...; echo $flags;

Если вы вырежете и вставите это в свою оболочку, вы получите точно такую ​​же ошибку.

Это связано с тем, что команда оболочки foo=bar biz baz означает установить для переменной среды foo значение bar, а затем запустить команду biz с аргументом baz .

Вам нужно добавить кавычки, чтобы оболочка поместила все аргументы в переменную flags:

.PHONY: add_errors
add_errors:
        @flags='$(CFLAGS)';\
        echo $$flags;\

заставит make запустить это:

flags='-march=armv5te -marm -mthumb-interwork -mtune=arm926ej-s ...'; echo $flags;
person MadScientist    schedule 28.01.2021