如果未在命令行中明确指定,则将安装前缀自动设置为自定义路径

时间:2013-04-18 04:38:33

标签: install cmake prefix

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

$ 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以使CMAKE_INSTALL_PREFIX产生效果的额外标志的烦恼之外,上述问题是否有任何问题?

(b)是否有更好,更清洁,更健壮,更惯用和/或更不烦人的方式来实现上述目标?

感谢。

2 个答案:

答案 0 :(得分:52)

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

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

答案 1 :(得分:2)

几年前,我想尝试同样的事情。不幸的是,我永远找不到完全满意的解决方案相反,我选择使用正则表达式来检查CMAKE_INSTALL_PREFIX是否与默认值匹配。

E.g。在Windows上我使用以下命令在build-directory中创建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上尝试类似的东西。