同时使用 CMAKE_INSTALL_PATH 和 CPack WiX 生成器

Posted

技术标签:

【中文标题】同时使用 CMAKE_INSTALL_PATH 和 CPack WiX 生成器【英文标题】:Using both CMAKE_INSTALL_PATH and CPack WiX generator 【发布时间】:2017-06-02 13:21:35 【问题描述】:

我正在尝试使用 CPack WiX Generator 生成 msi 包。

在我的CMakeLists.txt 中有CMAKE_INSTALL_PREFIX 设置为"C:/Program Files/My Project"。我需要完整的路径,因为项目源代码的一些重要部分依赖于这个路径。另外,我将项目拆分为一些组件,其中一个组件名为core

我使用 cmake-gui 成功生成了 Visual Studio 解决方案。但是当我尝试构建项目PACKAGE 时,出现以下错误:

53>EXEC : CPack error : Problem creating temporary directory: D:/Projects/build-Project-MSVC2015/_CPack_Packages/win64/WIX/project-2.3.0-20.AMD64/coreC:/Program Files/My Project

当我将CMAKE_INSTALL_PREFIX 留空时,也会发生同样的错误。在这种情况下,此变量默认初始化为"C:/Program Files/Project_Name",错误为:

53>EXEC : CPack error : Problem creating temporary directory: D:/Projects/build-Project-MSVC2015/_CPack_Packages/win64/WIX/project-2.3.0-20.AMD64/coreC:/Program Files/Project_Name

只有当我将 CMAKE_INSTALL_PREFIX 设置为 My Project(没有前置 C://)时,一切正常。目录创建为D:/Projects/build-Project-MSVC2015/_CPack_Packages/win64/WIX/project-2.3.0-20.AMD64/coreMy Project,并创建了msi-package。

看来,CPack 尝试将make DESTDIR="D:/Projects/build-Project-MSVC2015/_CPack_Packages/win64/WIX/project-2.3.0-20.AMD64/core" 安装作为中间步骤,但正如cmake's documentation 所述:

警告:DESTDIR 可能无法在 Windows 上使用,因为安装前缀通常包含一个驱动器号,例如“C:/Program Files”中的驱动器号,不能使用其他前缀。

我是否误解了 CMAKE_INSTALL_PREFIX 与 CPack WiX Generator 的用法?或者这是特定于 Visual Studio 的?或者是否有解决此问题的方法,例如强制 DESTDIR 为空(是的,我知道这很危险)?

【问题讨论】:

【参考方案1】:

我真的有点误解了 CPack 的用法。在阅读了一些关于 CPack 的信息后,我设法通过以下方式创建了一个 msi-package。

对于基于 Windows 的软件包安装,我通过将 CPACK_SET_DESTDIR 设置为 FALSE 来关闭 DESTDIR 的使用。

如 cmake 在CPACK_SET_DESTDIR 上的文档所述:

最明显的区别是没有CPACK_SET_DESTDIR, CPack 使用 CPACK_PACKAGING_INSTALL_PREFIX 作为前缀,而使用 CPACK_SET_DESTDIR 设置,CPack 将使用 CMAKE_INSTALL_PREFIX 作为 前缀。

也就是说,我应该将CPACK_PACKAGING_INSTALL_PREFIX 变量设置为适当的值。

如果我将CPACK_PACKAGING_INSTALL_PREFIX 设置为非空值,例如。 G。到/My Project(注意前导/),CPack 会将其附加到C:/Program files/$CPACK_PACKAGE_INSTALL_DIRECTORYCPACK_PACKAGE_INSTALL_DIRECTORY 反过来又默认为 "$CPACK_PACKAGE_NAME $CPACK_PACKAGE_VERSION"。如果我将CPACK_PACKAGE_NAME 设置为"my-project" 并将CPACK_PACKAGE_VERSION 设置为1.0.0,完整的安装路径将是C:/Program Files/my-project 1.0.0/My Project

因此,要构建一个将程序安装到C:\Program files\My Project 的 msi 包,我在CMakeLists.txt 中使用以下行:

SET(CMAKE_INSTALL_PREFIX "C:/Program Files/My Project" CACHE PATH "Install path" FORCE)
...
SET(CPACK_SET_DESTDIR FALSE)
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "My Project")
SET(CPACK_PACKAGING_INSTALL_PREFIX "")

对于 WiX 生成器,CPACK_PACKAGE_INSTALL_DIRECTORY 可能不包含完整路径,因此 SET(CPACK_PACKAGE_INSTALL_DIRECTORY $CMAKE_INSTALL_PREFIX) 将不起作用。

CPACK_PACKAGING_INSTALL_PREFIX默认好像是空的,所以最后一行是多余的。

【讨论】:

以上是关于同时使用 CMAKE_INSTALL_PATH 和 CPack WiX 生成器的主要内容,如果未能解决你的问题,请参考以下文章

为啥对 XML 同时使用 XSD 和 DTD?

同时使用 AVAudioPlayer 和 MPMoviePlayerController

同时使用 startUpdatingLocation 和 startMonitoringSignificantChanges?

尝试同时使用板载 iGPU 和 Nvidia 独立卡时,CUDA 失败。我如何同时使用离散的 nvidia 和集成(板载)intel gpu? [关闭]

可以同时使用 AVCaptureVideoDataOutput 和 AVCaptureMovieFileOutput 吗?

同时使用 Thymeleaf 和 JSP