2016-09-14 110 views
4

如何在我的根CMakeLists.txt文件中设置CMAKE_INSTALL_PREFIX?从CMakeLists.txt文件设置CMAKE_INSTALL_PREFIX

我一直在做

cmake_minimum_required(VERSION 2.8) 
project(MyProject) 

# Set default install prefix 
set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}) 

与希望,通过安装将在源代码树注定文件夹。即,

install(TARGETS my_exe DESTINATION bin/) 

将安装到${CMAKE_SOURCE_DIR}/bin/。相反,它一直试图写入/usr/local/bin(Ubuntu 14.04的默认设置)。

我尝试了this question的答案,但是当我检查CMakeCache.txt时,仍然将标准usr/local/作为我的CMAKE_INSTALL_PREFIX。

唯一的工作解决我是做

install(TARGETS my_exe DESTINATION "${CMAKE_SOURCE_DIR}/bin/") 

但这然后删除用户来指定要安装的bin目录的能力。

tl; dr我想make install默认自动安装到${CMAKE_SOURCE_DIR},而不是/usr/local/

回答

9

CMake的开发suggest使用给定的模式变革默认值 CMAKE_INSTALL_PREFIXCMakeLists.txt

# Use this snippet *after* PROJECT(xxx): 
IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) 
    SET(CMAKE_INSTALL_PREFIX <path> CACHE PATH <comment> FORCE) 
ENDIF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) 

使用这种方法

# Use this snippet *before* PROJECT(xxx): 
SET(CMAKE_INSTALL_PREFIX <path> CACHE PATH <comment>) 

不建议

..解决方案取决于PROJECT命令的实现细节,并且非常脆弱,因为它对某些CMake版本“意外”工作。我根本不认为它是一个选项。

+0

CMAKE_INSTALL_PREFIX的关键是使用FORCE。 –

+2

您不希望使用FORCE将其放入缓存的原因是因为这消除了传入的任何命令行选项。要求CMake使用默认值的建议是一个非常健壮的解决方案,不会混淆用户如果他们尝试使用命令行覆盖它。 – KymikoLoco