0

我已经编写了一个 llvm 插件并制作了一个 cmake 对象库,该对象库在每个源文件上运行该插件,但我需要从整个编译中获取数据,而为每个编译单元再次运行一个插件。

然而,我的构建环境相当复杂,我不想仅仅为了运行这个工具而管理配置的第二个表示。

如何使用我现有的 CMakeLists.txt 发送诸如#define 之类的内容并包含指向可以在一次运行中运行整个代码库的工具的路径?

我考虑过尝试在插件上使用 Coliru 的统一构建,因为它将是一个单一的编译单元,但希望 cmake 内置的东西(可能与一些命令行工具结合)可以获得我需要的信息. 我也可以进行多次运行,在其中构建一堆数据文件,然后制作一个不同的工具来组合这些文件,但这也不理想。

谢谢你。

4

1 回答 1

0

我最终使用了 cotire 模块(https://github.com/sakra/cotire)并配置了它的统一构建功能(它将所有源代码捆绑到一个文件中进行编译)并运行它。

虽然统一构建不是 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)
于 2016-07-29T05:26:50.047 回答