diff --git a/SamplesDef.json b/SamplesDef.json
index ca806929e..5de8b708e 100644
--- a/SamplesDef.json
+++ b/SamplesDef.json
@@ -47,6 +47,21 @@
"./{testFolder}/projects/output/vs2019/v4_7_2/{configuration}/TestCSharpConsole.exe"
]
},
+ {
+ "Name": "CPPForcePackageReference",
+ "CIs": [ "github", "gitlab" ],
+ "OSs": [ "windows-2022" ],
+ "Frameworks": [ "net6.0" ],
+ "Configurations": [ "debug", "release" ],
+ "TestFolder": "samples/CPPForcePackageReference",
+ "Commands":
+ [
+ "./RunSharpmake.ps1 -workingDirectory {testFolder} -sharpmakeFile \"CPPForcePackageReference.sharpmake.cs\" -framework {framework}",
+ "./RunProcess.ps1 -exeToRun msbuild -workingDirectory \"{testFolder}/projects\" -arguments \"-t:restore CPPForcePackageReference_{VsVersionSuffix}_win64.sln\"",
+ "./Compile.ps1 -slnOrPrjFile \"CPPForcePackageReference_{VsVersionSuffix}_win64.sln\" -configuration {configuration} -platform \"x64\" -WorkingDirectory \"{testFolder}/projects\" -VsVersion {os} -compiler MsBuild",
+ "&'./{testFolder}/projects/output/win64/{configuration}/cppforcepackagereference.exe'"
+ ]
+ },
{
"Name": "CSharpHelloWorld_old_Frameworks",
"CIs": [ "github", "gitlab" ],
diff --git a/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs b/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs
index 010fd33bd..530badd5f 100644
--- a/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs
+++ b/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs
@@ -160,13 +160,14 @@ public static class Project
";
// Support both regular and native package types, whichever happens to exist
- public static string ProjectTargetsNugetReferenceImport =
-@"
-
+ // possible file extension: .targets and .props
+ public static string ProjectNugetReferenceImport =
+@"
+
";
- public static string ProjectTargetsNugetReferenceError =
-@"
+ public static string ProjectNugetReferenceError =
+@"
";
public static string ProjectTargetsEnd =
@@ -174,7 +175,7 @@ public static class Project
";
public static string ProjectCustomTargetsBegin =
-@"
+@"
";
public static string ProjectCustomTargetsEnd =
diff --git a/Sharpmake.Generators/VisualStudio/Vcxproj.cs b/Sharpmake.Generators/VisualStudio/Vcxproj.cs
index c80f4d9f8..e4e51ff8d 100644
--- a/Sharpmake.Generators/VisualStudio/Vcxproj.cs
+++ b/Sharpmake.Generators/VisualStudio/Vcxproj.cs
@@ -370,6 +370,10 @@ private void GenerateImpl(GenerationContext context, IList generatedFile
fileGenerator.Write(Template.Project.ProjectBegin);
}
+ var firstConf = context.ProjectConfigurations.First();
+
+ NuGet nuGet = new NuGet(context.Project.NuGetReferenceType);
+
VsProjCommon.WriteCustomProperties(context.Project.CustomProperties, fileGenerator);
foreach (var platformVcxproj in context.PresentPlatforms.Values)
@@ -387,7 +391,7 @@ private void GenerateImpl(GenerationContext context, IList generatedFile
hasNonFastBuildConfig = true;
}
- var firstConf = context.ProjectConfigurations.First();
+
//checking only the first one, having one with CLR support and others without would be an error
bool clrSupport = Util.IsDotNet(firstConf);
@@ -642,7 +646,7 @@ private void GenerateImpl(GenerationContext context, IList generatedFile
else if (hasFastBuildConfig)
GenerateBffFilesSection(context, fileGenerator);
- // Generate and add reference to packages.config file for project
+ // Generate and add reference to packages.config file for project (if using packages.config mode)
if (firstConf.ReferencesByNuGetPackage.Count > 0)
{
if (hasFastBuildConfig)
@@ -650,15 +654,7 @@ private void GenerateImpl(GenerationContext context, IList generatedFile
throw new NotImplementedException("Nuget packages in c++ is not currently supported by FastBuild");
}
- var packagesConfig = new PackagesConfig();
- packagesConfig.Generate(context.Builder, firstConf, "native", context.ProjectDirectory, generatedFiles, skipFiles);
- if (packagesConfig.IsGenerated)
- {
- fileGenerator.Write(Template.Project.ProjectFilesBegin);
- using (fileGenerator.Declare("file", new ProjectFile(context, Util.SimplifyPath(packagesConfig.PackagesConfigPath))))
- fileGenerator.Write(Template.Project.ProjectFilesNone);
- fileGenerator.Write(Template.Project.ProjectFilesEnd);
- }
+ nuGet.TryGeneratePackagesConfig(firstConf, context, fileGenerator, generatedFiles, skipFiles);
}
// Import platform makefiles.
@@ -666,85 +662,74 @@ private void GenerateImpl(GenerationContext context, IList generatedFile
platform.GenerateMakefileConfigurationVcxproj(context, fileGenerator);
// .targets files
- fileGenerator.Write(Template.Project.ProjectTargetsBegin);
- if (context.Project.ContainsASM)
{
- fileGenerator.Write(Template.Project.ProjectMasmTargetsItem);
- }
- if (context.Project.ContainsNASM)
- {
- if (context.Project.NasmExePath.Length == 0)
+ fileGenerator.Write(Template.Project.ProjectTargetsBegin);
+ if (context.Project.ContainsASM)
{
- throw new ArgumentNullException("NasmExePath not set and needed for NASM assembly files.");
+ fileGenerator.Write(Template.Project.ProjectMasmTargetsItem);
}
- using (fileGenerator.Declare("importedNasmTargetsFile", context.Project.NasmTargetsFile))
+ if (context.Project.ContainsNASM)
{
- fileGenerator.Write(Template.Project.ProjectNasmTargetsItem);
+ if (context.Project.NasmExePath.Length == 0)
+ {
+ throw new ArgumentNullException("NasmExePath not set and needed for NASM assembly files.");
+ }
+ using (fileGenerator.Declare("importedNasmTargetsFile", context.Project.NasmTargetsFile))
+ {
+ fileGenerator.Write(Template.Project.ProjectNasmTargetsItem);
+ }
}
- }
- foreach (string targetsFiles in context.Project.CustomTargetsFiles)
- {
- string capitalizedFile = Project.GetCapitalizedFile(targetsFiles) ?? targetsFiles;
-
- string relativeFile = Util.PathGetRelative(context.ProjectDirectoryCapitalized, capitalizedFile);
- using (fileGenerator.Declare("importedTargetsFile", relativeFile))
+ foreach (string targetsFiles in context.Project.CustomTargetsFiles)
{
- fileGenerator.Write(Template.Project.ProjectTargetsItem);
+ string capitalizedFile = Project.GetCapitalizedFile(targetsFiles) ?? targetsFiles;
+
+ string relativeFile = Util.PathGetRelative(context.ProjectDirectoryCapitalized, capitalizedFile);
+ using (fileGenerator.Declare("importedTargetsFile", relativeFile))
+ {
+ fileGenerator.Write(Template.Project.ProjectTargetsItem);
+ }
}
- }
- // configuration .targets files
- foreach (Project.Configuration conf in context.ProjectConfigurations)
- {
- using (fileGenerator.Declare("platformName", Util.GetToolchainPlatformString(conf.Platform, conf.Project, conf.Target)))
- using (fileGenerator.Declare("conf", conf))
+ // configuration .targets files
+ foreach (Project.Configuration conf in context.ProjectConfigurations)
{
- foreach (string targetsFile in conf.CustomTargetsFiles)
+ using (fileGenerator.Declare("platformName", Util.GetToolchainPlatformString(conf.Platform, conf.Project, conf.Target)))
+ using (fileGenerator.Declare("conf", conf))
{
- string capitalizedFile = Project.GetCapitalizedFile(targetsFile) ?? targetsFile;
-
- string relativeFile = Util.PathGetRelative(context.ProjectDirectoryCapitalized, capitalizedFile);
- using (fileGenerator.Declare("importedTargetsFile", relativeFile))
+ foreach (string targetsFile in conf.CustomTargetsFiles)
{
- fileGenerator.Write(Template.Project.ProjectConfigurationImportedTargets);
+ string capitalizedFile = Project.GetCapitalizedFile(targetsFile) ?? targetsFile;
+
+ string relativeFile = Util.PathGetRelative(context.ProjectDirectoryCapitalized, capitalizedFile);
+ using (fileGenerator.Declare("importedTargetsFile", relativeFile))
+ {
+ fileGenerator.Write(Template.Project.ProjectConfigurationImportedTargets);
+ }
}
}
}
- }
- // add imports to nuget packages
- foreach (var package in firstConf.ReferencesByNuGetPackage)
- {
- fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectTargetsNugetReferenceImport));
- }
- fileGenerator.Write(Template.Project.ProjectTargetsEnd);
+ // add .targets files imported from nuget packages (if using packages.config mode)
+ nuGet.TryGenerateImport(NuGet.ImportFileExtension.Targets, firstConf, fileGenerator);
+
+ fileGenerator.Write(Template.Project.ProjectTargetsEnd);
+ } // .targets files done
- // add error checks for nuget package targets files
+ // add error checks for nuget package targets files (if using packages.config mode)
if (firstConf.ReferencesByNuGetPackage.Count > 0)
{
- using (fileGenerator.Declare("targetName", "EnsureNuGetPackageBuildImports"))
- using (fileGenerator.Declare("beforeTargets", "PrepareForBuild"))
- {
- fileGenerator.Write(Template.Project.ProjectCustomTargetsBegin);
- }
-
- fileGenerator.Write(Template.Project.PropertyGroupStart);
- using (fileGenerator.Declare("custompropertyname", "ErrorText"))
- using (fileGenerator.Declare("custompropertyvalue", "This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}."))
- {
- fileGenerator.Write(Template.Project.CustomProperty);
- }
- fileGenerator.Write(Template.Project.PropertyGroupEnd);
+ nuGet.TryGenerateImportErrorCheck(NuGet.ImportFileExtension.Targets, firstConf, fileGenerator);
+ }
- foreach (var package in firstConf.ReferencesByNuGetPackage)
- {
- fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectTargetsNugetReferenceError));
- }
- fileGenerator.Write(Template.Project.ProjectCustomTargetsEnd);
+ // Instead trying add nuget package reference in modern way (if using PackageReference mode)
+ if (firstConf.ReferencesByNuGetPackage.Count > 0)
+ {
+ nuGet.TryGeneratePackageReferences(firstConf, fileGenerator);
}
+
// in case we are using fast build we do not want to write most dependencies
// in the vcxproj because they are handled internally in the bff.
// Nevertheless, non-fastbuild dependencies (such as C# projects) must be written.
@@ -2038,6 +2023,141 @@ IList skipFiles
}
}
+
+ private class NuGet
+ {
+ public enum ImportFileExtension
+ {
+ Targets,
+ Props,
+ }
+
+ private static string ToString(ImportFileExtension fileExt) => fileExt switch
+ {
+ ImportFileExtension.Targets => "targets",
+ ImportFileExtension.Props => "props",
+ _ => throw new ArgumentOutOfRangeException(nameof(fileExt), fileExt, null)
+ };
+
+ private Project.NuGetPackageMode NuGetReferenceType { get; set; }
+
+ // VersionDefault fallback to packages,config (for now)
+ private bool shouldUsePackagesConfig => NuGetReferenceType == Project.NuGetPackageMode.PackageConfig
+ || (NuGetReferenceType == Project.NuGetPackageMode.VersionDefault);
+
+ public NuGet(Project.NuGetPackageMode mode = Project.NuGetPackageMode.VersionDefault)
+ {
+ if (NuGetReferenceType == Project.NuGetPackageMode.ProjectJson)
+ {
+ throw new NotImplementedException($"NuGet Package reference by {NuGetReferenceType.ToString()} files is not implemented for vcxproj");
+ }
+
+ NuGetReferenceType = mode;
+ }
+
+ #region For packages.config
+
+ // packages.config: old default implementation for vcxproj
+ // (yet it's still a broken implementation as it only handles .target files, and
+ // TODO: 1. .props files are not considered (and they must be put at the beginning of vcxproj)
+ // TODO: 2. other than build/ and build/native folder, irregular paths to .targets and .props files could not be access correctly
+ // )
+ public void TryGeneratePackagesConfig(
+ Project.Configuration firstConfiguration,
+ IVcxprojGenerationContext context,
+ IFileGenerator fileGenerator,
+ IList generatedFiles,
+ IList skipFiles)
+ {
+ if (!shouldUsePackagesConfig)
+ return;
+
+ var packagesConfig = new PackagesConfig();
+ packagesConfig.Generate(context.Builder, firstConfiguration, "native", context.ProjectDirectory, generatedFiles, skipFiles);
+ if (packagesConfig.IsGenerated)
+ {
+ fileGenerator.Write(Template.Project.ProjectFilesBegin);
+ using (fileGenerator.Declare("file", new ProjectFile(context, Util.SimplifyPath(packagesConfig.PackagesConfigPath))))
+ fileGenerator.Write(Template.Project.ProjectFilesNone);
+ fileGenerator.Write(Template.Project.ProjectFilesEnd);
+ }
+ }
+
+ public void TryGenerateImport(ImportFileExtension fileExtension, Project.Configuration firstConfiguration, IFileGenerator fileGenerator)
+ {
+ if (!shouldUsePackagesConfig)
+ return;
+
+ foreach (var package in firstConfiguration.ReferencesByNuGetPackage)
+ {
+ using (fileGenerator.Declare("fileExtension", ToString(fileExtension)))
+ {
+ fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceImport));
+ }
+ }
+ }
+
+ public void TryGenerateImportErrorCheck(ImportFileExtension fileExtension, Project.Configuration firstConfiguration, IFileGenerator fileGenerator)
+ {
+ if (!shouldUsePackagesConfig)
+ return;
+
+ using (fileGenerator.Declare("targetName", "EnsureNuGetPackageBuildImports"))
+ using (fileGenerator.Declare("beforeTargets", "PrepareForBuild"))
+ {
+ fileGenerator.Write(Template.Project.ProjectCustomTargetsBegin);
+ }
+
+ fileGenerator.Write(Template.Project.PropertyGroupStart);
+ using (fileGenerator.Declare("custompropertyname", "ErrorText"))
+ using (fileGenerator.Declare("custompropertyvalue", "This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}."))
+ {
+ fileGenerator.Write(Template.Project.CustomProperty);
+ }
+ fileGenerator.Write(Template.Project.PropertyGroupEnd);
+
+ foreach (var package in firstConfiguration.ReferencesByNuGetPackage)
+ {
+ using (fileGenerator.Declare("fileExtension", ToString(fileExtension)))
+ {
+ fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceError));
+ }
+ }
+
+ fileGenerator.Write(Template.Project.ProjectCustomTargetsEnd);
+ }
+ #endregion
+
+ #region For PackageReference
+ public void TryGeneratePackageReferences(
+ Project.Configuration firstConfiguration,
+ IFileGenerator fileGenerator)
+ {
+ var devenv = firstConfiguration.Target.GetFragment();
+
+ // package reference: by hacking in vs2017+
+ // only if manually chosen (for now)
+ if (NuGetReferenceType == Project.NuGetPackageMode.PackageReference && devenv >= DevEnv.vs2017)
+ {
+ if (devenv < DevEnv.vs2017)
+ throw new Error("Package references are not supported on Visual Studio versions below vs2017");
+
+ var resolver = new Resolver();
+ fileGenerator.Write(Template.Project.ItemGroupBegin);
+ foreach (var package in firstConfiguration.ReferencesByNuGetPackage)
+ {
+ fileGenerator.WriteVerbatim(package.Resolve(resolver));
+ }
+ fileGenerator.Write(Template.Project.ItemGroupEnd);
+
+ // TODO: remove packages.config file if existed ?
+ }
+ }
+ #endregion
+
+ }
+
+
public class ProjectFile
{
public string FileName;
diff --git a/Sharpmake/Project.cs b/Sharpmake/Project.cs
index d143cea3d..da168f94f 100644
--- a/Sharpmake/Project.cs
+++ b/Sharpmake/Project.cs
@@ -84,6 +84,14 @@ public string RootPath
set { SetProperty(ref _rootPath, value); }
}
+
+ private NuGetPackageMode _nuGetReferenceType = NuGetPackageMode.VersionDefault; // Determines the type of NuGet references generated for this project
+ public NuGetPackageMode NuGetReferenceType
+ {
+ get { return _nuGetReferenceType; }
+ set { SetProperty(ref _nuGetReferenceType, value); }
+ }
+
private DependenciesCopyLocalTypes _dependenciesCopyLocal = DependenciesCopyLocalTypes.Default; //used primarily for the .Net Framework
public DependenciesCopyLocalTypes DependenciesCopyLocal
{
@@ -2395,9 +2403,6 @@ public class CSharpProject : Project
public GeneratedAssemblyConfig GeneratedAssemblyConfig = new GeneratedAssemblyConfig();
- // Determines the type of NuGet references generated for this project
- public NuGetPackageMode NuGetReferenceType = NuGetPackageMode.VersionDefault;
-
public Options.CSharp.RunPostBuildEvent RunPostBuildEvent = Options.CSharp.RunPostBuildEvent.OnBuildSuccess;
public string CodeAnalysisRuleSetFileName;
diff --git a/samples/CPPForcePackageReference/CPPForcePackageReference.sharpmake.cs b/samples/CPPForcePackageReference/CPPForcePackageReference.sharpmake.cs
new file mode 100644
index 000000000..439248648
--- /dev/null
+++ b/samples/CPPForcePackageReference/CPPForcePackageReference.sharpmake.cs
@@ -0,0 +1,79 @@
+using System.IO;
+using Sharpmake;
+
+namespace CPPForcePackageReference
+{
+ [Generate]
+ public class CPPForcePackageReference : Project
+ {
+ public CPPForcePackageReference()
+ {
+ Name = "CPPForcePackageReference";
+
+ AddTargets(new Target(
+ Platform.win64,
+ DevEnv.vs2022,
+ Optimization.Debug | Optimization.Release
+ ));
+
+ SourceRootPath = @"[project.SharpmakeCsPath]\codebase";
+ NuGetReferenceType = NuGetPackageMode.PackageReference; // explicitly specify PackageReference for this cpp project
+ }
+
+ [Configure]
+ public void ConfigureAll(Configuration conf, Target target)
+ {
+ conf.ProjectFileName = "[project.Name]_[target.DevEnv]_[target.Platform]";
+ conf.ProjectPath = @"[project.SharpmakeCsPath]\projects";
+ conf.Options.Add(Options.Vc.Compiler.Exceptions.Enable);
+
+ // copy Directory.Build.props that forces the Nuget PackageReference feature for cpp project to be enabled
+ string directoryBuildPropsName = "Directory.Build.props";
+ DirectoryInfo srcPath = new DirectoryInfo(@$"{SharpmakeCsPath}\codebase\"); // SourceRootPath + ..
+ DirectoryInfo destPath = new DirectoryInfo(@$"{SharpmakeCsPath}\projects\"); // conf.ProjectPath + ..
+ if (!destPath.Exists)
+ {
+ destPath.Create();
+ }
+ Util.ForceCopy(Path.Combine(srcPath.FullName, directoryBuildPropsName), Path.Combine(destPath.FullName, directoryBuildPropsName));
+
+ // cpp source code uses nlohmann.json, we specify another nuget package that depends on nlohmann.json
+ // to test if nuget could correctly restore the dependency
+ conf.ReferencesByNuGetPackage.Add("SiddiqSoft.sip2json", "1.17.3");
+ }
+ }
+
+ [Generate]
+ public class CPPForcePackageReferenceSolution : Sharpmake.Solution
+ {
+ public CPPForcePackageReferenceSolution()
+ {
+ Name = "CPPForcePackageReference";
+
+ AddTargets(new Target(
+ Platform.win64,
+ DevEnv.vs2022,
+ Optimization.Debug | Optimization.Release
+ ));
+ }
+
+ [Configure()]
+ public void ConfigureAll(Configuration conf, Target target)
+ {
+ conf.SolutionFileName = "[solution.Name]_[target.DevEnv]_[target.Platform]";
+ conf.SolutionPath = @"[solution.SharpmakeCsPath]\projects";
+ conf.AddProject(target);
+
+ }
+ }
+
+ public static class Main
+ {
+ [Sharpmake.Main]
+ public static void SharpmakeMain(Sharpmake.Arguments arguments)
+ {
+ KitsRootPaths.SetUseKitsRootForDevEnv(DevEnv.vs2022, KitsRootEnum.KitsRoot10, Options.Vc.General.WindowsTargetPlatformVersion.v10_0_19041_0);
+ arguments.Generate();
+ }
+ }
+}
diff --git a/samples/CPPForcePackageReference/codebase/Directory.Build.props b/samples/CPPForcePackageReference/codebase/Directory.Build.props
new file mode 100644
index 000000000..cc2b35fd6
--- /dev/null
+++ b/samples/CPPForcePackageReference/codebase/Directory.Build.props
@@ -0,0 +1,18 @@
+
+
+
+
+ native,Version=v0.0
+
+
+
+
+
+
+
+
+ obj\$(MSBuildProjectName)\
+
+
+
+
diff --git a/samples/CPPForcePackageReference/codebase/main.cpp b/samples/CPPForcePackageReference/codebase/main.cpp
new file mode 100644
index 000000000..eae3421a4
--- /dev/null
+++ b/samples/CPPForcePackageReference/codebase/main.cpp
@@ -0,0 +1,37 @@
+#include
+#include
+using json = nlohmann::json;
+
+
+int main(int, char**)
+{
+ std::cout << "I was built in "
+
+#if _DEBUG
+ "Debug"
+#endif
+
+#if NDEBUG
+ "Release"
+#endif
+
+#if _WIN64
+ " x64"
+#else
+ " x86"
+#endif
+
+ << std::endl;
+
+
+ json j = {
+ {"happy", true},
+ {"pi", 3.141},
+ };
+
+ for (auto& element : j) {
+ std::cout << element << '\n';
+ }
+
+ return 0;
+}
diff --git a/samples/CPPForcePackageReference/reference/projects/cppforcepackagereference_vs2022_win64.sln b/samples/CPPForcePackageReference/reference/projects/cppforcepackagereference_vs2022_win64.sln
new file mode 100644
index 000000000..12cfbe655
--- /dev/null
+++ b/samples/CPPForcePackageReference/reference/projects/cppforcepackagereference_vs2022_win64.sln
@@ -0,0 +1,19 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CPPForcePackageReference", "cppforcepackagereference_vs2022_win64.vcxproj", "{9E635693-40E9-C1A2-3B1D-447B25D6293E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9E635693-40E9-C1A2-3B1D-447B25D6293E}.Debug|x64.ActiveCfg = Debug|x64
+ {9E635693-40E9-C1A2-3B1D-447B25D6293E}.Debug|x64.Build.0 = Debug|x64
+ {9E635693-40E9-C1A2-3B1D-447B25D6293E}.Release|x64.ActiveCfg = Release|x64
+ {9E635693-40E9-C1A2-3B1D-447B25D6293E}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/samples/CPPForcePackageReference/reference/projects/cppforcepackagereference_vs2022_win64.vcxproj b/samples/CPPForcePackageReference/reference/projects/cppforcepackagereference_vs2022_win64.vcxproj
new file mode 100644
index 000000000..d93ef6f2c
--- /dev/null
+++ b/samples/CPPForcePackageReference/reference/projects/cppforcepackagereference_vs2022_win64.vcxproj
@@ -0,0 +1,237 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ {9E635693-40E9-C1A2-3B1D-447B25D6293E}
+ en-US
+ CPPForcePackageReference
+ CPPForcePackageReference
+
+
+ 10.0.19041.0
+
+
+
+ Application
+ true
+ MultiByte
+ false
+ v143
+
+
+ Application
+ false
+ MultiByte
+ false
+ v143
+
+
+
+
+
+
+
+
+
+ cppforcepackagereference
+ output\win64\debug\
+ obj\win64\debug\
+ .exe
+ true
+ false
+ output\win64\debug\cppforcepackagereference.exe
+ false
+
+
+ cppforcepackagereference
+ output\win64\release\
+ obj\win64\release\
+ .exe
+ true
+ false
+ output\win64\release\cppforcepackagereference.exe
+ false
+
+
+
+ NotUsing
+ Level4
+ Disabled
+ WIN64;_CONSOLE;_DEBUG;%(PreprocessorDefinitions);$(PreprocessorDefinitions)
+ ProgramDatabase
+ true
+ false
+ true
+ false
+ OnlyExplicitInline
+ true
+ Neither
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ Sync
+ false
+ Default
+ MultiThreadedDebug
+ Default
+ true
+ false
+ NotSet
+ Fast
+ false
+ false
+ true
+ true
+ false
+ false
+ false
+ NoListing
+ false
+ false
+ Cdecl
+ Default
+ /Zc:__cplusplus
+ obj\win64\debug\cppforcepackagereference_compiler.pdb
+ MultiThreadedDebug
+
+
+ Console
+ true
+ output\win64\debug\cppforcepackagereference.exe
+ NotSet
+ output\win64\debug\cppforcepackagereference.pdb
+ true
+ false
+ false
+ false
+ NotSet
+ false
+ false
+
+
+ Default
+ false
+ 1
+ false
+ false
+ false
+ MachineX64
+ false
+ Default
+ PromptImmediately
+ ;%(AdditionalDependencies)
+ true
+ false
+
+ true
+ output\win64\debug\cppforcepackagereference.map
+
+
+
+
+ NotUsing
+ Level4
+ Full
+ NDEBUG;WIN64;_CONSOLE;%(PreprocessorDefinitions);$(PreprocessorDefinitions)
+ ProgramDatabase
+ true
+ false
+ true
+ false
+ AnySuitable
+ true
+ Speed
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ Sync
+ false
+ Default
+ MultiThreaded
+ Default
+ false
+ true
+ NotSet
+ Fast
+ false
+ false
+ true
+ true
+ false
+ false
+ false
+ NoListing
+ false
+ false
+ Cdecl
+ Default
+ /Zc:__cplusplus
+ obj\win64\release\cppforcepackagereference_compiler.pdb
+ MultiThreaded
+
+
+ Console
+ true
+ output\win64\release\cppforcepackagereference.exe
+ NotSet
+ output\win64\release\cppforcepackagereference.pdb
+ true
+ false
+ false
+ false
+ NotSet
+ true
+ true
+
+
+ Default
+ false
+ 1
+ false
+ false
+ false
+ MachineX64
+ false
+ Default
+ PromptImmediately
+ ;%(AdditionalDependencies)
+ true
+ false
+
+ true
+ output\win64\release\cppforcepackagereference.map
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/CPPForcePackageReference/reference/projects/cppforcepackagereference_vs2022_win64.vcxproj.filters b/samples/CPPForcePackageReference/reference/projects/cppforcepackagereference_vs2022_win64.vcxproj.filters
new file mode 100644
index 000000000..7cb9af5cb
--- /dev/null
+++ b/samples/CPPForcePackageReference/reference/projects/cppforcepackagereference_vs2022_win64.vcxproj.filters
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/PackageReferences/reference/projects/cpppackagereferences/cpppackagereferences.vs2019.v4_7_2.vcxproj b/samples/PackageReferences/reference/projects/cpppackagereferences/cpppackagereferences.vs2019.v4_7_2.vcxproj
index ed3b68e7d..c96e19f3e 100644
--- a/samples/PackageReferences/reference/projects/cpppackagereferences/cpppackagereferences.vs2019.v4_7_2.vcxproj
+++ b/samples/PackageReferences/reference/projects/cpppackagereferences/cpppackagereferences.vs2019.v4_7_2.vcxproj
@@ -233,10 +233,10 @@
-
+
-
+
This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
diff --git a/samples/PackageReferences/reference/projects/cpppackagereferences/cpppackagereferences.vs2022.v4_7_2.vcxproj b/samples/PackageReferences/reference/projects/cpppackagereferences/cpppackagereferences.vs2022.v4_7_2.vcxproj
index 13f383e0d..9638fff78 100644
--- a/samples/PackageReferences/reference/projects/cpppackagereferences/cpppackagereferences.vs2022.v4_7_2.vcxproj
+++ b/samples/PackageReferences/reference/projects/cpppackagereferences/cpppackagereferences.vs2022.v4_7_2.vcxproj
@@ -233,10 +233,10 @@
-
+
-
+
This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
diff --git a/samples/Properties/launchSettings.json b/samples/Properties/launchSettings.json
index 3decf803c..359ec4e0e 100644
--- a/samples/Properties/launchSettings.json
+++ b/samples/Properties/launchSettings.json
@@ -18,6 +18,12 @@
"commandLineArgs": "/sources(@'CLRTest.sharpmake.cs')",
"workingDirectory": "$(ProjectDir)\\CPPCLI"
},
+ "Sample (CPPForcePackageReference)": {
+ "commandName": "Executable",
+ "executablePath": "$(ProjectDir)\\..\\Sharpmake.Application\\bin\\$(Configuration)\\$(TargetFramework)\\Sharpmake.Application.exe",
+ "commandLineArgs": "/sources(@'CPPForcePackageReference.sharpmake.cs')",
+ "workingDirectory": "$(ProjectDir)\\CPPForcePackageReference"
+ },
"Sample (CSharpHelloWorld)": {
"commandName": "Executable",
"executablePath": "$(ProjectDir)\\..\\Sharpmake.Application\\bin\\$(Configuration)\\$(TargetFramework)\\Sharpmake.Application.exe",