如果命令行没有明确指定,将安装前缀自动设置为自定义路径

36

为了进行一些内部测试,我希望安装前缀默认为构建目录的子目录,除非用户明确覆盖。我知道用户可以通过以下方式指定安装前缀:

$ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar ..

但如果用户没有指定,它应该默认为,例如${PWD}/installed

变量CMAKE_INSTALL_PREFIX已经设置为/usr/local,所以我不能只检查它是否未设置/为空而进行设置。

我的当前解决方案是添加一个自定义开关,用户必须调用该开关来指定CMAKE_INSTALL_PREFIX变量得到尊重:

option(ENABLE_INSTALL_PREFIX "Install build targets to system (path given by '-DCMAKE_INSTALL_PREFIX' or '${CMAKE_INSTALL_PREFIX}' if not specified)." OFF)
if ( ENABLE_INSTALL_PREFIX )
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root")
else()
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root" FORCE)
endif()

我的问题是:

(a) 除了需要传递额外标志来使CMAKE_INSTALL_PREFIX生效之外,上述方法是否存在任何问题?

(b) 是否有更好、更干净、更健壮、更符合惯用法和/或不那么烦人的方法来实现上述目的?

谢谢。

2个回答

62

如果未明确指定CMAKE_INSTALL_PREFIX,则CMake会设置布尔变量CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT并将其初始化为默认值。您可以按以下方式覆盖它:

if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/installed"
           CACHE PATH "default install path" FORCE)
endif()

我希望在几天前就能找到这篇帖子,当时我正忙得不可开交地处理多个ExternalProject依赖项,而它们却一直做不对。谢谢! - KarateSnowMachine

2
几年前,我也想尝试同样的事情。不幸的是,我从未找到一个完全令人满意的解决方案。相反,我选择使用正则表达式来检查 CMAKE_INSTALL_PREFIX 是否与默认值匹配。
例如,在 Windows 上,我使用以下命令在构建目录中创建 install 目录:
if ( CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files" )
    # Override to an "Install" directory in the current build-dir
    message( STATUS "    Install-prefix was at default -> forcing it to the build-dir" )
    message( STATUS "        'set( CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install )'" )
    set( CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install )
endif ( CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files" )

这个结构的最大问题是你可以手动指定CMake应该安装在C:\Program Files中。由于我使用NSIS安装程序分发我的工具,所以这对我来说不是问题。也许你可以在Unix上尝试类似的方法。

在Unix上,我们可以使用"^/usr/local"进行匹配;或者更好的方法是使用STREQUAL "/usr/local"而不是正则表达式匹配。 - thiagowfx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接