gcc -MDD с -isystem <include_path> не добавляет зависимости для "системных" путей - PullRequest
0 голосов
/ 15 января 2019

Итак, у меня есть следующие настройки (упрощенная версия):

application/app1.hpp
application/app1.cpp
application/utils/utils1.hpp
application/utils/utils1.cpp

Поэтому, когда я компилирую app1.cpp, я делаю так (это урезанная версия компиляции):

g++ -Wall -Wextra -Werror -I application -isystem application/utils -MMD -MP -MF dep.d -c application/app1.cpp -o obj.o

Где я использую -MDD для автоматической генерации информации о зависимостях. Я использую -isystem, чтобы запретить предупреждения из файлов в папке utils.

Примечание: utils - это субмодуль (то есть отдельный проект, который компилируется самостоятельно). Поэтому я не хочу компилировать предупреждения / ошибки из этого проекта. Поэтому я использую -isystem application/utils для включения папок. Когда вы используете isystem, вы не получаете предупреждений gcc - это здорово:)

Однако я только что обнаружил, что это также причина того, что я не получаю полные выходные данные зависимости. Файлы, включенные в каталоги isystem, не добавляются в качестве зависимостей в файл dep.d, сгенерированный gcc.

Так что, похоже, я могу либо проигнорировать предупреждения от утилит, но не получить для него генерацию зависимости, ИЛИ я могу получить вывод зависимости, но не проигнорировать предупреждения.

Я действительно хочу оба:

  • Нет предупреждений от утилиты
  • Зависимости из папки utils (через gcc -MMD)

Возможно ли как-то получить оба поведения?

Некоторые мои идеи:

  • Я думал о том, чтобы как-то сначала запустить компонент препроцессора зависимостей, а затем компилировать ... но я не видел способа сделать это
  • Принудительно включать папки в часть MMD. Я обнаружил, что могу включать определенные файлы с -include, но не с папками, и у меня нет списка файлов: (

1 Ответ

0 голосов
/ 15 января 2019

Я только что нашел что-то, что могло бы работать, но я не уверен, насколько это эффективно. Я нашел опцию -E gcc, которая заменяет -c (compile) только на препроцесс). Так что я мог сделать:

  1. Создание информации о зависимости:

    g++ -I application -I application/utils -E application/app1.cpp -o /dev/null -MMD -MP -MF dep.d

  2. Скомпилируйте файл с минимальными предупреждениями:

    g++ -Wall -Wextra -Werror -I application -isystem application/utils -c application/app1.cpp -o obj.o

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

Если есть другие идеи, я все еще очень открыт для них ... Я не буду помечать этот ответ некоторое время, если у кого-то есть идея получше ...

...