CMake:将Mac OS X libfoo.1.dylib命名约定覆盖到libfoo.so.1

时间:2013-02-15 20:25:14

标签: cmake

我们正在尝试使用Linux,Solaris等使用的共享库命名约定在Mac OS X上使用CMake构建共享库,即libfoo.so.1而不是libfoo.1.dylib。这是针对我们现有Linux部署的内部部署,并且希望在其后对Mac OS X部署进行建模,以便不必修改其他工具。

我可以使用

.so更改为.dylib
set_target_properties(OpenImageIO
                      PROPERTIES
                      SUFFIX .so)

但是,我无法正确订购。试图

set_target_properties(OpenImageIO
                      PROPERTIES
                      OUTPUT_NAME libOpenImageIO.so.${SOVERSION})

build/macosx/libOpenImageIO/liblibOpenImageIO.so.32.1.2.0.so结束,这表明OUTPUT_NAME仅用于共享库的基本部分,而CMake将始终颠倒SUFFIX和VERSION的顺序。

我搜索过CMake的源代码,无法找到此代码的设置位置。

1 个答案:

答案 0 :(得分:6)

将版本名称放在后缀.dylib前面的行为在方法cmTarget::ComputeVersionedName中为Mac OS X进行了硬编码(请参阅CMake源文件cmTarget.cxx)。

然而,您可以通过以下方式设置目标属性来欺骗CMake生成所需的名称:

if (APPLE)
    set_property(TARGET OpenImageIO PROPERTY PREFIX "lib")
    set_property(TARGET OpenImageIO PROPERTY OUTPUT_NAME "OpenImageIO.so")
    set_property(TARGET OpenImageIO PROPERTY SUFFIX "")
    set_property(TARGET OpenImageIO PROPERTY SOVERSION "32.1.2.0")
endif()