From 0cff38e715b1631053fe33347b1f632bcdbb2a05 Mon Sep 17 00:00:00 2001 From: - <-> Date: Sun, 5 Jan 2025 18:36:40 +0900 Subject: [PATCH 01/11] Fix nuget reference template for vcxproj. We want VS to find files in build/native/ piror to files in build/ --- Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs | 10 +++++----- Sharpmake.Generators/VisualStudio/Vcxproj.cs | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs b/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs index 010fd33bd..0d90c3cad 100644 --- a/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs +++ b/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs @@ -160,12 +160,12 @@ public static class Project "; // Support both regular and native package types, whichever happens to exist - public static string ProjectTargetsNugetReferenceImport = -@" - + public static string ProjectNugetReferenceTargetsImport = +@" + "; - public static string ProjectTargetsNugetReferenceError = + public static string ProjectNugetReferenceTargetsError = @" "; @@ -174,7 +174,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..aeb0bfa3f 100644 --- a/Sharpmake.Generators/VisualStudio/Vcxproj.cs +++ b/Sharpmake.Generators/VisualStudio/Vcxproj.cs @@ -716,7 +716,7 @@ private void GenerateImpl(GenerationContext context, IList generatedFile // add imports to nuget packages foreach (var package in firstConf.ReferencesByNuGetPackage) { - fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectTargetsNugetReferenceImport)); + fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceTargetsImport)); } fileGenerator.Write(Template.Project.ProjectTargetsEnd); @@ -739,7 +739,7 @@ private void GenerateImpl(GenerationContext context, IList generatedFile foreach (var package in firstConf.ReferencesByNuGetPackage) { - fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectTargetsNugetReferenceError)); + fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceTargetsError)); } fileGenerator.Write(Template.Project.ProjectCustomTargetsEnd); From 3cd5c6459c9ab0616a8b874cf6eece81b1fe4fb0 Mon Sep 17 00:00:00 2001 From: - <-> Date: Sun, 5 Jan 2025 20:34:42 +0900 Subject: [PATCH 02/11] Add xml elements for .props files --- .../VisualStudio/Vcxproj.Template.cs | 11 ++++--- Sharpmake.Generators/VisualStudio/Vcxproj.cs | 32 ++++++++++++++++--- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs b/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs index 0d90c3cad..15847b1ba 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 ProjectNugetReferenceTargetsImport = -@" - + // possible file extension: .targets and .props + public static string ProjectNugetReferenceImport = +@" + "; - public static string ProjectNugetReferenceTargetsError = -@" + public static string ProjectNugetReferenceError = +@" "; public static string ProjectTargetsEnd = diff --git a/Sharpmake.Generators/VisualStudio/Vcxproj.cs b/Sharpmake.Generators/VisualStudio/Vcxproj.cs index aeb0bfa3f..e90827d16 100644 --- a/Sharpmake.Generators/VisualStudio/Vcxproj.cs +++ b/Sharpmake.Generators/VisualStudio/Vcxproj.cs @@ -370,6 +370,20 @@ private void GenerateImpl(GenerationContext context, IList generatedFile fileGenerator.Write(Template.Project.ProjectBegin); } + var firstConf = context.ProjectConfigurations.First(); + + // add .props files imported from nuget packages + // it must be at the top of project files. + // why? https://github.com/NuGet/Home/issues/10125#issuecomment-721400495 + foreach (var package in firstConf.ReferencesByNuGetPackage) + { + using (fileGenerator.Declare("fileExtension", "props")) + { + fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceImport)); + } + } + + VsProjCommon.WriteCustomProperties(context.Project.CustomProperties, fileGenerator); foreach (var platformVcxproj in context.PresentPlatforms.Values) @@ -387,7 +401,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); @@ -713,10 +727,13 @@ private void GenerateImpl(GenerationContext context, IList generatedFile } } - // add imports to nuget packages + // add .targets files imported from nuget packages foreach (var package in firstConf.ReferencesByNuGetPackage) { - fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceTargetsImport)); + using (fileGenerator.Declare("fileExtension", "targets")) + { + fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceImport)); + } } fileGenerator.Write(Template.Project.ProjectTargetsEnd); @@ -739,7 +756,14 @@ private void GenerateImpl(GenerationContext context, IList generatedFile foreach (var package in firstConf.ReferencesByNuGetPackage) { - fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceTargetsError)); + using (fileGenerator.Declare("fileExtension", "targets")) + { + fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceError)); + } + using (fileGenerator.Declare("fileExtension", "props")) + { + fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceError)); + } } fileGenerator.Write(Template.Project.ProjectCustomTargetsEnd); From 5979a815cf366e660aa4578e413e98c14afbfb95 Mon Sep 17 00:00:00 2001 From: - <-> Date: Wed, 15 Jan 2025 22:30:07 +0900 Subject: [PATCH 03/11] 1. Remove .props support 2. Add searching priority for reference files --- .../VisualStudio/Vcxproj.Template.cs | 2 +- Sharpmake.Generators/VisualStudio/Vcxproj.cs | 15 --------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs b/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs index 15847b1ba..530badd5f 100644 --- a/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs +++ b/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs @@ -163,7 +163,7 @@ public static class Project // possible file extension: .targets and .props public static string ProjectNugetReferenceImport = @" - + "; public static string ProjectNugetReferenceError = diff --git a/Sharpmake.Generators/VisualStudio/Vcxproj.cs b/Sharpmake.Generators/VisualStudio/Vcxproj.cs index e90827d16..bd30ec67b 100644 --- a/Sharpmake.Generators/VisualStudio/Vcxproj.cs +++ b/Sharpmake.Generators/VisualStudio/Vcxproj.cs @@ -372,17 +372,6 @@ private void GenerateImpl(GenerationContext context, IList generatedFile var firstConf = context.ProjectConfigurations.First(); - // add .props files imported from nuget packages - // it must be at the top of project files. - // why? https://github.com/NuGet/Home/issues/10125#issuecomment-721400495 - foreach (var package in firstConf.ReferencesByNuGetPackage) - { - using (fileGenerator.Declare("fileExtension", "props")) - { - fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceImport)); - } - } - VsProjCommon.WriteCustomProperties(context.Project.CustomProperties, fileGenerator); @@ -760,10 +749,6 @@ private void GenerateImpl(GenerationContext context, IList generatedFile { fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceError)); } - using (fileGenerator.Declare("fileExtension", "props")) - { - fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceError)); - } } fileGenerator.Write(Template.Project.ProjectCustomTargetsEnd); From 06b6b0533d67aac75ff9a0232f52201d157ab4c7 Mon Sep 17 00:00:00 2001 From: - <-> Date: Thu, 16 Jan 2025 02:16:22 +0900 Subject: [PATCH 04/11] move NuGetPackageMode from CSharpProject to parent Project class --- Sharpmake/Project.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) 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; From c1e438348bb82bc23b74a23e19d64353b46b5606 Mon Sep 17 00:00:00 2001 From: - <-> Date: Thu, 16 Jan 2025 02:20:43 +0900 Subject: [PATCH 05/11] Refactor nuget handling in Vcxproj.cs to generate PackageReference-style includes for C++ project. (requires extra Directory.Build.props hack) --- Sharpmake.Generators/VisualStudio/Vcxproj.cs | 256 +++++++++++++------ 1 file changed, 184 insertions(+), 72 deletions(-) diff --git a/Sharpmake.Generators/VisualStudio/Vcxproj.cs b/Sharpmake.Generators/VisualStudio/Vcxproj.cs index bd30ec67b..f06820fee 100644 --- a/Sharpmake.Generators/VisualStudio/Vcxproj.cs +++ b/Sharpmake.Generators/VisualStudio/Vcxproj.cs @@ -7,6 +7,7 @@ using System.IO; using System.Linq; using Sharpmake.Generators.FastBuild; +using static Sharpmake.DebugBreaks; namespace Sharpmake.Generators.VisualStudio { @@ -372,6 +373,7 @@ private void GenerateImpl(GenerationContext context, IList generatedFile var firstConf = context.ProjectConfigurations.First(); + NuGet nuGet = new NuGet(context.Project.NuGetReferenceType); VsProjCommon.WriteCustomProperties(context.Project.CustomProperties, fileGenerator); @@ -645,7 +647,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) @@ -653,15 +655,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. @@ -669,91 +663,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 .targets files imported from nuget packages - foreach (var package in firstConf.ReferencesByNuGetPackage) - { - using (fileGenerator.Declare("fileExtension", "targets")) - { - fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceImport)); - } - } - 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) - { - using (fileGenerator.Declare("fileExtension", "targets")) - { - fileGenerator.WriteVerbatim(package.Resolve(fileGenerator.Resolver, Template.Project.ProjectNugetReferenceError)); - } - } - 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. @@ -2047,6 +2024,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; From b7c0308de9a49d9d9b9cf45e18f303a0b7b2e53b Mon Sep 17 00:00:00 2001 From: - <-> Date: Thu, 16 Jan 2025 22:55:33 +0900 Subject: [PATCH 06/11] minor fix --- Sharpmake.Generators/VisualStudio/Vcxproj.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Sharpmake.Generators/VisualStudio/Vcxproj.cs b/Sharpmake.Generators/VisualStudio/Vcxproj.cs index f06820fee..e4e51ff8d 100644 --- a/Sharpmake.Generators/VisualStudio/Vcxproj.cs +++ b/Sharpmake.Generators/VisualStudio/Vcxproj.cs @@ -7,7 +7,6 @@ using System.IO; using System.Linq; using Sharpmake.Generators.FastBuild; -using static Sharpmake.DebugBreaks; namespace Sharpmake.Generators.VisualStudio { From e1ac11dae53f8133fec6fdecd53250aee3a67cf0 Mon Sep 17 00:00:00 2001 From: - <-> Date: Sat, 15 Feb 2025 13:07:49 +0900 Subject: [PATCH 07/11] Sync reference files for CI failure --- .../cpppackagereferences.vs2019.v4_7_2.vcxproj | 4 ++-- .../cpppackagereferences.vs2022.v4_7_2.vcxproj | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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..9cd4e2a62 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..96bb0a869 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}. From b55d865b978cf87ea68871df3279d1d0215f3d53 Mon Sep 17 00:00:00 2001 From: - <-> Date: Sat, 15 Feb 2025 13:11:09 +0900 Subject: [PATCH 08/11] Add new sample CPPForcePackageReference --- .../CPPForcePackageReference.sharpmake.cs | 79 +++++++++++++++++++ .../codebase/Directory.Build.props | 18 +++++ .../codebase/main.cpp | 37 +++++++++ samples/Properties/launchSettings.json | 6 ++ 4 files changed, 140 insertions(+) create mode 100644 samples/CPPForcePackageReference/CPPForcePackageReference.sharpmake.cs create mode 100644 samples/CPPForcePackageReference/codebase/Directory.Build.props create mode 100644 samples/CPPForcePackageReference/codebase/main.cpp 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/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", From 818bcf23d4529b2082ca471bda90217b8925635f Mon Sep 17 00:00:00 2001 From: - <-> Date: Sat, 15 Feb 2025 13:41:31 +0900 Subject: [PATCH 09/11] Add reference files --- .../cppforcepackagereference_vs2022_win64.sln | 19 ++ ...forcepackagereference_vs2022_win64.vcxproj | 237 ++++++++++++++++++ ...kagereference_vs2022_win64.vcxproj.filters | 6 + 3 files changed, 262 insertions(+) create mode 100644 samples/CPPForcePackageReference/reference/projects/cppforcepackagereference_vs2022_win64.sln create mode 100644 samples/CPPForcePackageReference/reference/projects/cppforcepackagereference_vs2022_win64.vcxproj create mode 100644 samples/CPPForcePackageReference/reference/projects/cppforcepackagereference_vs2022_win64.vcxproj.filters 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 From 891f310fbb14752f447a0a9866c33a4331d0b526 Mon Sep 17 00:00:00 2001 From: - <-> Date: Sat, 15 Feb 2025 13:41:57 +0900 Subject: [PATCH 10/11] Update SamplesDef.json --- SamplesDef.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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" ], From c567c4c11deae5d8c1690fa69301b8f956b9a7ce Mon Sep 17 00:00:00 2001 From: - <-> Date: Sat, 22 Feb 2025 22:17:51 +0900 Subject: [PATCH 11/11] run UpdateSamplesOutput.bat --- .../cpppackagereferences.vs2019.v4_7_2.vcxproj | 2 +- .../cpppackagereferences.vs2022.v4_7_2.vcxproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 9cd4e2a62..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,8 +233,8 @@ - + 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 96bb0a869..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,8 +233,8 @@ - +