mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-16 22:37:30 +08:00
cmake: Allow CMAKE_TOOLCHAIN_FILE to be set by environment variable
When no `CMAKE_TOOLCHAIN_FILE` is explicitly specified while creating a new build tree, check for an environment variable of the same name.
This commit is contained in:
12
Help/envvar/CMAKE_TOOLCHAIN_FILE.rst
Normal file
12
Help/envvar/CMAKE_TOOLCHAIN_FILE.rst
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
CMAKE_TOOLCHAIN_FILE
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
.. versionadded:: 3.21
|
||||||
|
|
||||||
|
.. include:: ENV_VAR.txt
|
||||||
|
|
||||||
|
The ``CMAKE_TOOLCHAIN_FILE`` environment variable specifies a default value
|
||||||
|
for the :variable:`CMAKE_TOOLCHAIN_FILE` variable when there is no explicit
|
||||||
|
configuration given on the first run while creating a new build tree.
|
||||||
|
On later runs in an existing build tree the value persists in the cache
|
||||||
|
as :variable:`CMAKE_TOOLCHAIN_FILE`.
|
@@ -41,6 +41,7 @@ Environment Variables that Control the Build
|
|||||||
/envvar/CMAKE_MSVCIDE_RUN_PATH
|
/envvar/CMAKE_MSVCIDE_RUN_PATH
|
||||||
/envvar/CMAKE_NO_VERBOSE
|
/envvar/CMAKE_NO_VERBOSE
|
||||||
/envvar/CMAKE_OSX_ARCHITECTURES
|
/envvar/CMAKE_OSX_ARCHITECTURES
|
||||||
|
/envvar/CMAKE_TOOLCHAIN_FILE
|
||||||
/envvar/DESTDIR
|
/envvar/DESTDIR
|
||||||
/envvar/LDFLAGS
|
/envvar/LDFLAGS
|
||||||
/envvar/MACOSX_DEPLOYMENT_TARGET
|
/envvar/MACOSX_DEPLOYMENT_TARGET
|
||||||
|
5
Help/release/dev/env-toolchain-file.rst
Normal file
5
Help/release/dev/env-toolchain-file.rst
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
env-toolchain-file
|
||||||
|
------------------
|
||||||
|
|
||||||
|
* The :envvar:`CMAKE_TOOLCHAIN_FILE` environment variable was added to
|
||||||
|
provide a default value for the :variable:`CMAKE_TOOLCHAIN_FILE` variable.
|
@@ -10,3 +10,6 @@ platform and compiler related information.
|
|||||||
|
|
||||||
Relative paths are allowed and are interpreted first as relative to the
|
Relative paths are allowed and are interpreted first as relative to the
|
||||||
build directory, and if not found, relative to the source directory.
|
build directory, and if not found, relative to the source directory.
|
||||||
|
|
||||||
|
This is initialized by the :envvar:`CMAKE_TOOLCHAIN_FILE` environment
|
||||||
|
variable if it is set when a new build tree is first created.
|
||||||
|
@@ -2040,6 +2040,16 @@ int cmake::ActualConfigure()
|
|||||||
this->GlobalGenerator->GetExtraGeneratorName().c_str(),
|
this->GlobalGenerator->GetExtraGeneratorName().c_str(),
|
||||||
"Name of external makefile project generator.",
|
"Name of external makefile project generator.",
|
||||||
cmStateEnums::INTERNAL);
|
cmStateEnums::INTERNAL);
|
||||||
|
|
||||||
|
if (!this->State->GetInitializedCacheValue("CMAKE_TOOLCHAIN_FILE")) {
|
||||||
|
std::string envToolchain;
|
||||||
|
if (cmSystemTools::GetEnv("CMAKE_TOOLCHAIN_FILE", envToolchain) &&
|
||||||
|
!envToolchain.empty()) {
|
||||||
|
this->AddCacheEntry("CMAKE_TOOLCHAIN_FILE", envToolchain.c_str(),
|
||||||
|
"The CMake toolchain file",
|
||||||
|
cmStateEnums::FILEPATH);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmProp instance =
|
if (cmProp instance =
|
||||||
|
1
Tests/RunCMake/CommandLine/EnvToolchain-toolchain.cmake
Normal file
1
Tests/RunCMake/CommandLine/EnvToolchain-toolchain.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
set(ENV_TOOLCHAIN 1)
|
3
Tests/RunCMake/CommandLine/EnvToolchain.cmake
Normal file
3
Tests/RunCMake/CommandLine/EnvToolchain.cmake
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
message(STATUS "ENV{CMAKE_TOOLCHAIN_FILE}='$ENV{CMAKE_TOOLCHAIN_FILE}'")
|
||||||
|
message(STATUS "CMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'")
|
||||||
|
message(STATUS "ENV_TOOLCHAIN='${ENV_TOOLCHAIN}'")
|
@@ -0,0 +1,5 @@
|
|||||||
|
-- ENV{CMAKE_TOOLCHAIN_FILE}='[^
|
||||||
|
]*/Tests/RunCMake/CommandLine/EnvToolchain-toolchain.cmake'
|
||||||
|
-- CMAKE_TOOLCHAIN_FILE='[^
|
||||||
|
]*/Tests/RunCMake/CommandLine/EnvToolchain-toolchain.cmake'
|
||||||
|
-- ENV_TOOLCHAIN='1'
|
1
Tests/RunCMake/CommandLine/EnvToolchainAbsolute.cmake
Normal file
1
Tests/RunCMake/CommandLine/EnvToolchainAbsolute.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
include(EnvToolchain.cmake)
|
4
Tests/RunCMake/CommandLine/EnvToolchainIgnore-stdout.txt
Normal file
4
Tests/RunCMake/CommandLine/EnvToolchainIgnore-stdout.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
-- ENV{CMAKE_TOOLCHAIN_FILE}='[^
|
||||||
|
]*/Tests/RunCMake/CommandLine/EnvToolchain-toolchain.cmake'
|
||||||
|
-- CMAKE_TOOLCHAIN_FILE=''
|
||||||
|
-- ENV_TOOLCHAIN=''
|
1
Tests/RunCMake/CommandLine/EnvToolchainIgnore.cmake
Normal file
1
Tests/RunCMake/CommandLine/EnvToolchainIgnore.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
include(EnvToolchain.cmake)
|
3
Tests/RunCMake/CommandLine/EnvToolchainNone-stdout.txt
Normal file
3
Tests/RunCMake/CommandLine/EnvToolchainNone-stdout.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
-- ENV{CMAKE_TOOLCHAIN_FILE}=''
|
||||||
|
-- CMAKE_TOOLCHAIN_FILE=''
|
||||||
|
-- ENV_TOOLCHAIN=''
|
1
Tests/RunCMake/CommandLine/EnvToolchainNone.cmake
Normal file
1
Tests/RunCMake/CommandLine/EnvToolchainNone.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
include(EnvToolchain.cmake)
|
@@ -0,0 +1,4 @@
|
|||||||
|
-- ENV{CMAKE_TOOLCHAIN_FILE}='[^
|
||||||
|
]*/Tests/RunCMake/CommandLine/EnvToolchain-toolchain.cmake'
|
||||||
|
-- CMAKE_TOOLCHAIN_FILE=''
|
||||||
|
-- ENV_TOOLCHAIN=''
|
@@ -0,0 +1,4 @@
|
|||||||
|
-- ENV{CMAKE_TOOLCHAIN_FILE}='EnvToolchain-toolchain.cmake'
|
||||||
|
-- CMAKE_TOOLCHAIN_FILE='[^
|
||||||
|
]*/Tests/RunCMake/CommandLine/EnvToolchainRelative-build/EnvToolchain-toolchain.cmake'
|
||||||
|
-- ENV_TOOLCHAIN='1'
|
1
Tests/RunCMake/CommandLine/EnvToolchainRelative.cmake
Normal file
1
Tests/RunCMake/CommandLine/EnvToolchainRelative.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
include(EnvToolchain.cmake)
|
@@ -344,6 +344,33 @@ if(RunCMake_GENERATOR MATCHES "Unix Makefiles" OR RunCMake_GENERATOR MATCHES "Ni
|
|||||||
run_EnvironmentExportCompileCommands()
|
run_EnvironmentExportCompileCommands()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
function(run_EnvironmentToolchain)
|
||||||
|
set(ENV{CMAKE_TOOLCHAIN_FILE} "${RunCMake_SOURCE_DIR}/EnvToolchain-toolchain.cmake")
|
||||||
|
run_cmake(EnvToolchainAbsolute)
|
||||||
|
run_cmake_with_options(EnvToolchainIgnore -DCMAKE_TOOLCHAIN_FILE=)
|
||||||
|
unset(ENV{CMAKE_TOOLCHAIN_FILE})
|
||||||
|
|
||||||
|
set(ENV{CMAKE_TOOLCHAIN_FILE} "EnvToolchain-toolchain.cmake")
|
||||||
|
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/EnvToolchainRelative-build)
|
||||||
|
set(RunCMake_TEST_NO_CLEAN 1)
|
||||||
|
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
|
||||||
|
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
|
||||||
|
configure_file("${RunCMake_SOURCE_DIR}/EnvToolchain-toolchain.cmake" "${RunCMake_TEST_BINARY_DIR}/EnvToolchain-toolchain.cmake" COPYONLY)
|
||||||
|
run_cmake(EnvToolchainRelative)
|
||||||
|
unset(ENV{CMAKE_TOOLCHAIN_FILE})
|
||||||
|
unset(RunCMake_TEST_NO_CLEAN)
|
||||||
|
|
||||||
|
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/EnvToolchainNone-build)
|
||||||
|
run_cmake(EnvToolchainNone)
|
||||||
|
set(RunCMake_TEST_NO_CLEAN 1)
|
||||||
|
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}/CMakeFiles")
|
||||||
|
set(ENV{CMAKE_TOOLCHAIN_FILE} "${RunCMake_SOURCE_DIR}/EnvToolchain-toolchain.cmake")
|
||||||
|
run_cmake_command(EnvToolchainNoneExisting ${CMAKE_COMMAND} .)
|
||||||
|
unset(ENV{CMAKE_TOOLCHAIN_FILE})
|
||||||
|
unset(RunCMake_TEST_NO_CLEAN)
|
||||||
|
endfunction()
|
||||||
|
run_EnvironmentToolchain()
|
||||||
|
|
||||||
if(RunCMake_GENERATOR STREQUAL "Ninja")
|
if(RunCMake_GENERATOR STREQUAL "Ninja")
|
||||||
# Use a single build tree for a few tests without cleaning.
|
# Use a single build tree for a few tests without cleaning.
|
||||||
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Build-build)
|
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Build-build)
|
||||||
|
Reference in New Issue
Block a user