浏览代码

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.
Brad King 11 年之前
父节点
当前提交
eb7d815649

+ 11 - 0
Help/manual/OPTIONS_BUILD.txt

@@ -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.
 
 

+ 3 - 1
Help/release/dev/vs-generator-platform.rst

@@ -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``.

+ 2 - 0
Help/variable/CMAKE_GENERATOR_PLATFORM.rst

@@ -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`

+ 22 - 0
Source/cmake.cxx

@@ -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);

+ 1 - 0
Source/cmake.h

@@ -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."}
 
 

+ 6 - 0
Tests/RunCMake/GeneratorPlatform/RunCMakeTest.cmake

@@ -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)

+ 1 - 0
Tests/RunCMake/GeneratorPlatform/TwoPlatforms-result.txt

@@ -0,0 +1 @@
+1

+ 1 - 0
Tests/RunCMake/GeneratorPlatform/TwoPlatforms-stderr.txt

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

+ 1 - 0
Tests/RunCMake/GeneratorPlatform/TwoPlatforms.cmake

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

+ 1 - 1
Tests/RunCMake/RunCMake.cmake

@@ -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