Xcode: Add variables and properties to configure schemes

Add `XCODE_SCHEME_*` target properties and associated variables
`CMAKE_XCODE_SCHEME_*` to initialize them on target creation.
Map each target property value to an associated Xcode scheme entry.

Co-Author: Martin Sander <mail@martin-sander.de>
Fixes: #17919
This commit is contained in:
Gregor Jasny
2018-07-29 21:37:18 +02:00
committed by Brad King
parent 39c91d0703
commit 6b7f1e1db0
43 changed files with 734 additions and 0 deletions

View File

@@ -339,6 +339,24 @@ Properties on Targets
/prop_tgt/XCODE_ATTRIBUTE_an-attribute
/prop_tgt/XCODE_EXPLICIT_FILE_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
.. _`Test Properties`:

View File

@@ -204,6 +204,21 @@ Variables that Change Behavior
/variable/CMAKE_WARN_DEPRECATED
/variable/CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION
/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
Variables that Describe the System

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -9,3 +9,31 @@ actions from the command line.
The Xcode Schema Generator is still experimental and subject to
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`

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -278,6 +278,31 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type,
this->SetPropertyDefault("LINK_SEARCH_START_STATIC", nullptr);
this->SetPropertyDefault("LINK_SEARCH_END_STATIC", 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.

View File

@@ -143,6 +143,41 @@ void cmXCodeScheme::WriteLaunchAction(cmXMLWriter& xout,
xout.Attribute("debugServiceExtension", "internal");
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)) {
xout.StartElement("BuildableProductRunnable");
xout.BreakAttributes();
@@ -156,12 +191,144 @@ void cmXCodeScheme::WriteLaunchAction(cmXMLWriter& xout,
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");
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(); // 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,
const std::string& configuration)
{

View File

@@ -41,6 +41,16 @@ private:
const std::string& container);
void WriteLaunchAction(cmXMLWriter& xout, const std::string& configuration,
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 WriteAnalyzeAction(cmXMLWriter& xout, const std::string& configuration);
void WriteArchiveAction(cmXMLWriter& xout, const std::string& configuration);

View File

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

View File

@@ -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"]=])

View File

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