CMake中使用install(CODE)对已安装构建产物做后处理的路径问题
嘿,我懂你遇到的问题了——你用install(TARGETS)把linktest目标安装到指定目录后,想用install(CODE)做后处理,结果发现它默认的工作目录是当前CMakeLists.txt对应的构建目录,完全不是你刚安装产物的地方,这确实有点坑。
别担心,这里有两个简单的办法能让install(CODE)的命令在安装目录下执行:
方法1:直接指定execute_process的工作目录
execute_process本身支持WORKING_DIRECTORY参数,你可以直接把安装路径传进去,这样命令就会在目标目录下跑了。结合你的场景,代码可以写成这样:
install(CODE " execute_process( COMMAND sh -c \"echo Do stuff in `pwd` && exit 0\" WORKING_DIRECTORY \"${CMAKE_INSTALL_PREFIX}\" ) " COMPONENT linkTest)
这里的${CMAKE_INSTALL_PREFIX}就是你设置的安装根目录,因为你的DESTINATION是.,所以实际安装产物的目录就是这个变量指向的路径。如果你的DESTINATION是子目录(比如bin),那就要写成${CMAKE_INSTALL_PREFIX}/bin。
方法2:在shell命令里先切换目录
如果你更习惯用shell的cd命令,也可以在sh -c的脚本里先切换到安装目录再执行操作,比如:
install(CODE " execute_process( COMMAND sh -c \"cd ${CMAKE_INSTALL_PREFIX} && echo Do stuff in `pwd` && exit 0\" ) " COMPONENT linkTest)
不过要注意,如果你的安装路径里包含空格,这种直接拼接的方式可能会出错,这时候可以用参数传递的方式来避免:
install(CODE " execute_process( COMMAND sh -c \"cd \\\"\\$1\\\" && echo Do stuff in \\`pwd\\` && exit 0\" ARGS \"${CMAKE_INSTALL_PREFIX}\" ) " COMPONENT linkTest)
额外提示
如果你是针对特定组件的安装路径,而组件的安装目录和默认的CMAKE_INSTALL_PREFIX不同,你可以提前设置CMAKE_INSTALL_PREFIX_<COMPONENT>变量,然后在install(CODE)里引用它,这样就能精准定位到组件的安装目录了。
最后,记得用make install VERBOSE=1或者cpack -V来查看详细输出,确认命令确实是在你期望的目录下执行的,这样能快速验证配置是否正确。
内容的提问来源于stack exchange,提问作者Jake Cobb

