子项目的CMake覆盖策略

Pie*_*oid 2 c++ python visibility cmake

我的CMake项目编译了一个与大型静态库链接的Python .so / .dylib扩展模块。我想用对符号隐藏的可见性来编译子项目的静态库:它将允许链接器(或LTO优化器)丢弃我的python模块未使用的符号。

最好的方法是CXX_VISIBILITY_PRESET在子项目的静态库目标上使用和朋友。但是,子项目使用3.1.0版中的策略,方法是声明:

cmake_minimum_required (VERSION 3.1.0)
Run Code Online (Sandbox Code Playgroud)

该策略CMP0063 NEW: Honor visibility properties for all target types.仅从版本3.3开始引入,因此set_target_properties不起作用。

我的项目需要CMake 3.3,但是我无法控制子项目。

我想避免打补丁子项目CMakeLists.txt,但目前看不到其他方法。

任何的想法 ?

Flo*_*ian 5

cmake_minimum_required()对CMake的政策产生以下影响:

  • 在指定版本或更早版本中引入的所有策略都将设置为使用NEW行为。
  • 在指定版本之后引入的所有策略都将被取消设置。

但是您可以将CMake的CMAKE_POLICY_DEFAULT_CMP<NNNN>全局变量用于“否则未设置的CMake Policy CMP的默认值”。

这是一个例子:

set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
add_subdirectory(MySubProjDir)
Run Code Online (Sandbox Code Playgroud)

参考