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

Installation 如果未在命令行上明确指定,则自动将安装前缀设置为自定义路径,installation,cmake,prefix,Installation,Cmake,Prefix,对于一些内部测试,我希望安装前缀默认为构建目录的子目录,除非用户显式重写。我知道用户可以通过以下方式指定安装前缀: $ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar .. 但如果用户未指定此项,则应默认为,例如,${PWD}/installed 变量CMAKE\u INSTALL\u PREFIX已设置为/usr/local,因此我无法在设置它之前检查它是否未设置/为空 我当前的解决方案是添加一个自定义开关,用户必须调用该开关来指定遵守CMAKE\u INSTAL

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

$ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar ..
但如果用户未指定此项,则应默认为,例如,
${PWD}/installed

变量
CMAKE\u INSTALL\u PREFIX
已设置为
/usr/local
,因此我无法在设置它之前检查它是否未设置/为空

我当前的解决方案是添加一个自定义开关,用户必须调用该开关来指定遵守
CMAKE\u INSTALL\u 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\u INSTALL\u PREFIX
以产生效果之外,上述内容是否存在任何问题

(b) 有没有更好、更干净、更健壮、更惯用和/或更少烦人的方法来实现上述目标


谢谢。

几年前,我想尝试同样的事情。不幸的是,我从未找到一个完全令人满意的解决方案。相反,我选择使用正则表达式检查
CMAKE\u INSTALL\u前缀是否与默认值匹配

例如,在windows上,我使用以下命令在生成目录中创建
install
dir:

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上尝试类似的操作。

CMake设置布尔变量,前提是未明确指定CMake\u INSTALL\u PREFIX
,并将其初始化为默认设置。您可以通过以下方式覆盖它:

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

我希望在几天前找到这篇文章,当时我正在努力让多个ExternalProject依赖项做正确的事情。谢谢在Unix上,可以在匹配中使用
“^/usr/local”
;或者,更好的方法是使用
STREQUAL”/usr/local“
而不是正则表达式匹配。