Przeglądaj źródła

Merge topic 'policy-version-env'

33856b1d62 Add CMAKE_POLICY_VERSION_MINIMUM environment variable
04721acc6c Tests: Cover CMAKE_POLICY_VERSION_MINIMUM in initial cache script
729470ff6d Tests: Cover CMAKE_POLICY_VERSION_MINIMUM in script mode
6cd10ffed7 Tests: Cover CMAKE_POLICY_VERSION_MINIMUM as cache entry

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Acked-by: John Parent <[email protected]>
Merge-request: !10376
Brad King 8 miesięcy temu
rodzic
commit
f0140a6e72
38 zmienionych plików z 133 dodań i 9 usunięć
  1. 11 0
      Help/envvar/CMAKE_POLICY_VERSION_MINIMUM.rst
  2. 1 0
      Help/manual/cmake-env-variables.7.rst
  3. 2 0
      Help/release/4.0.rst
  4. 4 0
      Help/variable/CMAKE_POLICY_VERSION_MINIMUM.rst
  5. 15 0
      Source/cmake.cxx
  6. 1 0
      Tests/EnforceConfig.cmake.in
  7. 4 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVar-stderr.txt
  8. 1 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVar.cmake
  9. 0 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad-result.txt
  10. 10 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad-stderr.txt
  11. 1 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad.cmake
  12. 1 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache-result.txt
  13. 9 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache-stderr.txt
  14. 0 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache.cmake
  15. 1 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript-result.txt
  16. 7 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript-stderr.txt
  17. 1 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript.cmake
  18. 4 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarCache-stderr.txt
  19. 0 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarCache.cmake
  20. 4 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarScript-stderr.txt
  21. 1 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarScript.cmake
  22. 4 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVar-stderr.txt
  23. 1 1
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVar.cmake
  24. 1 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBad-result.txt
  25. 9 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBad-stderr.txt
  26. 0 1
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBad.cmake
  27. 1 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBadCache-result.txt
  28. 7 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBadCache-stderr.txt
  29. 0 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBadCache.cmake
  30. 1 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBadScript-result.txt
  31. 4 2
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBadScript-stderr.txt
  32. 1 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBadScript.cmake
  33. 4 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarCache-stderr.txt
  34. 0 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarCache.cmake
  35. 4 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarScript-stderr.txt
  36. 1 0
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVarScript.cmake
  37. 0 3
      Tests/RunCMake/cmake_minimum_required/PolicyVersionVariable-stderr.txt
  38. 17 2
      Tests/RunCMake/cmake_minimum_required/RunCMakeTest.cmake

+ 11 - 0
Help/envvar/CMAKE_POLICY_VERSION_MINIMUM.rst

