Я написал плагин llvm и создал библиотеку объектов cmake, которая запускает плагин для каждого исходного файла, но мне нужны данные всей компиляции, в то время как плагин запускается снова для каждого модуля компиляции.
Однако моя среда сборки довольно сложна, и я не хочу управлять вторым представлением конфигурации только для запуска этого инструмента.
Как я могу использовать свой существующий CMakeLists.txt для отправки таких вещей, как # define и включить пути к инструменту, который может работать по всей моей базе кода за один прогон?
Я подумывал о том, чтобы попытаться использовать сборку Unity от Coliru на плагине, поскольку это был бы единый модуль компиляции, но я надеялся на что-то встроенное в cmake (возможно, в сочетании с несколькими инструментами командной строки), которое могло бы получить нужную мне информацию , Я также мог бы выполнить многопроходный прогон, где я собираю кучу файлов данных, а затем создаю другой инструмент для их объединения, но это тоже не идеально.
Спасибо.
Я закончил тем, что использовал модуль cotire (https://github.com/sakra/cotire) и настройте его функцию создания единства (где он объединяет весь ваш исходный код в один файл для компиляции) и запускайте его.
Хотя Unity не на 100% совместим с C ++, так как они нарушают границы на уровне файлов, это работает для меня.
Это было немного сложно настроить, и я не уверен, что сделал это наилучшим образом, но я положил следующее в подкаталог и вставил add_subdirectory(my_directory_name)
в моем основном файле CMakeLists.txt:
MACRO(ADD_CXX_FLAGS)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARGN}")
# MESSAGE(${CMAKE_CXX_FLAGS})
ENDMACRO(ADD_CXX_FLAGS)# target_compile_options is the "better" way to do this but it dedupes flags,
# so the multiple -Xclang flags after the first one get lost. There is a cmake bug on this but no one
# is working on it at this time
ADD_CXX_FLAGS(-Xclang)
ADD_CXX_FLAGS(-load)
ADD_CXX_FLAGS(-Xclang)
ADD_CXX_FLAGS(my_plugin.dylib) <== substitute yours here
ADD_CXX_FLAGS(-Xclang)
ADD_CXX_FLAGS(-plugin)
ADD_CXX_FLAGS(-Xclang)
ADD_CXX_FLAGS(MyPluginRegisteredName) <== substitute yours here#
add_library(apb-js-api-template OBJECT ${APB_SOURCE_FILES})
set_target_properties(some-project-name-template PROPERTIES COTIRE_UNITY_TARGET_NAME "some-project-name")
cotire(some-project-name-template)
Других решений пока нет …