Browse Source

Merge topic 'xcode_schemes_config'

6b7f1e1db0 Xcode: Add variables and properties to configure schemes
39c91d0703 cmGlobalGenerator: Add IsXcode query

Acked-by: Kitware Robot <[email protected]>
Merge-request: !1803
Brad King 7 years ago
parent
commit
d7a1bcd2e6
45 changed files with 738 additions and 0 deletions
  1. 18 0
      Help/manual/cmake-properties.7.rst
  2. 15 0
      Help/manual/cmake-variables.7.rst
  3. 12 0
      Help/prop_tgt/XCODE_SCHEME_ADDRESS_SANITIZER.rst
  4. 12 0
      Help/prop_tgt/XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN.rst
  5. 10 0
      Help/prop_tgt/XCODE_SCHEME_ARGUMENTS.rst
  6. 12 0
      Help/prop_tgt/XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER.rst
  7. 12 0
      Help/prop_tgt/XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS.rst
  8. 12 0
      Help/prop_tgt/XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE.rst
  9. 12 0
      Help/prop_tgt/XCODE_SCHEME_ENVIRONMENT.rst
  10. 9 0
      Help/prop_tgt/XCODE_SCHEME_EXECUTABLE.rst
  11. 12 0
      Help/prop_tgt/XCODE_SCHEME_GUARD_MALLOC.rst
  12. 13 0
      Help/prop_tgt/XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP.rst
  13. 12 0
      Help/prop_tgt/XCODE_SCHEME_MALLOC_GUARD_EDGES.rst
  14. 12 0
      Help/prop_tgt/XCODE_SCHEME_MALLOC_SCRIBBLE.rst
  15. 12 0
      Help/prop_tgt/XCODE_SCHEME_MALLOC_STACK.rst
  16. 12 0
      Help/prop_tgt/XCODE_SCHEME_THREAD_SANITIZER.rst
  17. 12 0
      Help/prop_tgt/XCODE_SCHEME_THREAD_SANITIZER_STOP.rst
  18. 12 0
      Help/prop_tgt/XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER.rst
  19. 13 0
      Help/prop_tgt/XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP.rst
  20. 12 0
      Help/prop_tgt/XCODE_SCHEME_ZOMBIE_OBJECTS.rst
  21. 5 0
      Help/release/dev/xcode_schemes_config.rst
  22. 28 0
      Help/variable/CMAKE_XCODE_GENERATE_SCHEME.rst
  23. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER.rst
  24. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN.rst
  25. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER.rst
  26. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS.rst
  27. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE.rst
  28. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_GUARD_MALLOC.rst
  29. 13 0
      Help/variable/CMAKE_XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP.rst
  30. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES.rst
  31. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_MALLOC_SCRIBBLE.rst
  32. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_MALLOC_STACK.rst
  33. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_THREAD_SANITIZER.rst
  34. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_THREAD_SANITIZER_STOP.rst
  35. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER.rst
  36. 13 0
      Help/variable/CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP.rst
  37. 12 0
      Help/variable/CMAKE_XCODE_SCHEME_ZOMBIE_OBJECTS.rst
  38. 2 0
      Source/cmGlobalGenerator.h
  39. 2 0
      Source/cmGlobalXCodeGenerator.h
  40. 25 0
      Source/cmTarget.cxx
  41. 167 0
      Source/cmXCodeScheme.cxx
  42. 10 0
      Source/cmXCodeScheme.h
  43. 1 0
      Tests/RunCMake/XcodeProject/RunCMakeTest.cmake
  44. 33 0
      Tests/RunCMake/XcodeProject/XcodeSchemaProperty-check.cmake
  45. 37 0
      Tests/RunCMake/XcodeProject/XcodeSchemaProperty.cmake

+ 18 - 0
Help/manual/cmake-properties.7.rst

@@ -339,6 +339,24 @@ Properties on Targets
    /prop_tgt/XCODE_ATTRIBUTE_an-attribute
    /prop_tgt/XCODE_ATTRIBUTE_an-attribute
    /prop_tgt/XCODE_EXPLICIT_FILE_TYPE
    /prop_tgt/XCODE_EXPLICIT_FILE_TYPE
    /prop_tgt/XCODE_PRODUCT_TYPE
    /prop_tgt/XCODE_PRODUCT_TYPE
