cmake: Add -A option to specify a generator platform

Define the 'cmake -A' option to set CMAKE_GENERATOR_PLATFORM
without having to spell out the whole variable name.  We choose
the name '-A' for "platform" because '-P' is already taken, and
in the common use case the "platform" is actually an architecture
(e.g. x64).

Teach the RunCMake test infrastructure to use -A to pass the generator
platform.  Extend the RunCMake.GeneratorPlatform test with a case to
verify that the -A option cannot be repeated.
This commit is contained in:
Brad King 2014-09-12 09:55:06 -04:00
parent 09c8ad9943
commit eb7d815649
10 changed files with 49 additions and 2 deletions

View File

@ -51,6 +51,17 @@
See native build system documentation for allowed toolset names. See native build system documentation for allowed toolset names.
``-A <platform-name>``
Specify platform name if supported by generator.
Some CMake generators support a platform name to be given to the
native build system to choose a compiler or SDK. This is supported only on
specific generators::
Visual Studio >= 8
See native build system documentation for allowed platform names.
``-Wno-dev`` ``-Wno-dev``
Suppress developer warnings. Suppress developer warnings.

View File

@ -4,4 +4,6 @@ vs-generator-platform
* The Visual Studio generators for versions 8 (2005) and above * The Visual Studio generators for versions 8 (2005) and above
learned to read the target platform name from a new learned to read the target platform name from a new
:variable:`CMAKE_GENERATOR_PLATFORM` variable when it is :variable:`CMAKE_GENERATOR_PLATFORM` variable when it is
not specified as part of the generator name. not specified as part of the generator name. The platform
name may be specified on the :manual:`cmake(1)` command line
with the ``-A`` option, e.g. ``-G "Visual Studio 12 2013" -A x64``.

View File

@ -5,6 +5,8 @@ Generator-specific target platform name specified by user.
Some CMake generators support a target platform name to be given Some CMake generators support a target platform name to be given
to the native build system to choose a compiler toolchain. to the native build system to choose a compiler toolchain.
If the user specifies a toolset name (e.g. via the cmake -A option)
the value will be available in this variable.
The value of this variable should never be modified by project code. The value of this variable should never be modified by project code.
A toolchain file specified by the :variable:`CMAKE_TOOLCHAIN_FILE` A toolchain file specified by the :variable:`CMAKE_TOOLCHAIN_FILE`

View File

@ -639,6 +639,7 @@ void cmake::SetArgs(const std::vector<std::string>& args,
{ {
bool directoriesSet = directoriesSetBefore; bool directoriesSet = directoriesSetBefore;
bool haveToolset = false; bool haveToolset = false;
bool havePlatform = false;
for(unsigned int i=1; i < args.size(); ++i) for(unsigned int i=1; i < args.size(); ++i)
{ {
std::string arg = args[i]; std::string arg = args[i];
@ -767,6 +768,27 @@ void cmake::SetArgs(const std::vector<std::string>& args,
"uninitialized variables.\n"; "uninitialized variables.\n";
this->SetCheckSystemVars(true); this->SetCheckSystemVars(true);
} }
else if(arg.find("-A",0) == 0)
{
std::string value = arg.substr(2);
if(value.size() == 0)
{
++i;
if(i >= args.size())
{
cmSystemTools::Error("No platform specified for -A");
return;
}
value = args[i];
}
if(havePlatform)
{
cmSystemTools::Error("Multiple -A options not allowed");
return;
}
this->GeneratorPlatform = value;
havePlatform = true;
}
else if(arg.find("-T",0) == 0) else if(arg.find("-T",0) == 0)
{ {
std::string value = arg.substr(2); std::string value = arg.substr(2);

View File

@ -476,6 +476,7 @@ private:
{"-U <globbing_expr>", "Remove matching entries from CMake cache."}, \ {"-U <globbing_expr>", "Remove matching entries from CMake cache."}, \
{"-G <generator-name>", "Specify a build system generator."},\ {"-G <generator-name>", "Specify a build system generator."},\
{"-T <toolset-name>", "Specify toolset name if supported by generator."}, \ {"-T <toolset-name>", "Specify toolset name if supported by generator."}, \
{"-A <platform-name>", "Specify platform name if supported by generator."}, \
{"-Wno-dev", "Suppress developer warnings."},\ {"-Wno-dev", "Suppress developer warnings."},\
{"-Wdev", "Enable developer warnings."} {"-Wdev", "Enable developer warnings."}

View File

@ -10,3 +10,9 @@ else()
set(RunCMake_GENERATOR_PLATFORM "Bad Platform") set(RunCMake_GENERATOR_PLATFORM "Bad Platform")
run_cmake(BadPlatform) run_cmake(BadPlatform)
endif() endif()
set(RunCMake_GENERATOR_TOOLSET "")
set(RunCMake_TEST_OPTIONS -A "Extra Platform")
run_cmake(TwoPlatforms)
unset(RunCMake_TEST_OPTIONS)

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1 @@
CMake Error: Multiple -A options not allowed

View File

@ -0,0 +1 @@
message(FATAL_ERROR "This should not be reached!")

View File

@ -53,7 +53,7 @@ function(run_cmake test)
execute_process( execute_process(
COMMAND ${CMAKE_COMMAND} "${RunCMake_TEST_SOURCE_DIR}" COMMAND ${CMAKE_COMMAND} "${RunCMake_TEST_SOURCE_DIR}"
-G "${RunCMake_GENERATOR}" -G "${RunCMake_GENERATOR}"
"-DCMAKE_GENERATOR_PLATFORM=${RunCMake_GENERATOR_PLATFORM}" -A "${RunCMake_GENERATOR_PLATFORM}"
-T "${RunCMake_GENERATOR_TOOLSET}" -T "${RunCMake_GENERATOR_TOOLSET}"
-DRunCMake_TEST=${test} -DRunCMake_TEST=${test}
--no-warn-unused-cli --no-warn-unused-cli