Presets: add resolve packages setting to build presets.

This commit is contained in:
Carsten Rudolph 2022-01-22 10:12:25 +01:00 committed by Brad King
parent b2f8f0bb87
commit 9aa7831f05
11 changed files with 160 additions and 4 deletions

View File

@ -475,6 +475,42 @@ that may contain the following fields:
An optional bool. If true, equivalent to passing ``--clean-first`` on
the command line.
``resolvePackageReferences``
An optional string that specifies the package resolve mode. This is
allowed in preset files specifying version ``4`` or above.
This field overwrites the ``--resolve-package-references`` command line
parameter. If there are no targets that define package references, this
option does nothing. Valid values are:
``on``
Causes package references to be resolved before attempting a build.
``off``
Package references will not be resolved. Note that this may cause
errors in some build environments, such as .NET SDK style projects.
``only``
Only resolve package references, but do not perform a build.
.. note::
If this setting is not specified in a preset, CMake will instead
use the setting specified by the ``--resolve-package-references``
command line parameter. If the command line parameter is not
provided either, an environment-specific cache variable will be
evaluated to decide, if package restoration should be performed.
When using the Visual Studio generator, package references are
defined using the :prop_tgt:`VS_PACKAGE_REFERENCES` property.
Package references are restored using NuGet. It can be disabled
by setting the ``CMAKE_VS_NUGET_PACKAGE_RESTORE`` variable to
``OFF``. This can also be done from within a configure preset.
``verbose``
An optional bool. If true, equivalent to passing ``--verbose`` on the

View File

@ -474,6 +474,19 @@ following options:
If the target does not define any package references, this option does
nothing.
This setting can be specified in a build preset (using
``resolvePackageReferences``). In this case, the command line option will
be ignored.
If the no command line parameter or preset option is not provided, an
environment-specific cache variable will be evaluated to decide, if package
restoration should be performed.
When using the Visual Studio generator, package references are defined
using the :prop_tgt:`VS_PACKAGE_REFERENCES` property. Package references
are restored using NuGet. It can be disabled by setting the
``CMAKE_VS_NUGET_PACKAGE_RESTORE`` variable to ``OFF``.
``--use-stderr``
Ignored. Behavior is default in CMake >= 3.0.

View File