+   /prop_tgt/XCODE_SCHEME_ADDRESS_SANITIZER
+   /prop_tgt/XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN
+   /prop_tgt/XCODE_SCHEME_THREAD_SANITIZER
+   /prop_tgt/XCODE_SCHEME_THREAD_SANITIZER_STOP
+   /prop_tgt/XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER
+   /prop_tgt/XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP
+   /prop_tgt/XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER
+   /prop_tgt/XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP
+   /prop_tgt/XCODE_SCHEME_MALLOC_SCRIBBLE
+   /prop_tgt/XCODE_SCHEME_MALLOC_GUARD_EDGES
+   /prop_tgt/XCODE_SCHEME_GUARD_MALLOC
+   /prop_tgt/XCODE_SCHEME_ZOMBIE_OBJECTS
+   /prop_tgt/XCODE_SCHEME_MALLOC_STACK
+   /prop_tgt/XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE
+   /prop_tgt/XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS
+   /prop_tgt/XCODE_SCHEME_EXECUTABLE
+   /prop_tgt/XCODE_SCHEME_ARGUMENTS
+   /prop_tgt/XCODE_SCHEME_ENVIRONMENT
    /prop_tgt/XCTEST
    /prop_tgt/XCTEST
 
 
 .. _`Test Properties`:
 .. _`Test Properties`:

+ 15 - 0
Help/manual/cmake-variables.7.rst

@@ -204,6 +204,21 @@ Variables that Change Behavior
    /variable/CMAKE_WARN_DEPRECATED
    /variable/CMAKE_WARN_DEPRECATED
    /variable/CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION
    /variable/CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION
    /variable/CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY
    /variable/CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY
+   /variable/CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER
+   /variable/CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN
+   /variable/CMAKE_XCODE_SCHEME_THREAD_SANITIZER
+   /variable/CMAKE_XCODE_SCHEME_THREAD_SANITIZER_STOP
+   /variable/CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER
+   /variable/CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP
+   /variable/CMAKE_XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER
+   /variable/CMAKE_XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP
+   /variable/CMAKE_XCODE_SCHEME_MALLOC_SCRIBBLE
+   /variable/CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES
+   /variable/CMAKE_XCODE_SCHEME_GUARD_MALLOC
+   /variable/CMAKE_XCODE_SCHEME_ZOMBIE_OBJECTS
+   /variable/CMAKE_XCODE_SCHEME_MALLOC_STACK
+   /variable/CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE
+   /variable/CMAKE_XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS
    /variable/PackageName_ROOT
    /variable/PackageName_ROOT
 
 
 Variables that Describe the System
 Variables that Describe the System

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_ADDRESS_SANITIZER.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_ADDRESS_SANITIZER
+------------------------------
+
+Whether to enable ``Address Sanitizer`` in the Diagnostics
+section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER` if it is set
+when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN
+-----------------------------------------------
+
+Whether to enable ``Detect use of stack after return``
+in the Diagnostics section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN`
+if it is set when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 10 - 0
Help/prop_tgt/XCODE_SCHEME_ARGUMENTS.rst

@@ -0,0 +1,10 @@
+XCODE_SCHEME_ARGUMENTS
+----------------------
+
+Specify command line arguments that should be added to the Arguments
+section of the generated Xcode scheme.
+
+If set to a list of arguments those will be added to the scheme.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER
+----------------------------------------
+
+Whether to disable the ``Main Thread Checker``
+in the Diagnostics section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER`
+if it is set when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS
+----------------------------------
+
+Whether to enable ``Dynamic Library Loads``
+in the Diagnostics section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS` if it is set
+when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE
+-------------------------------------
+
+Whether to enable ``Dynamic Linker API usage``
+in the Diagnostics section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE` if it is set
+when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_ENVIRONMENT.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_ENVIRONMENT
+------------------------
+
+Specify environment variables that should be added to the Arguments
+section of the generated Xcode scheme.
+
+If set to a list of environment variables and values of the form
+``MYVAR=value`` those environment variables will be added to the
+scheme.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 9 - 0
Help/prop_tgt/XCODE_SCHEME_EXECUTABLE.rst

@@ -0,0 +1,9 @@
+XCODE_SCHEME_EXECUTABLE
+-----------------------
+
+Specify path to executable in the Info section of the generated
+Xcode scheme. If not set the schema generator will select the
+current target if it is actually executable.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_GUARD_MALLOC.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_GUARD_MALLOC
+------------------------------
+
+Whether to enable ``Guard Malloc``
+in the Diagnostics section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_GUARD_MALLOC` if it is set
+when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 13 - 0
Help/prop_tgt/XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP.rst

