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.
``-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``
Suppress developer warnings.

View File

@ -4,4 +4,6 @@ vs-generator-platform
* The Visual Studio generators for versions 8 (2005) and above
learned to read the target platform name from a new
: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
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.
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 haveToolset = false;
bool havePlatform = false;
for(unsigned int i=1; i < args.size(); ++i)
{
std::string arg = args[i];
@ -767,6 +768,27 @@ void cmake::SetArgs(const std::vector<std::string>& args,
"uninitialized variables.\n";
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)
{
std::string value = arg.substr(2);

View File

@ -476,6 +476,7 @@ private:
{"-U <globbing_expr>", "Remove matching entries from CMake cache."}, \
{"-G <generator-name>", "Specify a build system 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."},\
{"-Wdev", "Enable developer warnings."}

View File

@ -10,3 +10,9 @@ else()
set(RunCMake_GENERATOR_PLATFORM "Bad Platform")
run_cmake(BadPlatform)
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(
COMMAND ${CMAKE_COMMAND} "${RunCMake_TEST_SOURCE_DIR}"
-G "${RunCMake_GENERATOR}"
"-DCMAKE_GENERATOR_PLATFORM=${RunCMake_GENERATOR_PLATFORM}"
-A "${RunCMake_GENERATOR_PLATFORM}"
-T "${RunCMake_GENERATOR_TOOLSET}"
-DRunCMake_TEST=${test}
--no-warn-unused-cli