diff --git a/Auxiliary/vim/syntax/cmake.vim b/Auxiliary/vim/syntax/cmake.vim index 87447f44f5..1fcf32f4a4 100644 --- a/Auxiliary/vim/syntax/cmake.vim +++ b/Auxiliary/vim/syntax/cmake.vim @@ -489,6 +489,7 @@ syn keyword cmakeProperty contained \ XCODE_SCHEME_GUARD_MALLOC \ XCODE_SCHEME_LAUNCH_CONFIGURATION \ XCODE_SCHEME_LAUNCH_MODE + \ XCODE_SCHEME_LLDB_INIT_FILE \ XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP \ XCODE_SCHEME_MALLOC_GUARD_EDGES \ XCODE_SCHEME_MALLOC_SCRIBBLE @@ -1854,6 +1855,7 @@ syn keyword cmakeVariable contained \ CMAKE_XCODE_SCHEME_GUARD_MALLOC \ CMAKE_XCODE_SCHEME_LAUNCH_CONFIGURATION \ CMAKE_XCODE_SCHEME_LAUNCH_MODE + \ CMAKE_XCODE_SCHEME_LLDB_INIT_FILE \ CMAKE_XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP \ CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES \ CMAKE_XCODE_SCHEME_MALLOC_SCRIBBLE diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst index c49aa8908a..bd0820311f 100644 --- a/Help/manual/cmake-properties.7.rst +++ b/Help/manual/cmake-properties.7.rst @@ -495,6 +495,7 @@ Properties on Targets /prop_tgt/XCODE_SCHEME_GUARD_MALLOC /prop_tgt/XCODE_SCHEME_LAUNCH_CONFIGURATION /prop_tgt/XCODE_SCHEME_LAUNCH_MODE + /prop_tgt/XCODE_SCHEME_LLDB_INIT_FILE /prop_tgt/XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP /prop_tgt/XCODE_SCHEME_MALLOC_GUARD_EDGES /prop_tgt/XCODE_SCHEME_MALLOC_SCRIBBLE diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst index 9b4f13c9c2..b00ef4a680 100644 --- a/Help/manual/cmake-variables.7.rst +++ b/Help/manual/cmake-variables.7.rst @@ -296,6 +296,7 @@ Variables that Change Behavior /variable/CMAKE_XCODE_SCHEME_GUARD_MALLOC /variable/CMAKE_XCODE_SCHEME_LAUNCH_CONFIGURATION /variable/CMAKE_XCODE_SCHEME_LAUNCH_MODE + /variable/CMAKE_XCODE_SCHEME_LLDB_INIT_FILE /variable/CMAKE_XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP /variable/CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES /variable/CMAKE_XCODE_SCHEME_MALLOC_SCRIBBLE diff --git a/Help/prop_tgt/XCODE_GENERATE_SCHEME.rst b/Help/prop_tgt/XCODE_GENERATE_SCHEME.rst index fa3c5bceed..aea655b5d9 100644 --- a/Help/prop_tgt/XCODE_GENERATE_SCHEME.rst +++ b/Help/prop_tgt/XCODE_GENERATE_SCHEME.rst @@ -45,4 +45,5 @@ The following target properties will be applied on the - :prop_tgt:`XCODE_SCHEME_ENVIRONMENT` - :prop_tgt:`XCODE_SCHEME_EXECUTABLE` - :prop_tgt:`XCODE_SCHEME_LAUNCH_MODE` +- :prop_tgt:`XCODE_SCHEME_LLDB_INIT_FILE` - :prop_tgt:`XCODE_SCHEME_WORKING_DIRECTORY` diff --git a/Help/prop_tgt/XCODE_SCHEME_LLDB_INIT_FILE.rst b/Help/prop_tgt/XCODE_SCHEME_LLDB_INIT_FILE.rst new file mode 100644 index 0000000000..ce06edab91 --- /dev/null +++ b/Help/prop_tgt/XCODE_SCHEME_LLDB_INIT_FILE.rst @@ -0,0 +1,15 @@ +XCODE_SCHEME_LLDB_INIT_FILE +--------------------------- + +.. versionadded:: 3.32 + +Property value for ``LLDB Init File`` in the Info section of the +generated Xcode scheme. In case the value contains generator +expressions those are evaluated. + +This property is initialized by the value of the variable +:variable:`CMAKE_XCODE_SCHEME_LLDB_INIT_FILE` if it is set +when a target is created. + +Please refer to the :prop_tgt:`XCODE_GENERATE_SCHEME` target property +documentation to see all Xcode schema related properties. diff --git a/Help/release/dev/xcode-scheme-lldb-init-file.rst b/Help/release/dev/xcode-scheme-lldb-init-file.rst new file mode 100644 index 0000000000..8a7921ca86 --- /dev/null +++ b/Help/release/dev/xcode-scheme-lldb-init-file.rst @@ -0,0 +1,7 @@ +xcode-scheme-lldb-init-file +--------------------------- + +* The :variable:`CMAKE_XCODE_SCHEME_LLDB_INIT_FILE` variable and corresponding + :prop_tgt:`XCODE_SCHEME_LLDB_INIT_FILE` target property were added to tell + the :generator:`Xcode` generator what to put in the scheme's "LLDB Init File" + setting. diff --git a/Help/variable/CMAKE_XCODE_SCHEME_LLDB_INIT_FILE.rst b/Help/variable/CMAKE_XCODE_SCHEME_LLDB_INIT_FILE.rst new file mode 100644 index 0000000000..146f05d939 --- /dev/null +++ b/Help/variable/CMAKE_XCODE_SCHEME_LLDB_INIT_FILE.rst @@ -0,0 +1,13 @@ +CMAKE_XCODE_SCHEME_LLDB_INIT_FILE +--------------------------------- + +.. versionadded:: 3.32 + +Property value for ``LLDB Init File`` in the Info section of the generated Xcode +scheme. + +This variable initializes the :prop_tgt:`XCODE_SCHEME_LLDB_INIT_FILE` property on +all targets. + +Please refer to the :prop_tgt:`XCODE_GENERATE_SCHEME` target property +documentation to see all Xcode schema related properties. diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 5267c783fe..c2860d6a99 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -630,6 +630,7 @@ TargetProperty const StaticTargetProperties[] = { { "XCODE_SCHEME_MALLOC_GUARD_EDGES"_s, IC::NeedsXcodeAndCanCompileSources }, { "XCODE_SCHEME_GUARD_MALLOC"_s, IC::NeedsXcodeAndCanCompileSources }, { "XCODE_SCHEME_LAUNCH_MODE"_s, IC::NeedsXcodeAndCanCompileSources }, + { "XCODE_SCHEME_LLDB_INIT_FILE"_s, IC::NeedsXcodeAndCanCompileSources }, { "XCODE_SCHEME_ZOMBIE_OBJECTS"_s, IC::NeedsXcodeAndCanCompileSources }, { "XCODE_SCHEME_MALLOC_STACK"_s, IC::NeedsXcodeAndCanCompileSources }, { "XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE"_s, IC::NeedsXcodeAndCanCompileSources }, diff --git a/Source/cmXCodeScheme.cxx b/Source/cmXCodeScheme.cxx index 12272d1481..2c905a5126 100644 --- a/Source/cmXCodeScheme.cxx +++ b/Source/cmXCodeScheme.cxx @@ -120,6 +120,7 @@ void cmXCodeScheme::WriteTestAction(cmXMLWriter& xout, xout.Attribute("selectedLauncherIdentifier", "Xcode.DebuggerFoundation.Launcher.LLDB"); xout.Attribute("shouldUseLaunchSchemeArgsEnv", "YES"); + WriteCustomLLDBInitFile(xout, configuration); xout.StartElement("Testables"); for (auto const* test : this->Tests) { @@ -164,6 +165,7 @@ void cmXCodeScheme::WriteLaunchAction(cmXMLWriter& xout, xout.Attribute("launchStyle", value); } WriteCustomWorkingDirectory(xout, configuration); + WriteCustomLLDBInitFile(xout, configuration); xout.Attribute("ignoresPersistentStateOnLaunch", "NO"); WriteLaunchActionBooleanAttribute(xout, "debugDocumentVersioning", @@ -481,6 +483,18 @@ void cmXCodeScheme::WriteCustomWorkingDirectory( } } +void cmXCodeScheme::WriteCustomLLDBInitFile(cmXMLWriter& xout, + const std::string& configuration) +{ + std::string const& propertyValue = + this->Target->GetTarget()->GetSafeProperty("XCODE_SCHEME_LLDB_INIT_FILE"); + if (!propertyValue.empty()) { + auto customLLDBInitFile = cmGeneratorExpression::Evaluate( + propertyValue, this->LocalGenerator, configuration); + xout.Attribute("customLLDBInitFile", customLLDBInitFile); + } +} + std::string cmXCodeScheme::WriteVersionString() { std::ostringstream v; diff --git a/Source/cmXCodeScheme.h b/Source/cmXCodeScheme.h index c933a6ec81..d3d6a4111d 100644 --- a/Source/cmXCodeScheme.h +++ b/Source/cmXCodeScheme.h @@ -71,6 +71,9 @@ private: void WriteCustomWorkingDirectory(cmXMLWriter& xout, const std::string& configuration); + void WriteCustomLLDBInitFile(cmXMLWriter& xout, + const std::string& configuration); + std::string WriteVersionString(); std::string FindConfiguration(const std::string& name); diff --git a/Tests/RunCMake/XcodeProject/XcodeSchemaProperty-check.cmake b/Tests/RunCMake/XcodeProject/XcodeSchemaProperty-check.cmake index 732f123dd6..3759c220d0 100644 --- a/Tests/RunCMake/XcodeProject/XcodeSchemaProperty-check.cmake +++ b/Tests/RunCMake/XcodeProject/XcodeSchemaProperty-check.cmake @@ -13,6 +13,48 @@ function(check_property property matcher) endif() endfunction() +function(check_property_count property matcher expected_count) + set(schema "${RunCMake_TEST_BINARY_DIR}/XcodeSchemaProperty.xcodeproj/xcshareddata/xcschemes/${property}.xcscheme") + file(STRINGS ${schema} actual-${property} + REGEX "${matcher}") + if(NOT actual-${property}) + string(APPEND RunCMake_TEST_FAILED + "Xcode schema property ${property}: Could not find\n" + " ${matcher}\n" + "in schema\n" + " ${schema}\n" + ) + set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE) + return() + endif() + list(LENGTH actual-${property} match_count) + if(NOT ${expected_count} EQUAL ${match_count}) + string(APPEND RunCMake_TEST_FAILED + "Xcode schema property ${property}: Expected ${expected_count} matches of\n" + " ${matcher}\n" + "in schema\n" + " ${schema}\n" + "but found ${match_count}.\n\n" + ) + set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE) + endif() +endfunction() + +function(check_no_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(actual-${property}) + string(APPEND RunCMake_TEST_FAILED + "Xcode schema property ${property}: Found\n" + " ${matcher}\n" + "which is not expected in schema\n" + " ${schema}\n" + ) + set(RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}" PARENT_SCOPE) + endif() +endfunction() + function(expect_schema target) set(schema "${RunCMake_TEST_BINARY_DIR}/XcodeSchemaProperty.xcodeproj/xcshareddata/xcschemes/${target}.xcscheme") if(NOT EXISTS ${schema}) @@ -60,6 +102,9 @@ check_property("ENABLE_GPU_FRAME_CAPTURE_MODE_DISABLED_MIXED_CASE" "enableGPUFra check_property("ENABLE_GPU_FRAME_CAPTURE_MODE_METAL_MIXED_CASE" "enableGPUFrameCaptureMode=\"1\"") check_property("LAUNCH_MODE_AUTO" "launchStyle=\"0\"") check_property("LAUNCH_MODE_WAIT" "launchStyle=\"1\"") +check_no_property("LLDB_INIT_FILE_EMPTY" "customLLDBInitFile") +check_property_count("LLDB_INIT_FILE_EVAL" "customLLDBInitFile=\"${RunCMake_TEST_BINARY_DIR}/.lldbinit\"" 2) +check_property_count("LLDB_INIT_FILE_FULL" "customLLDBInitFile=\"/full/path/to/.lldbinit\"" 2) check_property("EXECUTABLE" "myExecutable") check_property("ARGUMENTS" [=["--foo"]=]) diff --git a/Tests/RunCMake/XcodeProject/XcodeSchemaProperty.cmake b/Tests/RunCMake/XcodeProject/XcodeSchemaProperty.cmake index 05a89763de..cc3fa3d662 100644 --- a/Tests/RunCMake/XcodeProject/XcodeSchemaProperty.cmake +++ b/Tests/RunCMake/XcodeProject/XcodeSchemaProperty.cmake @@ -40,6 +40,9 @@ create_scheme_for_property(ENABLE_GPU_FRAME_CAPTURE_MODE_DISABLED_MIXED_CASE ENA create_scheme_for_property(ENABLE_GPU_FRAME_CAPTURE_MODE_METAL_MIXED_CASE ENABLE_GPU_FRAME_CAPTURE_MODE METal) create_scheme_for_property(LAUNCH_MODE_AUTO LAUNCH_MODE AUTO) create_scheme_for_property(LAUNCH_MODE_WAIT LAUNCH_MODE WAIT) +create_scheme_for_property(LLDB_INIT_FILE_EMPTY LLDB_INIT_FILE "") +create_scheme_for_property(LLDB_INIT_FILE_EVAL LLDB_INIT_FILE "${CMAKE_BINARY_DIR}/.lldbinit") +create_scheme_for_property(LLDB_INIT_FILE_FULL LLDB_INIT_FILE "/full/path/to/.lldbinit") create_scheme_for_property(EXECUTABLE EXECUTABLE myExecutable) create_scheme_for_property(ARGUMENTS ARGUMENTS "--foo;--bar=baz") create_scheme_for_property(ENVIRONMENT ENVIRONMENT "FOO=foo;BAR=bar") diff --git a/Tests/RunCMake/property_init/CompileSources.cmake b/Tests/RunCMake/property_init/CompileSources.cmake index eb0a77f2cb..23ea80d1fd 100644 --- a/Tests/RunCMake/property_init/CompileSources.cmake +++ b/Tests/RunCMake/property_init/CompileSources.cmake @@ -203,6 +203,7 @@ if (CMAKE_HOST_APPLE) # compile-guarded in CMake "XCODE_SCHEME_MALLOC_GUARD_EDGES" "ON" "" "XCODE_SCHEME_GUARD_MALLOC" "ON" "" "XCODE_SCHEME_LAUNCH_MODE" "ON" "" + "XCODE_SCHEME_LLDB_INIT_FILE" "ON" "" "XCODE_SCHEME_ZOMBIE_OBJECTS" "ON" "" "XCODE_SCHEME_MALLOC_STACK" "ON" "" "XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE" "ON" ""