如何仅为某个组件硬编码CMAKE_INSTALL_PREFIX?

n7taea2i  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(137)

请看下面的最小示例:

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-pythonmake install,而不是像cmake -DCMAKE_INSTALL_PREFIX=$(pwd)/python ..make install-pythoncmake -DCMAKE_INSTALL_PREFIX=/usr/local ..make install这样的操作,以实现相同的功能。这可能吗?
顺便说一句,我想在这里使用install的主要原因是因为在真实的情况中,如果我只是简单地使用add_custom_commandfoo${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

5n0oy7gb

5n0oy7gb1#

cmake --install允许您指定--prefix <prefix>--component <component>参数。有了你说的你想达到的目标,我会先试着这样做:

cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
cmake --install . --prefix $(pwd)/python --component python
cmake --install .

上面的代码会将python组件安装到两个位置两次。我认为如果你想真正精确,你需要在最后一个命令中指定除python之外的所有组件。
如果你要硬编码CMAKE_INSTALL_PREFIX,我很确定它应该是一个按组件的绝对路径,我建议你只把这些组件的安装调用的DESTINATION硬编码到你想要的任何绝对路径。如果您需要在不同的平台之间执行任何不同的操作,请参阅平台生成器表达式。
请注意,CMake中有各种机制用于操作RPATH s。只需查看property listingvariable listing,并搜索名称中包含“RPATH”的那些。参见the related wiki page

相关问题