请看下面的最小示例:
add_library(foo SHARED foo.cpp)
install(
TARGETS foo
DESTINATION .
COMPONENT python)
add_custom_target(
install-python
DEPENDS foo
COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=python -P
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
有没有一种方法可以将CMakeLists中的CMAKE_INSTALL_PREFIX
硬编码到某个路径,例如:${CMAKE_BINARY_DIR}/python
,仅用于特定的安装组件,例如python
?换句话说,我希望能够执行cmake ..
,make install-python
,make install
,而不是像cmake -DCMAKE_INSTALL_PREFIX=$(pwd)/python ..
,make install-python
,cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
,make install
这样的操作,以实现相同的功能。这可能吗?
顺便说一句,我想在这里使用install
的主要原因是因为在真实的情况中,如果我只是简单地使用add_custom_command
将foo
从${CMAKE_BINARY_DIR}
复制到${CMAKE_BINARY_DIR}/python
,那么没有一种简单的方法可以删除otool -l ${CMAKE_BINARY_DIR}/libFoo.so
中列出的所有LC_RPATH
。无法使用install_name_tool删除所有rpath。我们得到的最接近的是install_name_tool -delete_rpath
,但它需要知道要删除的确切rpath。使用install
解决了这个问题,因为安装的Foo
将只包含INSTALL_RPATH
目标属性指定的LC_RPATH
。
1条答案
按热度按时间5n0oy7gb1#
cmake --install
允许您指定--prefix <prefix>
和--component <component>
参数。有了你说的你想达到的目标,我会先试着这样做:上面的代码会将python组件安装到两个位置两次。我认为如果你想真正精确,你需要在最后一个命令中指定除python之外的所有组件。
如果你要硬编码
CMAKE_INSTALL_PREFIX
,我很确定它应该是一个按组件的绝对路径,我建议你只把这些组件的安装调用的DESTINATION
硬编码到你想要的任何绝对路径。如果您需要在不同的平台之间执行任何不同的操作,请参阅平台生成器表达式。请注意,CMake中有各种机制用于操作
RPATH
s。只需查看property listing和variable listing,并搜索名称中包含“RPATH”的那些。参见the related wiki page。