diff options
38 files changed, 317 insertions, 111 deletions
diff --git a/Help/guide/tutorial/Adding Support for a Testing Dashboard.rst b/Help/guide/tutorial/Adding Support for a Testing Dashboard.rst index 45d5976..787e777 100644 --- a/Help/guide/tutorial/Adding Support for a Testing Dashboard.rst +++ b/Help/guide/tutorial/Adding Support for a Testing Dashboard.rst @@ -4,33 +4,40 @@ Step 6: Adding Support for a Testing Dashboard Adding support for submitting our test results to a dashboard is simple. We already defined a number of tests for our project in :ref:`Testing Support <Tutorial Testing Support>`. Now we just have to run -those tests and submit them to a dashboard. To include support for dashboards -we include the :module:`CTest` module in our top-level ``CMakeLists.txt``. +those tests and submit them to CDash. -Replace: -.. literalinclude:: Step6/CMakeLists.txt - :caption: CMakeLists.txt - :name: CMakeLists.txt-enable_testing-remove - :language: cmake - :start-after: # enable testing - :end-before: # does the application run +Exercise 1 - Send Results to a Testing Dashboard +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -With: +Goal +---- -.. literalinclude:: Step7/CMakeLists.txt - :caption: CMakeLists.txt - :name: CMakeLists.txt-include-CTest - :language: cmake - :start-after: # enable testing - :end-before: # does the application run +Display our CTest results with CDash. + +Helpful Resources +----------------- + +* :manual:`ctest(1)` +* :command:`include` +* :module:`CTest` + +Files to Edit +------------- -The :module:`CTest` module will automatically call ``enable_testing()``, so we -can remove it from our CMake files. +* ``CMakeLists.txt`` + +Getting Started +--------------- + +For this exercise, complete ``TODO 1`` in the top-level ``CMakeLists.txt`` by +including the :module:`CTest` module. This will enable testing with CTest as +well as dashboard submissions to CDash, so we can safely remove the call to +:command:`enable_testing`. We will also need to acquire a ``CTestConfig.cmake`` file to be placed in the -top-level directory where we can specify information to CTest about the -project. It contains: +top-level directory. When run, the :manual:`ctest <ctest(1)>` executable will +read this file to gather information about the testing dashboard. It contains: * The project name @@ -41,9 +48,10 @@ project. It contains: * The URL of the CDash instance where the submission's generated documents will be sent -One has been provided for you in this directory. It would normally be -downloaded from the ``Settings`` page of the project on the CDash -instance that will host and display the test results. Once downloaded from +For this tutorial, a public dashboard server is used and its corresponding +``CTestConfig.cmake`` file is provided for you in this step's root directory. +In practice, this file would be downloaded from a project's ``Settings`` page +on the CDash instance intended to host the test results. Once downloaded from CDash, the file should not be modified locally. .. literalinclude:: Step7/CTestConfig.cmake @@ -51,11 +59,16 @@ CDash, the file should not be modified locally. :name: CTestConfig.cmake :language: cmake -The :manual:`ctest <ctest(1)>` executable will read in this file when it runs. -To create a simple dashboard you can run the :manual:`cmake <cmake(1)>` -executable or the :manual:`cmake-gui <cmake-gui(1)>` to configure the project, -but do not build it yet. Instead, change directory to the binary tree, and then -run: + +Build and Run +------------- + +Note that as part of the CDash submission some information about your +development system (e.g. site name or full pathnames) may displayed publicly. + +To create a simple test dashboard, run the :manual:`cmake <cmake(1)>` +executable or the :manual:`cmake-gui <cmake-gui(1)>` to configure the project +but do not build it yet. Instead, navigate to the build directory and run: .. code-block:: console @@ -70,6 +83,28 @@ type must be specified: Or, from an IDE, build the ``Experimental`` target. -The :manual:`ctest <ctest(1)>` executable will build and test the project and -submit the results to Kitware's public dashboard: +The :manual:`ctest <ctest(1)>` executable will build the project, run any +tests, and submit the results to Kitware's public dashboard: https://my.cdash.org/index.php?project=CMakeTutorial. + +Solution +-------- + +The only CMake code changed needed in this step was to enable dashboard +submissions to CDash by including the :module:`CTest` module in our top-level +``CMakeLists.txt``: + +.. raw:: html + + <details><summary>TODO 1: Click to show/hide answer</summary> + +.. literalinclude:: Step7/CMakeLists.txt + :caption: TODO 1: CMakeLists.txt + :name: CMakeLists.txt-include-CTest + :language: cmake + :start-after: # enable testing + :end-before: # does the application run + +.. raw:: html + + </details> diff --git a/Help/guide/tutorial/Adding a Library.rst b/Help/guide/tutorial/Adding a Library.rst index 46a8909..a56c327 100644 --- a/Help/guide/tutorial/Adding a Library.rst +++ b/Help/guide/tutorial/Adding a Library.rst @@ -236,11 +236,12 @@ Getting Started Start with the resulting files from Exercise 1. Complete ``TODO 7`` through ``TODO 13``. -First create a variable ``MY_MATH`` using the :command:`option` command +First create a variable ``USE_MYMATH`` using the :command:`option` command in the top-level ``CMakeLists.txt`` file. In that same file, use that option to determine whether to build and use the ``MathFunctions`` library. -Then, update ``tutorial.cxx`` and ``TutorialConfig.h.in`` to use ``MY_MATH``. +Then, update ``tutorial.cxx`` and ``TutorialConfig.h.in`` to use +``USE_MYMATH``. Build and Run ------------- @@ -314,9 +315,9 @@ Next, create an :command:`if` statement which checks the value of :command:`add_subdirectory` command from Exercise 1 with the additional :command:`list` commands. -When ``MY_MATH`` is ``ON``, the lists will be generated and will be added to -our project. When ``MY_MATH`` is ``OFF``, the lists stay empty. With this -strategy, we allow users to toggle ``MY_MATH`` to manipulate what library is +When ``USE_MYMATH`` is ``ON``, the lists will be generated and will be added to +our project. When ``USE_MYMATH`` is ``OFF``, the lists stay empty. With this +strategy, we allow users to toggle ``USE_MYMATH`` to manipulate what library is used in the build. The top-level CMakeLists.txt file will now look like the following: @@ -380,7 +381,7 @@ will cover the modern approach in the Step 3 of the tutorial. The corresponding changes to the source code are fairly straightforward. First, in ``tutorial.cxx``, we include the ``MathFunctions.h`` header if -``MY_MATH`` is defined. +``USE_MYMATH`` is defined. .. raw:: html diff --git a/Help/guide/tutorial/Step2/CMakeLists.txt b/Help/guide/tutorial/Step2/CMakeLists.txt index 2f7d56e..2b96128 100644 --- a/Help/guide/tutorial/Step2/CMakeLists.txt +++ b/Help/guide/tutorial/Step2/CMakeLists.txt @@ -7,7 +7,7 @@ project(Tutorial VERSION 1.0) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) -# TODO 7: Create a variable MY_MATH using option and set default to ON +# TODO 7: Create a variable USE_MYMATH using option and set default to ON # configure a header file to pass some of the CMake settings # to the source code diff --git a/Help/guide/tutorial/Step2/TutorialConfig.h.in b/Help/guide/tutorial/Step2/TutorialConfig.h.in index adb4c55..6c09e1a 100644 --- a/Help/guide/tutorial/Step2/TutorialConfig.h.in +++ b/Help/guide/tutorial/Step2/TutorialConfig.h.in @@ -2,4 +2,4 @@ #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@ #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@ -// TODO 13: use cmakedefine to define MY_MATH +// TODO 13: use cmakedefine to define USE_MYMATH diff --git a/Help/guide/tutorial/Step2/tutorial.cxx b/Help/guide/tutorial/Step2/tutorial.cxx index f83aa7e..87f5e0f 100644 --- a/Help/guide/tutorial/Step2/tutorial.cxx +++ b/Help/guide/tutorial/Step2/tutorial.cxx @@ -5,7 +5,7 @@ #include "TutorialConfig.h" -// TODO 11: Only include MathFunctions if MY_MATH is defined +// TODO 11: Only include MathFunctions if USE_MYMATH is defined // TODO 5: Include MathFunctions.h @@ -22,7 +22,7 @@ int main(int argc, char* argv[]) // convert input to double const double inputValue = std::stod(argv[1]); - // TODO 12: Use mysqrt if MY_MATH is defined and sqrt otherwise + // TODO 12: Use mysqrt if USE_MYMATH is defined and sqrt otherwise // TODO 6: Replace sqrt with mysqrt diff --git a/Help/guide/tutorial/Step6/CMakeLists.txt b/Help/guide/tutorial/Step6/CMakeLists.txt index da9e852..c11e307 100644 --- a/Help/guide/tutorial/Step6/CMakeLists.txt +++ b/Help/guide/tutorial/Step6/CMakeLists.txt @@ -45,6 +45,7 @@ install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h" DESTINATION include ) +# TODO 1: Replace enable_testing() with include(CTest) # enable testing enable_testing() diff --git a/Help/manual/cmake.1.rst b/Help/manual/cmake.1.rst index 35bd05f..b31ad11 100644 --- a/Help/manual/cmake.1.rst +++ b/Help/manual/cmake.1.rst @@ -1286,6 +1286,12 @@ The options are: Lists the available workflow presets. The current working directory must contain CMake preset files. +.. option:: --fresh + + Perform a fresh configuration of the build tree. + This removes any existing ``CMakeCache.txt`` file and associated + ``CMakeFiles/`` directory, and recreates them from scratch. + View Help ========= diff --git a/Help/prop_tgt/CONFIG_POSTFIX.rst b/Help/prop_tgt/CONFIG_POSTFIX.rst index 5c2fbd7..69caa39 100644 --- a/Help/prop_tgt/CONFIG_POSTFIX.rst +++ b/Help/prop_tgt/CONFIG_POSTFIX.rst @@ -1,13 +1,13 @@ <CONFIG>_POSTFIX ---------------- -Postfix to append to the target file name for configuration <CONFIG>. +Postfix to append to the target file name for configuration ``<CONFIG>``. -When building with configuration <CONFIG> the value of this property +When building with configuration ``<CONFIG>`` the value of this property is appended to the target file name built on disk. For non-executable -targets, this property is initialized by the value of the variable -CMAKE_<CONFIG>_POSTFIX if it is set when a target is created. This -property is ignored on the Mac for Frameworks and App Bundles. +targets, this property is initialized by the value of the +:variable:`CMAKE_<CONFIG>_POSTFIX` variable if it is set when a target is +created. This property is ignored on macOS for Frameworks and App Bundles. For macOS see also the :prop_tgt:`FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>` target property. diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake index d08660a..fa9b2b5 100644 --- a/Source/CMakeVersion.cmake +++ b/Source/CMakeVersion.cmake @@ -1,7 +1,7 @@ # CMake version number components. set(CMake_VERSION_MAJOR 3) set(CMake_VERSION_MINOR 25) -set(CMake_VERSION_PATCH 20221027) +set(CMake_VERSION_PATCH 20221028) #set(CMake_VERSION_RC 0) set(CMake_VERSION_IS_DIRTY 0) diff --git a/Source/CPack/cpack.cxx b/Source/CPack/cpack.cxx index 631bfd9..f06946b 100644 --- a/Source/CPack/cpack.cxx +++ b/Source/CPack/cpack.cxx @@ -173,8 +173,8 @@ int main(int argc, char const* const* argv) CommandArgument{ "--debug", CommandArgument::Values::Zero, debugLambda }, CommandArgument{ "--config", CommandArgument::Values::One, CommandArgument::setToValue(cpackConfigFile) }, - CommandArgument{ "--trace", CommandArgument::Values::One, traceLambda }, - CommandArgument{ "--trace-expand", CommandArgument::Values::One, + CommandArgument{ "--trace", CommandArgument::Values::Zero, traceLambda }, + CommandArgument{ "--trace-expand", CommandArgument::Values::Zero, traceExpandLambda }, CommandArgument{ "-C", CommandArgument::Values::One, CommandArgument::setToValue(cpackBuildConfig) }, diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index c326ca6..077de42 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -1030,19 +1030,6 @@ bool cmGlobalNinjaGenerator::OpenBuildFileStreams() return false; } - // New buffer size 8 MiB - constexpr auto buildFileStreamBufferSize = 8 * 1024 * 1024; - - // Ensure the buffer is allocated - if (!this->BuildFileStreamBuffer) { - this->BuildFileStreamBuffer = - cm::make_unique<char[]>(buildFileStreamBufferSize); - } - - // Enlarge the internal buffer of the `BuildFileStream` - this->BuildFileStream->rdbuf()->pubsetbuf(this->BuildFileStreamBuffer.get(), - buildFileStreamBufferSize); - // Write a comment about this file. *this->BuildFileStream << "# This file contains all the build statements describing the\n" diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h index dc4f444..defa264 100644 --- a/Source/cmGlobalNinjaGenerator.h +++ b/Source/cmGlobalNinjaGenerator.h @@ -531,7 +531,6 @@ private: /// The file containing the build statement. (the relationship of the /// compilation DAG). std::unique_ptr<cmGeneratedFileStream> BuildFileStream; - std::unique_ptr<char[]> BuildFileStreamBuffer; /// The file containing the rule statements. (The action attached to each /// edge of the compilation DAG). std::unique_ptr<cmGeneratedFileStream> RulesFileStream; diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index bc703e5..98dea3a 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -2387,7 +2387,20 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, gtgt->GetName()); return; } - std::string const& langForPreprocessor = llang; + + // Choose a language to use for target-wide preprocessor definitions. + static const char* ppLangs[] = { "CXX", "C", "OBJCXX", "OBJC" }; + std::string langForPreprocessor; + if (cm::contains(ppLangs, llang)) { + langForPreprocessor = llang; + } else { + for (const char* l : ppLangs) { + if (languages.count(l)) { + langForPreprocessor = l; + break; + } + } + } if (gtgt->IsIPOEnabled(llang, configName)) { const char* ltoValue = @@ -2404,13 +2417,8 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, // Add preprocessor definitions for this target and configuration. BuildObjectListOrString ppDefs(this, true); - if (languages.count("Swift")) { - // FIXME: Xcode warns that Swift does not support definition values. - // C/CXX sources mixed in Swift targets will not see CMAKE_INTDIR. - } else { - this->AppendDefines( - ppDefs, "CMAKE_INTDIR=\"$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\""); - } + this->AppendDefines( + ppDefs, "CMAKE_INTDIR=\"$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\""); if (const std::string* exportMacro = gtgt->GetExportMacro()) { // Add the export symbol definition for shared library objects. this->AppendDefines(ppDefs, exportMacro->c_str()); @@ -2424,15 +2432,28 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, buildSettings->AddAttribute("GCC_PREPROCESSOR_DEFINITIONS", ppDefs.CreateList()); if (languages.count("Swift")) { + // Swift uses a separate attribute for definitions. + std::vector<std::string> targetSwiftDefines; + gtgt->GetCompileDefinitions(targetSwiftDefines, configName, "Swift"); + // Remove the '=value' parts, as Swift does not support them. + std::for_each(targetSwiftDefines.begin(), targetSwiftDefines.end(), + [](std::string& def) { + std::string::size_type pos = def.find('='); + if (pos != std::string::npos) { + def.erase(pos); + } + }); if (this->XcodeVersion < 80) { std::string defineString; - std::set<std::string> defines(targetDefines.begin(), - targetDefines.end()); + std::set<std::string> defines(targetSwiftDefines.begin(), + targetSwiftDefines.end()); this->CurrentLocalGenerator->JoinDefines(defines, defineString, "Swift"); cflags["Swift"] += " " + defineString; } else { + BuildObjectListOrString swiftDefs(this, true); + this->AppendDefines(swiftDefs, targetSwiftDefines); buildSettings->AddAttribute("SWIFT_ACTIVE_COMPILATION_CONDITIONS", - ppDefs.CreateList()); + swiftDefs.CreateList()); } } diff --git a/Source/cmVSSetupHelper.cxx b/Source/cmVSSetupHelper.cxx index 1a3e72e..8764f21 100644 --- a/Source/cmVSSetupHelper.cxx +++ b/Source/cmVSSetupHelper.cxx @@ -300,13 +300,32 @@ bool cmVSSetupAPIHelper::IsEWDKEnabled() return false; } +#if !defined(CMAKE_BOOTSTRAP) +namespace { +std::string FindVsWhereCommand() +{ + std::string vswhere; + static const char* programFiles[] = { "ProgramFiles(x86)", "ProgramFiles" }; + for (const char* pf : programFiles) { + if (cmSystemTools::GetEnv(pf, vswhere)) { + vswhere += "/Microsoft Visual Studio/Installer/vswhere.exe"; + if (cmSystemTools::FileExists(vswhere)) { + return vswhere; + } + } + } + vswhere = "vswhere.exe"; + return vswhere; +} +} +#endif + bool cmVSSetupAPIHelper::EnumerateVSInstancesWithVswhere( std::vector<VSInstanceInfo>& VSInstances) { #if !defined(CMAKE_BOOTSTRAP) // Construct vswhere command to get installed VS instances in JSON format - std::string vswhereExe = getenv("ProgramFiles(x86)") + - std::string(R"(\Microsoft Visual Studio\Installer\vswhere.exe)"); + std::string vswhereExe = FindVsWhereCommand(); std::vector<std::string> vswhereCmd = { vswhereExe, "-format", "json" }; // Execute vswhere command and capture JSON output diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 73b8e88..c068894 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -3742,7 +3742,8 @@ std::function<int()> cmake::BuildWorkflowStep( } #endif -int cmake::Workflow(const std::string& presetName, bool listPresets) +int cmake::Workflow(const std::string& presetName, + WorkflowListPresets listPresets, WorkflowFresh fresh) { #ifndef CMAKE_BOOTSTRAP this->SetHomeDirectory(cmSystemTools::GetCurrentWorkingDirectory()); @@ -3757,7 +3758,7 @@ int cmake::Workflow(const std::string& presetName, bool listPresets) return 1; } - if (listPresets) { + if (listPresets == WorkflowListPresets::Yes) { settingsFile.PrintWorkflowPresetList(); return 0; } @@ -3824,10 +3825,13 @@ int cmake::Workflow(const std::string& presetName, bool listPresets) if (!configurePreset) { return 1; } - steps.emplace_back( - stepNumber, "configure"_s, step.PresetName, - this->BuildWorkflowStep({ cmSystemTools::GetCMakeCommand(), - "--preset", step.PresetName })); + std::vector<std::string> args{ cmSystemTools::GetCMakeCommand(), + "--preset", step.PresetName }; + if (fresh == WorkflowFresh::Yes) { + args.emplace_back("--fresh"); + } + steps.emplace_back(stepNumber, "configure"_s, step.PresetName, + this->BuildWorkflowStep(args)); } break; case cmCMakePresetsGraph::WorkflowPreset::WorkflowStep::Type::Build: { auto const* buildPreset = this->FindPresetForWorkflow( diff --git a/Source/cmake.h b/Source/cmake.h index 5b5425c..4e7bb54 100644 --- a/Source/cmake.h +++ b/Source/cmake.h @@ -611,7 +611,18 @@ public: bool Open(const std::string& dir, bool dryRun); //! run the --workflow option - int Workflow(const std::string& presetName, bool listPresets); + enum class WorkflowListPresets + { + No, + Yes, + }; + enum class WorkflowFresh + { + No, + Yes, + }; + int Workflow(const std::string& presetName, WorkflowListPresets listPresets, + WorkflowFresh fresh); void UnwatchUnusedCli(const std::string& var); void WatchUnusedCli(const std::string& var); diff --git a/Source/cmakemain.cxx b/Source/cmakemain.cxx index 928c1ba..43bebc1 100644 --- a/Source/cmakemain.cxx +++ b/Source/cmakemain.cxx @@ -917,8 +917,11 @@ int do_workflow(int ac, char const* const* av) std::cerr << "This cmake does not support --workflow\n"; return -1; #else + using WorkflowListPresets = cmake::WorkflowListPresets; + using WorkflowFresh = cmake::WorkflowFresh; std::string presetName; - bool listPresets = false; + auto listPresets = WorkflowListPresets::No; + auto fresh = WorkflowFresh::No; using CommandArgument = cmCommandLineArgument<bool(std::string const& value)>; @@ -927,7 +930,15 @@ int do_workflow(int ac, char const* const* av) CommandArgument{ "--preset", CommandArgument::Values::One, CommandArgument::setToValue(presetName) }, CommandArgument{ "--list-presets", CommandArgument::Values::Zero, - CommandArgument::setToTrue(listPresets) } + [&listPresets](const std::string&) -> bool { + listPresets = WorkflowListPresets::Yes; + return true; + } }, + CommandArgument{ "--fresh", CommandArgument::Values::Zero, + [&fresh](const std::string&) -> bool { + fresh = WorkflowFresh::Yes; + return true; + } }, }; std::vector<std::string> inputArgs; @@ -949,14 +960,25 @@ int do_workflow(int ac, char const* const* av) } if (!(matched && parsed)) { if (!matched) { + presetName.clear(); + listPresets = WorkflowListPresets::No; std::cerr << "Unknown argument " << arg << std::endl; } break; } } - if (presetName.empty() && !listPresets) { - std::cerr << "TODO: Usage\n"; + if (presetName.empty() && listPresets == WorkflowListPresets::No) { + /* clang-format off */ + std::cerr << + "Usage: cmake --workflow [options]\n" + "Options:\n" + " --preset <preset> = Workflow preset to execute.\n" + " --list-presets = List available workflow presets.\n" + " --fresh = Configure a fresh build tree, removing any " + "existing cache file.\n" + ; + /* clang-format on */ return 1; } @@ -969,7 +991,7 @@ int do_workflow(int ac, char const* const* av) cmakemainProgressCallback(msg, prog, &cm); }); - return cm.Workflow(presetName, listPresets); + return cm.Workflow(presetName, listPresets, fresh); #endif } diff --git a/Templates/MSBuild/FlagTables/v10_CSharp.json b/Templates/MSBuild/FlagTables/v10_CSharp.json index 5341841..526bcda 100644 --- a/Templates/MSBuild/FlagTables/v10_CSharp.json +++ b/Templates/MSBuild/FlagTables/v10_CSharp.json @@ -477,21 +477,21 @@ "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib", "comment": "", "value": "true", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib-", "comment": "", "value": "false", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib+", "comment": "", "value": "true", diff --git a/Templates/MSBuild/FlagTables/v11_CSharp.json b/Templates/MSBuild/FlagTables/v11_CSharp.json index 5341841..526bcda 100644 --- a/Templates/MSBuild/FlagTables/v11_CSharp.json +++ b/Templates/MSBuild/FlagTables/v11_CSharp.json @@ -477,21 +477,21 @@ "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib", "comment": "", "value": "true", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib-", "comment": "", "value": "false", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib+", "comment": "", "value": "true", diff --git a/Templates/MSBuild/FlagTables/v12_CSharp.json b/Templates/MSBuild/FlagTables/v12_CSharp.json index 5341841..526bcda 100644 --- a/Templates/MSBuild/FlagTables/v12_CSharp.json +++ b/Templates/MSBuild/FlagTables/v12_CSharp.json @@ -477,21 +477,21 @@ "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib", "comment": "", "value": "true", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib-", "comment": "", "value": "false", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib+", "comment": "", "value": "true", diff --git a/Templates/MSBuild/FlagTables/v140_CSharp.json b/Templates/MSBuild/FlagTables/v140_CSharp.json index 5341841..526bcda 100644 --- a/Templates/MSBuild/FlagTables/v140_CSharp.json +++ b/Templates/MSBuild/FlagTables/v140_CSharp.json @@ -477,21 +477,21 @@ "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib", "comment": "", "value": "true", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib-", "comment": "", "value": "false", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib+", "comment": "", "value": "true", diff --git a/Templates/MSBuild/FlagTables/v141_CSharp.json b/Templates/MSBuild/FlagTables/v141_CSharp.json index 5341841..526bcda 100644 --- a/Templates/MSBuild/FlagTables/v141_CSharp.json +++ b/Templates/MSBuild/FlagTables/v141_CSharp.json @@ -477,21 +477,21 @@ "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib", "comment": "", "value": "true", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib-", "comment": "", "value": "false", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib+", "comment": "", "value": "true", diff --git a/Templates/MSBuild/FlagTables/v142_CSharp.json b/Templates/MSBuild/FlagTables/v142_CSharp.json index 9ea8f4b..d57a97e 100644 --- a/Templates/MSBuild/FlagTables/v142_CSharp.json +++ b/Templates/MSBuild/FlagTables/v142_CSharp.json @@ -495,21 +495,21 @@ "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib", "comment": "", "value": "true", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib-", "comment": "", "value": "false", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib+", "comment": "", "value": "true", diff --git a/Templates/MSBuild/FlagTables/v143_CSharp.json b/Templates/MSBuild/FlagTables/v143_CSharp.json index 9ea8f4b..d57a97e 100644 --- a/Templates/MSBuild/FlagTables/v143_CSharp.json +++ b/Templates/MSBuild/FlagTables/v143_CSharp.json @@ -495,21 +495,21 @@ "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib", "comment": "", "value": "true", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib-", "comment": "", "value": "false", "flags": [] }, { - "name": "NoStandardLib", + "name": "NoStdLib", "switch": "nostdlib+", "comment": "", "value": "true", diff --git a/Tests/RunCMake/CMakePresetsWorkflow/Fresh.cmake b/Tests/RunCMake/CMakePresetsWorkflow/Fresh.cmake new file mode 100644 index 0000000..4cf999f --- /dev/null +++ b/Tests/RunCMake/CMakePresetsWorkflow/Fresh.cmake @@ -0,0 +1,4 @@ +option(FRESH_CONFIGURE "" ON) +if(NOT FRESH_CONFIGURE) + message(FATAL_ERROR "FRESH_CONFIGURE is ${FRESH_CONFIGURE}, should be ON") +endif() diff --git a/Tests/RunCMake/CMakePresetsWorkflow/Fresh.json.in b/Tests/RunCMake/CMakePresetsWorkflow/Fresh.json.in new file mode 100644 index 0000000..4ce0ca5 --- /dev/null +++ b/Tests/RunCMake/CMakePresetsWorkflow/Fresh.json.in @@ -0,0 +1,21 @@ +{ + "version": 6, + "configurePresets": [ + { + "name": "default", + "generator": "@RunCMake_GENERATOR@", + "binaryDir": "${sourceDir}/build" + } + ], + "workflowPresets": [ + { + "name": "Fresh", + "steps": [ + { + "type": "configure", + "name": "default" + } + ] + } + ] +} diff --git a/Tests/RunCMake/CMakePresetsWorkflow/InvalidOption-result.txt b/Tests/RunCMake/CMakePresetsWorkflow/InvalidOption-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/CMakePresetsWorkflow/InvalidOption-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CMakePresetsWorkflow/InvalidOption-stderr.txt b/Tests/RunCMake/CMakePresetsWorkflow/InvalidOption-stderr.txt new file mode 100644 index 0000000..049ff54 --- /dev/null +++ b/Tests/RunCMake/CMakePresetsWorkflow/InvalidOption-stderr.txt @@ -0,0 +1,6 @@ +^Unknown argument -DINVALID_OPTION +Usage: cmake --workflow \[options\] +Options: + --preset <preset> = Workflow preset to execute\. + --list-presets = List available workflow presets\. + --fresh = Configure a fresh build tree, removing any existing cache file\.$ diff --git a/Tests/RunCMake/CMakePresetsWorkflow/InvalidOption-stdout.txt b/Tests/RunCMake/CMakePresetsWorkflow/InvalidOption-stdout.txt new file mode 100644 index 0000000..10f3293 --- /dev/null +++ b/Tests/RunCMake/CMakePresetsWorkflow/InvalidOption-stdout.txt @@ -0,0 +1 @@ +^$ diff --git a/Tests/RunCMake/CMakePresetsWorkflow/RunCMakeTest.cmake b/Tests/RunCMake/CMakePresetsWorkflow/RunCMakeTest.cmake index b89a11a..550600a 100644 --- a/Tests/RunCMake/CMakePresetsWorkflow/RunCMakeTest.cmake +++ b/Tests/RunCMake/CMakePresetsWorkflow/RunCMakeTest.cmake @@ -10,10 +10,12 @@ function(run_cmake_workflow_presets name) set(RunCMake_TEST_BINARY_DIR "${RunCMake_TEST_SOURCE_DIR}/build") set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY "${RunCMake_TEST_SOURCE_DIR}") - set(RunCMake_TEST_NO_CLEAN TRUE) + if(NOT RunCMake_TEST_NO_CLEAN) + file(REMOVE_RECURSE "${RunCMake_TEST_SOURCE_DIR}") + file(MAKE_DIRECTORY "${RunCMake_TEST_SOURCE_DIR}") + endif() - file(REMOVE_RECURSE "${RunCMake_TEST_SOURCE_DIR}") - file(MAKE_DIRECTORY "${RunCMake_TEST_SOURCE_DIR}") + set(RunCMake_TEST_NO_CLEAN TRUE) set(CASE_NAME "${name}") set(CASE_SOURCE_DIR "${RunCMake_SOURCE_DIR}") @@ -77,3 +79,11 @@ unset(CMakeUserPresets_FILE) unset(CMakePresets_ASSETS) run_cmake_workflow_presets(ListPresets --list-presets) +run_cmake_workflow_presets(InvalidOption -DINVALID_OPTION) + +set(RunCMake_TEST_NO_CLEAN TRUE) +file(REMOVE_RECURSE "${RunCMake_BINARY_DIR}/Fresh") +file(MAKE_DIRECTORY "${RunCMake_BINARY_DIR}/Fresh/build") +file(WRITE "${RunCMake_BINARY_DIR}/Fresh/build/CMakeCache.txt" "FRESH_CONFIGURE:BOOL=OFF\n") +run_cmake_workflow_presets(Fresh --fresh) +unset(RunCMake_TEST_NO_CLEAN) diff --git a/Tests/RunCMake/Ninja/Intl-build-check.cmake b/Tests/RunCMake/Ninja/Intl-build-check.cmake new file mode 100644 index 0000000..77f013c --- /dev/null +++ b/Tests/RunCMake/Ninja/Intl-build-check.cmake @@ -0,0 +1,5 @@ +include(${RunCMake_SOURCE_DIR}/Intl-common.cmake) +set(output "${RunCMake_TEST_BINARY_DIR}/${intl}-output.txt") +if(NOT EXISTS "${output}") + set(RunCMake_TEST_FAILED "Expected output does not exist:\n ${output}") +endif() diff --git a/Tests/RunCMake/Ninja/Intl-common.cmake b/Tests/RunCMake/Ninja/Intl-common.cmake new file mode 100644 index 0000000..7703976 --- /dev/null +++ b/Tests/RunCMake/Ninja/Intl-common.cmake @@ -0,0 +1 @@ +set(intl "intl-ë®") diff --git a/Tests/RunCMake/Ninja/Intl.cmake b/Tests/RunCMake/Ninja/Intl.cmake new file mode 100644 index 0000000..50e4ee4 --- /dev/null +++ b/Tests/RunCMake/Ninja/Intl.cmake @@ -0,0 +1,7 @@ +include(Intl-common.cmake) +set(input "${CMAKE_CURRENT_BINARY_DIR}/${intl}-input.txt") +set(output "${CMAKE_CURRENT_BINARY_DIR}/${intl}-output.txt") +file(WRITE "${input}" "${intl}\n") +add_custom_command(OUTPUT "${output}" + COMMAND ${CMAKE_COMMAND} -E copy "${input}" "${output}") +add_custom_target(drive ALL DEPENDS "${output}") diff --git a/Tests/RunCMake/Ninja/RunCMakeTest.cmake b/Tests/RunCMake/Ninja/RunCMakeTest.cmake index 9f078e6..44a7ba1 100644 --- a/Tests/RunCMake/Ninja/RunCMakeTest.cmake +++ b/Tests/RunCMake/Ninja/RunCMakeTest.cmake @@ -33,6 +33,15 @@ function(run_NinjaToolMissing) endfunction() run_NinjaToolMissing() +function(run_Intl) + run_cmake(Intl) + set(RunCMake_TEST_NO_CLEAN 1) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Intl-build) + set(RunCMake_TEST_OUTPUT_MERGE 1) + run_cmake_command(Intl-build ${CMAKE_COMMAND} --build .) +endfunction() +run_Intl() + function(run_NoWorkToDo) run_cmake(NoWorkToDo) set(RunCMake_TEST_NO_CLEAN 1) diff --git a/Tests/SwiftMix/CMain.c b/Tests/SwiftMix/CMain.c index 519058e..b274322 100644 --- a/Tests/SwiftMix/CMain.c +++ b/Tests/SwiftMix/CMain.c @@ -1,3 +1,16 @@ +#if !defined(FOO) +# error "FOO not defined" +#endif +#if BAR != 3 +# error "FOO not defined to 3" +#endif +#if CCOND != 2 +# error "CCOND not defined to 2" +#endif +#if defined(SWIFTCOND) +# error "SWIFTCOND defined" +#endif + extern int ObjCMain(void); int main(void) { diff --git a/Tests/SwiftMix/CMakeLists.txt b/Tests/SwiftMix/CMakeLists.txt index 6d8e48b..e8b6521 100644 --- a/Tests/SwiftMix/CMakeLists.txt +++ b/Tests/SwiftMix/CMakeLists.txt @@ -4,3 +4,4 @@ project(SwiftMix C Swift) add_executable(SwiftMix CMain.c ObjCMain.m SwiftMain.swift ObjC-Swift.h) set_property(TARGET SwiftMix PROPERTY XCODE_ATTRIBUTE_SWIFT_OBJC_BRIDGING_HEADER "ObjC-Swift.h") target_compile_options(SwiftMix PRIVATE "$<$<COMPILE_LANGUAGE:C>:-Werror=objc-method-access>") +target_compile_definitions(SwiftMix PRIVATE "$<IF:$<COMPILE_LANGUAGE:Swift>,SWIFTCOND,CCOND=2>" FOO BAR=3) diff --git a/Tests/SwiftMix/SwiftMain.swift b/Tests/SwiftMix/SwiftMain.swift index d9c8cd7..238059d 100644 --- a/Tests/SwiftMix/SwiftMain.swift +++ b/Tests/SwiftMix/SwiftMain.swift @@ -3,6 +3,26 @@ import Foundation @objc class SwiftMainClass : NSObject { @objc class func SwiftMain() -> Int32 { dump("Hello World!"); +#if FOO + dump("FOO defined"); +#else + fatalError("FOO not defined"); +#endif +#if BAR + dump("BAR defined"); +#else + fatalError("BAR not defined"); +#endif +#if CCOND + fatalError("CCOND defined"); +#else + dump("CCOND not defined"); +#endif +#if SWIFTCOND + dump("SWIFTCOND defined"); +#else + fatalError("SWIFTCOND not defined"); +#endif return 0; } } diff --git a/Utilities/Sphinx/cmake.py b/Utilities/Sphinx/cmake.py index c7b1233..47e4909 100644 --- a/Utilities/Sphinx/cmake.py +++ b/Utilities/Sphinx/cmake.py @@ -475,3 +475,4 @@ def setup(app): app.add_transform(CMakeTransform) app.add_transform(CMakeXRefTransform) app.add_domain(CMakeDomain) + return {"parallel_read_safe": True} |
