сделать зависимости: пропустить заголовки поставщика и пакета с помощью g cc? - PullRequest
1 голос
/ 24 марта 2020

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

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

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

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

1 Ответ

1 голос
/ 24 марта 2020

Вместо -I, используйте -isystem, чтобы указать каталоги, которые вы не хотите sh выводить с -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 даже до того, как is a Make.Dep. Наконец, предполагается, что $(PkgIncDirs) hold package включает в себя каталоги, ни один из которых не должен изменяться, в то время как $(ProjIncDirs) будет включать в себя каталоги внутри проекта, для которых вы хотите создать зависимости.

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

-include Make.Dep
...