CMake - автоматическая зависание зависимостей предварительно скомпилированного заголовка?

По-прежнему, по крайней мере, насколько мне известно, в CMake нет стандартного способа указать добавление предварительно скомпилированного заголовка (PCH) в проект кросс-платформенным способом, поскольку способ обработки PCH с помощью компиляторов С++ очень разные среди поставщиков. Для g++ это обычно работает, просто добавляя настраиваемую команду, которая заботится о вызове компилятора с соответствующим вводом и генерирует его PCH.

Моя текущая проблема заключается в том, что CMake не будет анализировать зависимости зависимостей, которые вы указали для пользовательской команды. Например, предположим следующую структуру:

pch.h
 |- dependA.h
 |- dependB.h
 ...

Только предоставление pch.h в качестве зависимости приведет к генерации соответствующей цели в соответствующем makefile, который отслеживает изменения в pch.h. Однако CMake не анализирует входящие внутри pch.h и поэтому не распознает изменения в dependA.h и dependB.h. Это расширяется, если существуют зависимости для dependsA.h и т.д.

Примечание. Я знаю, что тот факт, что зависимости PCH могут и регулярно меняться, ставит весь рассматриваемый процесс. Тем не менее, это так, как есть, и я не могу ничего с этим поделать.

Поскольку задача не слишком сложная, есть несколько очевидных идей, которые приходят на ум:

Решение A:

Введите все зависимости вручную. Очевидно, это работает, но утомительно, как черт, и вообще не масштабируется.

Решение B:

Если возможно, напишите функцию CMake, которая автоматизирует процесс и разбор включает в себя "вручную".

Решение C:

Сделайте что-то подобное на другом языке, например Python, и просто представьте CMake список зависимостей, чтобы добавить к пользовательской команде.

Решение D:

Используйте функцию gcc/g++, чтобы проанализировать и распечатать дерево зависимостей PCH и проанализировать вывод, чтобы извлечь список зависимостей.

Мой вопрос: кто-нибудь знает более удобный и быстрый способ сделать это?

Ответ 1

Опция IMPLICIT_DEPENDS add_custom_command может сделать трюк:

add_custom_command(
    OUTPUT outFile
    COMMAND ...
    IMPLICIT_DEPENDS CXX "pch.h")

Опция IMPLICIT_DEPENDS делает сгенерированную систему сборки проверкой неявных зависимостей заданного входного файла во время сборки. Тем не менее, он поддерживается только для генераторов Makefile.