@ -52,7 +52,7 @@
"cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired"},
"vendor": { "$ref": "#/definitions/vendor" },
"configurePresets": { "$ref": "#/definitions/configurePresetsV3"},
"buildPresets": { "$ref": "#/definitions/buildPresetsV3"},
"buildPresets": { "$ref": "#/definitions/buildPresetsV4"},
"testPresets": { "$ref": "#/definitions/testPresetsV3"},
"include": { "$ref": "#/definitions/include"}
},
@ -427,6 +427,22 @@
"additionalProperties": false
}
},
"buildPresetsItemsV4": {
"type": "array",
"description": "An optional array of build preset objects. Used to specify arguments to cmake --build. Available in version 4 and higher.",
"items": {
"type": "object",
"properties": {
"resolvePackageReferences": {
"type": "string",
"description": "An optional string specifying the package resolve behavior. Valid values are \"on\" (packages are resolved prior to the build), \"off\" (packages are not resolved prior to the build), and \"only\" (packages are resolved, but no build will be performed).",
"enum": [
"on", "off", "only"
]
}
}
}
},
"buildPresetsItemsV3": {
"type": "array",
"description": "An optional array of build preset objects. Used to specify arguments to cmake --build. Available in version 3 and higher.",
@ -558,6 +574,41 @@
]
}
},
"buildPresetsV4": {
"type": "array",
"description": "An optional array of build preset objects. Used to specify arguments to cmake --build. Available in version 4 and higher.",
"allOf": [
{ "$ref": "#/definitions/buildPresetsItemsV4" },
{ "$ref": "#/definitions/buildPresetsItemsV3" },
{ "$ref": "#/definitions/buildPresetsItemsV2" }
],
"items": {
"type": "object",
"properties": {
"name": {},
"hidden": {},
"inherits": {},
"configurePreset": {},
"vendor": {},
"displayName": {},
"description": {},
"inheritConfigureEnvironment": {},
"environment": {},
"jobs": {},
"targets": {},
"configuration": {},
"cleanFirst": {},
"resolvePackageReferences": {},
"verbose": {},
"nativeToolOptions": {},
"condition": {}
},
"required": [
"name"
],
"additionalProperties": false
}
},
"buildPresetsV3": {
"type": "array",
"description": "An optional array of build preset objects. Used to specify arguments to cmake --build. Available in version 3 and higher.",

View File

@ -8,3 +8,6 @@ vs-package-restore
* :manual:`cmake(1)` gained the ``--resolve-package-references=<on|off|only>``
command-line option to control automatic package restoration.
* :manual:`cmake-presets(7)` gained support for specifying the
``resolvePackageReferences`` command line option in a build preset.

View File

@ -724,6 +724,9 @@ cmCMakePresetsGraph::BuildPreset::VisitPresetInherit(
InheritOptionalValue(preset.CleanFirst, parent.CleanFirst);
InheritOptionalValue(preset.Verbose, parent.Verbose);
InheritVector(preset.NativeToolOptions, parent.NativeToolOptions);
if (!preset.ResolvePackageReferences) {
preset.ResolvePackageReferences = parent.ResolvePackageReferences;
}
return ReadFileResult::READ_OK;
}

View File

@ -14,6 +14,8 @@
#include <cm/optional>
enum class PackageResolveMode;
class cmCMakePresetsGraph
{
public:
@ -182,6 +184,7 @@ public:
cm::optional<bool> CleanFirst;
cm::optional<bool> Verbose;
std::vector<std::string> NativeToolOptions;
cm::optional<PackageResolveMode> ResolvePackageReferences;
ReadFileResult VisitPresetInherit(const Preset& parent) override;
ReadFileResult VisitPresetAfterInherit(int /* version */) override;

View File

@ -12,6 +12,7 @@
#include <cm3p/json/value.h>
#include "cmBuildOptions.h"
#include "cmCMakePresetsGraph.h"
#include "cmCMakePresetsGraphInternal.h"
#include "cmJSONHelpers.h"
@ -20,6 +21,37 @@ namespace {
using ReadFileResult = cmCMakePresetsGraph::ReadFileResult;
using BuildPreset = cmCMakePresetsGraph::BuildPreset;
ReadFileResult PackageResolveModeHelper(cm::optional<PackageResolveMode>& out,
const Json::Value* value)
{
if (!value) {
out = cm::nullopt;
return ReadFileResult::READ_OK;
}
if (!value->isString()) {
return ReadFileResult::INVALID_PRESET;
}
if (value->asString() == "on") {
out = PackageResolveMode::Force;
} else if (value->asString() == "off") {
out = PackageResolveMode::Disable;
} else if (value->asString() == "only") {
out = PackageResolveMode::OnlyResolve;
} else {
return ReadFileResult::INVALID_PRESET;
}
return ReadFileResult::READ_OK;
}
std::function<ReadFileResult(BuildPreset&, const Json::Value*)> const
ResolvePackageReferencesHelper =
[](BuildPreset& out, const Json::Value* value) -> ReadFileResult {
return PackageResolveModeHelper(out.ResolvePackageReferences, value);
};
auto const BuildPresetHelper =
cmJSONObjectHelper<BuildPreset, ReadFileResult>(
ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
@ -59,7 +91,8 @@ auto const BuildPresetHelper =
.Bind("nativeToolOptions"_s, &BuildPreset::NativeToolOptions,
cmCMakePresetsGraphInternal::PresetVectorStringHelper, false)
.Bind("condition"_s, &BuildPreset::ConditionEvaluator,
cmCMakePresetsGraphInternal::PresetConditionHelper, false);
cmCMakePresetsGraphInternal::PresetConditionHelper, false)
.Bind("resolvePackageReferences"_s, ResolvePackageReferencesHelper, false);
}
namespace cmCMakePresetsGraphInternal {

View File

@ -724,6 +724,10 @@ void cmGlobalVisualStudio10Generator::Generate()
/* clang-format on */
lg->IssueMessage(MessageType::WARNING, e.str());
}
if (cmValue cached = this->CMakeInstance->GetState()->GetCacheEntryValue(
"CMAKE_VS_NUGET_PACKAGE_RESTORE")) {
this->CMakeInstance->MarkCliAsUsed("CMAKE_VS_NUGET_PACKAGE_RESTORE");
}
}
void cmGlobalVisualStudio10Generator::EnableLanguage(

View File

@ -3331,6 +3331,10 @@ int cmake::Build(int jobs, std::string dir, std::vector<std::string> targets,
buildOptions.Clean = *expandedPreset->CleanFirst;
}
if (expandedPreset->ResolvePackageReferences) {
buildOptions.ResolveMode = *expandedPreset->ResolvePackageReferences;
}
if (!verbose && expandedPreset->Verbose) {
verbose = *expandedPreset->Verbose;
}

View File

@ -1,5 +1,5 @@
{
"version": 2,
"version": 4,
"configurePresets": [
{
"name": "default",
@ -78,6 +78,12 @@
"name": "singleTarget",
"inherits": "build-default",
"targets": "good"
},
{
"name": "initResolve",
"inherits": "build-default",
"targets": "good",
"resolvePackageReferences": "off"
}
]
}

View File

@ -70,7 +70,7 @@ else()
set(Good_json_jobs [["jobs": 0,]])
endif()
run_cmake_build_presets(Good "default;other" "build-other;withEnvironment;noEnvironment;macros;vendorObject;singleTarget")
run_cmake_build_presets(Good "default;other" "build-other;withEnvironment;noEnvironment;macros;vendorObject;singleTarget;initResolve")
run_cmake_build_presets(InvalidConfigurePreset "default" "badConfigurePreset")
run_cmake_build_presets(Condition "default" "enabled;disabled")