сделать зависимости: пропустить заголовки поставщика и пакета с помощью gcc?

Я начинаю новый проект и думаю об использовании gcc 6.3.1 -MM для генерации зависимостей в файл с именем Make.Dep , который я Make.Dep из Makefile .

Опция -M выводит все заголовки, включая системные заголовки. Опция -MM не выводит системные заголовки, но я по-прежнему похоронен буквально в тысячах заголовков поставщиков и пакетов, таких как Sybase и Boost, которые, я не думаю, изменится (и если они это сделают, я счастлив иметь сделать полную перестройку вручную).

Очевидно, я мог бы обернуть gcc -MM в perl-скрипт или что вы знаете, какие каталоги я считаю пакетами, но есть ли какое-то более распространенное решение?

Обратите внимание, что один из заголовков моих поставщиков ищет определенные символы препроцессора, определенные для gcc, чтобы настроить их переносимость. Я бы предпочел не курировать набор таких символов вручную, чтобы разрешить генерацию зависимостей с помощью не-gcc метода (например, makedepend ).

Всего 1 ответ


Вместо -I используйте -isystem чтобы указать каталоги, которые вы не хотите выводить с -MM .

В настоящее время это не упоминается по адресу https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html, несмотря на то, что оно тесно связано с параметрами -M и -MM .

Пример: это создает правильные зависимости для foo.cpp и bar.cpp, включая заголовки Sybase:

gcc -MM -I/opt/nmr/sap/sybaseASE/sybclient-16.0.3-7/OCS-16_0/include foo.cpp bar.cpp

Пример: это делает то же самое, но не включая заголовки Sybase:

gcc -MM -isystem /opt/nmr/sap/sybaseASE/sybclient-16.0.3-7/OCS-16_0/include foo.cpp bar.cpp

Вот пример реализации Makefile для gmake . Функция patsubst - это подстановка шаблона, использующая% как часть, которая соответствует «до», которая затем захватывается и используется в «после». Похоже, что для isystem нужен пробел после нее, но это легко сгенерировать с помощью patsubst поскольку знак процента не позволяет усечь пространство. Опция минус в -include говорит gmake не жаловаться, если названный файл не существует. Это позволяет вам использовать gmake для создания depend и создания Make.Dep даже до того, как появится Make.Dep. Наконец, предполагается, $(PkgIncDirs) пакет хранения $(PkgIncDirs) включает в себя каталоги, ни один из которых не должен изменяться, в то время как $(ProjIncDirs) будет включать в себя каталоги внутри проекта, для которых вы хотите создать зависимости.

depend:
    gcc -MM $(CFlags) $(Defines) $(patsubst -I%, -isystem %, $(PkgIncDirs)) $(ProjIncDirs) $(Source) >Make.Dep

-include Make.Dep

Есть идеи?

10000