Allow disabling adding the install prefix to the prefix search path.

In certain scenarios, it is preferable to keep a 'dirty' install prefix
than to clear it, and to expect that content will not be found there.
Add a CMAKE_FIND_NO_INSTALL_PREFIX variable that can be set to disable
searching the install prefix.
This commit is contained in:
Stephen Kelly 2013-10-29 10:40:09 +01:00
parent 047c1ec457
commit fe057ab3cd
14 changed files with 78 additions and 9 deletions

View File

@ -88,6 +88,7 @@ Variables that Change Behavior
/variable/CMAKE_FIND_LIBRARY_PREFIXES
/variable/CMAKE_FIND_LIBRARY_SUFFIXES
/variable/CMAKE_FIND_PACKAGE_WARN_NO_MODULE
/variable/CMAKE_FIND_NO_INSTALL_PREFIX
/variable/CMAKE_IGNORE_PATH
/variable/CMAKE_INCLUDE_PATH
/variable/CMAKE_INSTALL_DEFAULT_COMPONENT_NAME

View File

@ -0,0 +1,13 @@
CMAKE_FIND_NO_INSTALL_PREFIX
----------------------------
Ignore the :variable:`CMAKE_INSTALL_PREFIX` when searching for assets.
CMake adds the :variable:`CMAKE_INSTALL_PREFIX` to the
:variable:`CMAKE_SYSTEM_PREFIX_PATH` by default. This variable may be set
on the command line to control that behavior.
Set :variable:`CMAKE_FIND_NO_INSTALL_PREFIX` to TRUE to tell find_package not
to search in the :variable:`CMAKE_INSTALL_PREFIX` by default. Note that the
prefix may still be searched for other reasons, such as being the same prefix
as the CMake installation, or for being a built-in system prefix.

View File

@ -37,10 +37,13 @@ list(APPEND CMAKE_SYSTEM_PREFIX_PATH
# CMake install location
"${_CMAKE_INSTALL_DIR}"
)
if (NOT CMAKE_FIND_NO_INSTALL_PREFIX)
list(APPEND CMAKE_SYSTEM_PREFIX_PATH
# Project install destination.
"${CMAKE_INSTALL_PREFIX}"
)
endif()
# List common include file locations not under the common prefixes.
list(APPEND CMAKE_SYSTEM_INCLUDE_PATH

View File

@ -73,11 +73,13 @@ get_filename_component(_CMAKE_INSTALL_DIR "${CMAKE_ROOT}" PATH)
get_filename_component(_CMAKE_INSTALL_DIR "${_CMAKE_INSTALL_DIR}" PATH)
list(APPEND CMAKE_SYSTEM_PREFIX_PATH "${_CMAKE_INSTALL_DIR}")
if (NOT CMAKE_FIND_NO_INSTALL_PREFIX)
# Add other locations.
list(APPEND CMAKE_SYSTEM_PREFIX_PATH
# Project install destination.
"${CMAKE_INSTALL_PREFIX}"
)
endif()
if(CMAKE_CROSSCOMPILING AND NOT CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
# MinGW (useful when cross compiling from linux with CMAKE_FIND_ROOT_PATH set)
@ -88,8 +90,12 @@ list(APPEND CMAKE_SYSTEM_INCLUDE_PATH
)
# mingw can also link against dlls which can also be in /bin, so list this too
if (NOT CMAKE_FIND_NO_INSTALL_PREFIX)
list(APPEND CMAKE_SYSTEM_LIBRARY_PATH
"${CMAKE_INSTALL_PREFIX}/bin"
)
endif()
list(APPEND CMAKE_SYSTEM_LIBRARY_PATH
"${_CMAKE_INSTALL_DIR}/bin"
/bin
)

View File

@ -109,6 +109,7 @@ add_RunCMake_test(CMP0004)
add_RunCMake_test(TargetPolicies)
add_RunCMake_test(alias_targets)
add_RunCMake_test(interface_library)
add_RunCMake_test(no_install_prefix)
find_package(Qt4 QUIET)
find_package(Qt5Core QUIET)

View File

@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 2.8.4)
project(${RunCMake_TEST} NONE)
include(${RunCMake_TEST}.cmake)

View File

@ -0,0 +1,15 @@
include(RunCMake)
set(RunCMake_TEST_OPTIONS "-DCMAKE_INSTALL_PREFIX=${RunCMake_BINARY_DIR}/prefix")
file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/prefix")
file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/prefix/NoPrefix")
file(WRITE "${RunCMake_BINARY_DIR}/prefix/NoPrefix/NoPrefixConfig.cmake" "")
set(RunCMake_TEST_OPTIONS "-DCMAKE_INSTALL_PREFIX:PATH=${RunCMake_BINARY_DIR}/prefix")
run_cmake(with_install_prefix)
file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/prefix")
file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/prefix/NoPrefix")
file(WRITE "${RunCMake_BINARY_DIR}/prefix/NoPrefix/NoPrefixConfig.cmake" "")
list(APPEND RunCMake_TEST_OPTIONS "-DCMAKE_FIND_NO_INSTALL_PREFIX=1")
run_cmake(no_install_prefix)

View File

@ -0,0 +1,2 @@
find_package(NoPrefix REQUIRED)

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,18 @@
CMake Error at do_test.cmake:2 \(find_package\):
By not providing "FindNoPrefix.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "NoPrefix",
but CMake did not find one.
Could not find a package configuration file provided by "NoPrefix" with any
of the following names:
NoPrefixConfig.cmake
noprefix-config.cmake
Add the installation prefix of "NoPrefix" to CMAKE_PREFIX_PATH or set
"NoPrefix_DIR" to a directory containing one of the above files. If
"NoPrefix" provides a separate development package or SDK, be sure it has
been installed.
Call Stack \(most recent call first\):
no_install_prefix.cmake:2 \(include\)
CMakeLists.txt:3 \(include\)

View File

@ -0,0 +1,2 @@
include(do_test.cmake)

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1 @@
^$

View File

@ -0,0 +1,2 @@
include(do_test.cmake)