Используйте GNU m4 во время компиляции для большого проекта C/C++

Задний план

У меня есть большой проект, который я сейчас рефакторинг. Одной из проблем является массовое злоупотребление строковыми литералами (более 300 экземпляров) для общих путей, используемых продуктом (т. е. ссылок на /opt/dev и вложенных путей этого местоположения), в том числе:

  • Исходные файлы C/C++ и заголовочные файлы.
  • питон скрипты.
  • bash-скрипты.
  • системные скрипты.
  • Бинарные образы (драйверы).

Цель

Я хотел бы использовать GNU m4 для определения файл с набором общих макросов, чтобы мы могли написать один раз, использовать везде, так что, если наш код разветвлен (типично для нового продукта), мы можем просто изменить макросы в этом одном файле, вместо того, чтобы искать повторяющиеся строковые литералы и отлаживать их днями. Это достаточно просто для простых вещей, таких как скрипты, так как я просто создаю копию исходного дерева в выходном пути сборки и запускаю M4 непосредственно на скриптах.


Проблема

Единственным недостатком на данный момент является то, что это похоже на огромные усилия для проектов C/C++, потому что я хочу выполнять расширение/замену макроса M4 только во время компиляции. Это означает, что, чтобы избежать изменения исходных файлов, извлеченных из git, мне придется изменить мои сценарии сборки (множество Makefiles), чтобы они работали с временной копией кода, а не с исходными исходными файлами. В противном случае запуск M4 непосредственно в исходном коде с контролируемой версией приведет к изменению локальной рабочей копии, и разработчики, скорее всего, зафиксируют эту копию кода с оценкой M4 в системе управления версиями, что нарушит работу M4.


Вопрос

Можно ли указать gcc для оценки m4 макросы/расширения во время компиляции либо с помощью какого-либо внешнего инструмента, либо с помощью особенность самого GCC? Если нет, то мои скрипты сборки, скорее всего, потребуют капитального ремонта для поддержки макросов M4.


person Cloud    schedule 17.11.2017    source источник
comment
Используйте m4 для создания заголовка project-config.h для кода C и/или C++. Используйте этот заголовок в каждом файле, который должен использовать один из макросов. Убедитесь, что программисты знают, что это то, что следует использовать. Возможно, применить проверку кода перед регистрацией или периодически? Перекомпилируйте, когда этот заголовок изменится. Не меняйте его без необходимости.   -  person Jonathan Leffler    schedule 17.11.2017
comment
@JonathanLeffler Вздох, так элегантно и просто. Не знаю, как я проглядел это. Если вы преобразуете это в ответ, я отмечу его принятым.   -  person Cloud    schedule 17.11.2017


Ответы (1)


Используйте m4 для создания заголовка project-config.h для кода C и/или C++. Используйте этот заголовок в каждом файле, который должен использовать один из макросов. Убедитесь, что программисты знают, что это то, что следует использовать. Возможно, принудительно использовать проверку кода перед регистрацией или периодическое сканирование базы кода? Перекомпилируйте затронутые файлы при изменении этого заголовка. Не меняйте его без необходимости.

person Jonathan Leffler    schedule 17.11.2017
comment
Я думаю, что я ошибся, рассматривая M4 как потоковый редактор (то есть как причудливую версию sed + grep), а не как инструмент для создания файлов. Неправильная ментальная модель. - person Cloud; 17.11.2017
comment
Легко сделать ошибку. Система AutoConf использует m4 и генерирует файлы конфигурации. Это слабая аналогия. - person Jonathan Leffler; 17.11.2017