@@ -0,0 +1,11 @@
+CMAKE_POLICY_VERSION_MINIMUM
+----------------------------
+
+.. versionadded:: 4.0
+
+.. include:: ENV_VAR.txt
+
+The default value for :variable:`CMAKE_POLICY_VERSION_MINIMUM` 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_POLICY_VERSION_MINIMUM`.

+ 1 - 0
Help/manual/cmake-env-variables.7.rst

@@ -27,6 +27,7 @@ Environment Variables that Change Behavior
    /envvar/CMAKE_INCLUDE_PATH
    /envvar/CMAKE_INCLUDE_PATH
    /envvar/CMAKE_LIBRARY_PATH
    /envvar/CMAKE_LIBRARY_PATH
    /envvar/CMAKE_MAXIMUM_RECURSION_DEPTH
    /envvar/CMAKE_MAXIMUM_RECURSION_DEPTH
+   /envvar/CMAKE_POLICY_VERSION_MINIMUM
    /envvar/CMAKE_PREFIX_PATH
    /envvar/CMAKE_PREFIX_PATH
    /envvar/CMAKE_PROGRAM_PATH
    /envvar/CMAKE_PROGRAM_PATH
    /envvar/CMAKE_TLS_VERIFY
    /envvar/CMAKE_TLS_VERIFY

+ 2 - 0
Help/release/4.0.rst

@@ -75,6 +75,8 @@ Variables
 * The :variable:`CMAKE_POLICY_VERSION_MINIMUM` variable was added to
 * The :variable:`CMAKE_POLICY_VERSION_MINIMUM` variable was added to
   help packagers and end users try to configure existing projects that
   help packagers and end users try to configure existing projects that
   have not been updated to work with supported CMake versions.
   have not been updated to work with supported CMake versions.
+  The :envvar:`CMAKE_POLICY_VERSION_MINIMUM` environment variable was
+  added to initialize it.
 
 
 * The :variable:`CMAKE_XCODE_SCHEME_LLDB_INIT_FILE` variable and corresponding
 * The :variable:`CMAKE_XCODE_SCHEME_LLDB_INIT_FILE` variable and corresponding
   :prop_tgt:`XCODE_SCHEME_LLDB_INIT_FILE` target property were added to tell
   :prop_tgt:`XCODE_SCHEME_LLDB_INIT_FILE` target property were added to tell

+ 4 - 0
Help/variable/CMAKE_POLICY_VERSION_MINIMUM.rst

@@ -16,6 +16,10 @@ to externally set policies for which a project has not itself been updated:
   ``-DCMAKE_POLICY_VERSION_MINIMUM=3.5``, to try configuring a project
   ``-DCMAKE_POLICY_VERSION_MINIMUM=3.5``, to try configuring a project
   that has not been updated to set at least that policy version itself.
   that has not been updated to set at least that policy version itself.
 
 
+  Alternatively, users may set the :envvar:`CMAKE_POLICY_VERSION_MINIMUM`
+  environment variable to initialize the cache entry in new build trees
+  automatically.
+
 * Projects may set this variable before a call to :command:`add_subdirectory`
 * Projects may set this variable before a call to :command:`add_subdirectory`
   that adds a third-party project in order to set its policy version without
   that adds a third-party project in order to set its policy version without
   modifying third-party code.
   modifying third-party code.

+ 15 - 0
Source/cmake.cxx

@@ -547,6 +547,21 @@ void cmake::PrintPresetEnvironment()
 // Parse the args
 // Parse the args
 bool cmake::SetCacheArgs(std::vector<std::string> const& args)
 bool cmake::SetCacheArgs(std::vector<std::string> const& args)
 {
 {
+  static std::string const kCMAKE_POLICY_VERSION_MINIMUM =
+    "CMAKE_POLICY_VERSION_MINIMUM";
+  if (!this->State->GetInitializedCacheValue(kCMAKE_POLICY_VERSION_MINIMUM)) {
+    cm::optional<std::string> policyVersion =
+      cmSystemTools::GetEnvVar(kCMAKE_POLICY_VERSION_MINIMUM);
+    if (policyVersion && !policyVersion->empty()) {
+      this->AddCacheEntry(
+        kCMAKE_POLICY_VERSION_MINIMUM, *policyVersion,
+        "Override policy version for cmake_minimum_required calls.",
+        cmStateEnums::STRING);
+      this->State->SetCacheEntryProperty(kCMAKE_POLICY_VERSION_MINIMUM,
+                                         "ADVANCED", "1");
+    }
+  }
+
   auto DefineLambda = [](std::string const& entry, cmake* state) -> bool {
   auto DefineLambda = [](std::string const& entry, cmake* state) -> bool {
     std::string var;
     std::string var;
     std::string value;
     std::string value;

+ 1 - 0
Tests/EnforceConfig.cmake.in

@@ -36,6 +36,7 @@ unset(ENV{CMAKE_GENERATOR_INSTANCE})
 unset(ENV{CMAKE_GENERATOR_PLATFORM})
 unset(ENV{CMAKE_GENERATOR_PLATFORM})
 unset(ENV{CMAKE_GENERATOR_TOOLSET})
 unset(ENV{CMAKE_GENERATOR_TOOLSET})
 unset(ENV{CMAKE_EXPORT_COMPILE_COMMANDS})
 unset(ENV{CMAKE_EXPORT_COMPILE_COMMANDS})
+unset(ENV{CMAKE_POLICY_VERSION_MINIMUM})
 
 
 # Verify that our module implementations do not recurse too much.
 # Verify that our module implementations do not recurse too much.
 set(ENV{CMAKE_MAXIMUM_RECURSION_DEPTH} 100)
 set(ENV{CMAKE_MAXIMUM_RECURSION_DEPTH} 100)

+ 4 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVar-stderr.txt

@@ -0,0 +1,4 @@
+^CMAKE_POLICY_VERSION_MINIMUM='3\.10'
+CMAKE_MINIMUM_REQUIRED_VERSION='3\.1'
+CMP0071='NEW'
+CMP0072=''$

+ 1 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVar.cmake

@@ -0,0 +1 @@
+include(${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVar.cmake)

+ 0 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVariableBad-result.txt → Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad-result.txt


+ 10 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad-stderr.txt

@@ -0,0 +1,10 @@
+^CMake Error at CMakeLists\.txt:1 \(cmake_minimum_required\):
+  Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\.  A numeric
+  major\.minor\[\.patch\[\.tweak\]\] must be given\.
++
+CMake Error at PolicyVersionVarBad\.cmake:1 \(cmake_minimum_required\):
+  Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\.  A numeric
+  major\.minor\[\.patch\[\.tweak\]\] must be given\.
+Call Stack \(most recent call first\):
+  PolicyVersionEnvVarBad\.cmake:[0-9]+ \(include\)
+  CMakeLists\.txt:[0-9]+ \(include\)$

+ 1 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBad.cmake

@@ -0,0 +1 @@
+include(${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVarBad.cmake)

+ 1 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache-result.txt

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

+ 9 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache-stderr.txt

@@ -0,0 +1,9 @@
+^CMake Error at PolicyVersionVarBad\.cmake:1 \(cmake_minimum_required\):
+  Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\.  A numeric
+  major\.minor\[\.patch\[\.tweak\]\] must be given\.
+Call Stack \(most recent call first\):
+  PolicyVersionEnvVarBad\.cmake:[0-9]+ \(include\)
++
+CMake Error at CMakeLists\.txt:1 \(cmake_minimum_required\):
+  Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\.  A numeric
+  major\.minor\[\.patch\[\.tweak\]\] must be given\.$

+ 0 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadCache.cmake


+ 1 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript-result.txt

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

+ 7 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript-stderr.txt

@@ -0,0 +1,7 @@
+^CMake Error at [^
+]*/PolicyVersionVarBad\.cmake:1 \(cmake_minimum_required\):
+  Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\.  A numeric
+  major\.minor\[\.patch\[\.tweak\]\] must be given\.
+Call Stack \(most recent call first\):
+  [^
+]*/PolicyVersionEnvVarBadScript\.cmake:[0-9]+ \(include\)$

+ 1 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarBadScript.cmake

@@ -0,0 +1 @@
+include(${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVarBad.cmake)

+ 4 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarCache-stderr.txt

@@ -0,0 +1,4 @@
+^CMAKE_POLICY_VERSION_MINIMUM='3\.10'
+CMAKE_MINIMUM_REQUIRED_VERSION='3\.1'
+CMP0071='NEW'
+CMP0072=''$

+ 0 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarCache.cmake


+ 4 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarScript-stderr.txt

@@ -0,0 +1,4 @@
+^CMAKE_POLICY_VERSION_MINIMUM='3\.10'
+CMAKE_MINIMUM_REQUIRED_VERSION='3\.1'
+CMP0071='NEW'
+CMP0072=''$

+ 1 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionEnvVarScript.cmake

@@ -0,0 +1 @@
+include(${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVar.cmake)

+ 4 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVar-stderr.txt

@@ -0,0 +1,4 @@
+^CMAKE_POLICY_VERSION_MINIMUM='3\.10'
+CMAKE_MINIMUM_REQUIRED_VERSION='3\.1'
+CMP0071='NEW'
+CMP0072=''$

+ 1 - 1
Tests/RunCMake/cmake_minimum_required/PolicyVersionVariable.cmake → Tests/RunCMake/cmake_minimum_required/PolicyVersionVar.cmake

@@ -1,4 +1,4 @@
-set(CMAKE_POLICY_VERSION_MINIMUM 3.10)
+message("CMAKE_POLICY_VERSION_MINIMUM='${CMAKE_POLICY_VERSION_MINIMUM}'")
 cmake_minimum_required(VERSION 3.1...3.4)
 cmake_minimum_required(VERSION 3.1...3.4)
 message("CMAKE_MINIMUM_REQUIRED_VERSION='${CMAKE_MINIMUM_REQUIRED_VERSION}'")
 message("CMAKE_MINIMUM_REQUIRED_VERSION='${CMAKE_MINIMUM_REQUIRED_VERSION}'")
 foreach(policy CMP0071 CMP0072)
 foreach(policy CMP0071 CMP0072)

+ 1 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBad-result.txt

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

+ 9 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBad-stderr.txt

@@ -0,0 +1,9 @@
+^CMake Error at CMakeLists\.txt:1 \(cmake_minimum_required\):
+  Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\.  A numeric
+  major\.minor\[\.patch\[\.tweak\]\] must be given\.
++
+CMake Error at PolicyVersionVarBad\.cmake:1 \(cmake_minimum_required\):
+  Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\.  A numeric
+  major\.minor\[\.patch\[\.tweak\]\] must be given\.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)$

+ 0 - 1
Tests/RunCMake/cmake_minimum_required/PolicyVersionVariableBad.cmake → Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBad.cmake

@@ -1,2 +1 @@
-set(CMAKE_POLICY_VERSION_MINIMUM ...3.10)
 cmake_minimum_required(VERSION 3.1...3.4)
 cmake_minimum_required(VERSION 3.1...3.4)

+ 1 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBadCache-result.txt

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

+ 7 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBadCache-stderr.txt

@@ -0,0 +1,7 @@
+^CMake Error at PolicyVersionVarBad\.cmake:1 \(cmake_minimum_required\):
+  Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\.  A numeric
+  major\.minor\[\.patch\[\.tweak\]\] must be given\.
++
+CMake Error at CMakeLists\.txt:1 \(cmake_minimum_required\):
+  Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\.  A numeric
+  major\.minor\[\.patch\[\.tweak\]\] must be given\.$

+ 0 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBadCache.cmake


+ 1 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBadScript-result.txt

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

+ 4 - 2
Tests/RunCMake/cmake_minimum_required/PolicyVersionVariableBad-stderr.txt → Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBadScript-stderr.txt

@@ -1,5 +1,7 @@
-^CMake Error at PolicyVersionVariableBad\.cmake:2 \(cmake_minimum_required\):
+^CMake Error at [^
+]*/PolicyVersionVarBad\.cmake:1 \(cmake_minimum_required\):
   Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\.  A numeric
   Invalid CMAKE_POLICY_VERSION_MINIMUM value "\.\.\.3\.10"\.  A numeric
   major\.minor\[\.patch\[\.tweak\]\] must be given\.
   major\.minor\[\.patch\[\.tweak\]\] must be given\.
 Call Stack \(most recent call first\):
 Call Stack \(most recent call first\):
-  CMakeLists\.txt:[0-9]+ \(include\)$
+  [^
+]*/PolicyVersionVarBadScript\.cmake:1 \(include\)$

+ 1 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVarBadScript.cmake

@@ -0,0 +1 @@
+include(${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVarBad.cmake)

+ 4 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVarCache-stderr.txt

@@ -0,0 +1,4 @@
+^CMAKE_POLICY_VERSION_MINIMUM='3\.10'
+CMAKE_MINIMUM_REQUIRED_VERSION='3\.1'
+CMP0071='NEW'
+CMP0072=''$

+ 0 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVarCache.cmake


+ 4 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVarScript-stderr.txt

@@ -0,0 +1,4 @@
+^CMAKE_POLICY_VERSION_MINIMUM='3\.10'
+CMAKE_MINIMUM_REQUIRED_VERSION='3\.1'
+CMP0071='NEW'
+CMP0072=''$

+ 1 - 0
Tests/RunCMake/cmake_minimum_required/PolicyVersionVarScript.cmake

@@ -0,0 +1 @@
+include(${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVar.cmake)

+ 0 - 3
Tests/RunCMake/cmake_minimum_required/PolicyVersionVariable-stderr.txt

@@ -1,3 +0,0 @@
-^CMAKE_MINIMUM_REQUIRED_VERSION='3\.1'
-CMP0071='NEW'
-CMP0072=''$

+ 17 - 2
Tests/RunCMake/cmake_minimum_required/RunCMakeTest.cmake

@@ -7,5 +7,20 @@ run_cmake(BeforeVersionDeprecated)
 run_cmake(Range)
 run_cmake(Range)
 run_cmake(RangeBad)
 run_cmake(RangeBad)
 run_cmake(Unknown)
 run_cmake(Unknown)
-run_cmake(PolicyVersionVariable)
-run_cmake(PolicyVersionVariableBad)
+
+run_cmake_with_options(PolicyVersionVar -DCMAKE_POLICY_VERSION_MINIMUM=3.10)
+run_cmake_with_options(PolicyVersionVarCache -DCMAKE_POLICY_VERSION_MINIMUM=3.10 -C ${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVar.cmake)
+run_cmake_script(PolicyVersionVarScript -DCMAKE_POLICY_VERSION_MINIMUM=3.10)
+run_cmake_with_options(PolicyVersionVarBad -DCMAKE_POLICY_VERSION_MINIMUM=...3.10)
+run_cmake_with_options(PolicyVersionVarBadCache -DCMAKE_POLICY_VERSION_MINIMUM=...3.10 -C ${CMAKE_CURRENT_LIST_DIR}/PolicyVersionVarBad.cmake)
+run_cmake_script(PolicyVersionVarBadScript -DCMAKE_POLICY_VERSION_MINIMUM=...3.10)
+
+set(ENV{CMAKE_POLICY_VERSION_MINIMUM} 3.10)
+run_cmake(PolicyVersionEnvVar)
+run_cmake_with_options(PolicyVersionEnvVarCache -C ${CMAKE_CURRENT_LIST_DIR}/PolicyVersionEnvVar.cmake)
+run_cmake_script(PolicyVersionEnvVarScript)
+set(ENV{CMAKE_POLICY_VERSION_MINIMUM} ...3.10)
+run_cmake(PolicyVersionEnvVarBad)
+run_cmake_with_options(PolicyVersionEnvVarBadCache -C ${CMAKE_CURRENT_LIST_DIR}/PolicyVersionEnvVarBad.cmake)
+run_cmake_script(PolicyVersionEnvVarBadScript)
+unset(ENV{CMAKE_POLICY_VERSION_MINIMUM})