Получение пути включения компилятора по умолчанию в make-файл - PullRequest
0 голосов
/ 05 мая 2020

Я могу запустить команду оболочки, чтобы получить путь включения по умолчанию из компилятора (и добавить -I):

arm-none-eabi-gcc -xc -E  -Wp,-v  /dev/null 2>&1 | sed -En '/#include <...> search starts here:/,/End of search list./{//!p;};' | sed 's/^ /-I/'

Я пытаюсь добавить это в Makefile:

PROJECT_INC = $(shell arm-none-eabi-gcc -xc -E  -Wp,-v /dev/null 2>&1 | sed -En "/#include <...> search starts here:/,/End of search list./{//!p;}" | sed "s/^ /-I/")

Затем я получаю сообщение об ошибке:

Makefile:104: *** unterminated call to function `shell': missing `)'.  Stop.

Я попытался использовать обратные кавычки, но это не помогает. Пробовал использовать одинарные или двойные кавычки для команд sed. Большинство подобных проблем, которые я могу найти в SO, связаны с расширением, когда в команде есть $, но здесь это не должно быть проблемой.

Если я урезал команду:

PROJECT_INC = $(shell arm-none-eabi-gcc -xc -E  -Wp,-v /dev/null 2>&1  )

Тогда вроде вырубает выход. Оболочка вернет

ignoring duplicate directory "/Users/mjeanson/miniconda3/envs/project/bin/../lib/gcc/../../lib/gcc/arm-none-eabi/8.3.1/include"
ignoring nonexistent directory "/Users/mjeanson/miniconda3/envs/project/bin/../arm-none-eabi/usr/local/include"
ignoring duplicate directory "/Users/mjeanson/miniconda3/envs/project/bin/../lib/gcc/../../lib/gcc/arm-none-eabi/8.3.1/include-fixed"
ignoring duplicate directory "/Users/mjeanson/miniconda3/envs/project/bin/../lib/gcc/../../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/include"
ignoring nonexistent directory "/Users/mjeanson/miniconda3/envs/project/bin/../arm-none-eabi/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 /Users/mjeanson/miniconda3/envs/project/bin/../lib/gcc/arm-none-eabi/8.3.1/include
 /Users/mjeanson/miniconda3/envs/project/bin/../lib/gcc/arm-none-eabi/8.3.1/include-fixed
 /Users/mjeanson/miniconda3/envs/project/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/include
End of search list.
# 1 "/dev/null"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/dev/null"

. Запустив это внутри Makefile, она отбросит первую строку, начинающуюся с #include, но в остальном она работает. Не уверен, что это все еще будет проблемой после того, как конвейер к команде sed будет работать нормально (?)

Если это актуально (и не очевидно в приведенных выше фрагментах кода), моя среда использует кросс-компилятор (arm-none-eabi-g cc) и в среде conda, и все это работает на Ma c.

Я не думаю, что это должно иметь значение, но причина, по которой я Это нужно сделать, чтобы я мог использовать какой-нибудь инструмент анализа stati c. При компиляции самого кода мне не нужно добавлять путь включения по умолчанию.

Бонус: я попытался объединить команды sed в одну, но не смог понять, как это сделать ...

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Синтаксис расширения макроса в GNU Make очень специфичен c (для make, а не для оболочки) и обычно не принимает во внимание такие метасимволы оболочки, как ".

Вы включили несколько из них, которые означают разные вещи (например, :, и c), чем они делают с оболочкой.

Лучше записать весь конвейер в сценарий оболочки, а затем просто использовать имя сценария оболочки в Makefile.

Не создавайте конвейеры с аргументами, защищенными кавычками оболочки, так как make вообще не заботится о цитировании.

0 голосов
/ 05 мая 2020

Проблема обнаружена ... символ '#' в команде sed вызывал проблему и заставлял make рассматривать все, что находится после, как комментарий.

Для потомков фиксированная команда намного проще, поскольку включить путь, начинающийся с '':

arm-none-eabi-gcc -xc -E  -Wp,-v  /dev/null 2>&1 | sed -En '/^ /s/^ /-I/p'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...