我正在使用 CMake v3.21.0在安装阶段通过install(CODE)命令调用 Qt 的windeployqt,如下所示:
install(
CODE "
execute_process(
COMMAND \"${CMAKE_COMMAND}\" -E
env PATH=\"${windeployqt_ROOT_DIR}\"
\"${windeployqt_EXECUTABLE}\"
# TODO(2021-08-25 by wolters): This is a different path when CPack is`
# used. How to check for this case and obtain the correct output path?
--dir \"${CMAKE_INSTALL_PREFIX}/${args_INSTALL_SUFFIX}\"
--no-quick-import
--no-system-d3d-compiler
--no-virtualkeyboard
--no-compiler-runtime
--no-webkit2
--no-angle
--no-opengl-sw
--verbose 0
\"\$<TARGET_FILE:${args_TARGET}>\"
)
"
COMPONENT runtime
)
如果安装项目,这工作正常:
cmake --build . --config RelWithDebInfo --target install
但是在创建 CPack 包时,创建的文件windeployqt
不是包的一部分(在这种情况下为 ZIP):
cpack -G ZIP -C RelWithDebInfo -D CPACK_COMPONENTS_ALL="runtime"
我知道问题是${CMAKE_INSTALL_PREFIX}
在CODE
.
- 对于
install
目标,这是正确的。 - 对于
package
目标,这是不正确的。相反,应该使用当前CPack 生成器的构建目录,例如${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages/win64/ZIP/${CPACK_PACKAGE_FILE_NAME}
.
我的问题是:
- 有没有办法区分
install
和package
定位该CODE
部分?(伪代码if(CMAKE_IS_PACKAGING)
:) - 如果有办法:是否可以获取或动态构建实际 CPack 临时“安装”目录的目录路径?
如果这两个问题都可以解决,则生成的文件windeployqt
应该是 CPack 生成的包的一部分。