35

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

$ 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) 是否有更好、更清洁、更健壮、更惯用和/或更少烦人的方式来实现上述目标?

谢谢。

4

2 回答 2

60

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

if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/installed"
           CACHE PATH "default install path" FORCE)
endif()
于 2013-04-18T07:22:39.990 回答
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 上尝试类似的东西。

于 2013-04-18T07:05:13.330 回答