@@ -0,0 +1,13 @@
+XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP
+-------------------------------------
+
+Whether to enable the ``Main Thread Checker`` option
+``Pause on issues``
+in the Diagnostics section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP` if it is set
+when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_MALLOC_GUARD_EDGES.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_MALLOC_GUARD_EDGES
+-------------------------------
+
+Whether to enable ``Malloc Guard Edges``
+in the Diagnostics section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES` if it is set
+when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_MALLOC_SCRIBBLE.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_MALLOC_SCRIBBLE
+------------------------------
+
+Whether to enable ``Malloc Scribble``
+in the Diagnostics section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_MALLOC_SCRIBBLE` if it is set
+when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_MALLOC_STACK.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_MALLOC_STACK
+-------------------------
+
+Whether to enable ``Malloc Stack`` in the Diagnostics
+section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_MALLOC_STACK` if it is set
+when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_THREAD_SANITIZER.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_THREAD_SANITIZER
+-----------------------------
+
+Whether to enable ``Thread Sanitizer`` in the Diagnostics
+section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_THREAD_SANITIZER` if it is set
+when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_THREAD_SANITIZER_STOP.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_THREAD_SANITIZER_STOP
+----------------------------------
+
+Whether to enable ``Thread Sanitizer - Pause on issues``
+in the Diagnostics section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_THREAD_SANITIZER_STOP` if it is set
+when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER
+------------------------------------------
+
+Whether to enable ``Undefined Behavior Sanitizer``
+in the Diagnostics section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER`
+if it is set when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 13 - 0
Help/prop_tgt/XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP.rst

@@ -0,0 +1,13 @@
+XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP
+-----------------------------------------------
+
+Whether to enable ``Undefined Behavior Sanitizer`` option
+``Pause on issues``
+in the Diagnostics section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP`
+if it is set when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/prop_tgt/XCODE_SCHEME_ZOMBIE_OBJECTS.rst

@@ -0,0 +1,12 @@
+XCODE_SCHEME_ZOMBIE_OBJECTS
+------------------------------
+
+Whether to enable ``Zombie Objects``
+in the Diagnostics section of the generated Xcode scheme.
+
+This property is initialized by the value of the variable
+:variable:`CMAKE_XCODE_SCHEME_ZOMBIE_OBJECTS` if it is set
+when a target is created.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 5 - 0
Help/release/dev/xcode_schemes_config.rst

@@ -0,0 +1,5 @@
+xcode_schemes_config
+--------------------
+
+* The :generator:`Xcode` generator learned to configure more Xcode Scheme
+  fields.  See the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable.

+ 28 - 0
Help/variable/CMAKE_XCODE_GENERATE_SCHEME.rst

@@ -9,3 +9,31 @@ actions from the command line.
 
 
   The Xcode Schema Generator is still experimental and subject to
   The Xcode Schema Generator is still experimental and subject to
   change.
   change.
+
+The following target properties overwrite the default of the
+corresponding settings on the "Diagnostic" tab for each schema file.
+Each of those is initialized by the respective ``CMAKE_`` variable
+at target creation time.
+
+- :prop_tgt:`XCODE_SCHEME_ADDRESS_SANITIZER`
+- :prop_tgt:`XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN`
+- :prop_tgt:`XCODE_SCHEME_THREAD_SANITIZER`
+- :prop_tgt:`XCODE_SCHEME_THREAD_SANITIZER_STOP`
+- :prop_tgt:`XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER`
+- :prop_tgt:`XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP`
+- :prop_tgt:`XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER`
+- :prop_tgt:`XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP`
+- :prop_tgt:`XCODE_SCHEME_MALLOC_SCRIBBLE`
+- :prop_tgt:`XCODE_SCHEME_MALLOC_GUARD_EDGES`
+- :prop_tgt:`XCODE_SCHEME_GUARD_MALLOC`
+- :prop_tgt:`XCODE_SCHEME_ZOMBIE_OBJECTS`
+- :prop_tgt:`XCODE_SCHEME_MALLOC_STACK`
+- :prop_tgt:`XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE`
+- :prop_tgt:`XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS`
+
+The following target properties will be applied on the
+"Info" and "Arguments" tab:
+
+- :prop_tgt:`XCODE_SCHEME_EXECUTABLE`
+- :prop_tgt:`XCODE_SCHEME_ARGUMENTS`
+- :prop_tgt:`XCODE_SCHEME_ENVIRONMENT`

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER
+------------------------------------
+
+Whether to enable ``Address Sanitizer`` in the Diagnostics
+section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_ADDRESS_SANITIZER`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN
+-----------------------------------------------------
+
+Whether to enable ``Detect use of stack after return``
+in the Diagnostics section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER
+----------------------------------------------
+
+Whether to disable the ``Main Thread Checker``
+in the Diagnostics section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS
+----------------------------------------
+
+Whether to enable ``Dynamic Library Loads``
+in the Diagnostics section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE
+-------------------------------------------
+
+Whether to enable ``Dynamic Linker API usage``
+in the Diagnostics section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_GUARD_MALLOC.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_GUARD_MALLOC
+-------------------------------
+
+Whether to enable ``Guard Malloc``
+in the Diagnostics section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_GUARD_MALLOC`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 13 - 0
Help/variable/CMAKE_XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP.rst

@@ -0,0 +1,13 @@
+CMAKE_XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP
+-------------------------------------------
+
+Whether to enable the ``Main Thread Checker`` option
+``Pause on issues``
+in the Diagnostics section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES
+-------------------------------------
+
+Whether to enable ``Malloc Guard Edges``
+in the Diagnostics section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_MALLOC_GUARD_EDGES`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_MALLOC_SCRIBBLE.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_MALLOC_SCRIBBLE
+----------------------------------
+
+Whether to enable ``Malloc Scribble``
+in the Diagnostics section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_MALLOC_SCRIBBLE`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_MALLOC_STACK.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_MALLOC_STACK
+-------------------------------
+
+Whether to enable ``Malloc Stack`` in the Diagnostics
+section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_MALLOC_STACK`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_THREAD_SANITIZER.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_THREAD_SANITIZER
+-----------------------------------
+
+Whether to enable ``Thread Sanitizer`` in the Diagnostics
+section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_THREAD_SANITIZER`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_THREAD_SANITIZER_STOP.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_THREAD_SANITIZER_STOP
+----------------------------------------
+
+Whether to enable ``Thread Sanitizer - Pause on issues``
+in the Diagnostics section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_THREAD_SANITIZER_STOP`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER
+------------------------------------------------
+
+Whether to enable ``Undefined Behavior Sanitizer``
+in the Diagnostics section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 13 - 0
Help/variable/CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP.rst

@@ -0,0 +1,13 @@
+CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP
+-----------------------------------------------------
+
+Whether to enable ``Undefined Behavior Sanitizer`` option
+``Pause on issues``
+in the Diagnostics section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 12 - 0
Help/variable/CMAKE_XCODE_SCHEME_ZOMBIE_OBJECTS.rst

@@ -0,0 +1,12 @@
+CMAKE_XCODE_SCHEME_ZOMBIE_OBJECTS
+---------------------------------
+
+Whether to enable ``Zombie Objects``
+in the Diagnostics section of the generated Xcode scheme.
+
+This variable initializes the
+:prop_tgt:`XCODE_SCHEME_ZOMBIE_OBJECTS`
+property on all targets.
+
+Please refer to the :variable:`CMAKE_XCODE_GENERATE_SCHEME` variable
+documentation to see all Xcode schema related properties.

+ 2 - 0
Source/cmGlobalGenerator.h

@@ -354,6 +354,8 @@ public:
       i.e. "Can I build Debug and Release in the same tree?" */
       i.e. "Can I build Debug and Release in the same tree?" */
   virtual bool IsMultiConfig() const { return false; }
   virtual bool IsMultiConfig() const { return false; }
 
 
+  virtual bool IsXcode() const { return false; }
+
   /** Return true if we know the exact location of object files.
   /** Return true if we know the exact location of object files.
       If false, store the reason in the given string.
       If false, store the reason in the given string.
       This is meaningful only after EnableLanguage has been called.  */
       This is meaningful only after EnableLanguage has been called.  */

+ 2 - 0
Source/cmGlobalXCodeGenerator.h

@@ -96,6 +96,8 @@ public:
       i.e. "Can I build Debug and Release in the same tree?" */
       i.e. "Can I build Debug and Release in the same tree?" */
   bool IsMultiConfig() const override;
   bool IsMultiConfig() const override;
 
 
+  bool IsXcode() const override { return true; }
+
   bool HasKnownObjectFileLocation(std::string* reason) const override;
   bool HasKnownObjectFileLocation(std::string* reason) const override;
 
 
   bool IsIPOSupported() const override { return true; }
   bool IsIPOSupported() const override { return true; }

+ 25 - 0
Source/cmTarget.cxx

@@ -278,6 +278,31 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type,
     this->SetPropertyDefault("LINK_SEARCH_START_STATIC", nullptr);
     this->SetPropertyDefault("LINK_SEARCH_START_STATIC", nullptr);
     this->SetPropertyDefault("LINK_SEARCH_END_STATIC", nullptr);
     this->SetPropertyDefault("LINK_SEARCH_END_STATIC", nullptr);
     this->SetPropertyDefault("FOLDER", nullptr);
     this->SetPropertyDefault("FOLDER", nullptr);
+#ifdef __APPLE__
+    if (this->GetGlobalGenerator()->IsXcode()) {
+      this->SetPropertyDefault("XCODE_SCHEME_ADDRESS_SANITIZER", nullptr);
+      this->SetPropertyDefault(
+        "XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN", nullptr);
+      this->SetPropertyDefault("XCODE_SCHEME_THREAD_SANITIZER", nullptr);
+      this->SetPropertyDefault("XCODE_SCHEME_THREAD_SANITIZER_STOP", nullptr);
+      this->SetPropertyDefault("XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER",
+                               nullptr);
+      this->SetPropertyDefault(
+        "XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP", nullptr);
+      this->SetPropertyDefault("XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER",
+                               nullptr);
+      this->SetPropertyDefault("XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP",
+                               nullptr);
+      this->SetPropertyDefault("XCODE_SCHEME_MALLOC_SCRIBBLE", nullptr);
+      this->SetPropertyDefault("XCODE_SCHEME_MALLOC_GUARD_EDGES", nullptr);
+      this->SetPropertyDefault("XCODE_SCHEME_GUARD_MALLOC", nullptr);
+      this->SetPropertyDefault("XCODE_SCHEME_ZOMBIE_OBJECTS", nullptr);
+      this->SetPropertyDefault("XCODE_SCHEME_MALLOC_STACK", nullptr);
+      this->SetPropertyDefault("XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE",
+                               nullptr);
+      this->SetPropertyDefault("XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS", nullptr);
+    }
+#endif
   }
   }
 
 
   // Collect the set of configuration types.
   // Collect the set of configuration types.

+ 167 - 0
Source/cmXCodeScheme.cxx

@@ -143,6 +143,41 @@ void cmXCodeScheme::WriteLaunchAction(cmXMLWriter& xout,
   xout.Attribute("debugServiceExtension", "internal");
   xout.Attribute("debugServiceExtension", "internal");
   xout.Attribute("allowLocationSimulation", "YES");
   xout.Attribute("allowLocationSimulation", "YES");
 
 
+  // Diagnostics tab begin
+
+  bool useAddressSanitizer = WriteLaunchActionAttribute(
+    xout, "enableAddressSanitizer",
+    "XCODE_SCHEME_ADDRESS_SANITIZER"); // not allowed with
+                                       // enableThreadSanitizer=YES
+  WriteLaunchActionAttribute(
+    xout, "enableASanStackUseAfterReturn",
+    "XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN");
+
+  bool useThreadSanitizer = false;
+  if (!useAddressSanitizer) {
+    useThreadSanitizer = WriteLaunchActionAttribute(
+      xout, "enableThreadSanitizer",
+      "XCODE_SCHEME_THREAD_SANITIZER"); // not allowed with
+                                        // enableAddressSanitizer=YES
+  }
+
+  WriteLaunchActionAttribute(xout, "stopOnEveryThreadSanitizerIssue",
+                             "XCODE_SCHEME_THREAD_SANITIZER_STOP");
+
+  WriteLaunchActionAttribute(xout, "enableUBSanitizer",
+                             "XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER");
+  WriteLaunchActionAttribute(
+    xout, "stopOnEveryUBSanitizerIssue",
+    "XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP");
+
+  WriteLaunchActionAttribute(
+    xout, "disableMainThreadChecker",
+    "XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER"); // negative enabled!
+  WriteLaunchActionAttribute(xout, "stopOnEveryMainThreadCheckerIssue",
+                             "XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP");
+
+  // Diagnostics tab end
+
   if (IsExecutable(this->Target)) {
   if (IsExecutable(this->Target)) {
     xout.StartElement("BuildableProductRunnable");
     xout.StartElement("BuildableProductRunnable");
     xout.BreakAttributes();
     xout.BreakAttributes();
@@ -156,12 +191,144 @@ void cmXCodeScheme::WriteLaunchAction(cmXMLWriter& xout,
 
 
   xout.EndElement(); // MacroExpansion
   xout.EndElement(); // MacroExpansion
 
 
+  // Info tab begin
+
+  if (const char* exe =
+        this->Target->GetTarget()->GetProperty("XCODE_SCHEME_EXECUTABLE")) {
+
+    xout.StartElement("PathRunnable");
+    xout.BreakAttributes();
+
+    xout.Attribute("runnableDebuggingMode", "0");
+    xout.Attribute("FilePath", exe);
+
+    xout.EndElement(); // PathRunnable
+  }
+
+  // Info tab end
+
+  // Arguments tab begin
+
+  if (const char* argList =
+        this->Target->GetTarget()->GetProperty("XCODE_SCHEME_ARGUMENTS")) {
+    std::vector<std::string> arguments;
+    cmSystemTools::ExpandListArgument(argList, arguments);
+    if (!arguments.empty()) {
+      xout.StartElement("CommandLineArguments");
+
+      for (auto argument : arguments) {
+        xout.StartElement("CommandLineArgument");
+        xout.BreakAttributes();
+
+        xout.Attribute("argument", argument);
+        xout.Attribute("isEnabled", "YES");
+
+        xout.EndElement(); // CommandLineArgument
+      }
+
+      xout.EndElement(); // CommandLineArguments
+    }
+  }
+
+  if (const char* envList =
+        this->Target->GetTarget()->GetProperty("XCODE_SCHEME_ENVIRONMENT")) {
+    std::vector<std::string> envs;
+    cmSystemTools::ExpandListArgument(envList, envs);
+    if (!envs.empty()) {
+      xout.StartElement("EnvironmentVariables");
+
+      for (auto env : envs) {
+
+        xout.StartElement("EnvironmentVariable");
+        xout.BreakAttributes();
+
+        std::string envValue;
+        const auto p = env.find_first_of('=');
+        if (p != std::string::npos) {
+          envValue = env.substr(p + 1);
+          env.resize(p);
+        }
+
+        xout.Attribute("key", env);
+        xout.Attribute("value", envValue);
+        xout.Attribute("isEnabled", "YES");
+
+        xout.EndElement(); // EnvironmentVariable
+      }
+
+      xout.EndElement(); // EnvironmentVariables
+    }
+  }
+
+  // Arguments tab end
+
   xout.StartElement("AdditionalOptions");
   xout.StartElement("AdditionalOptions");
+
+  if (!useThreadSanitizer) {
+    WriteLaunchActionAdditionalOption(xout, "MallocScribble", "",
+                                      "XCODE_SCHEME_MALLOC_SCRIBBLE");
+  }
+
+  if (!useThreadSanitizer && !useAddressSanitizer) {
+    WriteLaunchActionAdditionalOption(xout, "MallocGuardEdges", "",
+                                      "XCODE_SCHEME_MALLOC_GUARD_EDGES");
+  }
+
+  if (!useThreadSanitizer && !useAddressSanitizer) {
+    WriteLaunchActionAdditionalOption(xout, "DYLD_INSERT_LIBRARIES",
+                                      "/usr/lib/libgmalloc.dylib",
+                                      "XCODE_SCHEME_GUARD_MALLOC");
+  }
+
+  WriteLaunchActionAdditionalOption(xout, "NSZombieEnabled", "YES",
+                                    "XCODE_SCHEME_ZOMBIE_OBJECTS");
+
+  if (!useThreadSanitizer && !useAddressSanitizer) {
+    WriteLaunchActionAdditionalOption(xout, "MallocStackLogging", "",
+                                      "XCODE_SCHEME_MALLOC_STACK");
+  }
+
+  WriteLaunchActionAdditionalOption(xout, "DYLD_PRINT_APIS", "",
+                                    "XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE");
+
+  WriteLaunchActionAdditionalOption(xout, "DYLD_PRINT_LIBRARIES", "",
+                                    "XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS");
+
   xout.EndElement();
   xout.EndElement();
 
 
   xout.EndElement(); // LaunchAction
   xout.EndElement(); // LaunchAction
 }
 }
 
 
+bool cmXCodeScheme::WriteLaunchActionAttribute(cmXMLWriter& xout,
+                                               const std::string& attrName,
+                                               const std::string& varName)
+{
+  if (Target->GetTarget()->GetPropertyAsBool(varName)) {
+    xout.Attribute(attrName.c_str(), "YES");
+    return true;
+  }
+  return false;
+}
+
+bool cmXCodeScheme::WriteLaunchActionAdditionalOption(
+  cmXMLWriter& xout, const std::string& key, const std::string& value,
+  const std::string& varName)
+{
+  if (Target->GetTarget()->GetPropertyAsBool(varName)) {
+    xout.StartElement("AdditionalOption");
+    xout.BreakAttributes();
+
+    xout.Attribute("key", key);
+    xout.Attribute("value", value);
+    xout.Attribute("isEnabled", "YES");
+
+    xout.EndElement(); // AdditionalOption
+
+    return true;
+  }
+  return false;
+}
+
 void cmXCodeScheme::WriteProfileAction(cmXMLWriter& xout,
 void cmXCodeScheme::WriteProfileAction(cmXMLWriter& xout,
                                        const std::string& configuration)
                                        const std::string& configuration)
 {
 {

+ 10 - 0
Source/cmXCodeScheme.h

@@ -41,6 +41,16 @@ private:
                        const std::string& container);
                        const std::string& container);
   void WriteLaunchAction(cmXMLWriter& xout, const std::string& configuration,
   void WriteLaunchAction(cmXMLWriter& xout, const std::string& configuration,
                          const std::string& container);
                          const std::string& container);
+
+  bool WriteLaunchActionAttribute(cmXMLWriter& xout,
+                                  const std::string& attrName,
+                                  const std::string& varName);
+
+  bool WriteLaunchActionAdditionalOption(cmXMLWriter& xout,
+                                         const std::string& attrName,
+                                         const std::string& value,
+                                         const std::string& varName);
+
   void WriteProfileAction(cmXMLWriter& xout, const std::string& configuration);
   void WriteProfileAction(cmXMLWriter& xout, const std::string& configuration);
   void WriteAnalyzeAction(cmXMLWriter& xout, const std::string& configuration);
   void WriteAnalyzeAction(cmXMLWriter& xout, const std::string& configuration);
   void WriteArchiveAction(cmXMLWriter& xout, const std::string& configuration);
   void WriteArchiveAction(cmXMLWriter& xout, const std::string& configuration);

+ 1 - 0
Tests/RunCMake/XcodeProject/RunCMakeTest.cmake

@@ -219,6 +219,7 @@ endfunction()
 
 
 if(NOT XCODE_VERSION VERSION_LESS 7)
 if(NOT XCODE_VERSION VERSION_LESS 7)
   XcodeSchemaGeneration()
   XcodeSchemaGeneration()
+  run_cmake(XcodeSchemaProperty)
 endif()
 endif()
 
 
 if(XCODE_VERSION VERSION_GREATER_EQUAL 8)
 if(XCODE_VERSION VERSION_GREATER_EQUAL 8)

+ 33 - 0
Tests/RunCMake/XcodeProject/XcodeSchemaProperty-check.cmake

@@ -0,0 +1,33 @@
+function(check_property property matcher)
+  set(schema "${RunCMake_TEST_BINARY_DIR}/XcodeSchemaProperty.xcodeproj/xcshareddata/xcschemes/${property}.xcscheme")
+  file(STRINGS ${schema} actual-${property}
+       REGEX "${matcher}" LIMIT_COUNT 1)
+  if(NOT actual-${property})
+    message(SEND_ERROR "Xcode schema property ${property}: Could not find ${matcher} in schema ${schema}")
+  endif()
+endfunction()
+
+check_property("ADDRESS_SANITIZER" "enableAddressSanitizer")
+check_property("ADDRESS_SANITIZER_USE_AFTER_RETURN" "enableASanStackUseAfterReturn")
+check_property("THREAD_SANITIZER" "enableThreadSanitizer")
+check_property("THREAD_SANITIZER_STOP" "stopOnEveryThreadSanitizerIssue")
+check_property("UNDEFINED_BEHAVIOUR_SANITIZER" "enableUBSanitizer")
+check_property("UNDEFINED_BEHAVIOUR_SANITIZER_STOP" "stopOnEveryUBSanitizerIssue")
+check_property("DISABLE_MAIN_THREAD_CHECKER" "disableMainThreadChecker")
+check_property("MAIN_THREAD_CHECKER_STOP" "stopOnEveryMainThreadCheckerIssue")
+
+check_property("MALLOC_SCRIBBLE" "MallocScribble")
+check_property("MALLOC_GUARD_EDGES" "MallocGuardEdges")
+check_property("GUARD_MALLOC" "DYLD_INSERT_LIBRARIES")
+check_property("ZOMBIE_OBJECTS" "NSZombieEnabled")
+check_property("MALLOC_STACK" "MallocStackLogging")
+check_property("DYNAMIC_LINKER_API_USAGE" "DYLD_PRINT_APIS")
+check_property("DYNAMIC_LIBRARY_LOADS" "DYLD_PRINT_LIBRARIES")
+
+check_property("EXECUTABLE" "myExecutable")
+check_property("ARGUMENTS" [=["--foo"]=])
+check_property("ARGUMENTS" [=["--bar=baz"]=])
+check_property("ENVIRONMENT" [=[key="FOO"]=])
+check_property("ENVIRONMENT" [=[value="foo"]=])
+check_property("ENVIRONMENT" [=[key="BAR"]=])
+check_property("ENVIRONMENT" [=[value="bar"]=])

+ 37 - 0
Tests/RunCMake/XcodeProject/XcodeSchemaProperty.cmake

@@ -0,0 +1,37 @@
+cmake_minimum_required(VERSION 3.7)
+
+set(CMAKE_XCODE_GENERATE_SCHEME ON)
+
+project(XcodeSchemaProperty CXX)
+
+function(create_scheme_for_variable variable)
+  set(CMAKE_XCODE_SCHEME_${variable} ON)
+  add_executable(${variable} main.cpp)
+endfunction()
+
+create_scheme_for_variable(ADDRESS_SANITIZER)
+create_scheme_for_variable(ADDRESS_SANITIZER_USE_AFTER_RETURN)
+create_scheme_for_variable(THREAD_SANITIZER)
+create_scheme_for_variable(THREAD_SANITIZER_STOP)
+create_scheme_for_variable(UNDEFINED_BEHAVIOUR_SANITIZER)
+create_scheme_for_variable(UNDEFINED_BEHAVIOUR_SANITIZER_STOP)
+create_scheme_for_variable(DISABLE_MAIN_THREAD_CHECKER)
+create_scheme_for_variable(MAIN_THREAD_CHECKER_STOP)
+
+create_scheme_for_variable(MALLOC_SCRIBBLE)
+create_scheme_for_variable(MALLOC_GUARD_EDGES)
+create_scheme_for_variable(GUARD_MALLOC)
+create_scheme_for_variable(ZOMBIE_OBJECTS)
+create_scheme_for_variable(MALLOC_STACK)
+create_scheme_for_variable(DYNAMIC_LINKER_API_USAGE)
+create_scheme_for_variable(DYNAMIC_LIBRARY_LOADS)
+
+function(create_scheme_for_property property value)
+  set(XCODE_SCHEME_${property} ON)
+  add_executable(${property} main.cpp)
+  set_target_properties(${property} PROPERTIES XCODE_SCHEME_${property} "${value}")
+endfunction()
+
+create_scheme_for_property(EXECUTABLE myExecutable)
+create_scheme_for_property(ARGUMENTS "--foo;--bar=baz")
+create_scheme_for_property(ENVIRONMENT "FOO=foo;BAR=bar")