From a3da24b3d827dd6bdd56b649391d3028de766f18 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Thu, 23 Jul 2020 17:50:55 +0200 Subject: [PATCH 001/142] Make the version unofficial. --- Sharpmake.Application/Properties/AssemblyInfo.cs | 2 +- Sharpmake.Generators/Properties/AssemblyInfo.cs | 2 +- .../Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs | 2 +- .../Sharpmake.NvShield/Properties/AssemblyInfo.cs | 2 +- Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs | 2 +- Sharpmake/Properties/AssemblyInfo.cs | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Sharpmake.Application/Properties/AssemblyInfo.cs b/Sharpmake.Application/Properties/AssemblyInfo.cs index f6b96b822..fd73ed555 100644 --- a/Sharpmake.Application/Properties/AssemblyInfo.cs +++ b/Sharpmake.Application/Properties/AssemblyInfo.cs @@ -43,4 +43,4 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.14.5.0")] +[assembly: AssemblyVersion("0.14.5.*")] diff --git a/Sharpmake.Generators/Properties/AssemblyInfo.cs b/Sharpmake.Generators/Properties/AssemblyInfo.cs index 44aea2322..317dfcf4d 100644 --- a/Sharpmake.Generators/Properties/AssemblyInfo.cs +++ b/Sharpmake.Generators/Properties/AssemblyInfo.cs @@ -44,6 +44,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.14.5.0")] +[assembly: AssemblyVersion("0.14.5.*")] [assembly: InternalsVisibleTo("Sharpmake")] diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs index 0cef2a604..b6ff8f624 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs @@ -44,6 +44,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.14.5.0")] +[assembly: AssemblyVersion("0.14.5.*")] [assembly: SharpmakeExtension] diff --git a/Sharpmake.Platforms/Sharpmake.NvShield/Properties/AssemblyInfo.cs b/Sharpmake.Platforms/Sharpmake.NvShield/Properties/AssemblyInfo.cs index b3682ea16..06e0066eb 100644 --- a/Sharpmake.Platforms/Sharpmake.NvShield/Properties/AssemblyInfo.cs +++ b/Sharpmake.Platforms/Sharpmake.NvShield/Properties/AssemblyInfo.cs @@ -44,6 +44,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.14.5.0")] +[assembly: AssemblyVersion("0.14.5.*")] [assembly: SharpmakeExtension] diff --git a/Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs b/Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs index c7897309f..6352b7ffc 100644 --- a/Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs +++ b/Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs @@ -44,6 +44,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.14.5.0")] +[assembly: AssemblyVersion("0.14.5.*")] [assembly: SharpmakeExtension] diff --git a/Sharpmake/Properties/AssemblyInfo.cs b/Sharpmake/Properties/AssemblyInfo.cs index bbb5914f6..c9d3bdfe3 100644 --- a/Sharpmake/Properties/AssemblyInfo.cs +++ b/Sharpmake/Properties/AssemblyInfo.cs @@ -44,9 +44,9 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.14.5.0")] +[assembly: AssemblyVersion("0.14.5.*")] #pragma warning disable CS7035 -[assembly: AssemblyFileVersion("0.14.5.0 (LocalBuild)")] +[assembly: AssemblyFileVersion("0.14.5.* (LocalBuild)")] #pragma warning restore [assembly: InternalsVisibleTo("Sharpmake.Application")] From d7004c1eef1c0f8c69c0d3aa3f30b53cdbadbc44 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 12 Oct 2020 16:01:59 +0200 Subject: [PATCH 002/142] Switch to roslyn for sharpmake scripts compilation - Sharpmake now requires vs2019, .net framework 4.7.2, and C#7 to compile - Scripts now support C#7 - The debug solution will now be generated for vs2019 --- .../Sharpmake.Application.csproj | 6 +- .../Sharpmake.Generators.csproj | 6 +- Sharpmake.Main.sharpmake.cs | 4 +- .../Sharpmake.CommonPlatforms.csproj | 6 +- Sharpmake/Assembler.cs | 149 ++++++++++-------- Sharpmake/Builder.cs | 3 + Sharpmake/CommandLine.cs | 2 +- Sharpmake/Configurable.cs | 1 - Sharpmake/DebugProjectGenerator.cs | 6 +- Sharpmake/PreprocessorConditionParser.cs | 2 - Sharpmake/Sharpmake.csproj | 9 +- Sharpmake/Sharpmake.sharpmake.cs | 3 +- Sharpmake/Util.cs | 1 - 13 files changed, 107 insertions(+), 91 deletions(-) diff --git a/Sharpmake.Application/Sharpmake.Application.csproj b/Sharpmake.Application/Sharpmake.Application.csproj index 47895a7e6..7ad30d249 100644 --- a/Sharpmake.Application/Sharpmake.Application.csproj +++ b/Sharpmake.Application/Sharpmake.Application.csproj @@ -9,7 +9,7 @@ Properties Sharpmake.Application Sharpmake.Application - v4.6.1 + v4.7.2 512 True @@ -29,7 +29,7 @@ true 618 false - 6 + 7 AnyCPU @@ -44,7 +44,7 @@ true 618 false - 6 + 7 diff --git a/Sharpmake.Generators/Sharpmake.Generators.csproj b/Sharpmake.Generators/Sharpmake.Generators.csproj index 150ca9da4..5d3187b14 100644 --- a/Sharpmake.Generators/Sharpmake.Generators.csproj +++ b/Sharpmake.Generators/Sharpmake.Generators.csproj @@ -9,7 +9,7 @@ Properties Sharpmake.Generators Sharpmake.Generators - v4.6.1 + v4.7.2 512 @@ -27,7 +27,7 @@ 618 false 1570,1591 - 6 + 7 AnyCPU @@ -44,7 +44,7 @@ 618 false 1570,1591 - 6 + 7 diff --git a/Sharpmake.Main.sharpmake.cs b/Sharpmake.Main.sharpmake.cs index 7a6ccb5db..528cad43b 100644 --- a/Sharpmake.Main.sharpmake.cs +++ b/Sharpmake.Main.sharpmake.cs @@ -31,7 +31,7 @@ public static ITarget[] GetDefaultTargets() Platform.anycpu, DevEnv.vs2017, Optimization.Debug | Optimization.Release, - framework: DotNetFramework.v4_6_1 + framework: DotNetFramework.v4_7_2 ) ); return result.ToArray(); @@ -69,7 +69,7 @@ public virtual void ConfigureAll(Configuration conf, Target target) conf.ReferencesByName.Add("System"); - conf.Options.Add(Options.CSharp.LanguageVersion.CSharp6); + conf.Options.Add(Options.CSharp.LanguageVersion.CSharp7); conf.Options.Add(Options.CSharp.TreatWarningsAsErrors.Enabled); conf.Options.Add( new Options.CSharp.WarningsNotAsErrors( diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj index 2871102a6..52ec23965 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj @@ -9,7 +9,7 @@ Properties Sharpmake Sharpmake.CommonPlatforms - v4.6.1 + v4.7.2 512 @@ -27,7 +27,7 @@ 618 false 1570,1591 - 6 + 7 AnyCPU @@ -44,7 +44,7 @@ 618 false 1570,1591 - 6 + 7 diff --git a/Sharpmake/Assembler.cs b/Sharpmake/Assembler.cs index 512e65035..b3a7838d5 100644 --- a/Sharpmake/Assembler.cs +++ b/Sharpmake/Assembler.cs @@ -12,13 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. using System; -using System.CodeDom.Compiler; +using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +using System.Text; using System.Threading; +using System.Threading.Tasks; using Microsoft.Build.Utilities; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Emit; +using Microsoft.CodeAnalysis.Text; namespace Sharpmake { @@ -235,7 +241,7 @@ public static TDelegate BuildDelegate(string functionBody, string fun } // build in memory - Assembly assembly = assembler.Build(null, null, sourceTmpFile).Assembly; + Assembly assembly = assembler.Build(builderContext: null, libraryFile: null, sources: sourceTmpFile).Assembly; InternalError.Valid(assembly != null); // Try to delete tmp file to prevent pollution, but useful while debugging @@ -383,14 +389,16 @@ public void AddDefine(string define) private IAssemblyInfo Build(IBuilderContext builderContext, string libraryFile, params string[] sources) { var assemblyInfo = LoadAssemblyInfo(builderContext, sources); + HashSet references = GetReferences(); - HashSet references = new HashSet(); - - Dictionary providerOptions = new Dictionary(); - providerOptions.Add("CompilerVersion", "v4.0"); - CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider(providerOptions); + assemblyInfo.Assembly = Compile(builderContext, assemblyInfo.SourceFiles.ToArray(), libraryFile, references); + assemblyInfo.Id = assemblyInfo.Assembly.Location; + return assemblyInfo; + } - CompilerParameters cp = new CompilerParameters(); + private HashSet GetReferences() + { + HashSet references = new HashSet(); if (UseDefaultReferences) { @@ -407,83 +415,90 @@ private IAssemblyInfo Build(IBuilderContext builderContext, string libraryFile, references.Add(assembly.Location); } - cp.ReferencedAssemblies.AddRange(references.ToArray()); + return references; + } - // Generate an library - cp.GenerateExecutable = false; + private SourceText ReadSourceCode(string path) + { + using (var stream = File.OpenRead(path)) + return SourceText.From(stream, Encoding.Default); + } - // Set the level at which the compiler - // should start displaying warnings. - cp.WarningLevel = 4; + private Assembly Compile(IBuilderContext builderContext, string[] files, string libraryFile, HashSet references) + { + // Parse all files + var syntaxTrees = new ConcurrentBag(); + var parseOptions = new CSharpParseOptions(LanguageVersion.CSharp7, DocumentationMode.None, preprocessorSymbols: _defines); + Parallel.ForEach(files, f => syntaxTrees.Add(CSharpSyntaxTree.ParseText(ReadSourceCode(f), parseOptions, path: f))); - // Set whether to treat all warnings as errors. - cp.TreatWarningsAsErrors = false; + return Compile(builderContext, syntaxTrees.ToArray(), libraryFile, references); + } - // Set compiler argument to optimize output. - // TODO : figure out why it does not work when uncommenting the following line - // cp.CompilerOptions = "/optimize"; + private Assembly Compile(IBuilderContext builderContext, SyntaxTree[] syntaxTrees, string libraryFile, HashSet references) + { + // Add references + var portableExecutableReferences = new List(); - // If any defines are specified, pass them to the CSC. - if (_defines.Any()) + foreach (var reference in references.Where(r => !string.IsNullOrEmpty(r))) { - cp.CompilerOptions = "-DEFINE:" + string.Join(",", _defines); + portableExecutableReferences.Add(MetadataReference.CreateFromFile(reference)); } - // Specify the assembly file name to generate - if (libraryFile == null) + // Compile + var compilationOptions = new CSharpCompilationOptions( + OutputKind.DynamicallyLinkedLibrary, + optimizationLevel: OptimizationLevel.Release, + warningLevel: 4 + ); + var assemblyName = libraryFile != null ? Path.GetFileNameWithoutExtension(libraryFile) : $"Sharpmake_{new Random().Next():X8}" + GetHashCode(); + var compilation = CSharpCompilation.Create(assemblyName, syntaxTrees, portableExecutableReferences, compilationOptions); + + using (var dllStream = new MemoryStream()) + using (var pdbStream = new MemoryStream()) { - cp.GenerateInMemory = true; - cp.IncludeDebugInformation = false; - } - else - { - cp.GenerateInMemory = false; - cp.IncludeDebugInformation = true; - cp.OutputAssembly = libraryFile; - } + EmitResult result = compilation.Emit(dllStream, pdbStream, options: new EmitOptions(debugInformationFormat: DebugInformationFormat.Pdb)); - // Notes: - // Avoid getting spoiled by environment variables. - // C# will give compilation errors if a LIB variable contains non-existing directories. - Environment.SetEnvironmentVariable("LIB", null); + if (result.Success) + { + if (libraryFile != null) + { + dllStream.Seek(0, SeekOrigin.Begin); + using (var fileStream = new FileStream(libraryFile, FileMode.Create)) + dllStream.CopyTo(fileStream); - // Configure Temp file collection to avoid deleting its temp file. We will delete them ourselves after the compilation - // For some reasons, this seems to add just enough delays to avoid the following first chance exception(probably caused by some handles in csc.exe) - // System.IO.IOException: 'The process cannot access the file 'C:\Users\xxx\AppData\Local\Temp\sa205152\sa205152.out' because it is being used by another process.' - // That exception wasn't causing real problems but was really annoying when debugging! - // Executed several times sharpmake and this first chance exception no longer occurs when KeepFiles is true. - cp.TempFiles.KeepFiles = true; + pdbStream.Seek(0, SeekOrigin.Begin); + using (var pdbFileStream = new FileStream(Path.ChangeExtension(libraryFile, ".pdb"), FileMode.Create)) + pdbStream.CopyTo(pdbFileStream); - // Invoke compilation of the source file. - CompilerResults cr = provider.CompileAssemblyFromFile(cp, assemblyInfo.SourceFiles.ToArray()); + return Assembly.LoadFrom(libraryFile); + } - // Manually delete the files in the temp files collection. - cp.TempFiles.Delete(); + return Assembly.Load(dllStream.GetBuffer(), pdbStream.GetBuffer()); + } - if (cr.Errors.HasErrors || cr.Errors.HasWarnings) - { - string errorMessage = ""; - foreach (CompilerError ce in cr.Errors) - { - if (ce.IsWarning) - EventOutputWarning?.Invoke("{0}" + Environment.NewLine, ce.ToString()); - else - EventOutputError?.Invoke("{0}" + Environment.NewLine, ce.ToString()); + bool throwErrorException = builderContext == null || builderContext.CompileErrorBehavior == BuilderCompileErrorBehavior.ThrowException; + LogCompilationResult(result, throwErrorException); + } - errorMessage += ce + Environment.NewLine; - } + return null; + } - if (cr.Errors.HasErrors) - { - if (builderContext == null || builderContext.CompileErrorBehavior == BuilderCompileErrorBehavior.ThrowException) - throw new Error(errorMessage); - return assemblyInfo; - } + private void LogCompilationResult(EmitResult result, bool throwErrorException) + { + string errorMessage = ""; + + foreach (var diagnostic in result.Diagnostics) + { + if (diagnostic.Severity == DiagnosticSeverity.Error) + EventOutputError?.Invoke("{0}" + Environment.NewLine, diagnostic.ToString()); + else // catch everything else as warning + EventOutputWarning?.Invoke("{0}" + Environment.NewLine, diagnostic.ToString()); + + errorMessage += diagnostic + Environment.NewLine; } - assemblyInfo.Assembly = cr.CompiledAssembly; - assemblyInfo.Id = assemblyInfo.Assembly.Location; - return assemblyInfo; + if (throwErrorException) + throw new Error(errorMessage); } private List ComputeParsers() diff --git a/Sharpmake/Builder.cs b/Sharpmake/Builder.cs index e517a6792..7af99c152 100644 --- a/Sharpmake/Builder.cs +++ b/Sharpmake/Builder.cs @@ -398,6 +398,9 @@ private IAssemblyInfo BuildAndLoadAssembly(IList sharpmakeFiles, IBuilde { Assembler assembler = new Assembler(Defines); + // Add currently loaded assemblies + assembler.Assemblies.AddRange(AppDomain.CurrentDomain.GetAssemblies()); + // Add sharpmake assembly assembler.Assemblies.Add(_sharpmakeAssembly.Value); diff --git a/Sharpmake/CommandLine.cs b/Sharpmake/CommandLine.cs index 1b952e462..eb5015cea 100644 --- a/Sharpmake/CommandLine.cs +++ b/Sharpmake/CommandLine.cs @@ -13,10 +13,10 @@ // limitations under the License. using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Reflection; using System.Text; -using System.IO; namespace Sharpmake { diff --git a/Sharpmake/Configurable.cs b/Sharpmake/Configurable.cs index c6ec2ef51..048d1ac65 100644 --- a/Sharpmake/Configurable.cs +++ b/Sharpmake/Configurable.cs @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/Sharpmake/DebugProjectGenerator.cs b/Sharpmake/DebugProjectGenerator.cs index e3e7bc1e6..1219bdc40 100644 --- a/Sharpmake/DebugProjectGenerator.cs +++ b/Sharpmake/DebugProjectGenerator.cs @@ -225,12 +225,12 @@ internal static Target GetTargets() { return new Target( Platform.anycpu, - DevEnv.vs2017, + DevEnv.vs2019, Optimization.Debug, OutputType.Dll, Blob.NoBlob, BuildSystem.MSBuild, - DotNetFramework.v4_6_1 + DotNetFramework.v4_7_2 ); } @@ -317,7 +317,7 @@ public void ConfigureAll(Configuration conf, Target target) conf.ProjectFileName = "[project.Name].[target.DevEnv]"; conf.Output = Configuration.OutputType.DotNetClassLibrary; - conf.Options.Add(Options.CSharp.LanguageVersion.CSharp5); + conf.Options.Add(Options.CSharp.LanguageVersion.CSharp7); conf.Defines.Add(_projectInfo.Defines.ToArray()); diff --git a/Sharpmake/PreprocessorConditionParser.cs b/Sharpmake/PreprocessorConditionParser.cs index b4f387ee1..cd0984adc 100644 --- a/Sharpmake/PreprocessorConditionParser.cs +++ b/Sharpmake/PreprocessorConditionParser.cs @@ -16,10 +16,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; using System.Text.RegularExpressions; using System.Threading; -using System.Threading.Tasks; namespace Sharpmake { diff --git a/Sharpmake/Sharpmake.csproj b/Sharpmake/Sharpmake.csproj index 11372ada1..7f0f1ae2e 100644 --- a/Sharpmake/Sharpmake.csproj +++ b/Sharpmake/Sharpmake.csproj @@ -9,7 +9,7 @@ Properties Sharpmake Sharpmake - v4.6.1 + v4.7.2 512 @@ -31,7 +31,7 @@ 618 false 1570,1591 - 6 + 7 AnyCPU @@ -49,10 +49,10 @@ 618 false 1570,1591 - 6 + 7 - + True @@ -135,6 +135,7 @@ + diff --git a/Sharpmake/Sharpmake.sharpmake.cs b/Sharpmake/Sharpmake.sharpmake.cs index 7fd23166f..04e08d1a7 100644 --- a/Sharpmake/Sharpmake.sharpmake.cs +++ b/Sharpmake/Sharpmake.sharpmake.cs @@ -20,9 +20,10 @@ public SharpmakeProject() public override void ConfigureAll(Configuration conf, Target target) { base.ConfigureAll(conf, target); - conf.ReferencesByNameExternal.Add("Microsoft.Build.Utilities.v4.0"); + conf.ReferencesByNameExternal.Add("Microsoft.Build.Utilities.Core"); conf.Options.Add(Options.CSharp.AllowUnsafeBlocks.Enabled); + conf.ReferencesByNuGetPackage.Add("Microsoft.CodeAnalysis.CSharp", "3.7.0"); conf.ReferencesByNuGetPackage.Add("Microsoft.VisualStudio.Setup.Configuration.Interop", "1.16.30"); } } diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index 95e262f58..566402289 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -20,7 +20,6 @@ using System.IO; using System.Linq; using System.Reflection; -using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Text; From b0c31a4d44f63f7db1342e87def96c060f22e265 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 12 Oct 2020 16:31:40 +0200 Subject: [PATCH 003/142] [Csproj] Try to create links relative to project.RootPath if files are not found under SourceRootPath --- Sharpmake.Generators/VisualStudio/Csproj.cs | 51 +++++++++++---------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/Sharpmake.Generators/VisualStudio/Csproj.cs b/Sharpmake.Generators/VisualStudio/Csproj.cs index 41db85546..0ff452634 100644 --- a/Sharpmake.Generators/VisualStudio/Csproj.cs +++ b/Sharpmake.Generators/VisualStudio/Csproj.cs @@ -1710,14 +1710,14 @@ List skipFiles { Include = linkedCsFile, DependentUpon = Path.GetFileName(xaml), - LinkFolder = GetProjectLinkedFolder(linkedCsFile, _projectPathCapitalized, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(linkedCsFile, _projectPathCapitalized, project) }); itemGroups.Pages.Add(new ItemGroups.Page { Include = xaml, IsApplicationDefinition = project.ApplicationDefinitionFilenames.Any(f => f.Equals(Path.GetFileName(xaml), StringComparison.InvariantCultureIgnoreCase)), - LinkFolder = GetProjectLinkedFolder(xaml, _projectPathCapitalized, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(xaml, _projectPathCapitalized, project) }); remainingSourcesFiles.Remove(xaml); remainingSourcesFiles.Remove(linkedCsFile); @@ -1731,7 +1731,7 @@ List skipFiles { Include = designerFile, DependentUpon = Path.GetFileName(csFile), - LinkFolder = GetProjectLinkedFolder(designerFile, _projectPathCapitalized, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(designerFile, _projectPathCapitalized, project) }); remainingSourcesFiles.Remove(designerFile); string resXFile = fileAssociation.GetFilenameWithExtension(".resx"); @@ -1741,7 +1741,7 @@ List skipFiles { Include = resXFile, DependUpon = Path.GetFileName(csFile), - LinkFolder = GetProjectLinkedFolder(resXFile, _projectPathCapitalized, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(resXFile, _projectPathCapitalized, project) }); remainingEmbeddedResourcesFiles.Remove(resXFile); remainingResourcesFiles.Remove(resXFile); @@ -1758,21 +1758,21 @@ List skipFiles Include = mainAddinCode, SubType = "Code", LinkFolder = - GetProjectLinkedFolder(mainAddinCode, _projectPathCapitalized, project.SourceRootPath) + GetProjectLinkedFolder(mainAddinCode, _projectPathCapitalized, project) }); itemGroups.Compiles.Add(new ItemGroups.Compile { Include = designerCode, DependentUpon = designerXml, LinkFolder = - GetProjectLinkedFolder(mainAddinCode, _projectPathCapitalized, project.SourceRootPath) + GetProjectLinkedFolder(mainAddinCode, _projectPathCapitalized, project) }); itemGroups.Nones.Add(new ItemGroups.None { Include = designerXml, DependentUpon = mainAddinCode, LinkFolder = - GetProjectLinkedFolder(mainAddinCode, _projectPathCapitalized, project.SourceRootPath) + GetProjectLinkedFolder(mainAddinCode, _projectPathCapitalized, project) }); remainingSourcesFiles.Remove(mainAddinCode); remainingSourcesFiles.Remove(designerCode); @@ -1786,14 +1786,14 @@ List skipFiles itemGroups.Compiles.Add(new ItemGroups.Compile { Include = csFile, - LinkFolder = GetProjectLinkedFolder(csFile, _projectPathCapitalized, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(csFile, _projectPathCapitalized, project) }); itemGroups.EmbeddedResources.Add(new ItemGroups.EmbeddedResource { Include = xmlFile, SubType = "Designer", Generator = RemoveLineTag, - LinkFolder = GetProjectLinkedFolder(csFile, _projectPathCapitalized, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(csFile, _projectPathCapitalized, project) }); remainingEmbeddedResourcesFiles.Remove(xmlFile); remainingNoneFiles.Remove(xmlFile); @@ -1807,7 +1807,7 @@ List skipFiles { Include = resXFile, DependUpon = Path.GetFileName(csFile), - LinkFolder = GetProjectLinkedFolder(resXFile, _projectPathCapitalized, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(resXFile, _projectPathCapitalized, project) }); remainingEmbeddedResourcesFiles.Remove(resXFile); remainingResourcesFiles.Remove(resXFile); @@ -1822,7 +1822,7 @@ List skipFiles { Include = designerFile, DependentUpon = Path.GetFileName(resXFile), - LinkFolder = GetProjectLinkedFolder(designerFile, _projectPathCapitalized, project.SourceRootPath), + LinkFolder = GetProjectLinkedFolder(designerFile, _projectPathCapitalized, project), AutoGen = true, DesignTime = publicAccessModifiers ? (bool?)true : null }); @@ -1832,7 +1832,7 @@ List skipFiles Generator = publicAccessModifiers ? "PublicResXFileCodeGenerator" : "ResXFileCodeGenerator", MergeWithCto = resXFile.EndsWith("VSPackage.resx", StringComparison.InvariantCultureIgnoreCase) ? "true" : null, LastGenOutput = Path.GetFileName(designerFile), - LinkFolder = GetProjectLinkedFolder(resXFile, _projectPathCapitalized, project.SourceRootPath), + LinkFolder = GetProjectLinkedFolder(resXFile, _projectPathCapitalized, project), SubType = "Designer" }); remainingSourcesFiles.Remove(designerFile); @@ -1979,7 +1979,7 @@ List skipFiles { Include = linkedCsFile, DependentUpon = Path.GetFileName(asax), - LinkFolder = GetProjectLinkedFolder(linkedCsFile, _projectPathCapitalized, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(linkedCsFile, _projectPathCapitalized, project) }); itemGroups.Contents.Add(new ItemGroups.Content @@ -2123,7 +2123,7 @@ List skipFiles { Include = xaml, IsApplicationDefinition = project.ApplicationDefinitionFilenames.Any(f => f.Equals(xaml, StringComparison.InvariantCultureIgnoreCase)), - LinkFolder = GetProjectLinkedFolder(xaml, _projectPathCapitalized, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(xaml, _projectPathCapitalized, project) }); remainingSourcesFiles.Remove(xaml); } @@ -2144,7 +2144,7 @@ List skipFiles { Include = remainingSourcesFile, SubType = csProjSubTypesInfos?.SubTypeInfos.Find(s => string.Equals(s.FileName, remainingSourcesFile))?.SubType, - LinkFolder = GetProjectLinkedFolder(remainingSourcesFile, _projectPathCapitalized, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(remainingSourcesFile, _projectPathCapitalized, project) }); } @@ -2157,7 +2157,7 @@ List skipFiles itemGroups.Resources.Add(new ItemGroups.Resource { Include = file, - LinkFolder = GetProjectLinkedFolder(file, _projectPathCapitalized, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(file, _projectPathCapitalized, project) }); } } @@ -2449,14 +2449,14 @@ private static void AddNoneGeneratedItem(ItemGroups itemGroups, string file, str Include = file, Generator = generator, LastGenOutput = Path.GetFileName(generatedFile), - LinkFolder = GetProjectLinkedFolder(file, projectPath, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(file, projectPath, project) }); var compile = new ItemGroups.Compile { Include = generatedFile, AutoGen = true, DependentUpon = Path.GetFileName(file), - LinkFolder = GetProjectLinkedFolder(generatedFile, projectPath, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(generatedFile, projectPath, project) }; if (designTimeSharedInput) compile.DesignTimeSharedInput = true; @@ -2487,7 +2487,7 @@ private static void AddContentGeneratedItem( Include = templateFile, Generator = generator, LastGenOutput = Path.GetFileName(generatedFile), - LinkFolder = GetProjectLinkedFolder(templateFile, projectPath, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(templateFile, projectPath, project) }); if (!addGeneratedFile) @@ -2505,7 +2505,7 @@ private static void AddContentGeneratedItem( Include = generatedFile, AutoGen = true, DependentUpon = Path.GetFileName(templateFile), - LinkFolder = GetProjectLinkedFolder(generatedFile, projectPath, project.SourceRootPath) + LinkFolder = GetProjectLinkedFolder(generatedFile, projectPath, project) }; if (designTimeSharedInput) compile.DesignTimeSharedInput = true; @@ -2521,7 +2521,7 @@ private static void AddContentGeneratedItem( Include = generatedFile, AutoGen = true, DependentUpon = Path.GetFileName(templateFile), - LinkFolder = GetProjectLinkedFolder(generatedFile, projectPath, project.SourceRootPath), + LinkFolder = GetProjectLinkedFolder(generatedFile, projectPath, project), }); break; } @@ -2633,7 +2633,7 @@ private static FileAssociationType GetFileAssociationType(IEnumerable fi return FileAssociationType.Unknown; } - private static string GetProjectLinkedFolder(string sourceFile, string projectPath, string sourceRootPath) + private static string GetProjectLinkedFolder(string sourceFile, string projectPath, Project project) { // Exit out early if the file is not a relative path. if (!sourceFile.StartsWith("..", StringComparison.Ordinal)) @@ -2642,8 +2642,11 @@ private static string GetProjectLinkedFolder(string sourceFile, string projectPa string absoluteFile = Util.PathGetAbsolute(projectPath, sourceFile); var directoryName = Path.GetDirectoryName(absoluteFile); - if (directoryName.StartsWith(sourceRootPath, StringComparison.OrdinalIgnoreCase)) - return directoryName.Substring(sourceRootPath.Length).Trim(Util._pathSeparators); + if (directoryName.StartsWith(project.SourceRootPath, StringComparison.OrdinalIgnoreCase)) + return directoryName.Substring(project.SourceRootPath.Length).Trim(Util._pathSeparators); + + if (directoryName.StartsWith(project.RootPath)) + return directoryName.Substring(project.RootPath.Length).Trim(Util._pathSeparators); return Path.GetFileName(directoryName); } From 036db3f5cd2fc6737d248f4a99bf4d61da5fa02f Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 12 Oct 2020 16:46:46 +0200 Subject: [PATCH 004/142] Generate sharpmake solution with vs2019. --- Sharpmake.Main.sharpmake.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake.Main.sharpmake.cs b/Sharpmake.Main.sharpmake.cs index 528cad43b..a8b12cbc1 100644 --- a/Sharpmake.Main.sharpmake.cs +++ b/Sharpmake.Main.sharpmake.cs @@ -29,7 +29,7 @@ public static ITarget[] GetDefaultTargets() result.Add( new Target( Platform.anycpu, - DevEnv.vs2017, + DevEnv.vs2019, Optimization.Debug | Optimization.Release, framework: DotNetFramework.v4_7_2 ) From 47f4b22d7ba29773194b5d2ca22afa72f197d596 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 12 Oct 2020 18:00:38 +0200 Subject: [PATCH 005/142] Update .appveyor.yml Use vs2019 in appVeyor --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 23e7349fb..f63a98eaf 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,7 +1,7 @@ # Sharpmake AppVeyor CI configuration image: -- Visual Studio 2017 +- Visual Studio 2019 - macOS - Ubuntu From 68451601bb364d9cf3f5602361ff110816d2c7e8 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 12 Oct 2020 18:36:35 +0200 Subject: [PATCH 006/142] Downgrade Microsoft.CodeAnalysis.CSharp to 3.0.0 until we figure out the CI issues. --- Sharpmake.Application/Sharpmake.Application.csproj | 2 +- Sharpmake.Generators/Sharpmake.Generators.csproj | 2 +- .../Sharpmake.CommonPlatforms.csproj | 2 +- Sharpmake/Sharpmake.csproj | 4 ++-- Sharpmake/Sharpmake.sharpmake.cs | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Sharpmake.Application/Sharpmake.Application.csproj b/Sharpmake.Application/Sharpmake.Application.csproj index 7ad30d249..762cda6f2 100644 --- a/Sharpmake.Application/Sharpmake.Application.csproj +++ b/Sharpmake.Application/Sharpmake.Application.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU diff --git a/Sharpmake.Generators/Sharpmake.Generators.csproj b/Sharpmake.Generators/Sharpmake.Generators.csproj index 5d3187b14..eb3f4ca54 100644 --- a/Sharpmake.Generators/Sharpmake.Generators.csproj +++ b/Sharpmake.Generators/Sharpmake.Generators.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj index 52ec23965..ff40f8787 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU diff --git a/Sharpmake/Sharpmake.csproj b/Sharpmake/Sharpmake.csproj index 7f0f1ae2e..ef8ab273a 100644 --- a/Sharpmake/Sharpmake.csproj +++ b/Sharpmake/Sharpmake.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU @@ -135,7 +135,7 @@ - + diff --git a/Sharpmake/Sharpmake.sharpmake.cs b/Sharpmake/Sharpmake.sharpmake.cs index 04e08d1a7..ac0cba94c 100644 --- a/Sharpmake/Sharpmake.sharpmake.cs +++ b/Sharpmake/Sharpmake.sharpmake.cs @@ -23,7 +23,7 @@ public override void ConfigureAll(Configuration conf, Target target) conf.ReferencesByNameExternal.Add("Microsoft.Build.Utilities.Core"); conf.Options.Add(Options.CSharp.AllowUnsafeBlocks.Enabled); - conf.ReferencesByNuGetPackage.Add("Microsoft.CodeAnalysis.CSharp", "3.7.0"); + conf.ReferencesByNuGetPackage.Add("Microsoft.CodeAnalysis.CSharp", "3.0.0"); conf.ReferencesByNuGetPackage.Add("Microsoft.VisualStudio.Setup.Configuration.Interop", "1.16.30"); } } From 5600de7517955fa4d8dfb19c3cad7c127eea2b87 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 13 Oct 2020 01:10:03 +0200 Subject: [PATCH 007/142] Fix Assembler on mono platforms by using portable pdb --- Sharpmake/Assembler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake/Assembler.cs b/Sharpmake/Assembler.cs index b3a7838d5..5a2d2a8a2 100644 --- a/Sharpmake/Assembler.cs +++ b/Sharpmake/Assembler.cs @@ -456,7 +456,7 @@ private Assembly Compile(IBuilderContext builderContext, SyntaxTree[] syntaxTree using (var dllStream = new MemoryStream()) using (var pdbStream = new MemoryStream()) { - EmitResult result = compilation.Emit(dllStream, pdbStream, options: new EmitOptions(debugInformationFormat: DebugInformationFormat.Pdb)); + EmitResult result = compilation.Emit(dllStream, pdbStream, options: new EmitOptions(debugInformationFormat: DebugInformationFormat.PortablePdb)); if (result.Success) { From fcc44596d11b6c6c39b29ff8a462dcee8da27d66 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 13 Oct 2020 09:13:43 +0200 Subject: [PATCH 008/142] [AppVeyor] Set NUGET_HTTP_CACHE_PATH to a directory under the project root to fix intermittent permission issues when restoring NuGet. - Re-enable vs2017 --- .appveyor.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.appveyor.yml b/.appveyor.yml index f63a98eaf..deaba35ed 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -2,6 +2,7 @@ image: - Visual Studio 2019 +- Visual Studio 2017 - macOS - Ubuntu @@ -16,6 +17,10 @@ configuration: - Debug - Release +init: +- sh: >- + export NUGET_HTTP_CACHE_PATH=$PWD/tmp/nuget_cache + before_build: - cmd: bootstrap.bat - sh: ./bootstrap.sh From 97a032d0e70aefb242f3158cb126791e8633a159 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 13 Oct 2020 18:21:59 +0200 Subject: [PATCH 009/142] Make vswhere consider all the products so it can also find the build tools --- CompileSharpmake.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CompileSharpmake.bat b/CompileSharpmake.bat index 0667a0293..4040c4301 100644 --- a/CompileSharpmake.bat +++ b/CompileSharpmake.bat @@ -16,7 +16,7 @@ if not exist %VSWHERE% ( ) set VSMSBUILDCMD= -for /f "usebackq delims=" %%i in (`%VSWHERE% -latest -property installationPath`) do ( +for /f "usebackq delims=" %%i in (`%VSWHERE% -latest -products * -property installationPath`) do ( if exist "%%i\Common7\Tools\VsMSBuildCmd.bat" ( set VSMSBUILDCMD="%%i\Common7\Tools\VsMSBuildCmd.bat" ) From 3bd7fc6fdce54194842d5b44f719bdf9da56b46f Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 13 Oct 2020 16:36:38 +0200 Subject: [PATCH 010/142] - Separate project output directories to prevent different assemblies from stomping over each other - By default disable copying all project dependencies to the output dir - Fix functional tests background color resetting - Try updating CodeAnalysis.CSharp to 3.7.0 again --- Sharpmake.Application/Sharpmake.Application.csproj | 4 ++-- .../Sharpmake.Application.sharpmake.cs | 2 ++ .../Sharpmake.FunctionalTests.sharpmake.cs | 1 - Sharpmake.Generators/Sharpmake.Generators.csproj | 9 +++++---- Sharpmake.Main.sharpmake.cs | 4 +++- .../Sharpmake.CommonPlatforms.csproj | 10 ++++++---- Sharpmake.UnitTests/Sharpmake.UnitTests.sharpmake.cs | 2 -- Sharpmake/Sharpmake.csproj | 12 ++++++------ Sharpmake/Sharpmake.sharpmake.cs | 2 +- bootstrap.bat | 2 +- deploy_binaries.py | 10 +++++----- functional_test.py | 9 +++++++-- regression_test.py | 4 ++-- samples/Sharpmake.Samples.sharpmake.cs | 2 +- 14 files changed, 41 insertions(+), 32 deletions(-) diff --git a/Sharpmake.Application/Sharpmake.Application.csproj b/Sharpmake.Application/Sharpmake.Application.csproj index 762cda6f2..cdae5a8eb 100644 --- a/Sharpmake.Application/Sharpmake.Application.csproj +++ b/Sharpmake.Application/Sharpmake.Application.csproj @@ -21,7 +21,7 @@ true full false - ..\bin\debug + ..\tmp\bin\debug\sharpmake.application ..\tmp\obj\debug\sharpmake.application ..\tmp\obj\debug\sharpmake.application DEBUG;TRACE @@ -36,7 +36,7 @@ false pdbonly true - ..\bin\release + ..\tmp\bin\release\sharpmake.application ..\tmp\obj\release\sharpmake.application ..\tmp\obj\release\sharpmake.application TRACE diff --git a/Sharpmake.Application/Sharpmake.Application.sharpmake.cs b/Sharpmake.Application/Sharpmake.Application.sharpmake.cs index 14e4d471b..d34bf44d3 100644 --- a/Sharpmake.Application/Sharpmake.Application.sharpmake.cs +++ b/Sharpmake.Application/Sharpmake.Application.sharpmake.cs @@ -14,6 +14,8 @@ public SharpmakeApplicationProject() { Name = "Sharpmake.Application"; ApplicationManifest = "app.manifest"; + + DependenciesCopyLocal = DependenciesCopyLocalTypes.Default; } public override void ConfigureAll(Configuration conf, Target target) diff --git a/Sharpmake.FunctionalTests/Sharpmake.FunctionalTests.sharpmake.cs b/Sharpmake.FunctionalTests/Sharpmake.FunctionalTests.sharpmake.cs index 7806aec4c..3a5cf5f9d 100644 --- a/Sharpmake.FunctionalTests/Sharpmake.FunctionalTests.sharpmake.cs +++ b/Sharpmake.FunctionalTests/Sharpmake.FunctionalTests.sharpmake.cs @@ -26,7 +26,6 @@ public override void ConfigureAll(Configuration conf, Target target) base.ConfigureAll(conf, target); conf.SolutionFolder = "FunctionalTests"; - conf.TargetPath = @"[project.RootPath]\bin\[target.Optimization]\functionaltests"; conf.AddPrivateDependency(target); conf.AddPrivateDependency(target); diff --git a/Sharpmake.Generators/Sharpmake.Generators.csproj b/Sharpmake.Generators/Sharpmake.Generators.csproj index eb3f4ca54..21c7da8e5 100644 --- a/Sharpmake.Generators/Sharpmake.Generators.csproj +++ b/Sharpmake.Generators/Sharpmake.Generators.csproj @@ -17,10 +17,10 @@ true full false - ..\bin\debug + ..\tmp\bin\debug\sharpmake.generators ..\tmp\obj\debug\sharpmake.generators ..\tmp\obj\debug\sharpmake.generators - ..\bin\debug\sharpmake.generators.xml + ..\tmp\bin\debug\sharpmake.generators\sharpmake.generators.xml DEBUG;TRACE 4 true @@ -34,10 +34,10 @@ false pdbonly true - ..\bin\release + ..\tmp\bin\release\sharpmake.generators ..\tmp\obj\release\sharpmake.generators ..\tmp\obj\release\sharpmake.generators - ..\bin\release\sharpmake.generators.xml + ..\tmp\bin\release\sharpmake.generators\sharpmake.generators.xml TRACE 4 true @@ -112,6 +112,7 @@ {15f793c7-9e88-64a9-591c-7244fcc6b771} Sharpmake + false diff --git a/Sharpmake.Main.sharpmake.cs b/Sharpmake.Main.sharpmake.cs index a8b12cbc1..1297b414d 100644 --- a/Sharpmake.Main.sharpmake.cs +++ b/Sharpmake.Main.sharpmake.cs @@ -52,6 +52,8 @@ protected SharpmakeBaseProject( RootPath = Globals.AbsoluteRootPath; + DependenciesCopyLocal = DependenciesCopyLocalTypes.None; + if (excludeSharpmakeFiles) SourceFilesExcludeRegex.Add(@".*\.sharpmake.cs"); } @@ -62,7 +64,7 @@ public virtual void ConfigureAll(Configuration conf, Target target) conf.ProjectFileName = "[project.Name]"; conf.ProjectPath = @"[project.SourceRootPath]"; conf.Output = Configuration.OutputType.DotNetClassLibrary; - conf.TargetPath = @"[project.RootPath]\bin\[target.Optimization]"; + conf.TargetPath = @"[project.RootPath]\tmp\bin\[target.Optimization]\[project.Name]"; conf.IntermediatePath = @"[project.RootPath]\tmp\obj\[target.Optimization]\[project.Name]"; conf.BaseIntermediateOutputPath = conf.IntermediatePath; diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj index ff40f8787..b102dd344 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj @@ -17,10 +17,10 @@ true full false - ..\..\bin\debug + ..\..\tmp\bin\debug\sharpmake.commonplatforms ..\..\tmp\obj\debug\sharpmake.commonplatforms ..\..\tmp\obj\debug\sharpmake.commonplatforms - ..\..\bin\debug\sharpmake.commonplatforms.xml + ..\..\tmp\bin\debug\sharpmake.commonplatforms\sharpmake.commonplatforms.xml DEBUG;TRACE 4 true @@ -34,10 +34,10 @@ false pdbonly true - ..\..\bin\release + ..\..\tmp\bin\release\sharpmake.commonplatforms ..\..\tmp\obj\release\sharpmake.commonplatforms ..\..\tmp\obj\release\sharpmake.commonplatforms - ..\..\bin\release\sharpmake.commonplatforms.xml + ..\..\tmp\bin\release\sharpmake.commonplatforms\sharpmake.commonplatforms.xml TRACE 4 true @@ -84,10 +84,12 @@ {844f66de-b015-340e-720a-8e158b517e93} Sharpmake.Generators + false {15f793c7-9e88-64a9-591c-7244fcc6b771} Sharpmake + false diff --git a/Sharpmake.UnitTests/Sharpmake.UnitTests.sharpmake.cs b/Sharpmake.UnitTests/Sharpmake.UnitTests.sharpmake.cs index bdb0f93ce..253b3a046 100644 --- a/Sharpmake.UnitTests/Sharpmake.UnitTests.sharpmake.cs +++ b/Sharpmake.UnitTests/Sharpmake.UnitTests.sharpmake.cs @@ -24,8 +24,6 @@ public override void ConfigureAll(Configuration conf, Target target) { base.ConfigureAll(conf, target); - conf.TargetPath = @"[conf.ProjectPath]\bin\[target.Optimization]"; - conf.AddPrivateDependency(target); conf.AddPrivateDependency(target); conf.AddPrivateDependency(target); diff --git a/Sharpmake/Sharpmake.csproj b/Sharpmake/Sharpmake.csproj index ef8ab273a..ca3fb25f8 100644 --- a/Sharpmake/Sharpmake.csproj +++ b/Sharpmake/Sharpmake.csproj @@ -20,10 +20,10 @@ true full false - ..\bin\debug + ..\tmp\bin\debug\sharpmake ..\tmp\obj\debug\sharpmake ..\tmp\obj\debug\sharpmake - ..\bin\debug\sharpmake.xml + ..\tmp\bin\debug\sharpmake\sharpmake.xml DEBUG;TRACE 4 true @@ -38,10 +38,10 @@ false pdbonly true - ..\bin\release + ..\tmp\bin\release\sharpmake ..\tmp\obj\release\sharpmake ..\tmp\obj\release\sharpmake - ..\bin\release\sharpmake.xml + ..\tmp\bin\release\sharpmake\sharpmake.xml TRACE 4 true @@ -53,7 +53,7 @@ - True + False False @@ -135,7 +135,7 @@ - + diff --git a/Sharpmake/Sharpmake.sharpmake.cs b/Sharpmake/Sharpmake.sharpmake.cs index ac0cba94c..04e08d1a7 100644 --- a/Sharpmake/Sharpmake.sharpmake.cs +++ b/Sharpmake/Sharpmake.sharpmake.cs @@ -23,7 +23,7 @@ public override void ConfigureAll(Configuration conf, Target target) conf.ReferencesByNameExternal.Add("Microsoft.Build.Utilities.Core"); conf.Options.Add(Options.CSharp.AllowUnsafeBlocks.Enabled); - conf.ReferencesByNuGetPackage.Add("Microsoft.CodeAnalysis.CSharp", "3.0.0"); + conf.ReferencesByNuGetPackage.Add("Microsoft.CodeAnalysis.CSharp", "3.7.0"); conf.ReferencesByNuGetPackage.Add("Microsoft.VisualStudio.Setup.Configuration.Interop", "1.16.30"); } } diff --git a/bootstrap.bat b/bootstrap.bat index 02fbe61e2..71a27e844 100644 --- a/bootstrap.bat +++ b/bootstrap.bat @@ -6,7 +6,7 @@ COLOR :: set batch file directory as current pushd "%~dp0" -set SHARPMAKE_EXECUTABLE=bin\debug\Sharpmake.Application.exe +set SHARPMAKE_EXECUTABLE=tmp\bin\debug\Sharpmake.Application\Sharpmake.Application.exe call CompileSharpmake.bat Sharpmake.Application/Sharpmake.Application.csproj Debug AnyCPU if %errorlevel% NEQ 0 goto error diff --git a/deploy_binaries.py b/deploy_binaries.py index 63849660e..1b0796458 100644 --- a/deploy_binaries.py +++ b/deploy_binaries.py @@ -64,7 +64,7 @@ sys.exit(-1) # Check if there are actual DLLs to copy, otherwise it must be compiled in VS. -if not os.path.isfile(os.path.join(root_dir, "bin/{}/Sharpmake.dll".format(config))): +if not os.path.isfile(os.path.join(root_dir, "tmp/bin/{}/sharpmake/Sharpmake.dll".format(config))): print("Please build Sharpmake in its {} configuration.".format(config)) sys.exit(1) @@ -86,12 +86,12 @@ def __init__(self, name): def copy(self): # Copy the DLL. - dll_path = os.path.join(root_dir, "bin", config, self.name + ".dll") + dll_path = os.path.join(root_dir, "tmp", "bin", config, self.name, self.name + ".dll") copy_file(dll_path) copy_file(dll_path + ".config") # Copy the executable. - exe_path = os.path.join(root_dir, "bin", config, self.name + ".exe") + exe_path = os.path.join(root_dir, "tmp", "bin", config, self.name, self.name + ".exe") copy_file(exe_path) copy_file(exe_path + ".config") @@ -99,11 +99,11 @@ def copy(self): if deploy_pdb: copy_file(dll_path + ".mdb") copy_file(exe_path + ".mdb") - copy_file(os.path.join(root_dir, "bin", config, self.name + ".pdb")) + copy_file(os.path.join(root_dir, "tmp", "bin", config, self.name, self.name + ".pdb")) # Copy the XML API doc if it exists. if deploy_xmldoc: - copy_file(os.path.join(root_dir, "bin", config, self.name + ".xml")) + copy_file(os.path.join(root_dir, "tmp", "bin", config, self.name, self.name + ".xml")) def __str__(self): return self.name diff --git a/functional_test.py b/functional_test.py index eda1ab170..8cfe668f4 100644 --- a/functional_test.py +++ b/functional_test.py @@ -28,7 +28,7 @@ def run_test(self): os.chdir(pwd) # Detects the path of the Sharpmake executable - sharpmake_path = find_target_path(os.path.join(entry_path, "bin"), "Sharpmake.Application.exe") + sharpmake_path = find_target_path(self.directory, "Sharpmake.Application.exe") write_line("Using sharpmake " + sharpmake_path) @@ -145,7 +145,7 @@ def build_with_fastbuild(root_dir, test_dir): def find_target_path(directory, target): optim_tokens = ["debug", "release"] for optim_token in optim_tokens: - path = os.path.abspath(os.path.join(directory, optim_token, target)) + path = os.path.abspath(os.path.join("..", "tmp", "bin", optim_token, "sharpmake.application", target)) if os.path.isfile(path): return path @@ -163,6 +163,10 @@ def red_bg(): def green_bg(): if os.name == "nt": os.system("color 2F") + +def black_bg(): + if os.name == "nt": + os.system("color 0F") def pause(timeout=None): if timeout is None: @@ -216,5 +220,6 @@ def launch_functional_tests(): finally: os.chdir(entry_path) +black_bg() exit_code = launch_functional_tests() sys.exit(exit_code) diff --git a/regression_test.py b/regression_test.py index da313ebe9..ca2127271 100644 --- a/regression_test.py +++ b/regression_test.py @@ -29,7 +29,7 @@ def run_test(self, as_source): os.chdir(pwd) # Detects the path of the Sharpmake executable - sharpmake_path = find_target_path(self.directory, "Sharpmake.Application.exe") + sharpmake_path = find_target_path("Sharpmake.Application", "Sharpmake.Application.exe") write_line("Using sharpmake " + sharpmake_path) @@ -81,7 +81,7 @@ def run_test(self, as_source): def find_target_path(directory, target): optim_tokens = ["debug", "release"] for optim_token in optim_tokens: - path = os.path.abspath(os.path.join("..", "bin", optim_token, "samples", target)) + path = os.path.abspath(os.path.join("..", "tmp", "bin", optim_token, directory, target)) if os.path.isfile(path): return path diff --git a/samples/Sharpmake.Samples.sharpmake.cs b/samples/Sharpmake.Samples.sharpmake.cs index 8000ebf20..dcde04076 100644 --- a/samples/Sharpmake.Samples.sharpmake.cs +++ b/samples/Sharpmake.Samples.sharpmake.cs @@ -26,7 +26,7 @@ public override void ConfigureAll(Configuration conf, Target target) base.ConfigureAll(conf, target); conf.SolutionFolder = "Samples"; - conf.TargetPath = @"[project.RootPath]\bin\[target.Optimization]\Samples"; + //conf.TargetPath = @"[project.RootPath]\bin\[target.Optimization]\Samples"; conf.AddPrivateDependency(target); conf.AddPrivateDependency(target); From 913968385b9405c7f8735d70096580d09b501ca5 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 13 Oct 2020 09:21:51 +0200 Subject: [PATCH 011/142] - Fix path to sharpmake executable in bootstrap for linux/mac - Remove vs2017 from appveyor CI --- .appveyor.yml | 7 +++---- bootstrap.sh | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index deaba35ed..5662bea71 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,10 +1,9 @@ # Sharpmake AppVeyor CI configuration image: -- Visual Studio 2019 -- Visual Studio 2017 - macOS - Ubuntu +- Visual Studio 2019 skip_commits: files: @@ -26,8 +25,8 @@ before_build: - sh: ./bootstrap.sh build_script: - - cmd: CompileSharpmake.bat Sharpmake.sln "%CONFIGURATION%" "%PLATFORM%" - - sh: ./CompileSharpmake.sh Sharpmake.sln "${CONFIGURATION}" "${PLATFORM}" +- cmd: CompileSharpmake.bat Sharpmake.sln "%CONFIGURATION%" "%PLATFORM%" +- sh: ./CompileSharpmake.sh Sharpmake.sln "${CONFIGURATION}" "${PLATFORM}" test: assemblies: diff --git a/bootstrap.sh b/bootstrap.sh index 7d46392a5..1373c092a 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -25,7 +25,7 @@ fi # workaround for https://github.com/mono/mono/issues/6752 TERM=xterm -SHARPMAKE_EXECUTABLE=$CURRENT_DIR/bin/debug/Sharpmake.Application.exe +SHARPMAKE_EXECUTABLE=$CURRENT_DIR/tmp/bin/debug/sharpmake.application/Sharpmake.Application.exe $CURRENT_DIR/CompileSharpmake.sh $CURRENT_DIR/Sharpmake.Application/Sharpmake.Application.csproj Debug AnyCPU if [ $? -ne 0 ]; then From 5180bad5aa09f347075275ed2181007d2c5018bb Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 13 Oct 2020 20:23:22 +0200 Subject: [PATCH 012/142] Fix unit-tests and downgrade Microsoft.CodeAnalysis.CSharp to 3.4.0 --- Sharpmake.UnitTests/Sharpmake.UnitTests.sharpmake.cs | 2 ++ Sharpmake/Sharpmake.csproj | 2 +- Sharpmake/Sharpmake.sharpmake.cs | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Sharpmake.UnitTests/Sharpmake.UnitTests.sharpmake.cs b/Sharpmake.UnitTests/Sharpmake.UnitTests.sharpmake.cs index 253b3a046..27e6837cd 100644 --- a/Sharpmake.UnitTests/Sharpmake.UnitTests.sharpmake.cs +++ b/Sharpmake.UnitTests/Sharpmake.UnitTests.sharpmake.cs @@ -16,6 +16,8 @@ public SharpmakeUnitTestsProject() Services.Add("{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}"); // NUnit + DependenciesCopyLocal = DependenciesCopyLocalTypes.Default; + // indicates where to find the nuget(s) we reference without needing nuget.config or global setting CustomProperties.Add("RestoreAdditionalProjectSources", "https://api.nuget.org/v3/index.json"); } diff --git a/Sharpmake/Sharpmake.csproj b/Sharpmake/Sharpmake.csproj index ca3fb25f8..d11098642 100644 --- a/Sharpmake/Sharpmake.csproj +++ b/Sharpmake/Sharpmake.csproj @@ -135,7 +135,7 @@ - + diff --git a/Sharpmake/Sharpmake.sharpmake.cs b/Sharpmake/Sharpmake.sharpmake.cs index 04e08d1a7..716cf78c0 100644 --- a/Sharpmake/Sharpmake.sharpmake.cs +++ b/Sharpmake/Sharpmake.sharpmake.cs @@ -23,7 +23,7 @@ public override void ConfigureAll(Configuration conf, Target target) conf.ReferencesByNameExternal.Add("Microsoft.Build.Utilities.Core"); conf.Options.Add(Options.CSharp.AllowUnsafeBlocks.Enabled); - conf.ReferencesByNuGetPackage.Add("Microsoft.CodeAnalysis.CSharp", "3.7.0"); + conf.ReferencesByNuGetPackage.Add("Microsoft.CodeAnalysis.CSharp", "3.4.0"); conf.ReferencesByNuGetPackage.Add("Microsoft.VisualStudio.Setup.Configuration.Interop", "1.16.30"); } } From 565d07841e57d52e5d40356ea822bf4b729d2316 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 13 Oct 2020 20:45:40 +0200 Subject: [PATCH 013/142] Fix deploy script: normalize case before comparison. --- deploy_binaries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy_binaries.py b/deploy_binaries.py index 1b0796458..30765f3c5 100644 --- a/deploy_binaries.py +++ b/deploy_binaries.py @@ -74,7 +74,7 @@ ################################################################################ def copy_file(src): - if os.path.isfile(src) and os.path.normpath(os.path.dirname(src)) != os.path.normpath(target_dir): + if os.path.isfile(src) and os.path.normcase(os.path.normpath(os.path.dirname(src))) != os.path.normcase(os.path.normpath(target_dir)): print("Copying {} to {}".format(os.path.join(root_dir, src), target_dir)) shutil.copy2(src, target_dir) From d05c543dc7697c91ae68c42e0472f7a28b0f08d9 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 13 Oct 2020 21:15:35 +0200 Subject: [PATCH 014/142] Update the nuspec with the updated output paths. --- Sharpmake.Application/Sharpmake.Application.nuspec | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sharpmake.Application/Sharpmake.Application.nuspec b/Sharpmake.Application/Sharpmake.Application.nuspec index 951cdd14c..f4e8e14f1 100644 --- a/Sharpmake.Application/Sharpmake.Application.nuspec +++ b/Sharpmake.Application/Sharpmake.Application.nuspec @@ -4,9 +4,9 @@ Sharpmake - - - - + + + + From c9c3afed36a9ac6000625229f3e50c4aac8d83f0 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 13 Oct 2020 21:30:08 +0200 Subject: [PATCH 015/142] Fix interop embedding in deployment script. --- deploy_binaries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy_binaries.py b/deploy_binaries.py index 30765f3c5..563689d60 100644 --- a/deploy_binaries.py +++ b/deploy_binaries.py @@ -147,7 +147,7 @@ def __str__(self): site.copy() # Also copy the interop allowing the detection of visual studio -vs_interop = os.path.join(root_dir, "bin", config, "Microsoft.VisualStudio.Setup.Configuration.Interop.dll") +vs_interop = os.path.join(root_dir, "tmp", "bin", config, "sharpmake", "Microsoft.VisualStudio.Setup.Configuration.Interop.dll") if os.path.isfile(vs_interop): copy_file(vs_interop) From f577f73d0f5d8754fb7cb7f51f5395adc1b60676 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 13 Oct 2020 22:40:38 +0200 Subject: [PATCH 016/142] Assemble in debug instead of release to try and fix sharpmake when not built locally. --- Sharpmake/Assembler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake/Assembler.cs b/Sharpmake/Assembler.cs index 5a2d2a8a2..ccb42656b 100644 --- a/Sharpmake/Assembler.cs +++ b/Sharpmake/Assembler.cs @@ -447,7 +447,7 @@ private Assembly Compile(IBuilderContext builderContext, SyntaxTree[] syntaxTree // Compile var compilationOptions = new CSharpCompilationOptions( OutputKind.DynamicallyLinkedLibrary, - optimizationLevel: OptimizationLevel.Release, + //optimizationLevel: OptimizationLevel.Release, warningLevel: 4 ); var assemblyName = libraryFile != null ? Path.GetFileNameWithoutExtension(libraryFile) : $"Sharpmake_{new Random().Next():X8}" + GetHashCode(); From 37f23312b069cd9a3d463ae96a59972ada9921b5 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 13 Oct 2020 23:23:17 +0200 Subject: [PATCH 017/142] Another attempt: embed texts. --- Sharpmake/Assembler.cs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/Sharpmake/Assembler.cs b/Sharpmake/Assembler.cs index ccb42656b..d037ce29d 100644 --- a/Sharpmake/Assembler.cs +++ b/Sharpmake/Assembler.cs @@ -25,6 +25,7 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Emit; using Microsoft.CodeAnalysis.Text; +using EmbeddedText = Microsoft.CodeAnalysis.EmbeddedText; namespace Sharpmake { @@ -421,20 +422,26 @@ private HashSet GetReferences() private SourceText ReadSourceCode(string path) { using (var stream = File.OpenRead(path)) - return SourceText.From(stream, Encoding.Default); + return SourceText.From(stream, Encoding.Default, canBeEmbedded: true); } private Assembly Compile(IBuilderContext builderContext, string[] files, string libraryFile, HashSet references) { // Parse all files var syntaxTrees = new ConcurrentBag(); + var embeddedTexts = new ConcurrentBag(); var parseOptions = new CSharpParseOptions(LanguageVersion.CSharp7, DocumentationMode.None, preprocessorSymbols: _defines); - Parallel.ForEach(files, f => syntaxTrees.Add(CSharpSyntaxTree.ParseText(ReadSourceCode(f), parseOptions, path: f))); + Parallel.ForEach(files, f => + { + var sourceText = ReadSourceCode(f); + syntaxTrees.Add(CSharpSyntaxTree.ParseText(sourceText, parseOptions, path: f)); + embeddedTexts.Add(EmbeddedText.FromSource(f, sourceText)); + }); - return Compile(builderContext, syntaxTrees.ToArray(), libraryFile, references); + return Compile(builderContext, syntaxTrees, embeddedTexts, libraryFile, references); } - private Assembly Compile(IBuilderContext builderContext, SyntaxTree[] syntaxTrees, string libraryFile, HashSet references) + private Assembly Compile(IBuilderContext builderContext, IEnumerable syntaxTrees, IEnumerable embeddedTexts, string libraryFile, HashSet references) { // Add references var portableExecutableReferences = new List(); @@ -447,16 +454,17 @@ private Assembly Compile(IBuilderContext builderContext, SyntaxTree[] syntaxTree // Compile var compilationOptions = new CSharpCompilationOptions( OutputKind.DynamicallyLinkedLibrary, - //optimizationLevel: OptimizationLevel.Release, + optimizationLevel: OptimizationLevel.Release, warningLevel: 4 ); var assemblyName = libraryFile != null ? Path.GetFileNameWithoutExtension(libraryFile) : $"Sharpmake_{new Random().Next():X8}" + GetHashCode(); var compilation = CSharpCompilation.Create(assemblyName, syntaxTrees, portableExecutableReferences, compilationOptions); + string pdbFilePath = libraryFile != null ? Path.ChangeExtension(libraryFile, ".pdb") : null; using (var dllStream = new MemoryStream()) using (var pdbStream = new MemoryStream()) { - EmitResult result = compilation.Emit(dllStream, pdbStream, options: new EmitOptions(debugInformationFormat: DebugInformationFormat.PortablePdb)); + EmitResult result = compilation.Emit(dllStream, pdbStream, embeddedTexts: embeddedTexts, options: new EmitOptions(debugInformationFormat: DebugInformationFormat.PortablePdb, pdbFilePath: pdbFilePath)); if (result.Success) { @@ -467,7 +475,7 @@ private Assembly Compile(IBuilderContext builderContext, SyntaxTree[] syntaxTree dllStream.CopyTo(fileStream); pdbStream.Seek(0, SeekOrigin.Begin); - using (var pdbFileStream = new FileStream(Path.ChangeExtension(libraryFile, ".pdb"), FileMode.Create)) + using (var pdbFileStream = new FileStream(pdbFilePath, FileMode.Create)) pdbStream.CopyTo(pdbFileStream); return Assembly.LoadFrom(libraryFile); From 6a3c1b55381eeb676f386050efb02db94f361123 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 14 Oct 2020 08:54:20 +0200 Subject: [PATCH 018/142] Use PortablePdb only with Mono. --- Sharpmake/Assembler.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Sharpmake/Assembler.cs b/Sharpmake/Assembler.cs index d037ce29d..97507adec 100644 --- a/Sharpmake/Assembler.cs +++ b/Sharpmake/Assembler.cs @@ -464,7 +464,15 @@ private Assembly Compile(IBuilderContext builderContext, IEnumerable using (var dllStream = new MemoryStream()) using (var pdbStream = new MemoryStream()) { - EmitResult result = compilation.Emit(dllStream, pdbStream, embeddedTexts: embeddedTexts, options: new EmitOptions(debugInformationFormat: DebugInformationFormat.PortablePdb, pdbFilePath: pdbFilePath)); + EmitResult result = compilation.Emit( + dllStream, + pdbStream, + embeddedTexts: embeddedTexts, + options: new EmitOptions( + debugInformationFormat: Util.IsRunningInMono() ? DebugInformationFormat.PortablePdb : DebugInformationFormat.Pdb, + pdbFilePath: pdbFilePath + ) + ); if (result.Success) { From cc476218b7eee53e6a64c81424303f8b0019c065 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 14 Oct 2020 11:09:29 +0200 Subject: [PATCH 019/142] Fix appveyor unit-tests location. --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 5662bea71..61ada2d6f 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -30,7 +30,7 @@ build_script: test: assemblies: - - 'Sharpmake.UnitTests\bin\*\Sharpmake.UnitTests.dll' + - 'tmp/bin/*/Sharpmake.UnitTests/Sharpmake.UnitTests.dll' after_test: - cmd: python regression_test.py From da39329cc17767a425d869a35d2f1116765860c7 Mon Sep 17 00:00:00 2001 From: Guillaume BUCHLE Date: Fri, 7 Aug 2020 13:54:52 -0400 Subject: [PATCH 020/142] [XCode] Sort source files and ressource files remove the AssetCatalog XCode option, while it is used like any other ressource (use directly project.ResourceFiles) --- Sharpmake.Generators/Apple/XCodeProj.cs | 15 +++++---------- Sharpmake/Options.XCode.cs | 2 ++ 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/Sharpmake.Generators/Apple/XCodeProj.cs b/Sharpmake.Generators/Apple/XCodeProj.cs index efd80dd15..a3056368c 100644 --- a/Sharpmake.Generators/Apple/XCodeProj.cs +++ b/Sharpmake.Generators/Apple/XCodeProj.cs @@ -275,7 +275,9 @@ private void PrepareSections(XCodeGenerationContext context, List(configuration); - XCodeUtil.ResolveProjectPaths(project, assetCatalog); - foreach (string asset in assetCatalog) - { - projectFiles.Add(asset); - } } _projectReferencesGroups = new Dictionary(); @@ -338,8 +333,8 @@ private void PrepareSections(XCodeGenerationContext context, List { return !project.ResourceFiles.Contains(file); }), project, conf, workspacePath); - PrepareResourceFiles(xCodeTargetName, project.ResourceFiles, project, conf); + PrepareSourceFiles(xCodeTargetName, sourceFiles.SortedValues, project, conf, workspacePath); + PrepareResourceFiles(xCodeTargetName, resourceFiles.SortedValues, project, conf); PrepareExternalResourceFiles(xCodeTargetName, project, conf); RegisterScriptBuildPhase(xCodeTargetName, _shellScriptPreBuildPhases, conf.EventPreBuild.GetEnumerator()); diff --git a/Sharpmake/Options.XCode.cs b/Sharpmake/Options.XCode.cs index de8ce1e06..8131e1401 100644 --- a/Sharpmake/Options.XCode.cs +++ b/Sharpmake/Options.XCode.cs @@ -11,6 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +using System; using System.Linq; namespace Sharpmake @@ -186,6 +187,7 @@ public ExternalResourceFolders(params string[] paths) { } } + [Obsolete("AssetCatalog is not used anymore.", error: true)] public class AssetCatalog : Strings { public AssetCatalog(params string[] paths) From 1e1851fb5fa682a9e47740c1ee1337252ae1f1c1 Mon Sep 17 00:00:00 2001 From: Chris Savoie Date: Mon, 19 Oct 2020 14:47:28 +0200 Subject: [PATCH 021/142] Cleanup useless using --- Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs index 0d6280e41..2ebf02dd0 100644 --- a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs +++ b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs @@ -13,7 +13,6 @@ // limitations under the License. using System; using System.Collections.Generic; -using System.Diagnostics.Eventing.Reader; using System.IO; using System.Linq; using System.Text; From a278ed0959e1e5a96effe802e860fe8abbeef318 Mon Sep 17 00:00:00 2001 From: Chris Savoie Date: Mon, 19 Oct 2020 14:48:33 +0200 Subject: [PATCH 022/142] Use SequenceEqual instead of importing memcmp from msvcrt dll --- Sharpmake/Util.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index 566402289..3c99e14ca 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -794,9 +794,6 @@ public static string GetCapitalizedPath(string path) return capitalizedPath; } - [System.Runtime.InteropServices.DllImport("msvcrt.dll", CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)] - private static extern int memcmp(byte[] b1, byte[] b2, long count); - private static bool AreStreamsEqual(Stream stream1, Stream stream2) { const int BufferSize = 4096; @@ -817,7 +814,7 @@ private static bool AreStreamsEqual(Stream stream1, Stream stream2) if (count1 == 0) return true; - if (memcmp(buffer1, buffer2, count1) != 0) + if (!buffer1.SequenceEqual(buffer2)) return false; } } From 19af1b435baf79ad080cf7e3f2a98fc8b13496ed Mon Sep 17 00:00:00 2001 From: Chris Savoie Date: Mon, 19 Oct 2020 14:51:38 +0200 Subject: [PATCH 023/142] Use remote domain Load instead of CreateInstanceAndUnwrap --- Sharpmake/ExtensionLoader.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Sharpmake/ExtensionLoader.cs b/Sharpmake/ExtensionLoader.cs index 763fb07d2..07e5f8e38 100644 --- a/Sharpmake/ExtensionLoader.cs +++ b/Sharpmake/ExtensionLoader.cs @@ -15,7 +15,6 @@ using System.Collections.Generic; using System.IO; using System.Reflection; -using System.Security.Policy; namespace Sharpmake { @@ -205,8 +204,8 @@ private void CreateRemoteExtensionCheckerIfNeeded() { if (_validator == null) { - _remoteDomain = AppDomain.CreateDomain("ExtensionHelperDomain", new Evidence(AppDomain.CurrentDomain.Evidence)); - _validator = _remoteDomain.CreateInstanceAndUnwrap(typeof(ExtensionChecker).Assembly.FullName, typeof(ExtensionChecker).FullName) as ExtensionChecker; + _remoteDomain = AppDomain.CreateDomain("ExtensionHelperDomain"); + _validator = _remoteDomain.Load(typeof(ExtensionChecker).Assembly.FullName).CreateInstance(typeof(ExtensionChecker).FullName) as ExtensionChecker; } } } From 63005093066e9fa10660b59c47ec3e461a393e1e Mon Sep 17 00:00:00 2001 From: Chris Savoie Date: Fri, 31 May 2019 22:02:33 -0700 Subject: [PATCH 024/142] [Sample Output] Fix UpdateSamplesOutput.bat to use sharpmake from tmp folder --- UpdateSamplesOutput.bat | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/UpdateSamplesOutput.bat b/UpdateSamplesOutput.bat index f7e9ae769..ee05231eb 100644 --- a/UpdateSamplesOutput.bat +++ b/UpdateSamplesOutput.bat @@ -36,9 +36,9 @@ if not "%ERRORLEVEL_BACKUP%" == "0" goto error call :UpdateRef samples NetCore\DotNetCoreFrameworkHelloWorld HelloWorld.sharpmake.cs reference NetCore\DotNetCoreFrameworkHelloWorld if not "%ERRORLEVEL_BACKUP%" == "0" goto error -call :UpdateRef samples NetCore\DotNetFrameworkHelloWorld HelloWorld.sharpmake.cs reference NetCore\DotNetFrameworkHelloWorld +call :UpdateRef samples NetCore\DotNetFrameworkHelloWorld HelloWorld.sharpmake.cs reference NetCore\DotNetFrameworkHelloWorld if not "%ERRORLEVEL_BACKUP%" == "0" goto error -call :UpdateRef samples NetCore\DotNetMultiFrameworksHelloWorld HelloWorld.sharpmake.cs reference NetCore\DotNetMultiFrameworksHelloWorld +call :UpdateRef samples NetCore\DotNetMultiFrameworksHelloWorld HelloWorld.sharpmake.cs reference NetCore\DotNetMultiFrameworksHelloWorld if not "%ERRORLEVEL_BACKUP%" == "0" goto error :: functional tests @@ -62,9 +62,9 @@ pushd %CD% :: set testScopedCurrentDirectory as current cd /d %~dp0%~1 -set SHARPMAKE_EXECUTABLE=%~dp0bin\Debug\Sharpmake.Application.exe -if not exist %SHARPMAKE_EXECUTABLE% set SHARPMAKE_EXECUTABLE=%~dp0bin\Release\Sharpmake.Application.exe -if not exist %SHARPMAKE_EXECUTABLE% echo Cannot find sharpmake executable in %~dp0bin & pause & goto error +set SHARPMAKE_EXECUTABLE=%~dp0tmp\bin\debug\Sharpmake.Application\Sharpmake.Application.exe +if not exist %SHARPMAKE_EXECUTABLE% set SHARPMAKE_EXECUTABLE=%~dp0tmp\bin\release\Sharpmake.Application\Sharpmake.Application.exe +if not exist %SHARPMAKE_EXECUTABLE% echo Cannot find sharpmake executable in %~dp0tmp\bin\[debug|release]\Sharpmake.Application & pause & goto error echo Using executable %SHARPMAKE_EXECUTABLE% From acea2dcaf4ed313123af762ca5536b9a200eb852 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 20 Oct 2020 12:13:54 +0200 Subject: [PATCH 025/142] Allow Sharpmake to dump profiling tags as a JSON that can be opened in Chrome Add /profile("c:\path\to\file.json") to the command line, and open the file by navigating to chrome://tracing. Thanks to Nicolas Fleury for finalising the feature. --- Sharpmake.Application/CommandLineArguments.cs | 7 + Sharpmake.Application/Program.cs | 50 ++- Sharpmake.Generators/FastBuild/Bff.cs | 46 ++- Sharpmake.Generators/VisualStudio/Vcxproj.cs | 302 ++++++++------- Sharpmake/Builder.cs | 214 +++++++++-- Sharpmake/Project.cs | 357 +++++++++--------- Sharpmake/Solution.cs | 328 ++++++++-------- Sharpmake/Util.cs | 27 +- 8 files changed, 787 insertions(+), 544 deletions(-) diff --git a/Sharpmake.Application/CommandLineArguments.cs b/Sharpmake.Application/CommandLineArguments.cs index 696b7e534..2c0ba82b5 100644 --- a/Sharpmake.Application/CommandLineArguments.cs +++ b/Sharpmake.Application/CommandLineArguments.cs @@ -46,6 +46,7 @@ public enum InputType public string[] Assemblies = new string[0]; public HashSet Defines = new HashSet(); public InputType Input = InputType.Undefined; + public string ProfileFile = null; public bool Exit = false; public bool BlobOnly = false; public bool CleanBlobsOnly = false; @@ -95,6 +96,12 @@ public void SetDefines(params string[] defines) DebugWriteLine(" " + define); } + [CommandLine.Option("profile", @"Profile file used to activate and output profiling: ex: /profile( @""D:\profile.json"" )")] + public void SetProfileFile(string profileFile) + { + ProfileFile = profileFile; + } + [CommandLine.Option("projectlogfiles", @"log files contained in a project for debug purpose: ex: /projectlogfiles( ""s:\p4\ac\dev\sharpmake\projects\win32\system\system.vcproj"" )")] public void ProjectLogFiles(string projectFile) { diff --git a/Sharpmake.Application/Program.cs b/Sharpmake.Application/Program.cs index 98c38e9c7..ae2a0d5b2 100644 --- a/Sharpmake.Application/Program.cs +++ b/Sharpmake.Application/Program.cs @@ -444,16 +444,19 @@ private static void CreateBuilderAndGenerate(BuildContext.BaseBuildContext build } else { - if (parameters.GenerateDebugSolution) - LogWriteLine("Generate debug solution..."); + IDictionary outputs; + using (Builder.Instance.CreateProfilingScope("Generate")) + outputs = builder.Generate(); - var outputs = builder.Generate(); foreach (var output in outputs) { if (output.Value.Exception != null) throw new Error(output.Value.Exception, "Error encountered while generating {0}", output.Key); } + if (!string.IsNullOrEmpty(parameters.ProfileFile)) + builder.DumpTraceFile(parameters.ProfileFile); + if (parameters.DumpDependency) DependencyTracker.Instance.DumpGraphs(outputs); @@ -598,28 +601,38 @@ public static Builder CreateBuilder(BuildContext.BaseBuildContext context, Argum if (parameters.ProfileOutput) builder.EventOutputProfile += LogWrite; + if (!string.IsNullOrEmpty(parameters.ProfileFile)) + builder.EnableProfiling(); + try { // Generate debug solution - if (generateDebugSolution) + using (Builder.Instance.CreateProfilingScope("Debug solution")) { - DebugProjectGenerator.GenerateDebugSolution(parameters.Sources, builder.Arguments, parameters.DebugSolutionStartArguments, parameters.Defines.ToArray()); - builder.BuildProjectAndSolution(); - return builder; + if (generateDebugSolution) + { + LogWriteLine("Generate debug solution..."); + DebugProjectGenerator.GenerateDebugSolution(parameters.Sources, builder.Arguments, parameters.DebugSolutionStartArguments, parameters.Defines.ToArray()); + builder.BuildProjectAndSolution(); + return builder; + } } // Load user input (either files or pre-built assemblies) - switch (parameters.Input) + using (Builder.Instance.CreateProfilingScope("EntryPoints")) { - case Argument.InputType.File: - builder.ExecuteEntryPointInAssemblies
(builder.LoadSharpmakeFiles(parameters.Sources)); - break; - case Argument.InputType.Assembly: - builder.ExecuteEntryPointInAssemblies
(builder.LoadAssemblies(parameters.Assemblies)); - break; - case Argument.InputType.Undefined: - default: - throw new Error("Sharpmake input missing, use /sources() or /assemblies()"); + switch (parameters.Input) + { + case Argument.InputType.File: + builder.ExecuteEntryPointInAssemblies
(builder.LoadSharpmakeFiles(parameters.Sources)); + break; + case Argument.InputType.Assembly: + builder.ExecuteEntryPointInAssemblies
(builder.LoadAssemblies(parameters.Assemblies)); + break; + case Argument.InputType.Undefined: + default: + throw new Error("Sharpmake input missing, use /sources() or /assemblies()"); + } } if (builder.Arguments.TypesToGenerate.Count == 0) @@ -628,7 +641,8 @@ public static Builder CreateBuilder(BuildContext.BaseBuildContext context, Argum builder.Context.ConfigureOrder = builder.Arguments.ConfigureOrder; // Call all configuration's methods and resolve project/solution member's values - builder.BuildProjectAndSolution(); + using (Builder.Instance.CreateProfilingScope("Build")) + builder.BuildProjectAndSolution(); return builder; } diff --git a/Sharpmake.Generators/FastBuild/Bff.cs b/Sharpmake.Generators/FastBuild/Bff.cs index adb6bd791..eae7a8761 100644 --- a/Sharpmake.Generators/FastBuild/Bff.cs +++ b/Sharpmake.Generators/FastBuild/Bff.cs @@ -206,36 +206,46 @@ List skipFiles string projectBffFile = Bff.GetBffFileName(projectPath, firstConf.BffFileName); // TODO: bff file name could be different per conf, hence we would generate more than one file string fastBuildClrSupport = Util.IsDotNet(firstConf) ? "/clr" : FileGeneratorUtilities.RemoveLineTag; List filesInNonDefaultSection; - var confSourceFiles = GetGeneratedFiles(context, configurations, out filesInNonDefaultSection); + Dictionary>, List>> confSourceFiles; + using (builder.CreateProfilingScope("BffGenerator.Generate:GetGeneratedFiles")) + { + confSourceFiles = GetGeneratedFiles(context, configurations, out filesInNonDefaultSection); + } // Generate all configuration options onces... var options = new Dictionary(); var cmdLineOptions = new Dictionary(); var additionalDependenciesPerConf = new Dictionary(); - var projectOptionsGen = new ProjectOptionsGenerator(); - foreach (Project.Configuration conf in configurations) + ProjectOptionsGenerator projectOptionsGen; + using (builder.CreateProfilingScope("BffGenerator.Generate:ProjectOptionsGenerator()")) { - context.Options = new Options.ExplicitOptions(); - context.CommandLineOptions = new ProjectOptionsGenerator.VcxprojCmdLineOptions(); - context.Configuration = conf; + projectOptionsGen = new ProjectOptionsGenerator(); + } + using (builder.CreateProfilingScope("BffGenerator.Generate:confs1")) + { + foreach (Project.Configuration conf in configurations) + { + context.Options = new Options.ExplicitOptions(); + context.CommandLineOptions = new ProjectOptionsGenerator.VcxprojCmdLineOptions(); + context.Configuration = conf; - GenerateBffOptions(projectOptionsGen, context, additionalDependenciesPerConf); + GenerateBffOptions(projectOptionsGen, context, additionalDependenciesPerConf); - options.Add(conf, context.Options); - cmdLineOptions.Add(conf, (ProjectOptionsGenerator.VcxprojCmdLineOptions)context.CommandLineOptions); + options.Add(conf, context.Options); + cmdLineOptions.Add(conf, (ProjectOptionsGenerator.VcxprojCmdLineOptions)context.CommandLineOptions); - // Validation of unsupported cases - if (conf.EventPreLink.Count > 0) - throw new Error("Sharpmake-FastBuild : Pre-Link Events not yet supported."); - if (context.Options["IgnoreImportLibrary"] == "true") - throw new Error("Sharpmake-FastBuild : IgnoreImportLibrary not yet supported."); + // Validation of unsupported cases + if (conf.EventPreLink.Count > 0) + throw new Error("Sharpmake-FastBuild : Pre-Link Events not yet supported."); + if (context.Options["IgnoreImportLibrary"] == "true") + throw new Error("Sharpmake-FastBuild : IgnoreImportLibrary not yet supported."); - if (conf.Output != Project.Configuration.OutputType.None && conf.FastBuildBlobbed) - { - ConfigureUnities(context, confSourceFiles); + if (conf.Output != Project.Configuration.OutputType.None && conf.FastBuildBlobbed) + { + ConfigureUnities(context, confSourceFiles); + } } } - ResolveUnities(project, projectPath); // Start writing Bff diff --git a/Sharpmake.Generators/VisualStudio/Vcxproj.cs b/Sharpmake.Generators/VisualStudio/Vcxproj.cs index 057cffe70..09e7596ae 100644 --- a/Sharpmake.Generators/VisualStudio/Vcxproj.cs +++ b/Sharpmake.Generators/VisualStudio/Vcxproj.cs @@ -437,17 +437,20 @@ private void GenerateImpl(GenerationContext context, IList generatedFile uf.GenerateUserFile(context.Builder, context.Project, context.ProjectConfigurations, generatedFiles, skipFiles); // configuration general - foreach (Project.Configuration conf in context.ProjectConfigurations) + using (Builder.Instance.CreateProfilingScope("GenerateImpl:confs2", context.ProjectConfigurations.Count)) { - context.Configuration = conf; - - using (fileGenerator.Declare("platformName", Util.GetPlatformString(conf.Platform, conf.Project, conf.Target))) - using (fileGenerator.Declare("conf", conf)) - using (fileGenerator.Declare("options", context.ProjectConfigurationOptions[conf])) - using (fileGenerator.Declare("clrSupport", (conf.IsFastBuild || !clrSupport) ? FileGeneratorUtilities.RemoveLineTag : clrSupport.ToString().ToLower())) + foreach (Project.Configuration conf in context.ProjectConfigurations) { - var platformVcxproj = context.PresentPlatforms[conf.Platform]; - platformVcxproj.GenerateProjectConfigurationGeneral(context, fileGenerator); + context.Configuration = conf; + + using (fileGenerator.Declare("platformName", Util.GetPlatformString(conf.Platform, conf.Project, conf.Target))) + using (fileGenerator.Declare("conf", conf)) + using (fileGenerator.Declare("options", context.ProjectConfigurationOptions[conf])) + using (fileGenerator.Declare("clrSupport", (conf.IsFastBuild || !clrSupport) ? FileGeneratorUtilities.RemoveLineTag : clrSupport.ToString().ToLower())) + { + var platformVcxproj = context.PresentPlatforms[conf.Platform]; + platformVcxproj.GenerateProjectConfigurationGeneral(context, fileGenerator); + } } } @@ -466,154 +469,160 @@ private void GenerateImpl(GenerationContext context, IList generatedFile fileGenerator.Write(Template.Project.ProjectAfterImportedProps); // configuration general2 - foreach (Project.Configuration conf in context.ProjectConfigurations) + using (Builder.Instance.CreateProfilingScope("GenerateImpl:confs3", context.ProjectConfigurations.Count)) { - context.Configuration = conf; - - using (fileGenerator.Declare("project", context.Project)) - using (fileGenerator.Declare("platformName", Util.GetPlatformString(conf.Platform, conf.Project, conf.Target))) - using (fileGenerator.Declare("conf", conf)) - using (fileGenerator.Declare("options", context.ProjectConfigurationOptions[conf])) - using (fileGenerator.Declare("target", conf.Target)) + foreach (Project.Configuration conf in context.ProjectConfigurations) { - var platformVcxproj = context.PresentPlatforms[conf.Platform]; + context.Configuration = conf; - if (conf.IsFastBuild) + using (fileGenerator.Declare("project", context.Project)) + using (fileGenerator.Declare("platformName", Util.GetPlatformString(conf.Platform, conf.Project, conf.Target))) + using (fileGenerator.Declare("conf", conf)) + using (fileGenerator.Declare("options", context.ProjectConfigurationOptions[conf])) + using (fileGenerator.Declare("target", conf.Target)) { - var fastBuildCommandLineOptions = new List(); + var platformVcxproj = context.PresentPlatforms[conf.Platform]; + + if (conf.IsFastBuild) + { + var fastBuildCommandLineOptions = new List(); - if (FastBuildSettings.FastBuildUseIDE) - fastBuildCommandLineOptions.Add("-ide"); + if (FastBuildSettings.FastBuildUseIDE) + fastBuildCommandLineOptions.Add("-ide"); - if (FastBuildSettings.FastBuildReport) - fastBuildCommandLineOptions.Add("-report"); + if (FastBuildSettings.FastBuildReport) + fastBuildCommandLineOptions.Add("-report"); - if (FastBuildSettings.FastBuildNoSummaryOnError) - fastBuildCommandLineOptions.Add("-nosummaryonerror"); + if (FastBuildSettings.FastBuildNoSummaryOnError) + fastBuildCommandLineOptions.Add("-nosummaryonerror"); - if (FastBuildSettings.FastBuildSummary) - fastBuildCommandLineOptions.Add("-summary"); + if (FastBuildSettings.FastBuildSummary) + fastBuildCommandLineOptions.Add("-summary"); - if (FastBuildSettings.FastBuildVerbose) - fastBuildCommandLineOptions.Add("-verbose"); + if (FastBuildSettings.FastBuildVerbose) + fastBuildCommandLineOptions.Add("-verbose"); - if (FastBuildSettings.FastBuildMonitor) - fastBuildCommandLineOptions.Add("-monitor"); + if (FastBuildSettings.FastBuildMonitor) + fastBuildCommandLineOptions.Add("-monitor"); - // Configuring cache mode if that configuration is allowed to use caching - if (conf.FastBuildCacheAllowed) - { - // Setting the appropriate cache type commandline for that target. - switch (FastBuildSettings.CacheType) + // Configuring cache mode if that configuration is allowed to use caching + if (conf.FastBuildCacheAllowed) { - case FastBuildSettings.CacheTypes.CacheRead: - fastBuildCommandLineOptions.Add("-cacheread"); - break; - case FastBuildSettings.CacheTypes.CacheWrite: - fastBuildCommandLineOptions.Add("-cachewrite"); - break; - case FastBuildSettings.CacheTypes.CacheReadWrite: - fastBuildCommandLineOptions.Add("-cache"); - break; - default: - break; + // Setting the appropriate cache type commandline for that target. + switch (FastBuildSettings.CacheType) + { + case FastBuildSettings.CacheTypes.CacheRead: + fastBuildCommandLineOptions.Add("-cacheread"); + break; + case FastBuildSettings.CacheTypes.CacheWrite: + fastBuildCommandLineOptions.Add("-cachewrite"); + break; + case FastBuildSettings.CacheTypes.CacheReadWrite: + fastBuildCommandLineOptions.Add("-cache"); + break; + default: + break; + } } - } - if (FastBuildSettings.FastBuildDistribution && conf.FastBuildDistribution) - fastBuildCommandLineOptions.Add("-dist"); + if (FastBuildSettings.FastBuildDistribution && conf.FastBuildDistribution) + fastBuildCommandLineOptions.Add("-dist"); - if (FastBuildSettings.FastBuildWait) - fastBuildCommandLineOptions.Add("-wait"); + if (FastBuildSettings.FastBuildWait) + fastBuildCommandLineOptions.Add("-wait"); - if (FastBuildSettings.FastBuildNoStopOnError) - fastBuildCommandLineOptions.Add("-nostoponerror"); + if (FastBuildSettings.FastBuildNoStopOnError) + fastBuildCommandLineOptions.Add("-nostoponerror"); - if (FastBuildSettings.FastBuildFastCancel) - fastBuildCommandLineOptions.Add("-fastcancel"); + if (FastBuildSettings.FastBuildFastCancel) + fastBuildCommandLineOptions.Add("-fastcancel"); - if (FastBuildSettings.FastBuildNoUnity) - fastBuildCommandLineOptions.Add("-nounity"); + if (FastBuildSettings.FastBuildNoUnity) + fastBuildCommandLineOptions.Add("-nounity"); - if (!string.IsNullOrEmpty(conf.FastBuildCustomArgs)) - fastBuildCommandLineOptions.Add(conf.FastBuildCustomArgs); + if (!string.IsNullOrEmpty(conf.FastBuildCustomArgs)) + fastBuildCommandLineOptions.Add(conf.FastBuildCustomArgs); - if (!string.IsNullOrEmpty(FastBuildCustomArguments)) - fastBuildCommandLineOptions.Add(FastBuildCustomArguments); + if (!string.IsNullOrEmpty(FastBuildCustomArguments)) + fastBuildCommandLineOptions.Add(FastBuildCustomArguments); - string commandLine = string.Join(" ", fastBuildCommandLineOptions); + string commandLine = string.Join(" ", fastBuildCommandLineOptions); - // Make the commandline written in the bff available, except the master bff -config - Bff.SetCommandLineArguments(conf, commandLine); + // Make the commandline written in the bff available, except the master bff -config + Bff.SetCommandLineArguments(conf, commandLine); - commandLine += " -config $(SolutionName)" + FastBuildSettings.FastBuildConfigFileExtension; + commandLine += " -config $(SolutionName)" + FastBuildSettings.FastBuildConfigFileExtension; - using (fileGenerator.Declare("relativeMasterBffPath", "$(SolutionDir)")) - using (fileGenerator.Declare("fastBuildMakeCommandBuild", context.FastBuildMakeCommandGenerator.GetCommand(FastBuildMakeCommandGenerator.BuildType.Build, conf, commandLine))) - using (fileGenerator.Declare("fastBuildMakeCommandRebuild", context.FastBuildMakeCommandGenerator.GetCommand(FastBuildMakeCommandGenerator.BuildType.Rebuild, conf, commandLine))) + using (fileGenerator.Declare("relativeMasterBffPath", "$(SolutionDir)")) + using (fileGenerator.Declare("fastBuildMakeCommandBuild", context.FastBuildMakeCommandGenerator.GetCommand(FastBuildMakeCommandGenerator.BuildType.Build, conf, commandLine))) + using (fileGenerator.Declare("fastBuildMakeCommandRebuild", context.FastBuildMakeCommandGenerator.GetCommand(FastBuildMakeCommandGenerator.BuildType.Rebuild, conf, commandLine))) + { + platformVcxproj.GenerateProjectConfigurationFastBuildMakeFile(context, fileGenerator); + } + } + else if (conf.CustomBuildSettings != null) { - platformVcxproj.GenerateProjectConfigurationFastBuildMakeFile(context, fileGenerator); + platformVcxproj.GenerateProjectConfigurationCustomMakeFile(context, fileGenerator); + } + else + { + platformVcxproj.GenerateProjectConfigurationGeneral2(context, fileGenerator); } - } - else if (conf.CustomBuildSettings != null) - { - platformVcxproj.GenerateProjectConfigurationCustomMakeFile(context, fileGenerator); - } - else - { - platformVcxproj.GenerateProjectConfigurationGeneral2(context, fileGenerator); } } } // configuration ItemDefinitionGroup - foreach (Project.Configuration conf in context.ProjectConfigurations) + using (Builder.Instance.CreateProfilingScope("GenerateImpl:confs4", context.ProjectConfigurations.Count)) { - context.Configuration = conf; - - if (!conf.IsFastBuild) + foreach (Project.Configuration conf in context.ProjectConfigurations) { - using (fileGenerator.Declare("platformName", Util.GetPlatformString(conf.Platform, conf.Project, conf.Target))) - using (fileGenerator.Declare("conf", conf)) - using (fileGenerator.Declare("project", conf.Project)) - using (fileGenerator.Declare("target", conf.Target)) - using (fileGenerator.Declare("options", context.ProjectConfigurationOptions[conf])) - using (fileGenerator.Declare("clrSupport", !clrSupport ? FileGeneratorUtilities.RemoveLineTag : clrSupport.ToString().ToLower())) + context.Configuration = conf; + + if (!conf.IsFastBuild) { - fileGenerator.Write(Template.Project.ProjectConfigurationBeginItemDefinition); + using (fileGenerator.Declare("platformName", Util.GetPlatformString(conf.Platform, conf.Project, conf.Target))) + using (fileGenerator.Declare("conf", conf)) + using (fileGenerator.Declare("project", conf.Project)) + using (fileGenerator.Declare("target", conf.Target)) + using (fileGenerator.Declare("options", context.ProjectConfigurationOptions[conf])) + using (fileGenerator.Declare("clrSupport", !clrSupport ? FileGeneratorUtilities.RemoveLineTag : clrSupport.ToString().ToLower())) + { + fileGenerator.Write(Template.Project.ProjectConfigurationBeginItemDefinition); - var platformVcxproj = context.PresentPlatforms[conf.Platform]; - platformVcxproj.GenerateProjectCompileVcxproj(context, fileGenerator); - platformVcxproj.GenerateProjectLinkVcxproj(context, fileGenerator); + var platformVcxproj = context.PresentPlatforms[conf.Platform]; + platformVcxproj.GenerateProjectCompileVcxproj(context, fileGenerator); + platformVcxproj.GenerateProjectLinkVcxproj(context, fileGenerator); - if (conf.Project.ContainsASM) - platformVcxproj.GenerateProjectMasmVcxproj(context, fileGenerator); + if (conf.Project.ContainsASM) + platformVcxproj.GenerateProjectMasmVcxproj(context, fileGenerator); - if (conf.EventPreBuild.Count != 0) - fileGenerator.Write(Template.Project.ProjectConfigurationsPreBuildEvent); + if (conf.EventPreBuild.Count != 0) + fileGenerator.Write(Template.Project.ProjectConfigurationsPreBuildEvent); - if (conf.EventPreLink.Count != 0) - fileGenerator.Write(Template.Project.ProjectConfigurationsPreLinkEvent); + if (conf.EventPreLink.Count != 0) + fileGenerator.Write(Template.Project.ProjectConfigurationsPreLinkEvent); - if (conf.EventPrePostLink.Count != 0) - fileGenerator.Write(Template.Project.ProjectConfigurationsPrePostLinkEvent); + if (conf.EventPrePostLink.Count != 0) + fileGenerator.Write(Template.Project.ProjectConfigurationsPrePostLinkEvent); - if (conf.EventPostBuild.Count != 0) - fileGenerator.Write(Template.Project.ProjectConfigurationsPostBuildEvent); + if (conf.EventPostBuild.Count != 0) + fileGenerator.Write(Template.Project.ProjectConfigurationsPostBuildEvent); - if (conf.CustomBuildStep.Count != 0) - fileGenerator.Write(Template.Project.ProjectConfigurationsCustomBuildStep); + if (conf.CustomBuildStep.Count != 0) + fileGenerator.Write(Template.Project.ProjectConfigurationsCustomBuildStep); - if (conf.EventCustomBuild.Count != 0) - fileGenerator.Write(Template.Project.ProjectConfigurationsCustomBuildEvent); + if (conf.EventCustomBuild.Count != 0) + fileGenerator.Write(Template.Project.ProjectConfigurationsCustomBuildEvent); - if (conf.Platform.IsPC()) - fileGenerator.Write(Template.Project.ProjectConfigurationsResourceCompile); + if (conf.Platform.IsPC()) + fileGenerator.Write(Template.Project.ProjectConfigurationsResourceCompile); - if (conf.AdditionalManifestFiles.Count != 0 || (Options.GetObjects(conf).Any()) && (conf.Platform.IsPC() && conf.Platform.IsMicrosoft())) - fileGenerator.Write(Template.Project.ProjectConfigurationsManifestTool); + if (conf.AdditionalManifestFiles.Count != 0 || (Options.GetObjects(conf).Any()) && (conf.Platform.IsPC() && conf.Platform.IsMicrosoft())) + fileGenerator.Write(Template.Project.ProjectConfigurationsManifestTool); - fileGenerator.Write(Template.Project.ProjectConfigurationEndItemDefinition); + fileGenerator.Write(Template.Project.ProjectConfigurationEndItemDefinition); + } } } } @@ -622,7 +631,10 @@ private void GenerateImpl(GenerationContext context, IList generatedFile // source file requires to be remove from the projects, so that not 2 same cpp file be in 2 different project. // TODO: make a better check if (hasNonFastBuildConfig || !context.Project.StripFastBuildSourceFiles || context.ProjectConfigurations.Any(conf => !conf.StripFastBuildSourceFiles)) - GenerateFilesSection(context, fileGenerator, generatedFiles, skipFiles); + { + using (Builder.Instance.CreateProfilingScope("GenerateFilesSection")) + GenerateFilesSection(context, fileGenerator, generatedFiles, skipFiles); + } else if (hasFastBuildConfig) GenerateBffFilesSection(context, fileGenerator); @@ -1294,48 +1306,54 @@ IList skipFiles // Gather files with custom build steps. var configurationCustomFileBuildSteps = new Dictionary>(); Strings configurationCustomBuildFiles = new Strings(); - foreach (Project.Configuration config in context.ProjectConfigurations) + using (Builder.Instance.CreateProfilingScope("GenerateFilesSection:confs1", context.ProjectConfigurations.Count)) { - using (fileGenerator.Resolver.NewScopedParameter("project", context.Project)) - using (fileGenerator.Resolver.NewScopedParameter("config", config)) - using (fileGenerator.Resolver.NewScopedParameter("target", config.Target)) + foreach (Project.Configuration config in context.ProjectConfigurations) { - var customFileBuildSteps = CombineCustomFileBuildSteps(context.ProjectDirectory, fileGenerator.Resolver, config.CustomFileBuildSteps.Where(step => step.Filter != Project.Configuration.CustomFileBuildStep.ProjectFilter.BFFOnly)); - configurationCustomFileBuildSteps.Add(config, customFileBuildSteps); - foreach (var customBuildSetup in customFileBuildSteps) + using (fileGenerator.Resolver.NewScopedParameter("project", context.Project)) + using (fileGenerator.Resolver.NewScopedParameter("config", config)) + using (fileGenerator.Resolver.NewScopedParameter("target", config.Target)) { - configurationCustomBuildFiles.Add(customBuildSetup.Key); + var customFileBuildSteps = CombineCustomFileBuildSteps(context.ProjectDirectory, fileGenerator.Resolver, config.CustomFileBuildSteps.Where(step => step.Filter != Project.Configuration.CustomFileBuildStep.ProjectFilter.BFFOnly)); + configurationCustomFileBuildSteps.Add(config, customFileBuildSteps); + foreach (var customBuildSetup in customFileBuildSteps) + { + configurationCustomBuildFiles.Add(customBuildSetup.Key); + } } } } // type -> files var customSourceFiles = new Dictionary>(); - foreach (var projectFile in allFiles) + using (Builder.Instance.CreateProfilingScope("GenerateFilesSection:allFiles", allFiles.Count)) { - string type = null; - if (context.Project.ExtensionBuildTools.TryGetValue(projectFile.FileExtension, out type)) + foreach (var projectFile in allFiles) { - List files = null; - if (!customSourceFiles.TryGetValue(type, out files)) + string type = null; + if (context.Project.ExtensionBuildTools.TryGetValue(projectFile.FileExtension, out type)) { - files = new List(); - customSourceFiles[type] = files; + List files = null; + if (!customSourceFiles.TryGetValue(type, out files)) + { + files = new List(); + customSourceFiles[type] = files; + } + files.Add(projectFile); + } + else if (configurationCustomBuildFiles.Contains(projectFile.FileNameProjectRelative)) + { + customBuildFiles.Add(projectFile); + } + else if (context.Project.SourceFilesCompileExtensions.Contains(projectFile.FileExtension) || + (String.Compare(projectFile.FileExtension, ".rc", StringComparison.OrdinalIgnoreCase) == 0)) + { + sourceFiles.Add(projectFile); + } + else // if (projectFile.FileExtension == "h") + { + includeFiles.Add(projectFile); } - files.Add(projectFile); - } - else if (configurationCustomBuildFiles.Contains(projectFile.FileNameProjectRelative)) - { - customBuildFiles.Add(projectFile); - } - else if (context.Project.SourceFilesCompileExtensions.Contains(projectFile.FileExtension) || - (String.Compare(projectFile.FileExtension, ".rc", StringComparison.OrdinalIgnoreCase) == 0)) - { - sourceFiles.Add(projectFile); - } - else // if (projectFile.FileExtension == "h") - { - includeFiles.Add(projectFile); } } diff --git a/Sharpmake/Builder.cs b/Sharpmake/Builder.cs index 7af99c152..438776612 100644 --- a/Sharpmake/Builder.cs +++ b/Sharpmake/Builder.cs @@ -20,6 +20,7 @@ using System.Linq; using System.Reflection; using System.Text.RegularExpressions; +using System.Threading; namespace Sharpmake { @@ -134,6 +135,110 @@ public class Builder : IDisposable private readonly ConcurrentDictionary _builtAssemblies = new ConcurrentDictionary(); // Assembly Full Path -> Assembly private readonly Dictionary _references = new Dictionary(); // Keep track of assemblies explicitly referenced with [module: Sharpmake.Reference("...")] in compiled files + private class ProfilingCompleteEvent + { + public static readonly string pid = Process.GetCurrentProcess().Id.ToString(); // The process ID for the process that output this event + public string name; // The name of the event, as displayed in Trace Viewer + public string tid; // The thread ID for the thread that output this event + public string ts; // The tracing clock timestamp of the event. The timestamps are provided at microsecond granularity + + public string dur; // comes with the above: tracing clock duration of complete events in microseconds + public int count = -1; + + public string ToJsonString() + { + if (count != -1) + return $"{{ \"pid\":{pid}, \"tid\":{tid}, \"ts\":{ts}, \"dur\":{dur}, \"ph\":\"X\", \"name\":\"{name}\", \"args\": {{\"count\": {count}}}}}"; + else + return $"{{ \"pid\":{pid}, \"tid\":{tid}, \"ts\":{ts}, \"dur\":{dur}, \"ph\":\"X\", \"name\":\"{name}\" }}"; + } + } + private readonly ConcurrentBag _profilingCompleteEvents = new ConcurrentBag(); + + private class ProfilingInstantEvent + { + public static readonly string pid = Process.GetCurrentProcess().Id.ToString(); // The process ID for the process that output this event + public string name; // The name of the event, as displayed in Trace Viewer + public string tid; // The thread ID for the thread that output this event + public string ts; // The tracing clock timestamp of the event. The timestamps are provided at microsecond granularity + + public string ToJsonString() + { + return $"{{ \"pid\":{pid}, \"tid\":{tid}, \"ts\":{ts}, \"ph\":\"i\", \"name\":\"{name}\" }}"; + } + } + private readonly ConcurrentBag _profilingInstantEvents = new ConcurrentBag(); + + + public void AddProfilingCompleteEvent(string name, long startTicks, long endTicks, int countArg = -1) + { + var durTicks = endTicks - startTicks; + if (durTicks > 0) + { + double start = 1000000.0 * (double)startTicks / Stopwatch.Frequency; + double end = 1000000.0 * (double)endTicks / Stopwatch.Frequency; + double dur = end - start; + + _profilingCompleteEvents.Add(new ProfilingCompleteEvent + { + name = name, + tid = Thread.CurrentThread.ManagedThreadId.ToString(), + dur = dur.ToString(), + ts = start.ToString(), + count = countArg + }); + } + } + + public void AddProfilingInstantEvent(string name) + { + double start = 1000000.0 * (double)Stopwatch.GetTimestamp() / Stopwatch.Frequency; + + _profilingInstantEvents.Add(new ProfilingInstantEvent + { + name = name, + tid = Thread.CurrentThread.ManagedThreadId.ToString(), + ts = start.ToString(), + }); + } + + private class TraceFile { } + + private string _traceFileHeaderTemplate = @"{ ""traceEvents"": [" + Environment.NewLine; + private string _traceFileFooterTemplate = @"]}"; + + public void DumpTraceFile(string filePath) + { + if (_profilingCompleteEvents.IsEmpty && _profilingInstantEvents.IsEmpty) + return; + + var mStream = new MemoryStream(); + var writer = new StreamWriter(mStream); + { + writer.Write(_traceFileHeaderTemplate); + var lines = new List(_profilingCompleteEvents.Count + _profilingInstantEvents.Count); + foreach (var traceEvent in _profilingCompleteEvents) + { + lines.Add(traceEvent.ToJsonString()); + } + foreach (var traceEvent in _profilingInstantEvents) + { + lines.Add(traceEvent.ToJsonString()); + } + writer.Write(string.Join("," + Environment.NewLine, lines)); + writer.Write(_traceFileFooterTemplate); + } + writer.Flush(); + + var generationOutput = new GenerationOutput(); + if (Util.FileWriteIfDifferentInternal(new FileInfo(filePath), mStream, bypassAutoCleanupDatabase: true)) + generationOutput.Generated.Add(filePath); + else + generationOutput.Skipped.Add(filePath); + + ReportGenerated(typeof(TraceFile), generationOutput); + } + public BuildContext.BaseBuildContext Context { get; private set; } private readonly BuilderExtension _builderExt; @@ -251,6 +356,31 @@ public void ExecuteEntryPointInAssemblies(params Assembly[] assembl } } + private bool _profilingEnabled = false; + public void EnableProfiling() + { + _profilingEnabled = true; + } + + public Util.StopwatchProfiler CreateProfilingScope(string name) + { + if (!_profilingEnabled) + return null; + return new Util.StopwatchProfiler((start, end) => { AddProfilingCompleteEvent(name, start, end); }); + } + public Util.StopwatchProfiler CreateProfilingScope(string name, int countArg) + { + if (!_profilingEnabled) + return null; + return new Util.StopwatchProfiler((start, end) => { AddProfilingCompleteEvent(name, start, end, countArg); }); + } + public void CreateProfilingInstant(string name) + { + if (!_profilingEnabled) + return; + AddProfilingInstantEvent(name); + } + public void BuildProjectAndSolution() { LogWriteLine(" building projects and solutions configurations{0}...", _multithreaded ? $" using {_tasks.NumTasks()} tasks" : " single-threaded"); @@ -489,7 +619,7 @@ private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs a public Project LoadProjectType(Type type) { - using (new Util.StopwatchProfiler(ms => { ProfileWriteLine(" |{0,5} ms| load project {1}", ms, type.Name); })) + using (CreateProfilingScope(type.Name)) { Project.ProjectTypeAttribute projectTypeAttribute; if (type.IsDefined(typeof(Generate), false)) @@ -505,24 +635,35 @@ public Project LoadProjectType(Type type) Project project = Project.CreateProject(type, Arguments.FragmentMasks, projectTypeAttribute); // Pre event - EventPreProjectConfigure?.Invoke(project); + var eventPreProjectConfigure = EventPreProjectConfigure; + if (eventPreProjectConfigure != null) + { + using (CreateProfilingScope("EventPreProjectConfigure" + project.ClassName)) + eventPreProjectConfigure.Invoke(project); + } project.PreConfigure(); // Create and Configure all possibles configurations. - project.InvokeConfiguration(Context); + using (CreateProfilingScope("Configures" + project.ClassName)) + project.InvokeConfiguration(Context); - project.AfterConfigure(); + using (CreateProfilingScope("AfterConfigure" + project.ClassName)) + project.AfterConfigure(); // Post event if (EventPostProjectConfigure != null) { - foreach (Project.Configuration conf in project.Configurations) - EventPostProjectConfigure?.Invoke(project, conf); + using (CreateProfilingScope("EventPostProjectConfigure" + project.ClassName)) + { + foreach (Project.Configuration conf in project.Configurations) + EventPostProjectConfigure?.Invoke(project, conf); + } } // Resolve [*] - project.Resolve(this, SkipInvalidPath); + using (CreateProfilingScope("Resolve")) + project.Resolve(this, SkipInvalidPath); // Would be more optimal to not generate the blobs, but simpler that way if (_cleanBlobsOnly) @@ -696,7 +837,7 @@ public void ReportGenerated(Type t, GenerationOutput output) private void LinkProject(Project project) { - using (new Util.StopwatchProfiler(ms => { ProfileWriteLine(" |{0,5} ms| link project {1}", ms, project.Name); })) + using (CreateProfilingScope("LinkProject" + project.Name)) { // Pre event EventPreProjectLink?.Invoke(project); @@ -710,15 +851,18 @@ private void LinkProject(Project project) private void LinkSolution(Solution solution) { - using (new Util.StopwatchProfiler(ms => { ProfileWriteLine(" |{0,5} ms| link solution {1}", ms, solution.Name); })) + using (CreateProfilingScope("LinkSolution" + solution.Name)) { // Pre event - EventPreSolutionLink?.Invoke(solution); + using (CreateProfilingScope("EventPreSolutionLink" + solution.Name)) + EventPreSolutionLink?.Invoke(solution); - solution.Link(this); + using (CreateProfilingScope("Solution.Link" + solution.Name)) + solution.Link(this); // Post event - EventPostSolutionLink?.Invoke(solution); + using (CreateProfilingScope("EventPostSolutionLink" + solution.Name)) + EventPostSolutionLink?.Invoke(solution); } } @@ -820,13 +964,15 @@ private void LogUnusedProjectConfigurations(List projects, List Generate() { - Link(); + using (CreateProfilingScope("Link")) + Link(); if (Context.WriteLog) WriteLogs(); LogWriteLine(" generating projects and solutions..."); using (new Util.StopwatchProfiler(ms => { LogWriteLine(" generation done in {0:0.0} sec", ms / 1000.0f); })) + using (CreateProfilingScope("Generation")) { var projects = new List(_projects.Values); var solutions = new List(_solutions.Values); @@ -838,6 +984,7 @@ public IDictionary Generate() if (EventPreGeneration != null) { using (new Util.StopwatchProfiler(ms => { LogWriteLine(" pre-generation steps took {0:0.0} sec", ms / 1000.0f); }, minThresholdMs: 100)) + using (CreateProfilingScope("PreGen Steps")) EventPreGeneration.Invoke(projects, solutions); } @@ -860,6 +1007,7 @@ public IDictionary Generate() if (EventPostGeneration != null || EventPostGenerationReport != null) { using (new Util.StopwatchProfiler(ms => { LogWriteLine(" post-generation steps took {0:0.0} sec", ms / 1000.0f); }, minThresholdMs: 100)) + using (CreateProfilingScope("PostGen Steps")) { EventPostGeneration?.Invoke(projects, solutions); EventPostGenerationReport?.Invoke(projects, solutions, _generationReport); @@ -878,7 +1026,7 @@ private void GenerateSolutionFile(object arg) Solution.Configuration firstConf = configurations.FirstOrDefault(); Solution solution = firstConf.Solution; - using (new Util.StopwatchProfiler(ms => { ProfileWriteLine(" |{0,5} ms| generate solution file {1}", ms, firstConf.SolutionFileName); })) + using (CreateProfilingScope("GenSolution" + Path.GetFileName(solutionFile))) { GenerationOutput output = new GenerationOutput(); @@ -931,7 +1079,7 @@ private void GenerateProjectFile(object arg) Project.Configuration firstConf = configurations.FirstOrDefault(); Project project = firstConf.Project; - using (new Util.StopwatchProfiler(ms => { ProfileWriteLine(" |{0,5} ms| generate project file {1}", ms, firstConf.ProjectFileName); })) + using (CreateProfilingScope("GenProject" + Path.GetFileName(projectFile))) { GenerationOutput output = new GenerationOutput(); @@ -940,24 +1088,27 @@ private void GenerateProjectFile(object arg) bool generateProject = false; DevEnv devEnv = configurations[0].Target.GetFragment(); - for (int i = 0; i < configurations.Count; ++i) + using (CreateProfilingScope("GenProject" + Path.GetFileName(projectFile) + ":confs")) { - Project.Configuration conf = pair.Value[i]; - if (devEnv != conf.Target.GetFragment()) + for (int i = 0; i < configurations.Count; ++i) { - throw new Error("Multiple generator cannot output to the same file:" + Environment.NewLine + "\tBoth {0} and {1} try to generate {2}", - devEnv, - conf.Target.GetFragment(), - projectFile); - } + Project.Configuration conf = pair.Value[i]; + if (devEnv != conf.Target.GetFragment()) + { + throw new Error("Multiple generator cannot output to the same file:" + Environment.NewLine + "\tBoth {0} and {1} try to generate {2}", + devEnv, + conf.Target.GetFragment(), + projectFile); + } - if (!generateProject) - { - if (_usedProjectConfigurations == null || - Arguments.TypesToGenerate.Contains(project.GetType()) || // generate the project if it was explicitly queried by the user-code - _usedProjectConfigurations.Contains(conf)) + if (!generateProject) { - generateProject = true; + if (_usedProjectConfigurations == null || + Arguments.TypesToGenerate.Contains(project.GetType()) || // generate the project if it was explicitly queried by the user-code + _usedProjectConfigurations.Contains(conf)) + { + generateProject = true; + } } } } @@ -965,7 +1116,10 @@ private void GenerateProjectFile(object arg) if (project.SourceFilesFilters == null || (project.SourceFilesFiltersCount != 0 && !project.SkipProjectWhenFiltersActive)) { if (generateProject) - _getGeneratorsManagerCallBack().Generate(this, project, configurations, projectFile, output.Generated, output.Skipped); + { + using (CreateProfilingScope("GenProject" + Path.GetFileName(projectFile) + ":Generate")) + _getGeneratorsManagerCallBack().Generate(this, project, configurations, projectFile, output.Generated, output.Skipped); + } } } catch (Exception ex) diff --git a/Sharpmake/Project.cs b/Sharpmake/Project.cs index 098b594ef..aeb70bd49 100644 --- a/Sharpmake/Project.cs +++ b/Sharpmake/Project.cs @@ -637,45 +637,48 @@ public HashSet GetAllConfigurationBuildExclude(IEnumerable configurations) { - // Remove blob files ? - bool allBlobbed = true; - bool allNoBlobbed = true; - bool includeBlobbedSourceFiles = true; - - foreach (Project.Configuration conf in configurations) + using (Builder.Instance.CreateProfilingScope("Project.GetSourceFilesForConfigurations", configurations.Count())) { - bool isBlobbed = conf.IsBlobbed; - allBlobbed &= isBlobbed; - allNoBlobbed &= !isBlobbed; - includeBlobbedSourceFiles &= conf.IncludeBlobbedSourceFiles; - } + // Remove blob files ? + bool allBlobbed = true; + bool allNoBlobbed = true; + bool includeBlobbedSourceFiles = true; - Strings result = new Strings(); - result.AddRange(ResourceFiles); + foreach (Project.Configuration conf in configurations) + { + bool isBlobbed = conf.IsBlobbed; + allBlobbed &= isBlobbed; + allNoBlobbed &= !isBlobbed; + includeBlobbedSourceFiles &= conf.IncludeBlobbedSourceFiles; + } - if (allBlobbed && !includeBlobbedSourceFiles) - { - foreach (var entry in _blobPathContents) + Strings result = new Strings(); + result.AddRange(ResourceFiles); + + if (allBlobbed && !includeBlobbedSourceFiles) { - result.AddRange(entry.Value.ResolvedBlobSourceFiles); + foreach (var entry in _blobPathContents) + { + result.AddRange(entry.Value.ResolvedBlobSourceFiles); + } + result.AddRange(ResolvedNoBlobbedSourceFiles); + result.RemoveRange(GetAllConfigurationBuildExclude(configurations)); } - result.AddRange(ResolvedNoBlobbedSourceFiles); - result.RemoveRange(GetAllConfigurationBuildExclude(configurations)); - } - else if (allNoBlobbed) - { - result.AddRange(ResolvedSourceFiles); - foreach (var entry in _blobPathContents) + else if (allNoBlobbed) { - result.RemoveRange(entry.Value.ResolvedBlobSourceFiles); + result.AddRange(ResolvedSourceFiles); + foreach (var entry in _blobPathContents) + { + result.RemoveRange(entry.Value.ResolvedBlobSourceFiles); + } + } + else + { + result.AddRange(ResolvedSourceFiles); } - } - else - { - result.AddRange(ResolvedSourceFiles); - } - return result; + return result; + } } internal Strings GetConfigurationsNoBlobSourceFiles(Strings sourceFiles) @@ -999,6 +1002,7 @@ internal virtual void ResolveSourceFiles(Builder builder) var resolvedSourceFilesWithCompileAsNonCLROption = new Strings(); var resolvedSourceFilesWithCompileAsWinRTOption = new Strings(); var resolvedSourceFilesWithExcludeAsWinRTOption = new Strings(); + using (builder.CreateProfilingScope("Project.ResolveSourceFiles:ApplyProjectRegexes")) { // Do first part that is specific to project to not repeat for each config AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref resolvedSourceFilesBuildExclude, sourceFilesBuildExcludeRegex); @@ -1016,115 +1020,121 @@ internal virtual void ResolveSourceFiles(Builder builder) var md5Hasher = System.Security.Cryptography.MD5.Create(); var confRegexesHashToAnyConf = new Dictionary(); var confToRegexesHash = new Dictionary(); - foreach (Configuration conf in Configurations) + using (builder.CreateProfilingScope("Project.ResolveSourceFiles:GroupCommonRegexes", Configurations.Count)) { - var stream = new MemoryStream(2000); - var writer = new BinaryWriter(stream); - writer.Write(conf.SourceFilesBuildExcludeRegex.Count); - foreach (string val in conf.SourceFilesBuildExcludeRegex) - writer.Write(val); - writer.Write(conf.SourceFilesCompileAsCRegex.Count); - foreach (string val in conf.SourceFilesCompileAsCRegex) - writer.Write(val); - writer.Write(conf.SourceFilesCompileAsCPPRegex.Count); - foreach (string val in conf.SourceFilesCompileAsCPPRegex) - writer.Write(val); - writer.Write(conf.SourceFilesCompileAsCLRRegex.Count); - foreach (string val in conf.SourceFilesCompileAsCLRRegex) - writer.Write(val); - writer.Write(conf.SourceFilesCompileAsCLRExcludeRegex.Count); - foreach (string val in conf.SourceFilesCompileAsCLRExcludeRegex) - writer.Write(val); - writer.Write(conf.SourceFilesCompileAsNonCLRRegex.Count); - foreach (string val in conf.SourceFilesCompileAsNonCLRRegex) - writer.Write(val); - writer.Write(conf.SourceFilesCompileAsWinRTRegex.Count); - foreach (string val in conf.SourceFilesCompileAsWinRTRegex) - writer.Write(val); - writer.Write(conf.SourceFilesExcludeAsWinRTRegex.Count); - foreach (string val in conf.SourceFilesExcludeAsWinRTRegex) - writer.Write(val); - writer.Write(conf.SourceFilesFiltersRegex.Count); - foreach (string val in conf.SourceFilesFiltersRegex) - writer.Write(val); - - byte[] data = md5Hasher.ComputeHash(stream.GetBuffer()); - string md5 = BitConverter.ToString(data); - confToRegexesHash[conf] = md5; - confRegexesHashToAnyConf[md5] = conf; - } - - foreach (var conf in confRegexesHashToAnyConf.Values) - { - conf.ResolvedSourceFilesBuildExclude.AddRange(resolvedSourceFilesBuildExclude); - var configSourceFilesBuildExcludeRegex = RegexCache.GetCachedRegexes(conf.SourceFilesBuildExcludeRegex); - AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesBuildExclude, configSourceFilesBuildExcludeRegex); - - // Resolve files that will be built as C Files - conf.ResolvedSourceFilesWithCompileAsCOption.AddRange(resolvedSourceFilesWithCompileAsCOption); - var configSourceFilesCompileAsCRegex = RegexCache.GetCachedRegexes(conf.SourceFilesCompileAsCRegex); - AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesWithCompileAsCOption, configSourceFilesCompileAsCRegex); - - // Resolve files that will be built as CPP Files - conf.ResolvedSourceFilesWithCompileAsCPPOption.AddRange(resolvedSourceFilesWithCompileAsCPPOption); - var configSourceFilesCompileAsCPPRegex = RegexCache.GetCachedRegexes(conf.SourceFilesCompileAsCPPRegex); - AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesWithCompileAsCPPOption, configSourceFilesCompileAsCPPRegex); - - // Resolve files that will be built as CLR Files - conf.ResolvedSourceFilesWithCompileAsCLROption.AddRange(resolvedSourceFilesWithCompileAsCLROption); - var configSourceFilesCompileAsCLRRegex = RegexCache.GetCachedRegexes(conf.SourceFilesCompileAsCLRRegex); - AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesWithCompileAsCLROption, configSourceFilesCompileAsCLRRegex); - - // Remove file that match SourceFilesCompileAsCLRExcludeRegex - var configCompileAsClrFilesExclude = new Strings(); - configCompileAsClrFilesExclude.AddRange(compileAsClrFilesExclude); - var configSourceFilesCompileAsCLRExcludeRegex = RegexCache.GetCachedRegexes(conf.SourceFilesCompileAsCLRExcludeRegex); - AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref configCompileAsClrFilesExclude, configSourceFilesCompileAsCLRExcludeRegex); - conf.ResolvedSourceFilesWithCompileAsCLROption.RemoveRange(configCompileAsClrFilesExclude); - - // Resolve non-CLR files. - conf.ResolvedSourceFilesWithCompileAsNonCLROption.AddRange(resolvedSourceFilesWithCompileAsNonCLROption); - var configSourceFilesCompileAsNonCLRRegex = RegexCache.GetCachedRegexes(conf.SourceFilesCompileAsNonCLRRegex); - AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesWithCompileAsNonCLROption, configSourceFilesCompileAsNonCLRRegex); - - // Resolve files that will be built as WinRT Files - conf.ResolvedSourceFilesWithCompileAsWinRTOption.AddRange(resolvedSourceFilesWithCompileAsWinRTOption); - var configSourceFilesCompileAsWinRTRegex = RegexCache.GetCachedRegexes(conf.SourceFilesCompileAsWinRTRegex); - AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesWithCompileAsWinRTOption, configSourceFilesCompileAsWinRTRegex); - - // Resolve files that will not be built as WinRT Files - conf.ResolvedSourceFilesWithExcludeAsWinRTOption.AddRange(resolvedSourceFilesWithExcludeAsWinRTOption); - var configSourceFilesExcludeAsWinRTRegex = RegexCache.GetCachedRegexes(conf.SourceFilesExcludeAsWinRTRegex); - AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesWithExcludeAsWinRTOption, configSourceFilesExcludeAsWinRTRegex); - - conf.ResolvedSourceFilesBlobExclude.AddRange(conf.ResolvedSourceFilesWithCompileAsCOption); - conf.ResolvedSourceFilesBlobExclude.AddRange(conf.ResolvedSourceFilesWithCompileAsCPPOption); - conf.ResolvedSourceFilesBlobExclude.AddRange(conf.ResolvedSourceFilesWithCompileAsNonCLROption); - conf.ResolvedSourceFilesBlobExclude.AddRange(conf.ResolvedSourceFilesWithCompileAsCLROption); - conf.ResolvedSourceFilesBlobExclude.AddRange(conf.ResolvedSourceFilesWithCompileAsWinRTOption); - conf.ResolvedSourceFilesBlobExclude.AddRange(conf.ResolvedSourceFilesWithExcludeAsWinRTOption); - - var configSourceFilesFiltersRegex = RegexCache.GetCachedRegexes(conf.SourceFilesFiltersRegex).ToArray(); - if (conf.SourceFilesFiltersRegex.Count != 0) + foreach (Configuration conf in Configurations) { - foreach (var sourceFile in SourceFiles) + var stream = new MemoryStream(2000); + var writer = new BinaryWriter(stream); + writer.Write(conf.SourceFilesBuildExcludeRegex.Count); + foreach (string val in conf.SourceFilesBuildExcludeRegex) + writer.Write(val); + writer.Write(conf.SourceFilesCompileAsCRegex.Count); + foreach (string val in conf.SourceFilesCompileAsCRegex) + writer.Write(val); + writer.Write(conf.SourceFilesCompileAsCPPRegex.Count); + foreach (string val in conf.SourceFilesCompileAsCPPRegex) + writer.Write(val); + writer.Write(conf.SourceFilesCompileAsCLRRegex.Count); + foreach (string val in conf.SourceFilesCompileAsCLRRegex) + writer.Write(val); + writer.Write(conf.SourceFilesCompileAsCLRExcludeRegex.Count); + foreach (string val in conf.SourceFilesCompileAsCLRExcludeRegex) + writer.Write(val); + writer.Write(conf.SourceFilesCompileAsNonCLRRegex.Count); + foreach (string val in conf.SourceFilesCompileAsNonCLRRegex) + writer.Write(val); + writer.Write(conf.SourceFilesCompileAsWinRTRegex.Count); + foreach (string val in conf.SourceFilesCompileAsWinRTRegex) + writer.Write(val); + writer.Write(conf.SourceFilesExcludeAsWinRTRegex.Count); + foreach (string val in conf.SourceFilesExcludeAsWinRTRegex) + writer.Write(val); + writer.Write(conf.SourceFilesFiltersRegex.Count); + foreach (string val in conf.SourceFilesFiltersRegex) + writer.Write(val); + + byte[] data = md5Hasher.ComputeHash(stream.GetBuffer()); + string md5 = BitConverter.ToString(data); + confToRegexesHash[conf] = md5; + confRegexesHashToAnyConf[md5] = conf; + } + } + + using (builder.CreateProfilingScope("Project.ResolveSourceFiles:ApplyCommonRegexes", confRegexesHashToAnyConf.Count)) + { + foreach (var conf in confRegexesHashToAnyConf.Values) + { + conf.ResolvedSourceFilesBuildExclude.AddRange(resolvedSourceFilesBuildExclude); + var configSourceFilesBuildExcludeRegex = RegexCache.GetCachedRegexes(conf.SourceFilesBuildExcludeRegex); + AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesBuildExclude, configSourceFilesBuildExcludeRegex); + + // Resolve files that will be built as C Files + conf.ResolvedSourceFilesWithCompileAsCOption.AddRange(resolvedSourceFilesWithCompileAsCOption); + var configSourceFilesCompileAsCRegex = RegexCache.GetCachedRegexes(conf.SourceFilesCompileAsCRegex); + AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesWithCompileAsCOption, configSourceFilesCompileAsCRegex); + + // Resolve files that will be built as CPP Files + conf.ResolvedSourceFilesWithCompileAsCPPOption.AddRange(resolvedSourceFilesWithCompileAsCPPOption); + var configSourceFilesCompileAsCPPRegex = RegexCache.GetCachedRegexes(conf.SourceFilesCompileAsCPPRegex); + AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesWithCompileAsCPPOption, configSourceFilesCompileAsCPPRegex); + + // Resolve files that will be built as CLR Files + conf.ResolvedSourceFilesWithCompileAsCLROption.AddRange(resolvedSourceFilesWithCompileAsCLROption); + var configSourceFilesCompileAsCLRRegex = RegexCache.GetCachedRegexes(conf.SourceFilesCompileAsCLRRegex); + AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesWithCompileAsCLROption, configSourceFilesCompileAsCLRRegex); + + // Remove file that match SourceFilesCompileAsCLRExcludeRegex + var configCompileAsClrFilesExclude = new Strings(); + configCompileAsClrFilesExclude.AddRange(compileAsClrFilesExclude); + var configSourceFilesCompileAsCLRExcludeRegex = RegexCache.GetCachedRegexes(conf.SourceFilesCompileAsCLRExcludeRegex); + AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref configCompileAsClrFilesExclude, configSourceFilesCompileAsCLRExcludeRegex); + conf.ResolvedSourceFilesWithCompileAsCLROption.RemoveRange(configCompileAsClrFilesExclude); + + // Resolve non-CLR files. + conf.ResolvedSourceFilesWithCompileAsNonCLROption.AddRange(resolvedSourceFilesWithCompileAsNonCLROption); + var configSourceFilesCompileAsNonCLRRegex = RegexCache.GetCachedRegexes(conf.SourceFilesCompileAsNonCLRRegex); + AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesWithCompileAsNonCLROption, configSourceFilesCompileAsNonCLRRegex); + + // Resolve files that will be built as WinRT Files + conf.ResolvedSourceFilesWithCompileAsWinRTOption.AddRange(resolvedSourceFilesWithCompileAsWinRTOption); + var configSourceFilesCompileAsWinRTRegex = RegexCache.GetCachedRegexes(conf.SourceFilesCompileAsWinRTRegex); + AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesWithCompileAsWinRTOption, configSourceFilesCompileAsWinRTRegex); + + // Resolve files that will not be built as WinRT Files + conf.ResolvedSourceFilesWithExcludeAsWinRTOption.AddRange(resolvedSourceFilesWithExcludeAsWinRTOption); + var configSourceFilesExcludeAsWinRTRegex = RegexCache.GetCachedRegexes(conf.SourceFilesExcludeAsWinRTRegex); + AddMatchFiles(RootPath, resolvedSourceFilesRelative, ResolvedSourceFiles, ref conf.ResolvedSourceFilesWithExcludeAsWinRTOption, configSourceFilesExcludeAsWinRTRegex); + + conf.ResolvedSourceFilesBlobExclude.AddRange(conf.ResolvedSourceFilesWithCompileAsCOption); + conf.ResolvedSourceFilesBlobExclude.AddRange(conf.ResolvedSourceFilesWithCompileAsCPPOption); + conf.ResolvedSourceFilesBlobExclude.AddRange(conf.ResolvedSourceFilesWithCompileAsNonCLROption); + conf.ResolvedSourceFilesBlobExclude.AddRange(conf.ResolvedSourceFilesWithCompileAsCLROption); + conf.ResolvedSourceFilesBlobExclude.AddRange(conf.ResolvedSourceFilesWithCompileAsWinRTOption); + conf.ResolvedSourceFilesBlobExclude.AddRange(conf.ResolvedSourceFilesWithExcludeAsWinRTOption); + + var configSourceFilesFiltersRegex = RegexCache.GetCachedRegexes(conf.SourceFilesFiltersRegex).ToArray(); + if (conf.SourceFilesFiltersRegex.Count != 0) { - if (!configSourceFilesFiltersRegex.Any(regex => regex.Match(sourceFile).Success)) - conf.ResolvedSourceFilesBuildExclude.Add(sourceFile); + foreach (var sourceFile in SourceFiles) + { + if (!configSourceFilesFiltersRegex.Any(regex => regex.Match(sourceFile).Success)) + conf.ResolvedSourceFilesBuildExclude.Add(sourceFile); + } + Util.ResolvePath(SourceRootPath, ref conf.ResolvedSourceFilesBuildExclude); } - Util.ResolvePath(SourceRootPath, ref conf.ResolvedSourceFilesBuildExclude); - } - // To allow sharing with other configs - conf.ResolvedSourceFilesWithCompileAsCOption.SetReadOnly(true); - conf.ResolvedSourceFilesWithCompileAsCPPOption.SetReadOnly(true); - conf.ResolvedSourceFilesWithCompileAsCLROption.SetReadOnly(true); - conf.ResolvedSourceFilesWithCompileAsNonCLROption.SetReadOnly(true); - conf.ResolvedSourceFilesWithCompileAsWinRTOption.SetReadOnly(true); - conf.ResolvedSourceFilesWithExcludeAsWinRTOption.SetReadOnly(true); + // To allow sharing with other configs + conf.ResolvedSourceFilesWithCompileAsCOption.SetReadOnly(true); + conf.ResolvedSourceFilesWithCompileAsCPPOption.SetReadOnly(true); + conf.ResolvedSourceFilesWithCompileAsCLROption.SetReadOnly(true); + conf.ResolvedSourceFilesWithCompileAsNonCLROption.SetReadOnly(true); + conf.ResolvedSourceFilesWithCompileAsWinRTOption.SetReadOnly(true); + conf.ResolvedSourceFilesWithExcludeAsWinRTOption.SetReadOnly(true); + } } - + using (builder.CreateProfilingScope("Project.ResolveSourceFiles:ApplyRegexesToConfigs", Configurations.Count)) { foreach (Configuration conf in Configurations) { @@ -1777,52 +1787,61 @@ internal void Resolve(Builder builder, bool skipInvalidPath) if (Resolved) return; - // valid work blob parameters, set BlobWorkEnabled to false if 0 work blob specified - if (BlobWorkEnabled && BlobWorkFileCount == 0) - BlobWorkEnabled = false; + using (builder.CreateProfilingScope("ResolveProject")) + { + // valid work blob parameters, set BlobWorkEnabled to false if 0 work blob specified + if (BlobWorkEnabled && BlobWorkFileCount == 0) + BlobWorkEnabled = false; - Resolver resolver = new Resolver(); - resolver.SetParameter("project", this); + Resolver resolver = new Resolver(); + resolver.SetParameter("project", this); - if (skipInvalidPath) - resolver.Resolve(this, fallbackValue: false); - else - resolver.Resolve(this); + if (skipInvalidPath) + resolver.Resolve(this, fallbackValue: false); + else + resolver.Resolve(this); - // Resolve full paths - _rootPath = Util.SimplifyPath(RootPath); - Util.ResolvePath(SharpmakeCsPath, ref _sourceRootPath); - Util.ResolvePath(SourceRootPath, ref SourceFiles); - Util.ResolvePath(SourceRootPath, ref SourceFilesExclude); - Util.ResolvePath(SourceRootPath, ref SourceFilesBlobExclude); - Util.ResolvePath(SourceRootPath, ref SourceFilesBuildExclude); - Util.ResolvePath(SharpmakeCsPath, ref _blobPath); + // Resolve full paths + _rootPath = Util.SimplifyPath(RootPath); + Util.ResolvePath(SharpmakeCsPath, ref _sourceRootPath); + Util.ResolvePath(SourceRootPath, ref SourceFiles); + Util.ResolvePath(SourceRootPath, ref SourceFilesExclude); + Util.ResolvePath(SourceRootPath, ref SourceFilesBlobExclude); + Util.ResolvePath(SourceRootPath, ref SourceFilesBuildExclude); + Util.ResolvePath(SharpmakeCsPath, ref _blobPath); - if (PerforceRootPath != null) - Util.ResolvePath(SharpmakeCsPath, ref _perforceRootPath); + if (PerforceRootPath != null) + Util.ResolvePath(SharpmakeCsPath, ref _perforceRootPath); - if (SourceFilesFilters != null) - Util.ResolvePath(SharpmakeCsPath, ref SourceFilesFilters); + if (SourceFilesFilters != null) + Util.ResolvePath(SharpmakeCsPath, ref SourceFilesFilters); - XResourcesImg.Resolve(SourceRootPath, resolver); + XResourcesImg.Resolve(SourceRootPath, resolver); - // Resolve Configuration - foreach (Project.Configuration conf in Configurations) - conf.Resolve(resolver); + using (builder.CreateProfilingScope("ResolveConfs")) + { + // Resolve Configuration + foreach (Project.Configuration conf in Configurations) + conf.Resolve(resolver); + } - if (SharpmakeProjectType == ProjectTypeAttribute.Generate) - { - PreResolveSourceFiles(); - ResolveSourceFiles(builder); - } - PostResolve(); + if (SharpmakeProjectType == ProjectTypeAttribute.Generate) + { + using (builder.CreateProfilingScope("PreResolveSourceFiles")) + PreResolveSourceFiles(); + using (builder.CreateProfilingScope("ResolveSourceFiles")) + ResolveSourceFiles(builder); + } + using (builder.CreateProfilingScope("PostResolve")) + PostResolve(); - if (builder.DumpDependencyGraph && !IsFastBuildAll) - { - foreach (Configuration conf in Configurations) - DependencyTracker.Instance.UpdateConfiguration(this, conf); + if (builder.DumpDependencyGraph && !IsFastBuildAll) + { + foreach (Configuration conf in Configurations) + DependencyTracker.Instance.UpdateConfiguration(this, conf); + } + Resolved = true; } - Resolved = true; } /// diff --git a/Sharpmake/Solution.cs b/Sharpmake/Solution.cs index 70dfa2879..548c03a92 100644 --- a/Sharpmake/Solution.cs +++ b/Sharpmake/Solution.cs @@ -257,182 +257,185 @@ internal void Link(Builder builder) bool hasFastBuildProjectConf = false; var unlinkedConfigurations = new Dictionary>(); // This will hold MSBuild -> Fastbuild refs - foreach (Solution.Configuration solutionConfiguration in Configurations) + using (builder.CreateProfilingScope("Solution.Link:confs", Configurations.Count)) { - // Build SolutionFilesMapping - string configurationFile = Path.Combine(solutionConfiguration.SolutionPath, solutionConfiguration.SolutionFileName); - - var fileConfigurationList = SolutionFilesMapping.GetValueOrAdd(configurationFile, new List()); - fileConfigurationList.Add(solutionConfiguration); - - var unlinkedList = unlinkedConfigurations.GetValueOrAdd(solutionConfiguration, new List()); - - // solutionConfiguration.IncludedProjectInfos will be appended - // while iterating, but with projects that we already have resolved, - // so no need to parse them again - int origCount = solutionConfiguration.IncludedProjectInfos.Count; - for (int i = 0; i < origCount; ++i) + foreach (Solution.Configuration solutionConfiguration in Configurations) { - Configuration.IncludedProjectInfo configurationProject = solutionConfiguration.IncludedProjectInfos[i]; - bool projectIsInactive = configurationProject.InactiveProject; + // Build SolutionFilesMapping + string configurationFile = Path.Combine(solutionConfiguration.SolutionPath, solutionConfiguration.SolutionFileName); - Project project = builder.GetProject(configurationProject.Type); - Project.Configuration projectConfiguration = project.GetConfiguration(configurationProject.Target); + var fileConfigurationList = SolutionFilesMapping.GetValueOrAdd(configurationFile, new List()); + fileConfigurationList.Add(solutionConfiguration); - if (projectConfiguration == null) + var unlinkedList = unlinkedConfigurations.GetValueOrAdd(solutionConfiguration, new List()); + + // solutionConfiguration.IncludedProjectInfos will be appended + // while iterating, but with projects that we already have resolved, + // so no need to parse them again + int origCount = solutionConfiguration.IncludedProjectInfos.Count; + for (int i = 0; i < origCount; ++i) { - var messageBuilder = new System.Text.StringBuilder(); - messageBuilder.AppendFormat("Resolving dependencies for solution {0}, target '{1}': cannot find target '{3}' in project {2}", - GetType().FullName, solutionConfiguration.Target, project.GetType().FullName, configurationProject.Target); - messageBuilder.AppendLine(); + Configuration.IncludedProjectInfo configurationProject = solutionConfiguration.IncludedProjectInfos[i]; + bool projectIsInactive = configurationProject.InactiveProject; - if (project.Configurations.Any()) - { - messageBuilder.AppendLine("Project configurations are:"); - int confNum = 0; - foreach (var conf in project.Configurations) - messageBuilder.AppendLine(++confNum + "/" + project.Configurations.Count + " " + conf.ToString()); - } - else + Project project = builder.GetProject(configurationProject.Type); + Project.Configuration projectConfiguration = project.GetConfiguration(configurationProject.Target); + + if (projectConfiguration == null) { - messageBuilder.AppendLine("The project does not contain any configurations!"); - } + var messageBuilder = new System.Text.StringBuilder(); + messageBuilder.AppendFormat("Resolving dependencies for solution {0}, target '{1}': cannot find target '{3}' in project {2}", + GetType().FullName, solutionConfiguration.Target, project.GetType().FullName, configurationProject.Target); + messageBuilder.AppendLine(); - Trace.WriteLine(messageBuilder.ToString()); - Debugger.Break(); + if (project.Configurations.Any()) + { + messageBuilder.AppendLine("Project configurations are:"); + int confNum = 0; + foreach (var conf in project.Configurations) + messageBuilder.AppendLine(++confNum + "/" + project.Configurations.Count + " " + conf.ToString()); + } + else + { + messageBuilder.AppendLine("The project does not contain any configurations!"); + } - throw new Error(messageBuilder.ToString()); - } + Trace.WriteLine(messageBuilder.ToString()); + Debugger.Break(); - if (configurationProject.Project == null) - configurationProject.Project = project; - else if (configurationProject.Project != project) - throw new Error("Tried to match more than one project to Project type."); + throw new Error(messageBuilder.ToString()); + } - if (configurationProject.Configuration == null) - configurationProject.Configuration = projectConfiguration; - else if (configurationProject.Configuration != projectConfiguration) - throw new Error("Tried to match more than one Project Configuration to a solution configuration."); + if (configurationProject.Project == null) + configurationProject.Project = project; + else if (configurationProject.Project != project) + throw new Error("Tried to match more than one project to Project type."); - hasFastBuildProjectConf |= projectConfiguration.IsFastBuild; - if (projectConfiguration.IsFastBuild) - projectConfiguration.AddMasterBff(solutionConfiguration.MasterBffFilePath); + if (configurationProject.Configuration == null) + configurationProject.Configuration = projectConfiguration; + else if (configurationProject.Configuration != projectConfiguration) + throw new Error("Tried to match more than one Project Configuration to a solution configuration."); - bool build = !projectConfiguration.IsExcludedFromBuild && !configurationProject.InactiveProject; - if (build && solutionConfiguration.IncludeOnlyFilterProject && (configurationProject.Project.SourceFilesFiltersCount == 0 || configurationProject.Project.SkipProjectWhenFiltersActive)) - build = false; + hasFastBuildProjectConf |= projectConfiguration.IsFastBuild; + if (projectConfiguration.IsFastBuild) + projectConfiguration.AddMasterBff(solutionConfiguration.MasterBffFilePath); - if (configurationProject.ToBuild != Configuration.IncludedProjectInfo.Build.YesThroughDependency) - { - if (build) - configurationProject.ToBuild = Configuration.IncludedProjectInfo.Build.Yes; - else if (configurationProject.ToBuild != Configuration.IncludedProjectInfo.Build.Yes) - configurationProject.ToBuild = Configuration.IncludedProjectInfo.Build.No; - } + bool build = !projectConfiguration.IsExcludedFromBuild && !configurationProject.InactiveProject; + if (build && solutionConfiguration.IncludeOnlyFilterProject && (configurationProject.Project.SourceFilesFiltersCount == 0 || configurationProject.Project.SkipProjectWhenFiltersActive)) + build = false; - var dependenciesConfiguration = configurationProject.Configuration.GetRecursiveDependencies(); - // TODO: Slow LINQ? May be better to create this list as part of GetRecursiveDependencies - if (!configurationProject.Configuration.IsFastBuild && configurationProject.Configuration.ResolvedDependencies.Any(d => d.IsFastBuild)) - unlinkedList.Add(configurationProject.Configuration); - unlinkedList.AddRange(dependenciesConfiguration.Where(c => !c.IsFastBuild && c.ResolvedDependencies.Any(d => d.IsFastBuild))); - foreach (Project.Configuration dependencyConfiguration in dependenciesConfiguration) - { - Project dependencyProject = dependencyConfiguration.Project; - if (dependencyProject.SharpmakeProjectType == Project.ProjectTypeAttribute.Export) - continue; + if (configurationProject.ToBuild != Configuration.IncludedProjectInfo.Build.YesThroughDependency) + { + if (build) + configurationProject.ToBuild = Configuration.IncludedProjectInfo.Build.Yes; + else if (configurationProject.ToBuild != Configuration.IncludedProjectInfo.Build.Yes) + configurationProject.ToBuild = Configuration.IncludedProjectInfo.Build.No; + } - Type dependencyProjectType = dependencyProject.GetType(); - ITarget dependencyProjectTarget = dependencyConfiguration.Target; + var dependenciesConfiguration = configurationProject.Configuration.GetRecursiveDependencies(); + // TODO: Slow LINQ? May be better to create this list as part of GetRecursiveDependencies + if (!configurationProject.Configuration.IsFastBuild && configurationProject.Configuration.ResolvedDependencies.Any(d => d.IsFastBuild)) + unlinkedList.Add(configurationProject.Configuration); + unlinkedList.AddRange(dependenciesConfiguration.Where(c => !c.IsFastBuild && c.ResolvedDependencies.Any(d => d.IsFastBuild))); + foreach (Project.Configuration dependencyConfiguration in dependenciesConfiguration) + { + Project dependencyProject = dependencyConfiguration.Project; + if (dependencyProject.SharpmakeProjectType == Project.ProjectTypeAttribute.Export) + continue; - hasFastBuildProjectConf |= dependencyConfiguration.IsFastBuild; - if (dependencyConfiguration.IsFastBuild) - dependencyConfiguration.AddMasterBff(solutionConfiguration.MasterBffFilePath); + Type dependencyProjectType = dependencyProject.GetType(); + ITarget dependencyProjectTarget = dependencyConfiguration.Target; - Configuration.IncludedProjectInfo configurationProjectDependency = solutionConfiguration.GetProject(dependencyProjectType); + hasFastBuildProjectConf |= dependencyConfiguration.IsFastBuild; + if (dependencyConfiguration.IsFastBuild) + dependencyConfiguration.AddMasterBff(solutionConfiguration.MasterBffFilePath); - // if that project was not explicitly added to the solution configuration, add it ourselves, as it is needed - if (configurationProjectDependency == null) - { - configurationProjectDependency = new Configuration.IncludedProjectInfo - { - Type = dependencyProjectType, - Project = dependencyProject, - Configuration = dependencyConfiguration, - Target = dependencyProjectTarget, - InactiveProject = projectIsInactive // inherit from the parent: no reason to mark dependencies for build if parent is inactive - }; - solutionConfiguration.IncludedProjectInfos.Add(configurationProjectDependency); - } - else if (!projectIsInactive && configurationProjectDependency.InactiveProject) - { - // if the project we found in the solutionConfiguration is inactive, and the current is not, replace its settings - configurationProjectDependency.Type = dependencyProjectType; - configurationProjectDependency.Project = dependencyProject; - configurationProjectDependency.Configuration = dependencyConfiguration; - configurationProjectDependency.Target = dependencyProjectTarget; - configurationProjectDependency.InactiveProject = false; - } - else if (projectIsInactive) - { - // if the current project is inactive, ignore - } - else - { - if (!configurationProjectDependency.Target.IsEqualTo(dependencyProjectTarget)) + Configuration.IncludedProjectInfo configurationProjectDependency = solutionConfiguration.GetProject(dependencyProjectType); + + // if that project was not explicitly added to the solution configuration, add it ourselves, as it is needed + if (configurationProjectDependency == null) { - throw new Error("In solution configuration (solution: {3}, config: {4}) the parent project {5} generates multiple dependency targets for the same child project {0}: {1} and {2}. Look for all AddPublicDependency() and AddPrivateDependency() calls for the child project and follow the dependency chain.", - configurationProjectDependency.Project?.GetType().ToString(), - configurationProjectDependency.Target, - dependencyProjectTarget, - solutionConfiguration.SolutionFileName, - solutionConfiguration.Target, - project.Name - ); + configurationProjectDependency = new Configuration.IncludedProjectInfo + { + Type = dependencyProjectType, + Project = dependencyProject, + Configuration = dependencyConfiguration, + Target = dependencyProjectTarget, + InactiveProject = projectIsInactive // inherit from the parent: no reason to mark dependencies for build if parent is inactive + }; + solutionConfiguration.IncludedProjectInfos.Add(configurationProjectDependency); } - - if (configurationProjectDependency.Project == null) + else if (!projectIsInactive && configurationProjectDependency.InactiveProject) + { + // if the project we found in the solutionConfiguration is inactive, and the current is not, replace its settings + configurationProjectDependency.Type = dependencyProjectType; configurationProjectDependency.Project = dependencyProject; - else if (configurationProjectDependency.Project != dependencyProject) - throw new Error("Tried to match more than one project to Project type."); - - if (configurationProjectDependency.Configuration == null) configurationProjectDependency.Configuration = dependencyConfiguration; - else if (configurationProjectDependency.Configuration != dependencyConfiguration) - throw new Error("Tried to match more than one Project Configuration to a solution configuration."); - } - - if (configurationProjectDependency.ToBuild != Configuration.IncludedProjectInfo.Build.YesThroughDependency) - { - // If we're finding a Fastbuild dependency of an MSBuild project, we know that it'll need re-linking if the All project is generated. - var needsFastbuildRelink = (dependencyConfiguration.IsFastBuild && !configurationProject.Configuration.IsFastBuild && GenerateFastBuildAllProject); - - var isExcludedSinceNoFilter = solutionConfiguration.IncludeOnlyFilterProject - && (configurationProjectDependency.Project.SourceFilesFiltersCount == 0 || configurationProjectDependency.Project.SkipProjectWhenFiltersActive); - - var skipBuild = dependencyConfiguration.IsExcludedFromBuild - || projectIsInactive - || configurationProjectDependency.InactiveProject - || needsFastbuildRelink - || isExcludedSinceNoFilter; + configurationProjectDependency.Target = dependencyProjectTarget; + configurationProjectDependency.InactiveProject = false; + } + else if (projectIsInactive) + { + // if the current project is inactive, ignore + } + else + { + if (!configurationProjectDependency.Target.IsEqualTo(dependencyProjectTarget)) + { + throw new Error("In solution configuration (solution: {3}, config: {4}) the parent project {5} generates multiple dependency targets for the same child project {0}: {1} and {2}. Look for all AddPublicDependency() and AddPrivateDependency() calls for the child project and follow the dependency chain.", + configurationProjectDependency.Project?.GetType().ToString(), + configurationProjectDependency.Target, + dependencyProjectTarget, + solutionConfiguration.SolutionFileName, + solutionConfiguration.Target, + project.Name + ); + } + + if (configurationProjectDependency.Project == null) + configurationProjectDependency.Project = dependencyProject; + else if (configurationProjectDependency.Project != dependencyProject) + throw new Error("Tried to match more than one project to Project type."); + + if (configurationProjectDependency.Configuration == null) + configurationProjectDependency.Configuration = dependencyConfiguration; + else if (configurationProjectDependency.Configuration != dependencyConfiguration) + throw new Error("Tried to match more than one Project Configuration to a solution configuration."); + } - if (!skipBuild) + if (configurationProjectDependency.ToBuild != Configuration.IncludedProjectInfo.Build.YesThroughDependency) { - if (projectConfiguration.Output == Project.Configuration.OutputType.Dll || projectConfiguration.Output == Project.Configuration.OutputType.Exe) - configurationProjectDependency.ToBuild = Configuration.IncludedProjectInfo.Build.YesThroughDependency; - else - configurationProjectDependency.ToBuild = Configuration.IncludedProjectInfo.Build.Yes; + // If we're finding a Fastbuild dependency of an MSBuild project, we know that it'll need re-linking if the All project is generated. + var needsFastbuildRelink = (dependencyConfiguration.IsFastBuild && !configurationProject.Configuration.IsFastBuild && GenerateFastBuildAllProject); + + var isExcludedSinceNoFilter = solutionConfiguration.IncludeOnlyFilterProject + && (configurationProjectDependency.Project.SourceFilesFiltersCount == 0 || configurationProjectDependency.Project.SkipProjectWhenFiltersActive); + + var skipBuild = dependencyConfiguration.IsExcludedFromBuild + || projectIsInactive + || configurationProjectDependency.InactiveProject + || needsFastbuildRelink + || isExcludedSinceNoFilter; + + if (!skipBuild) + { + if (projectConfiguration.Output == Project.Configuration.OutputType.Dll || projectConfiguration.Output == Project.Configuration.OutputType.Exe) + configurationProjectDependency.ToBuild = Configuration.IncludedProjectInfo.Build.YesThroughDependency; + else + configurationProjectDependency.ToBuild = Configuration.IncludedProjectInfo.Build.Yes; + } + else if (configurationProjectDependency.ToBuild != Configuration.IncludedProjectInfo.Build.Yes) + configurationProjectDependency.ToBuild = Configuration.IncludedProjectInfo.Build.No; } - else if (configurationProjectDependency.ToBuild != Configuration.IncludedProjectInfo.Build.Yes) - configurationProjectDependency.ToBuild = Configuration.IncludedProjectInfo.Build.No; } } } - } - if (hasFastBuildProjectConf) - MakeFastBuildAllProjectIfNeeded(builder, unlinkedConfigurations); + if (hasFastBuildProjectConf) + MakeFastBuildAllProjectIfNeeded(builder, unlinkedConfigurations); - _dependenciesResolved = true; + _dependenciesResolved = true; + } } internal void Resolve() @@ -440,28 +443,31 @@ internal void Resolve() if (_resolved) return; - Resolver resolver = new Resolver(); - resolver.SetParameter("solution", this); - resolver.Resolve(this); + using (Builder.Instance.CreateProfilingScope("ResolveSolution")) + { + Resolver resolver = new Resolver(); + resolver.SetParameter("solution", this); + resolver.Resolve(this); - if (PerforceRootPath != null) - Util.ResolvePath(SharpmakeCsPath, ref _perforceRootPath); + if (PerforceRootPath != null) + Util.ResolvePath(SharpmakeCsPath, ref _perforceRootPath); - foreach (Solution.Configuration conf in Configurations) - conf.Resolve(resolver); + foreach (Solution.Configuration conf in Configurations) + conf.Resolve(resolver); - foreach (var extraItemKey in ExtraItems.Keys.ToList()) - { - Strings values = new Strings(ExtraItems[extraItemKey]); - foreach (string value in values) + foreach (var extraItemKey in ExtraItems.Keys.ToList()) { - string newValue = resolver.Resolve(value); - values.UpdateValue(value, newValue); + Strings values = new Strings(ExtraItems[extraItemKey]); + foreach (string value in values) + { + string newValue = resolver.Resolve(value); + values.UpdateValue(value, newValue); + } + ExtraItems[extraItemKey] = values; } - ExtraItems[extraItemKey] = values; - } - _resolved = true; + _resolved = true; + } } public string ResolveString(string input, Configuration conf = null, ITarget target = null) diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index 3c99e14ca..36afc724c 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -2378,26 +2378,41 @@ public static string GetRegistryLocalMachineSubKeyValue(string registrySubKey, s public class StopwatchProfiler : IDisposable { private readonly Stopwatch _stopWatch; - private readonly Action _disposeAction; + private readonly Action _disposeActionDuration; + private readonly Action _disposeActionStartEnd; private readonly long _minThresholdMs; - public StopwatchProfiler(Action disposeAction) - : this(disposeAction, 0) + public StopwatchProfiler(Action disposeActionDuration) + : this(disposeActionDuration, 0) { } - public StopwatchProfiler(Action disposeAction, long minThresholdMs) + public StopwatchProfiler(Action disposeActionStartEnd) { - _disposeAction = disposeAction; + _disposeActionStartEnd = disposeActionStartEnd; + _stopWatch = Stopwatch.StartNew(); + _minThresholdMs = 0; + } + + public StopwatchProfiler(Action disposeActionDuration, long minThresholdMs) + { + _disposeActionDuration = disposeActionDuration; _stopWatch = Stopwatch.StartNew(); _minThresholdMs = minThresholdMs; } public void Dispose() { + _stopWatch.Stop(); + if (_disposeActionStartEnd != null) + { + long timestamp = Stopwatch.GetTimestamp(); // sadly the stopwatch can't tell us the real start time + _disposeActionStartEnd.Invoke(timestamp - _stopWatch.ElapsedTicks, timestamp); + } + long elapsed = _stopWatch.ElapsedMilliseconds; if (elapsed > _minThresholdMs) - _disposeAction(elapsed); + _disposeActionDuration?.Invoke(elapsed); } } From 19fccee7bcf3776172cac27793718a18340abb84 Mon Sep 17 00:00:00 2001 From: Nicolas Fleury Date: Tue, 20 Oct 2020 14:35:47 +0200 Subject: [PATCH 026/142] Optim: take into account the number of resolved files in addition to the nb of configurations when sorting project link tasks, so big projects are processed early --- Sharpmake/Builder.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Sharpmake/Builder.cs b/Sharpmake/Builder.cs index 438776612..0e923099d 100644 --- a/Sharpmake/Builder.cs +++ b/Sharpmake/Builder.cs @@ -876,7 +876,13 @@ public void Link() { // start with huge projects to balance end of tasks List projects = new List(_projects.Values); - projects.Sort((Project p0, Project p1) => { return p1.Configurations.Count.CompareTo(p0.Configurations.Count); }); + projects.Sort((Project p0, Project p1) => + { + int p0Int = p0.Configurations.Count * p0.ResolvedSourceFiles.Count; + int p1Int = p1.Configurations.Count * p1.ResolvedSourceFiles.Count; + int cmp = p1Int.CompareTo(p0Int); + return cmp; + }); LinkProjects(projects); From d5eeb4381c52143b7ab064494e3f4327cd95b13b Mon Sep 17 00:00:00 2001 From: Chris Savoie Date: Sun, 9 Sep 2018 04:30:35 -0700 Subject: [PATCH 027/142] [Makefile] Add more c++ version options for make files. --- Sharpmake.Generators/Generic/Makefile.cs | 20 ++++++++++++-------- Sharpmake/Options.Makefile.cs | 6 +++++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Sharpmake.Generators/Generic/Makefile.cs b/Sharpmake.Generators/Generic/Makefile.cs index b94b1716f..cbf8a3fe9 100644 --- a/Sharpmake.Generators/Generic/Makefile.cs +++ b/Sharpmake.Generators/Generic/Makefile.cs @@ -484,15 +484,19 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File // CppLanguageStandard SelectOption(conf, - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp17, () => { cxxflags.Append("-std=c++17 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp14, () => { cxxflags.Append("-std=c++14 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp11, () => { cxxflags.Append("-std=c++11 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp98, () => { cxxflags.Append("-std=c++98 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp11, () => { cxxflags.Append("-std=gnu++11 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp98, () => { cxxflags.Append("-std=gnu++98 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Default, () => { cxxflags.Append(""); }) + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Default, () => { cxxflags.Append(""); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp98, () => { cxxflags.Append("-std=c++98 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp11, () => { cxxflags.Append("-std=c++11 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp14, () => { cxxflags.Append("-std=c++14 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp17, () => { cxxflags.Append("-std=c++17 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp2a, () => { cxxflags.Append("-std=c++2a "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp98, () => { cxxflags.Append("-std=gnu++98 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp11, () => { cxxflags.Append("-std=gnu++11 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp14, () => { cxxflags.Append("-std=gnu++14 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp17, () => { cxxflags.Append("-std=gnu++17 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp2a, () => { cxxflags.Append("-std=gnu++2a "); }) ); - + // Exceptions SelectOption(conf, Options.Option(Options.Makefile.Compiler.Exceptions.Enable, () => { cxxflags.Append("-fexceptions "); }), diff --git a/Sharpmake/Options.Makefile.cs b/Sharpmake/Options.Makefile.cs index 7439d1a73..3feefb642 100644 --- a/Sharpmake/Options.Makefile.cs +++ b/Sharpmake/Options.Makefile.cs @@ -37,8 +37,12 @@ public enum CppLanguageStandard Cpp11, Cpp14, Cpp17, + Cpp2a, GnuCpp98, - GnuCpp11 + GnuCpp11, + GnuCpp14, + GnuCpp17, + GnuCpp2a, } public enum Exceptions From a21adbc2de7eb8afa7c4309588b2749c6482edd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Le?= Date: Tue, 6 Oct 2020 14:44:48 -0400 Subject: [PATCH 028/142] Add ProduceReferenceAssembly option for csproj --- Sharpmake.Generators/VisualStudio/Csproj.Template.cs | 1 + Sharpmake.Generators/VisualStudio/Csproj.cs | 6 ++++++ Sharpmake/Options.CSharp.cs | 7 +++++++ 3 files changed, 14 insertions(+) diff --git a/Sharpmake.Generators/VisualStudio/Csproj.Template.cs b/Sharpmake.Generators/VisualStudio/Csproj.Template.cs index e1cea7516..253564d79 100644 --- a/Sharpmake.Generators/VisualStudio/Csproj.Template.cs +++ b/Sharpmake.Generators/VisualStudio/Csproj.Template.cs @@ -145,6 +145,7 @@ public static class Project [options.LanguageVersion] [options.CopyVsixExtensionFiles] [options.CopyVsixExtensionLocation] + [options.ProduceReferenceAssembly] "; diff --git a/Sharpmake.Generators/VisualStudio/Csproj.cs b/Sharpmake.Generators/VisualStudio/Csproj.cs index 0ff452634..fd63125a9 100644 --- a/Sharpmake.Generators/VisualStudio/Csproj.cs +++ b/Sharpmake.Generators/VisualStudio/Csproj.cs @@ -3324,6 +3324,12 @@ private Options.ExplicitOptions GenerateOptions(CSharpProject project, Project.C Options.Option(Options.CSharp.SonarQubeExclude.Enabled, () => { options["SonarQubeExclude"] = "True"; }) ); + SelectOption + ( + Options.Option(Options.CSharp.ProduceReferenceAssembly.Enabled, () => { options["ProduceReferenceAssembly"] = "True"; }), + Options.Option(Options.CSharp.ProduceReferenceAssembly.Disabled, () => { options["ProduceReferenceAssembly"] = RemoveLineTag; }) + ); + options["AssemblyOriginatorKeyFile"] = Options.PathOption.Get(conf, RemoveLineTag, _projectPath); options["MinimumVisualStudioVersion"] = Options.StringOption.Get(conf); options["OldToolsVersion"] = Options.StringOption.Get(conf); diff --git a/Sharpmake/Options.CSharp.cs b/Sharpmake/Options.CSharp.cs index 89a598546..d9556866a 100644 --- a/Sharpmake/Options.CSharp.cs +++ b/Sharpmake/Options.CSharp.cs @@ -183,6 +183,13 @@ public enum RunPostBuildEvent OnOutputUpdated } + public enum ProduceReferenceAssembly + { + Enabled, + [Default] + Disabled + } + public class UpdateInterval : IntOption { public UpdateInterval(int interval) From 6c74a9377979cf37885cdb628b3ac0d2ba9b6aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Le?= Date: Wed, 14 Oct 2020 11:26:48 -0400 Subject: [PATCH 029/142] Add support for CustomTargetsFiles in csproj --- Sharpmake.Generators/VisualStudio/Csproj.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Sharpmake.Generators/VisualStudio/Csproj.cs b/Sharpmake.Generators/VisualStudio/Csproj.cs index fd63125a9..7d918747a 100644 --- a/Sharpmake.Generators/VisualStudio/Csproj.cs +++ b/Sharpmake.Generators/VisualStudio/Csproj.cs @@ -1447,6 +1447,12 @@ List skipFiles project.AddCSharpSpecificImportProjects(importProjects, devenv); + // Add custom .targets files as import projects. + foreach (string targetsFile in project.CustomTargetsFiles) + { + importProjects.AddRange(targetsFile.Select(f => new ImportProject() { Project = targetsFile })); + } + WriteImportProjects(importProjects.Distinct(EqualityComparer.Default), project, configurations.First(), writer, resolver); foreach (var element in project.UsingTasks) From 2d4896de4d3838d50b513df67bac6f2f82b2f584 Mon Sep 17 00:00:00 2001 From: Chris Savoie Date: Sat, 23 Feb 2019 01:39:58 -0800 Subject: [PATCH 030/142] [Makefile] Get precompiled headers working. This doesn't prevent a precompiled source file from being compiled redundantly, it will still have to be excluded in the scripts. ```c++ if (target.DevEnv.IsVisualStudio()) conf.PrecompSource = PrecompiledHeader + ".cpp"; else conf.SourceFilesBuildExclude.Add(PrecompiledHeader + ".cpp"); ``` --- .../Generic/Makefile.Template.cs | 21 ++++++++++++------ Sharpmake.Generators/Generic/Makefile.cs | 22 +++++++++++++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/Sharpmake.Generators/Generic/Makefile.Template.cs b/Sharpmake.Generators/Generic/Makefile.Template.cs index 42e1c01d3..7e3526c4a 100644 --- a/Sharpmake.Generators/Generic/Makefile.Template.cs +++ b/Sharpmake.Generators/Generic/Makefile.Template.cs @@ -103,6 +103,10 @@ ifndef verbose RESFLAGS += $(DEFINES) $(INCLUDES) LDDEPS += [options.LDDEPS] LINKCMD = [options.LinkCommand] + PCH = [precompHeader] + PCHOUT = [precompHeaderOut] + GCH = [precompIntermediate] + PCHCMD = [precompCommand] define PREBUILDCMDS endef define PRELINKCMDS @@ -180,32 +184,35 @@ @echo Cleaning [projectName] $(PRELINKCMDS) ifneq (,$(PCH)) -$(GCH): $(PCH) +$(GCH): $(PCH) | $(OBJDIR) @echo $(notdir $<) -$(SILENT) cp $< $(OBJDIR) - $(SILENT) $(CXX) $(CXXFLAGS) -o ""$@"" -c ""$<"" + $(SILENT) $(CXX) $(CXXFLAGS) -xc++-header -o ""$@"" -c ""$<"" $(SILENT) $(POSTFILECMDS) endif "; public static readonly string ObjectRuleCxx = -@"$(OBJDIR)/[objectFile]: [sourceFile] | $(OBJDIR) +@"$(OBJDIR)/[objectFile]: [sourceFile] $(GCH) | $(OBJDIR) @echo $(notdir $<) - $(SILENT) $(CXX) $(CXXFLAGS) -o ""$@"" -c ""$<"" + $(SILENT) $(CXX) $(CXXFLAGS) $(PCHCMD) -o ""$@"" -c ""$<"" $(SILENT) $(POSTFILECMDS) "; public static readonly string ObjectRuleC = -@"$(OBJDIR)/[objectFile]: [sourceFile] | $(OBJDIR) +@"$(OBJDIR)/[objectFile]: [sourceFile] $(GCH) | $(OBJDIR) @echo $(notdir $<) - $(SILENT) $(CXX) $(CFLAGS) -x c -o ""$@"" -c ""$<"" + $(SILENT) $(CXX) $(CFLAGS) $(PCHCMD) -x c -o ""$@"" -c ""$<"" $(SILENT) $(POSTFILECMDS) "; - public static string Footer = "-include $(OBJECTS:%.o=%.d)\n"; + public static string Footer = +@"-include $(OBJECTS:%.o=%.d) +-include $(GCH:%.gch=%.d) +"; } } } diff --git a/Sharpmake.Generators/Generic/Makefile.cs b/Sharpmake.Generators/Generic/Makefile.cs index cbf8a3fe9..87ae735ad 100644 --- a/Sharpmake.Generators/Generic/Makefile.cs +++ b/Sharpmake.Generators/Generic/Makefile.cs @@ -280,8 +280,30 @@ private string GenerateProject( // Configurations variables. foreach (Project.Configuration conf in configurations) { + string precompHeader = ""; + string precompHeaderOut = ""; + string precompIntermediate = ""; + string precompCommand = ""; + + if (!string.IsNullOrEmpty(conf.PrecompHeader)) + { + // Support pch files in sub folders + var pchFile = PathMakeUnix(conf.PrecompHeader); + // Don't make additional subfolder in temp directory + var pchObj = Path.GetFileName(conf.PrecompHeader); + var fileName = Path.Combine(Util.GetCapitalizedPath(project.SourceRootPath), pchFile); + precompHeader = PathMakeUnix(Util.PathGetRelative(projectFileInfo.DirectoryName, fileName, true)); + precompHeaderOut = $"$(OBJDIR)/{pchObj}"; + precompIntermediate = $"$(OBJDIR)/{pchObj}.gch"; + precompCommand = "-include $(PCHOUT)"; + } + using (fileGenerator.Declare("name", conf.Name.ToLower())) using (fileGenerator.Declare("options", options[conf])) + using (fileGenerator.Declare("precompHeader", precompHeader)) + using (fileGenerator.Declare("precompHeaderOut", precompHeaderOut)) + using (fileGenerator.Declare("precompIntermediate", precompIntermediate)) + using (fileGenerator.Declare("precompCommand", precompCommand)) { fileGenerator.Write(Template.Project.ProjectConfigurationVariables); } From 19e2022f0cb2265c729c6d53f78f86304035eb73 Mon Sep 17 00:00:00 2001 From: Chris Savoie Date: Tue, 20 Oct 2020 11:11:44 -0700 Subject: [PATCH 031/142] [Samples] Fix launch arguments to work with new sharpmake output location * Use single qotes in sources argument instead of double for cross platform support --- samples/Sharpmake.Samples.sharpmake.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/Sharpmake.Samples.sharpmake.cs b/samples/Sharpmake.Samples.sharpmake.cs index dcde04076..8150e2171 100644 --- a/samples/Sharpmake.Samples.sharpmake.cs +++ b/samples/Sharpmake.Samples.sharpmake.cs @@ -35,8 +35,8 @@ public override void ConfigureAll(Configuration conf, Target target) conf.CsprojUserFile = new Project.Configuration.CsprojUserFileSettings { StartAction = Project.Configuration.CsprojUserFileSettings.StartActionSetting.Program, - StartProgram = @"[conf.TargetPath]\Sharpmake.Application.exe", - StartArguments = "/sources(\"[project.SharpmakeMainFile]\")", + StartProgram = @"[project.RootPath]\tmp\bin\[conf.Target.Optimization]\sharpmake.application\Sharpmake.Application.exe", + StartArguments = "/sources('[project.SharpmakeMainFile]')", WorkingDirectory = "[project.SourceRootPath]", OverwriteExistingFile = false }; From 478b9fea55bb2a371213dfa72807c6de5c886a4a Mon Sep 17 00:00:00 2001 From: Philippe Sengchanpheng Date: Tue, 20 Oct 2020 17:41:44 -0400 Subject: [PATCH 032/142] Adds property to explicitely set python virtual environment version --- Sharpmake.Generators/VisualStudio/Pyproj.cs | 3 ++- Sharpmake/Project.cs | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Sharpmake.Generators/VisualStudio/Pyproj.cs b/Sharpmake.Generators/VisualStudio/Pyproj.cs index 44b8f8cba..0a457e374 100644 --- a/Sharpmake.Generators/VisualStudio/Pyproj.cs +++ b/Sharpmake.Generators/VisualStudio/Pyproj.cs @@ -193,10 +193,11 @@ private string Generate(PythonProject project, List unsor foreach (PythonVirtualEnvironment virtualEnvironment in _project.VirtualEnvironments) { baseGuid = needsPypatching ? baseGuid : virtualEnvironment.BaseInterpreterGuid.ToString(); + pyVersion = String.IsNullOrEmpty(virtualEnvironment.Version) ? currentInterpreterVersion : virtualEnvironment.Version; Write(Template.Project.ProjectItemGroupBegin, writer, resolver); using (resolver.NewScopedParameter("name", virtualEnvironment.Name)) - using (resolver.NewScopedParameter("version", currentInterpreterVersion)) + using (resolver.NewScopedParameter("version", pyVersion)) using (resolver.NewScopedParameter("basePath", virtualEnvironment.Path)) using (resolver.NewScopedParameter("baseGuid", baseGuid)) using (resolver.NewScopedParameter("guid", virtualEnvironment.Guid)) diff --git a/Sharpmake/Project.cs b/Sharpmake/Project.cs index aeb70bd49..2663b7bda 100644 --- a/Sharpmake/Project.cs +++ b/Sharpmake/Project.cs @@ -2575,15 +2575,25 @@ public class PythonVirtualEnvironment public Guid Guid; public bool IsDefault; public Guid BaseInterpreterGuid; + public string Version; public PythonVirtualEnvironment(string name, string path, bool isDefault) - : this(name, path, isDefault, default(Guid)) + : this(name, path, String.Empty, isDefault, default(Guid)) + { } + + public PythonVirtualEnvironment(string name, string path, string version, bool isDefault) + : this(name, path, version, isDefault, default(Guid)) { } public PythonVirtualEnvironment(string name, string path, bool isDefault, Guid baseInterpreterGuid) + : this(name, path, String.Empty, isDefault, baseInterpreterGuid) + { } + + public PythonVirtualEnvironment(string name, string path, string version, bool isDefault, Guid baseInterpreterGuid) { Name = name; Path = path; + Version = version; Guid = Util.BuildGuid(path); IsDefault = isDefault; BaseInterpreterGuid = baseInterpreterGuid; From 8ab9846fac3a6550fd29bdd6c2ce0dfb6a4efde1 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 21 Oct 2020 09:41:26 +0200 Subject: [PATCH 033/142] Buildfix. --- Sharpmake.Generators/VisualStudio/Pyproj.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake.Generators/VisualStudio/Pyproj.cs b/Sharpmake.Generators/VisualStudio/Pyproj.cs index 0a457e374..79b71498f 100644 --- a/Sharpmake.Generators/VisualStudio/Pyproj.cs +++ b/Sharpmake.Generators/VisualStudio/Pyproj.cs @@ -193,7 +193,7 @@ private string Generate(PythonProject project, List unsor foreach (PythonVirtualEnvironment virtualEnvironment in _project.VirtualEnvironments) { baseGuid = needsPypatching ? baseGuid : virtualEnvironment.BaseInterpreterGuid.ToString(); - pyVersion = String.IsNullOrEmpty(virtualEnvironment.Version) ? currentInterpreterVersion : virtualEnvironment.Version; + string pyVersion = string.IsNullOrEmpty(virtualEnvironment.Version) ? currentInterpreterVersion : virtualEnvironment.Version; Write(Template.Project.ProjectItemGroupBegin, writer, resolver); using (resolver.NewScopedParameter("name", virtualEnvironment.Name)) From 6fee12d939f60be2493832ca9197a4f5f2ee9fe8 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 21 Oct 2020 10:04:40 +0200 Subject: [PATCH 034/142] Add reference to Microsoft.DiaSymReader.Native to fix exceptions. --- Sharpmake/Sharpmake.csproj | 1 + Sharpmake/Sharpmake.sharpmake.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/Sharpmake/Sharpmake.csproj b/Sharpmake/Sharpmake.csproj index d11098642..40e0f564f 100644 --- a/Sharpmake/Sharpmake.csproj +++ b/Sharpmake/Sharpmake.csproj @@ -136,6 +136,7 @@ + diff --git a/Sharpmake/Sharpmake.sharpmake.cs b/Sharpmake/Sharpmake.sharpmake.cs index 716cf78c0..73bbc5d32 100644 --- a/Sharpmake/Sharpmake.sharpmake.cs +++ b/Sharpmake/Sharpmake.sharpmake.cs @@ -24,6 +24,7 @@ public override void ConfigureAll(Configuration conf, Target target) conf.Options.Add(Options.CSharp.AllowUnsafeBlocks.Enabled); conf.ReferencesByNuGetPackage.Add("Microsoft.CodeAnalysis.CSharp", "3.4.0"); + conf.ReferencesByNuGetPackage.Add("Microsoft.DiaSymReader.Native", "1.7.0"); conf.ReferencesByNuGetPackage.Add("Microsoft.VisualStudio.Setup.Configuration.Interop", "1.16.30"); } } From 813f2c4275943a6d0c784706e16a2c6da0481f51 Mon Sep 17 00:00:00 2001 From: Christian Martin Date: Wed, 21 Oct 2020 10:32:16 +0200 Subject: [PATCH 035/142] [Bff] Fix intermittent bug when collecting natvis files. --- Sharpmake.Generators/FastBuild/Bff.cs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Sharpmake.Generators/FastBuild/Bff.cs b/Sharpmake.Generators/FastBuild/Bff.cs index eae7a8761..5ddb39c02 100644 --- a/Sharpmake.Generators/FastBuild/Bff.cs +++ b/Sharpmake.Generators/FastBuild/Bff.cs @@ -1463,10 +1463,11 @@ private static void FillLinkerOptions(BffGenerationContext context) private static Strings CollectNatvisFiles(BffGenerationContext context) { Project.Configuration projectConfig = context.Configuration; + + var natvisFiles = new Strings(projectConfig.Project.NatvisFiles); if (projectConfig.Output == Project.Configuration.OutputType.Dll || projectConfig.Output == Project.Configuration.OutputType.Exe) { - Strings natvisFiles = new Strings(projectConfig.Project.NatvisFiles); - HashSet visitedProjects = new HashSet(); + var visitedProjects = new HashSet(); foreach (Project.Configuration resolvedDepConfig in projectConfig.ResolvedDependencies) { if (resolvedDepConfig.Output != Project.Configuration.OutputType.Dll && resolvedDepConfig.Output != Project.Configuration.OutputType.Exe) @@ -1481,13 +1482,8 @@ private static Strings CollectNatvisFiles(BffGenerationContext context) } } } - - return natvisFiles; - } - else - { - return projectConfig.Project.NatvisFiles; } + return natvisFiles; } private static void FillEmbeddedNatvisOptions(BffGenerationContext context) From 325678a9244dfb6e8fc0666a9d5db25f3c1b7107 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sun, 4 Oct 2020 16:04:29 +0200 Subject: [PATCH 036/142] Add HelloLinux sample --- .../HelloLinux.CommonProject.sharpmake.cs | 136 ++++++++++++++++ .../HelloLinux.CommonSolution.sharpmake.cs | 38 +++++ .../HelloLinux.CommonTarget.sharpmake.cs | 152 ++++++++++++++++++ .../HelloLinux/HelloLinux.Main.sharpmake.cs | 91 +++++++++++ samples/HelloLinux/Properties/AssemblyInfo.cs | 47 ++++++ .../codebase/HelloXCode.sharpmake.cs | 38 +++++ .../codebase/dll1/dll1.sharpmake.cs | 48 ++++++ samples/HelloLinux/codebase/dll1/precomp.cpp | 2 + samples/HelloLinux/codebase/dll1/precomp.h | 3 + samples/HelloLinux/codebase/dll1/util_dll.cpp | 33 ++++ samples/HelloLinux/codebase/dll1/util_dll.h | 18 +++ .../HelloLinux/codebase/exe/exe.sharpmake.cs | 47 ++++++ samples/HelloLinux/codebase/exe/main.cpp | 37 +++++ samples/HelloLinux/codebase/exe/stdafx.cpp | 1 + samples/HelloLinux/codebase/exe/stdafx.h | 3 + .../static lib2/static_lib2.sharpmake.cs | 37 +++++ .../sub folder/useless_static_lib2.cpp | 11 ++ .../sub folder/useless_static_lib2.h | 7 + .../codebase/static lib2/util_static_lib2.cpp | 34 ++++ .../codebase/static lib2/util_static_lib2.h | 15 ++ .../codebase/static_lib1/src/ensure_debug.cpp | 11 ++ .../static_lib1/src/ensure_release.cpp | 11 ++ .../codebase/static_lib1/src/pch.cpp | 2 + .../HelloLinux/codebase/static_lib1/src/pch.h | 3 + .../static_lib1/src/util_static_lib1.cpp | 28 ++++ .../static_lib1/src/util_static_lib1.h | 7 + .../static_lib1/static_lib1.sharpmake.cs | 57 +++++++ samples/Sharpmake.Samples.sharpmake.cs | 20 +++ 28 files changed, 937 insertions(+) create mode 100644 samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs create mode 100644 samples/HelloLinux/HelloLinux.CommonSolution.sharpmake.cs create mode 100644 samples/HelloLinux/HelloLinux.CommonTarget.sharpmake.cs create mode 100644 samples/HelloLinux/HelloLinux.Main.sharpmake.cs create mode 100644 samples/HelloLinux/Properties/AssemblyInfo.cs create mode 100644 samples/HelloLinux/codebase/HelloXCode.sharpmake.cs create mode 100644 samples/HelloLinux/codebase/dll1/dll1.sharpmake.cs create mode 100644 samples/HelloLinux/codebase/dll1/precomp.cpp create mode 100644 samples/HelloLinux/codebase/dll1/precomp.h create mode 100644 samples/HelloLinux/codebase/dll1/util_dll.cpp create mode 100644 samples/HelloLinux/codebase/dll1/util_dll.h create mode 100644 samples/HelloLinux/codebase/exe/exe.sharpmake.cs create mode 100644 samples/HelloLinux/codebase/exe/main.cpp create mode 100644 samples/HelloLinux/codebase/exe/stdafx.cpp create mode 100644 samples/HelloLinux/codebase/exe/stdafx.h create mode 100644 samples/HelloLinux/codebase/static lib2/static_lib2.sharpmake.cs create mode 100644 samples/HelloLinux/codebase/static lib2/sub folder/useless_static_lib2.cpp create mode 100644 samples/HelloLinux/codebase/static lib2/sub folder/useless_static_lib2.h create mode 100644 samples/HelloLinux/codebase/static lib2/util_static_lib2.cpp create mode 100644 samples/HelloLinux/codebase/static lib2/util_static_lib2.h create mode 100644 samples/HelloLinux/codebase/static_lib1/src/ensure_debug.cpp create mode 100644 samples/HelloLinux/codebase/static_lib1/src/ensure_release.cpp create mode 100644 samples/HelloLinux/codebase/static_lib1/src/pch.cpp create mode 100644 samples/HelloLinux/codebase/static_lib1/src/pch.h create mode 100644 samples/HelloLinux/codebase/static_lib1/src/util_static_lib1.cpp create mode 100644 samples/HelloLinux/codebase/static_lib1/src/util_static_lib1.h create mode 100644 samples/HelloLinux/codebase/static_lib1/static_lib1.sharpmake.cs diff --git a/samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs b/samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs new file mode 100644 index 000000000..836bdbf29 --- /dev/null +++ b/samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs @@ -0,0 +1,136 @@ +// Copyright (c) 2017 Ubisoft Entertainment +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System.IO; +using System.Linq; +using Sharpmake; + +namespace HelloLinux +{ + public static class ConfigurePriorities + { + public const int All = -75; + public const int Platform = -50; + public const int Optimization = -25; + /* SHARPMAKE DEFAULT IS 0 */ + public const int Blobbing = 10; + public const int BuildSystem = 30; + } + + public abstract class CommonProject : Sharpmake.Project + { + protected CommonProject() + : base(typeof(CommonTarget)) + { + RootPath = Globals.RootDirectory; + IsFileNameToLower = false; + IsTargetFileNameToLower = false; + + SourceRootPath = @"[project.RootPath]\[project.Name]"; + } + + [ConfigurePriority(ConfigurePriorities.All)] + [Configure] + public virtual void ConfigureAll(Configuration conf, CommonTarget target) + { + conf.ProjectFileName = "[project.Name]_[target.Platform]"; + if (target.DevEnv != DevEnv.xcode4ios) + conf.ProjectFileName += "_[target.DevEnv]"; + conf.ProjectPath = Path.Combine(Globals.TmpDirectory, @"projects\[project.Name]"); + conf.IsFastBuild = target.BuildSystem == BuildSystem.FastBuild; + + conf.IntermediatePath = Path.Combine(Globals.TmpDirectory, @"obj\[target.DirectoryName]\[project.Name]"); + conf.TargetPath = Path.Combine(Globals.OutputDirectory, "[target.DirectoryName]"); + + // Note: uncomment the following line if we port this sample to windows + //conf.TargetLibraryPath = conf.IntermediatePath; // .lib files must be with the .obj files when running in fastbuild distributed mode or we'll have missing symbols due to merging of the .pdb + conf.TargetLibraryPath = Path.Combine(Globals.TmpDirectory, @"lib\[target.DirectoryName]\[project.Name]"); + + // TODO: uncomment and fix this. Didn't find a way to have product with + // different names per configurations to work properly... + //conf.TargetFileName += "_" + target.Optimization.ToString().ToLowerInvariant().First(); // suffix with lowered first letter of optim + //if (conf.IsFastBuild) + //conf.TargetFileName += "x"; + + conf.Output = Configuration.OutputType.Lib; // defaults to creating static libs + } + + //////////////////////////////////////////////////////////////////////// + #region Platfoms + [ConfigurePriority(ConfigurePriorities.Platform)] + [Configure(Platform.linux)] + public virtual void ConfigureLinux(Configuration conf, CommonTarget target) + { + } + #endregion + //////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////// + #region Optimizations + [ConfigurePriority(ConfigurePriorities.Optimization)] + [Configure(Optimization.Debug)] + public virtual void ConfigureDebug(Configuration conf, CommonTarget target) + { + conf.DefaultOption = Options.DefaultTarget.Debug; + } + + [ConfigurePriority(ConfigurePriorities.Optimization)] + [Configure(Optimization.Release)] + public virtual void ConfigureRelease(Configuration conf, CommonTarget target) + { + conf.DefaultOption = Options.DefaultTarget.Release; + } + #endregion + //////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////// + #region Blobs and unitys + [Configure(Blob.FastBuildUnitys)] + [ConfigurePriority(ConfigurePriorities.Blobbing)] + public virtual void FastBuildUnitys(Configuration conf, CommonTarget target) + { + conf.FastBuildBlobbed = true; + conf.FastBuildUnityPath = Path.Combine(Globals.TmpDirectory, @"unity\[project.Name]"); + conf.IncludeBlobbedSourceFiles = false; + conf.IsBlobbed = false; + } + + [Configure(Blob.NoBlob)] + [ConfigurePriority(ConfigurePriorities.Blobbing)] + public virtual void BlobNoBlob(Configuration conf, CommonTarget target) + { + conf.FastBuildBlobbed = false; + conf.IsBlobbed = false; + + if (conf.IsFastBuild) + conf.ProjectName += "_NoBlob"; + } + #endregion + //////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////// + #region Compilers and toolchains + [ConfigurePriority(ConfigurePriorities.BuildSystem)] + [Configure(BuildSystem.FastBuild)] + public virtual void ConfigureFastBuild(Configuration conf, CommonTarget target) + { + conf.SolutionFolder = "FastBuild/" + conf.SolutionFolder; + conf.ProjectName += "_FastBuild"; + + conf.Defines.Add("USES_FASTBUILD"); + } + #endregion + //////////////////////////////////////////////////////////////////////// + } +} diff --git a/samples/HelloLinux/HelloLinux.CommonSolution.sharpmake.cs b/samples/HelloLinux/HelloLinux.CommonSolution.sharpmake.cs new file mode 100644 index 000000000..9869c5060 --- /dev/null +++ b/samples/HelloLinux/HelloLinux.CommonSolution.sharpmake.cs @@ -0,0 +1,38 @@ +// Copyright (c) 2017 Ubisoft Entertainment +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using Sharpmake; + +namespace HelloLinux +{ + public class CommonSolution : Sharpmake.Solution + { + public CommonSolution() + : base(typeof(CommonTarget)) + { + IsFileNameToLower = false; + } + + [ConfigurePriority(ConfigurePriorities.All)] + [Configure] + public virtual void ConfigureAll(Configuration conf, CommonTarget target) + { + conf.SolutionFileName = "[solution.Name]_[target.Platform]"; + if (target.DevEnv != DevEnv.xcode4ios) + conf.SolutionFileName += "_[target.DevEnv]"; + conf.PlatformName = "[target.SolutionPlatformName]"; + conf.SolutionPath = System.IO.Path.Combine(Globals.TmpDirectory, "solutions"); + } + } +} diff --git a/samples/HelloLinux/HelloLinux.CommonTarget.sharpmake.cs b/samples/HelloLinux/HelloLinux.CommonTarget.sharpmake.cs new file mode 100644 index 000000000..20552282f --- /dev/null +++ b/samples/HelloLinux/HelloLinux.CommonTarget.sharpmake.cs @@ -0,0 +1,152 @@ +// Copyright (c) 2017 Ubisoft Entertainment +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Sharpmake; + +namespace HelloLinux +{ + [Fragment, Flags] + public enum Optimization + { + Debug = 1 << 0, + Release = 1 << 1 + } + + [Fragment, Flags] + public enum BuildSystem + { + Default = 1 << 0, + FastBuild = 1 << 1, + } + + [DebuggerDisplay("\"{Platform}_{DevEnv}\" {Name}")] + public class CommonTarget : Sharpmake.ITarget + { + public Platform Platform; + public DevEnv DevEnv; + public Optimization Optimization; + public Blob Blob; + public BuildSystem BuildSystem; + + public CommonTarget() { } + + public CommonTarget( + Platform platform, + DevEnv devEnv, + Optimization optimization, + Blob blob, + BuildSystem buildSystem + ) + { + Platform = platform; + DevEnv = devEnv; + Optimization = optimization; + Blob = blob; + BuildSystem = buildSystem; + } + + public override string Name + { + get + { + var nameParts = new List(); + + nameParts.Add(Optimization.ToString().ToLowerInvariant()); + + return string.Join(" ", nameParts); + } + } + + public string SolutionPlatformName + { + get + { + var nameParts = new List(); + + nameParts.Add(BuildSystem.ToString()); + + if (BuildSystem == BuildSystem.FastBuild && Blob == Blob.NoBlob) + nameParts.Add(Blob.ToString()); + + return string.Join("_", nameParts); + } + } + + /// + /// returns a string usable as a directory name, to use for instance for the intermediate path + /// + public string DirectoryName + { + get + { + var dirNameParts = new List(); + + dirNameParts.Add(Platform.ToString()); + dirNameParts.Add(Optimization.ToString()); + + if (BuildSystem == BuildSystem.FastBuild) + dirNameParts.Add(BuildSystem.ToString()); + + return string.Join("_", dirNameParts); + } + } + + public override Sharpmake.Optimization GetOptimization() + { + switch (Optimization) + { + case Optimization.Debug: + return Sharpmake.Optimization.Debug; + case Optimization.Release: + return Sharpmake.Optimization.Release; + default: + throw new NotSupportedException("Optimization value " + Optimization.ToString()); + } + } + + public override Platform GetPlatform() + { + return Platform; + } + + public static CommonTarget[] GetDefaultTargets() + { + var result = new List(); + result.AddRange(GetLinuxTargets()); + return result.ToArray(); + } + + public static CommonTarget[] GetLinuxTargets() + { + var defaultTarget = new CommonTarget( + Platform.linux, + DevEnv.make, + Optimization.Debug | Optimization.Release, + Blob.NoBlob, + BuildSystem.Default + ); + + // make a fastbuild version of the target + var fastBuildTarget = (CommonTarget)defaultTarget.Clone( + Blob.FastBuildUnitys, + BuildSystem.FastBuild + ); + + return new[] { defaultTarget }; + } + } +} diff --git a/samples/HelloLinux/HelloLinux.Main.sharpmake.cs b/samples/HelloLinux/HelloLinux.Main.sharpmake.cs new file mode 100644 index 000000000..c7f193ec3 --- /dev/null +++ b/samples/HelloLinux/HelloLinux.Main.sharpmake.cs @@ -0,0 +1,91 @@ +// Copyright (c) 2017 Ubisoft Entertainment +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using Sharpmake; +using Sharpmake.Generators.FastBuild; + +[module: Sharpmake.DebugProjectName("Sharpmake.HelloLinux")] + +[module: Sharpmake.Include("HelloLinux.*.sharpmake.cs")] +[module: Sharpmake.Include("codebase/*.sharpmake.cs")] +[module: Sharpmake.Include("codebase/*/*.sharpmake.cs")] + +namespace HelloLinux +{ + public static class Globals + { + // branch root path relative to current sharpmake file location + public const string RelativeRootPath = @".\codebase"; + public static string RootDirectory; + public static string TmpDirectory { get { return Path.Combine(RootDirectory, "temp"); } } + public static string OutputDirectory { get { return Path.Combine(TmpDirectory, "bin"); } } + } + + public static class Main + { + private static void ConfigureRootDirectory() + { + FileInfo fileInfo = Util.GetCurrentSharpmakeFileInfo(); + string rootDirectory = Path.Combine(fileInfo.DirectoryName, Globals.RelativeRootPath); + Globals.RootDirectory = Util.SimplifyPath(rootDirectory); + } + + private static void ConfigureAutoCleanup() + { + Util.FilesAutoCleanupActive = true; + Util.FilesAutoCleanupDBPath = Path.Combine(Globals.TmpDirectory, "sharpmake"); + + if (!Directory.Exists(Util.FilesAutoCleanupDBPath)) + Directory.CreateDirectory(Util.FilesAutoCleanupDBPath); + } + + [Sharpmake.Main] + public static void SharpmakeMain(Sharpmake.Arguments arguments) + { + ConfigureRootDirectory(); + ConfigureAutoCleanup(); + + FastBuildSettings.FastBuildWait = true; + FastBuildSettings.FastBuildSummary = false; + FastBuildSettings.FastBuildNoSummaryOnError = true; + FastBuildSettings.FastBuildDistribution = false; + FastBuildSettings.FastBuildMonitor = true; + FastBuildSettings.FastBuildAllowDBMigration = true; + + // for the purpose of this sample, we'll reuse the FastBuild executables that live in the sharpmake source repo + string sharpmakeFastBuildDir = Util.PathGetAbsolute(Globals.RootDirectory, @"..\..\..\tools\FastBuild"); + switch (Util.GetExecutingPlatform()) + { + case Platform.linux: + FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeFastBuildDir, "FBuild"); + break; + case Platform.win64: + default: + FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeFastBuildDir, "FBuild.exe"); + break; + } + + Bff.UnityResolver = new Bff.FragmentUnityResolver(); + + foreach (Type solutionType in Assembly.GetExecutingAssembly().GetTypes().Where(t => !t.IsAbstract && t.IsSubclassOf(typeof(CommonSolution)))) + arguments.Generate(solutionType); + } + } +} diff --git a/samples/HelloLinux/Properties/AssemblyInfo.cs b/samples/HelloLinux/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..191db1679 --- /dev/null +++ b/samples/HelloLinux/Properties/AssemblyInfo.cs @@ -0,0 +1,47 @@ +// Copyright (c) 2017 Ubisoft Entertainment +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("HelloLinux.Properties")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Ubisoft")] +[assembly: AssemblyProduct("HelloLinux.Properties")] +[assembly: AssemblyCopyright("Copyright \u00A9 Ubisoft 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("CC6018D5-0760-463E-92FB-849E7E904449")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/samples/HelloLinux/codebase/HelloXCode.sharpmake.cs b/samples/HelloLinux/codebase/HelloXCode.sharpmake.cs new file mode 100644 index 000000000..d426b4b86 --- /dev/null +++ b/samples/HelloLinux/codebase/HelloXCode.sharpmake.cs @@ -0,0 +1,38 @@ +// Copyright (c) 2017 Ubisoft Entertainment +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using Sharpmake; + +namespace HelloLinux +{ + [Sharpmake.Generate] + public class HelloLinuxSolution : CommonSolution + { + public HelloLinuxSolution() + { + AddTargets(CommonTarget.GetDefaultTargets()); + Name = "HelloLinux"; + } + + public override void ConfigureAll(Configuration conf, CommonTarget target) + { + base.ConfigureAll(conf, target); + + conf.AddProject(target); + conf.AddProject(target); + conf.AddProject(target); + conf.AddProject(target); + } + } +} diff --git a/samples/HelloLinux/codebase/dll1/dll1.sharpmake.cs b/samples/HelloLinux/codebase/dll1/dll1.sharpmake.cs new file mode 100644 index 000000000..1eb9e8987 --- /dev/null +++ b/samples/HelloLinux/codebase/dll1/dll1.sharpmake.cs @@ -0,0 +1,48 @@ +// Copyright (c) 2017 Ubisoft Entertainment +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using Sharpmake; + +namespace HelloLinux +{ + [Sharpmake.Generate] + public class Dll1Project : CommonProject + { + public Dll1Project() + { + AddTargets(CommonTarget.GetDefaultTargets()); + Name = "dll1"; + } + + public override void ConfigureAll(Configuration conf, CommonTarget target) + { + base.ConfigureAll(conf, target); + + conf.SolutionFolder = "SharedLibs"; + + conf.PrecompHeader = "precomp.h"; + conf.PrecompSource = "precomp.cpp"; + + conf.Output = Configuration.OutputType.Dll; + conf.AdditionalCompilerOptions.Add("-fPIC"); + + conf.Defines.Add("UTIL_DLL_EXPORT"); + conf.ExportDefines.Add("UTIL_DLL_IMPORT"); + + conf.IncludePaths.Add(SourceRootPath); + + conf.AddPrivateDependency(target); + } + } +} diff --git a/samples/HelloLinux/codebase/dll1/precomp.cpp b/samples/HelloLinux/codebase/dll1/precomp.cpp new file mode 100644 index 000000000..15c6d7b04 --- /dev/null +++ b/samples/HelloLinux/codebase/dll1/precomp.cpp @@ -0,0 +1,2 @@ +#include "precomp.h" + diff --git a/samples/HelloLinux/codebase/dll1/precomp.h b/samples/HelloLinux/codebase/dll1/precomp.h new file mode 100644 index 000000000..c32e3aaf4 --- /dev/null +++ b/samples/HelloLinux/codebase/dll1/precomp.h @@ -0,0 +1,3 @@ +#pragma once + +#include diff --git a/samples/HelloLinux/codebase/dll1/util_dll.cpp b/samples/HelloLinux/codebase/dll1/util_dll.cpp new file mode 100644 index 000000000..73e079cb4 --- /dev/null +++ b/samples/HelloLinux/codebase/dll1/util_dll.cpp @@ -0,0 +1,33 @@ +#include "precomp.h" +#include "util_dll.h" + +#include "src/util_static_lib1.h" +#include + +int UtilDll1::ComputeSum(const std::vector& someInts) +{ + int acc = 0; + for (int item : someInts) + acc += item; + +#if _DEBUG + std::cout << "- Dll1 is built in Debug" +# if USES_FASTBUILD + " with FastBuild" +# endif + "!" << std::endl; +#endif + +#if NDEBUG + std::cout << "- Dll1 is built in Release" +# if USES_FASTBUILD + " with FastBuild" +# endif + "!" << std::endl; +#endif + + acc += static_lib1_utils::GetRandomPosition(); + + return acc; +} + diff --git a/samples/HelloLinux/codebase/dll1/util_dll.h b/samples/HelloLinux/codebase/dll1/util_dll.h new file mode 100644 index 000000000..3cdb40a16 --- /dev/null +++ b/samples/HelloLinux/codebase/dll1/util_dll.h @@ -0,0 +1,18 @@ +#pragma once +#include + +#if defined(UTIL_DLL_EXPORT) && HAVE_VISIBILITY +# define UTIL_DLL __attribute__((__visibility("default"))) +#elif defined(UTIL_DLL_EXPORT) && defined(_MSC_VER) +# define UTIL_DLL __declspec(dllexport) +#elif defined(UTIL_DLL_IMPORT) && defined(_MSC_VER) +#define UTIL_DLL __declspec(dllimport) +#else +#define UTIL_DLL +#endif + +struct UtilDll1 +{ + UTIL_DLL int ComputeSum(const std::vector& someInts); +}; + diff --git a/samples/HelloLinux/codebase/exe/exe.sharpmake.cs b/samples/HelloLinux/codebase/exe/exe.sharpmake.cs new file mode 100644 index 000000000..83b2be627 --- /dev/null +++ b/samples/HelloLinux/codebase/exe/exe.sharpmake.cs @@ -0,0 +1,47 @@ +// Copyright (c) 2017 Ubisoft Entertainment +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using Sharpmake; + +namespace HelloLinux +{ + [Sharpmake.Generate] + public class ExeProject : CommonProject + { + public ExeProject() + { + AddTargets(CommonTarget.GetDefaultTargets()); + Name = "exe"; + } + + public override void ConfigureAll(Configuration conf, CommonTarget target) + { + base.ConfigureAll(conf, target); + + conf.Output = Configuration.OutputType.Exe; + + conf.PrecompHeader = "stdafx.h"; + conf.PrecompSource = "stdafx.cpp"; + + // this tells the shared lib loader to look in the exe dir + // note: because we write in makefiles we double the $ to escape it + conf.AdditionalLinkerOptions.Add("-Wl,-rpath='$$ORIGIN'"); + + conf.AddPrivateDependency(target); + conf.AddPrivateDependency(target); + + conf.Defines.Add("CREATION_DATE=\"October 2020\""); + } + } +} diff --git a/samples/HelloLinux/codebase/exe/main.cpp b/samples/HelloLinux/codebase/exe/main.cpp new file mode 100644 index 000000000..86912aed5 --- /dev/null +++ b/samples/HelloLinux/codebase/exe/main.cpp @@ -0,0 +1,37 @@ +#include "stdafx.h" +#include "util_dll.h" +#include "util_static_lib2.h" +#include "sub folder/useless_static_lib2.h" + +int main(int, char**) +{ + std::cout << "Hello Linux World, from " CREATION_DATE "!" << std::endl; + +#if _DEBUG + std::cout << "- Exe is built in Debug" +# if USES_FASTBUILD + " with FastBuild" +# endif + "!" << std::endl; +#endif + +#if NDEBUG + std::cout << "- Exe is built in Release" +# if USES_FASTBUILD + " with FastBuild" +# endif + "!" << std::endl; +#endif + + std::vector someArray(5, 6); + + // from dll1 + UtilDll1 utilityDll; + utilityDll.ComputeSum(someArray); + + // from static_lib2 + Util2 utilityStatic; + utilityStatic.DoSomethingUseful(); + StaticLib2::UselessMethod(); + return 0; +} diff --git a/samples/HelloLinux/codebase/exe/stdafx.cpp b/samples/HelloLinux/codebase/exe/stdafx.cpp new file mode 100644 index 000000000..fd4f341c7 --- /dev/null +++ b/samples/HelloLinux/codebase/exe/stdafx.cpp @@ -0,0 +1 @@ +#include "stdafx.h" diff --git a/samples/HelloLinux/codebase/exe/stdafx.h b/samples/HelloLinux/codebase/exe/stdafx.h new file mode 100644 index 000000000..23395186c --- /dev/null +++ b/samples/HelloLinux/codebase/exe/stdafx.h @@ -0,0 +1,3 @@ +#pragma once + +#include diff --git a/samples/HelloLinux/codebase/static lib2/static_lib2.sharpmake.cs b/samples/HelloLinux/codebase/static lib2/static_lib2.sharpmake.cs new file mode 100644 index 000000000..4c36dd045 --- /dev/null +++ b/samples/HelloLinux/codebase/static lib2/static_lib2.sharpmake.cs @@ -0,0 +1,37 @@ +// Copyright (c) 2017 Ubisoft Entertainment +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using Sharpmake; + +namespace HelloLinux +{ + [Sharpmake.Generate] + public class StaticLib2Project : CommonProject + { + public StaticLib2Project() + { + AddTargets(CommonTarget.GetDefaultTargets()); + Name = "static lib2"; + } + + public override void ConfigureAll(Configuration conf, CommonTarget target) + { + base.ConfigureAll(conf, target); + + conf.SolutionFolder = "StaticLibs"; + + conf.IncludePaths.Add(SourceRootPath); + } + } +} diff --git a/samples/HelloLinux/codebase/static lib2/sub folder/useless_static_lib2.cpp b/samples/HelloLinux/codebase/static lib2/sub folder/useless_static_lib2.cpp new file mode 100644 index 000000000..49469d32a --- /dev/null +++ b/samples/HelloLinux/codebase/static lib2/sub folder/useless_static_lib2.cpp @@ -0,0 +1,11 @@ +#include "useless_static_lib2.h" +#include + +namespace StaticLib2 +{ + void UselessMethod() + { + std::cout << "- Useless in fact!" << std::endl; + } +} + diff --git a/samples/HelloLinux/codebase/static lib2/sub folder/useless_static_lib2.h b/samples/HelloLinux/codebase/static lib2/sub folder/useless_static_lib2.h new file mode 100644 index 000000000..ee6d3ef92 --- /dev/null +++ b/samples/HelloLinux/codebase/static lib2/sub folder/useless_static_lib2.h @@ -0,0 +1,7 @@ +#pragma once + +namespace StaticLib2 +{ + void UselessMethod(); +} + diff --git a/samples/HelloLinux/codebase/static lib2/util_static_lib2.cpp b/samples/HelloLinux/codebase/static lib2/util_static_lib2.cpp new file mode 100644 index 000000000..b6404f891 --- /dev/null +++ b/samples/HelloLinux/codebase/static lib2/util_static_lib2.cpp @@ -0,0 +1,34 @@ +#include "util_static_lib2.h" +#include + +Util2::Util2() = default; + +Util2::~Util2() +{ +} + +void Util2::DoSomethingUseful() const +{ +#if _DEBUG + std::cout << "- StaticLib2 is built in Debug" +# if USES_FASTBUILD + " with FastBuild" +# endif + "!" << std::endl; +#endif + +#if NDEBUG + std::cout << "- StaticLib2 is built in Release" +# if USES_FASTBUILD + " with FastBuild" +# endif + "!" << std::endl; +#endif + + return DoSomethingInternal("Yeah right..."); +} + +void Util2::DoSomethingInternal(const char* anArgument) const +{ + std::cout << "Useful, right?\n- " << anArgument << std::endl; +} diff --git a/samples/HelloLinux/codebase/static lib2/util_static_lib2.h b/samples/HelloLinux/codebase/static lib2/util_static_lib2.h new file mode 100644 index 000000000..196128c58 --- /dev/null +++ b/samples/HelloLinux/codebase/static lib2/util_static_lib2.h @@ -0,0 +1,15 @@ +#pragma once + +class Util2 +{ +public: + Util2(); + ~Util2(); + +public: + void DoSomethingUseful() const; + +private: + void DoSomethingInternal(const char* anArgument) const; +}; + diff --git a/samples/HelloLinux/codebase/static_lib1/src/ensure_debug.cpp b/samples/HelloLinux/codebase/static_lib1/src/ensure_debug.cpp new file mode 100644 index 000000000..2f8e4ac06 --- /dev/null +++ b/samples/HelloLinux/codebase/static_lib1/src/ensure_debug.cpp @@ -0,0 +1,11 @@ +#include "src/pch.h" + +#if !_DEBUG + #error Expected Debug define (_DEBUG) was not found +#endif + +#if NDEBUG + #error Unexpected Release define (NDEBUG) was found +#endif + +#warning Debug is built! diff --git a/samples/HelloLinux/codebase/static_lib1/src/ensure_release.cpp b/samples/HelloLinux/codebase/static_lib1/src/ensure_release.cpp new file mode 100644 index 000000000..18d52b619 --- /dev/null +++ b/samples/HelloLinux/codebase/static_lib1/src/ensure_release.cpp @@ -0,0 +1,11 @@ +#include "src/pch.h" + +#if _DEBUG + #error Unexpected Debug define (_DEBUG) was found +#endif + +#if !NDEBUG + #error Expected Release define (NDEBUG) was not found +#endif + +#warning Release is built! diff --git a/samples/HelloLinux/codebase/static_lib1/src/pch.cpp b/samples/HelloLinux/codebase/static_lib1/src/pch.cpp new file mode 100644 index 000000000..ce9b73991 --- /dev/null +++ b/samples/HelloLinux/codebase/static_lib1/src/pch.cpp @@ -0,0 +1,2 @@ +#include "pch.h" + diff --git a/samples/HelloLinux/codebase/static_lib1/src/pch.h b/samples/HelloLinux/codebase/static_lib1/src/pch.h new file mode 100644 index 000000000..23395186c --- /dev/null +++ b/samples/HelloLinux/codebase/static_lib1/src/pch.h @@ -0,0 +1,3 @@ +#pragma once + +#include diff --git a/samples/HelloLinux/codebase/static_lib1/src/util_static_lib1.cpp b/samples/HelloLinux/codebase/static_lib1/src/util_static_lib1.cpp new file mode 100644 index 000000000..e07f280ae --- /dev/null +++ b/samples/HelloLinux/codebase/static_lib1/src/util_static_lib1.cpp @@ -0,0 +1,28 @@ +#include "src/pch.h" +#include "util_static_lib1.h" +#include + +namespace static_lib1_utils +{ + std::streampos GetRandomPosition() + { +#if _DEBUG + std::cout << "- StaticLib1 is built in Debug" +# if USES_FASTBUILD + " with FastBuild" +# endif + "!" << std::endl; +#endif + +#if NDEBUG + std::cout << "- StaticLib1 is built in Release" +# if USES_FASTBUILD + " with FastBuild" +# endif + "!" << std::endl; +#endif + + return 1; + } +} + diff --git a/samples/HelloLinux/codebase/static_lib1/src/util_static_lib1.h b/samples/HelloLinux/codebase/static_lib1/src/util_static_lib1.h new file mode 100644 index 000000000..0cec87480 --- /dev/null +++ b/samples/HelloLinux/codebase/static_lib1/src/util_static_lib1.h @@ -0,0 +1,7 @@ +#pragma once +#include + +namespace static_lib1_utils +{ + std::streampos GetRandomPosition(); +} diff --git a/samples/HelloLinux/codebase/static_lib1/static_lib1.sharpmake.cs b/samples/HelloLinux/codebase/static_lib1/static_lib1.sharpmake.cs new file mode 100644 index 000000000..1034a65fe --- /dev/null +++ b/samples/HelloLinux/codebase/static_lib1/static_lib1.sharpmake.cs @@ -0,0 +1,57 @@ +// Copyright (c) 2017 Ubisoft Entertainment +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using Sharpmake; + +namespace HelloLinux +{ + [Sharpmake.Generate] + public class StaticLib1Project : CommonProject + { + public StaticLib1Project() + { + AddTargets(CommonTarget.GetDefaultTargets()); + Name = "static_lib1"; + } + + public override void ConfigureAll(Configuration conf, CommonTarget target) + { + base.ConfigureAll(conf, target); + + conf.SolutionFolder = "StaticLibs"; + + // intentionally in a subfolder + conf.PrecompHeader = @"src\pch.h"; + conf.PrecompSource = @"src\pch.cpp"; + + // becase this lib will be used in a shared lib, we need it to be position independent + conf.AdditionalCompilerOptions.Add("-fPIC"); + + conf.IncludePaths.Add(SourceRootPath); + + switch (target.Optimization) + { + case Optimization.Debug: + conf.SourceFilesBuildExclude.Add(@"src\ensure_release.cpp"); + break; + case Optimization.Release: + // use a different method to exclude ensure_debug.cpp + conf.SourceFilesBuildExcludeRegex.Add(Util.RegexPathCombine("src", @"ensure_d.*\.cpp$")); + break; + default: + throw new Error("Unexpected optimization " + target.Optimization); + } + } + } +} diff --git a/samples/Sharpmake.Samples.sharpmake.cs b/samples/Sharpmake.Samples.sharpmake.cs index 8150e2171..7ef42bf74 100644 --- a/samples/Sharpmake.Samples.sharpmake.cs +++ b/samples/Sharpmake.Samples.sharpmake.cs @@ -158,6 +158,26 @@ public FastBuildSimpleExecutable() } } + [Generate] + public class HelloLinuxProject : SampleProject + { + public HelloLinuxProject() + { + Name = "HelloLinux"; + SharpmakeMainFile = "HelloLinux.Main.sharpmake.cs"; + + // This one is special, we have .sharpmake.cs files in the codebase + SourceFilesExcludeRegex.Remove(@"\\codebase\\"); + } + + public override void ConfigureAll(Configuration conf, Target target) + { + base.ConfigureAll(conf, target); + + conf.AddPrivateDependency(target); + } + } + [Generate] public class HelloWorldProject : SampleProject { From 18392e34cd8e016ccc724774860f692b22c8e7af Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sun, 4 Oct 2020 16:05:26 +0200 Subject: [PATCH 037/142] [Makefile] Shared libraries support - Implement shared library link command - Shared libs are found in the target path --- .../Generic/Makefile.Template.cs | 2 ++ Sharpmake.Generators/Generic/Makefile.cs | 8 ++++++-- .../Linux/LinuxPlatform.cs | 17 ++++++++++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Sharpmake.Generators/Generic/Makefile.Template.cs b/Sharpmake.Generators/Generic/Makefile.Template.cs index 7e3526c4a..a61fe9835 100644 --- a/Sharpmake.Generators/Generic/Makefile.Template.cs +++ b/Sharpmake.Generators/Generic/Makefile.Template.cs @@ -120,6 +120,8 @@ define POSTFILECMDS "; public static string LinkCommandLib = "$(AR) -rcs $(TARGET) $(OBJECTS)"; + public static string LinkCommandDll = "$(CXX) -shared -o $(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(LDLIBS)"; + public static string LinkCommandExe = "$(CXX) -o $(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(LDLIBS)"; public static string ObjectsVariableBegin = "ifeq ($(config),[name])\n"; diff --git a/Sharpmake.Generators/Generic/Makefile.cs b/Sharpmake.Generators/Generic/Makefile.cs index 87ae735ad..3a27640ad 100644 --- a/Sharpmake.Generators/Generic/Makefile.cs +++ b/Sharpmake.Generators/Generic/Makefile.cs @@ -291,7 +291,7 @@ private string GenerateProject( var pchFile = PathMakeUnix(conf.PrecompHeader); // Don't make additional subfolder in temp directory var pchObj = Path.GetFileName(conf.PrecompHeader); - var fileName = Path.Combine(Util.GetCapitalizedPath(project.SourceRootPath), pchFile); + var fileName = Path.Combine(PathMakeUnix(project.SourceRootPath), pchFile); precompHeader = PathMakeUnix(Util.PathGetRelative(projectFileInfo.DirectoryName, fileName, true)); precompHeaderOut = $"$(OBJDIR)/{pchObj}"; precompIntermediate = $"$(OBJDIR)/{pchObj}.gch"; @@ -518,7 +518,7 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp17, () => { cxxflags.Append("-std=gnu++17 "); }), Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp2a, () => { cxxflags.Append("-std=gnu++2a "); }) ); - + // Exceptions SelectOption(conf, Options.Option(Options.Makefile.Compiler.Exceptions.Enable, () => { cxxflags.Append("-fexceptions "); }), @@ -587,6 +587,10 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File { options["LinkCommand"] = Template.Project.LinkCommandLib; } + else if (conf.Output == Project.Configuration.OutputType.Dll) + { + options["LinkCommand"] = Template.Project.LinkCommandDll; + } else { options["LinkCommand"] = Template.Project.LinkCommandExe; diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.cs index 3efff3b1b..11bd958de 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.cs @@ -72,7 +72,22 @@ public IEnumerable GetPlatformLibraryPaths(Project.Configuration conf) public void SetupDynamicLibraryPaths(Project.Configuration configuration, DependencySetting dependencySetting, Project.Configuration dependency) { - DefaultPlatform.SetupLibraryPaths(configuration, dependencySetting, dependency); + // There's no implib on linux platforms, the so does both + if (dependency.Project.SharpmakeProjectType != Project.ProjectTypeAttribute.Export && + !(configuration.IsFastBuild && !dependency.IsFastBuild)) + { + if (dependencySetting.HasFlag(DependencySetting.LibraryPaths)) + configuration.AddDependencyBuiltTargetLibraryPath(dependency.TargetPath, dependency.TargetLibraryPathOrderNumber); + if (dependencySetting.HasFlag(DependencySetting.LibraryFiles)) + configuration.AddDependencyBuiltTargetLibraryFile(dependency.TargetFileFullName, dependency.TargetFileOrderNumber); + } + else + { + if (dependencySetting.HasFlag(DependencySetting.LibraryPaths)) + configuration.DependenciesOtherLibraryPaths.Add(dependency.TargetPath, dependency.TargetLibraryPathOrderNumber); + if (dependencySetting.HasFlag(DependencySetting.LibraryFiles)) + configuration.DependenciesOtherLibraryFiles.Add(dependency.TargetFileFullName, dependency.TargetFileOrderNumber); + } } public void SetupStaticLibraryPaths(Project.Configuration configuration, DependencySetting dependencySetting, Project.Configuration dependency) From 909a4e0cd95104353c6d8775d9bebd4f961f2538 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sun, 4 Oct 2020 16:06:08 +0200 Subject: [PATCH 038/142] [Makefile] Remove useless calls to Append. --- Sharpmake.Generators/Generic/Makefile.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Sharpmake.Generators/Generic/Makefile.cs b/Sharpmake.Generators/Generic/Makefile.cs index 3a27640ad..cd7328c46 100644 --- a/Sharpmake.Generators/Generic/Makefile.cs +++ b/Sharpmake.Generators/Generic/Makefile.cs @@ -463,18 +463,18 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File // ExtraWarnings SelectOption(conf, Options.Option(Options.Makefile.Compiler.ExtraWarnings.Enable, () => { cflags.Append("-Wextra "); }), - Options.Option(Options.Makefile.Compiler.ExtraWarnings.Disable, () => { cflags.Append(""); }) + Options.Option(Options.Makefile.Compiler.ExtraWarnings.Disable, () => { }) ); // GenerateDebugInformation SelectOption(conf, Options.Option(Options.Makefile.Compiler.GenerateDebugInformation.Enable, () => { cflags.Append("-g "); }), - Options.Option(Options.Makefile.Compiler.GenerateDebugInformation.Disable, () => { cflags.Append(""); }) + Options.Option(Options.Makefile.Compiler.GenerateDebugInformation.Disable, () => { }) ); // OptimizationLevel SelectOption(conf, - Options.Option(Options.Makefile.Compiler.OptimizationLevel.Disable, () => { cflags.Append(""); }), + Options.Option(Options.Makefile.Compiler.OptimizationLevel.Disable, () => { }), Options.Option(Options.Makefile.Compiler.OptimizationLevel.Standard, () => { cflags.Append("-O1 "); }), Options.Option(Options.Makefile.Compiler.OptimizationLevel.Full, () => { cflags.Append("-O2 "); }), Options.Option(Options.Makefile.Compiler.OptimizationLevel.FullWithInlining, () => { cflags.Append("-O3 "); }), @@ -483,7 +483,7 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File // Warnings SelectOption(conf, - Options.Option(Options.Makefile.Compiler.Warnings.NormalWarnings, () => { cflags.Append(""); }), + Options.Option(Options.Makefile.Compiler.Warnings.NormalWarnings, () => { }), Options.Option(Options.Makefile.Compiler.Warnings.MoreWarnings, () => { cflags.Append("-Wall "); }), Options.Option(Options.Makefile.Compiler.Warnings.Disable, () => { cflags.Append("-w "); }) ); @@ -491,7 +491,7 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File // WarningsAsErrors SelectOption(conf, Options.Option(Options.Makefile.Compiler.TreatWarningsAsErrors.Enable, () => { cflags.Append("-Werror "); }), - Options.Option(Options.Makefile.Compiler.TreatWarningsAsErrors.Disable, () => { cflags.Append(""); }) + Options.Option(Options.Makefile.Compiler.TreatWarningsAsErrors.Disable, () => { }) ); // AdditionalCompilerOptions From cfcbee7fd8af4f67867f789a6f029eba3ce1745d Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sun, 4 Oct 2020 16:10:09 +0200 Subject: [PATCH 039/142] [Makefile] Fix makefiles that contain spaces in their names and other spacing issues --- .../Generic/Makefile.Template.cs | 4 ++-- Sharpmake.Generators/Generic/Makefile.cs | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Sharpmake.Generators/Generic/Makefile.Template.cs b/Sharpmake.Generators/Generic/Makefile.Template.cs index a61fe9835..6493c7cdb 100644 --- a/Sharpmake.Generators/Generic/Makefile.Template.cs +++ b/Sharpmake.Generators/Generic/Makefile.Template.cs @@ -45,11 +45,11 @@ export config public static string ProjectRuleEnd = "\n\t@echo \" ==== Building [projectName] ($(config)) ====\"" + - "\n\t@${MAKE} --no-print-directory -C [projectFileDirectory] -f [projectFileName]\n\n"; + "\n\t@${MAKE} --no-print-directory -C \"[projectFileDirectory]\" -f \"[projectFileName]\"\n\n"; public static string CleanRuleBegin = "clean:\n"; - public static string CleanRuleProject = "\t@${MAKE} --no-print-directory -C [projectFileDirectory] -f [projectFileName] clean\n"; + public static string CleanRuleProject = "\t@${MAKE} --no-print-directory -C \"[projectFileDirectory]\" -f \"[projectFileName]\" clean\n"; public static string CleanRuleEnd = "\n"; diff --git a/Sharpmake.Generators/Generic/Makefile.cs b/Sharpmake.Generators/Generic/Makefile.cs index cd7328c46..171caaf2f 100644 --- a/Sharpmake.Generators/Generic/Makefile.cs +++ b/Sharpmake.Generators/Generic/Makefile.cs @@ -149,7 +149,7 @@ private string GenerateSolution( { FileInfo projectFileInfo = new FileInfo(resolvedProject.ProjectFile); using (fileGenerator.Declare("projectName", resolvedProject.ProjectName)) - using (fileGenerator.Declare("projectFileDirectory", PathMakeUnix(Util.PathGetRelative(solutionFileInfo.DirectoryName, projectFileInfo.DirectoryName)))) + using (fileGenerator.Declare("projectFileDirectory", PathMakeUnix(Util.PathGetRelative(solutionFileInfo.DirectoryName, projectFileInfo.DirectoryName), false))) using (fileGenerator.Declare("projectFileName", projectFileInfo.Name)) { fileGenerator.Write(Template.Solution.ProjectRuleBegin); @@ -169,7 +169,7 @@ private string GenerateSolution( foreach (Solution.ResolvedProject resolvedProject in solutionProjects) { FileInfo projectFileInfo = new FileInfo(resolvedProject.ProjectFile); - using (fileGenerator.Declare("projectFileDirectory", PathMakeUnix(Util.PathGetRelative(solutionFileInfo.DirectoryName, projectFileInfo.DirectoryName)))) + using (fileGenerator.Declare("projectFileDirectory", PathMakeUnix(Util.PathGetRelative(solutionFileInfo.DirectoryName, projectFileInfo.DirectoryName), false))) using (fileGenerator.Declare("projectFileName", projectFileInfo.Name)) { fileGenerator.Write(Template.Solution.CleanRuleProject); @@ -539,7 +539,7 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File #region Linker // OutputFile - options["OutputFile"] = FormatOutputFileName(conf); + options["OutputFile"] = FormatOutputFileName(conf).Replace(" ", @"\ "); // DependenciesLibraryFiles OrderableStrings dependenciesLibraryFiles = new OrderableStrings(conf.DependenciesLibraryFiles); @@ -569,10 +569,10 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File { case Project.Configuration.OutputType.None: continue; case Project.Configuration.OutputType.Lib: - case Project.Configuration.OutputType.Dll: case Project.Configuration.OutputType.DotNetClassLibrary: deps.Add(Path.Combine(depConf.TargetLibraryPath, FormatOutputFileName(depConf)), depConf.TargetFileOrderNumber); break; + case Project.Configuration.OutputType.Dll: default: deps.Add(Path.Combine(depConf.TargetPath, FormatOutputFileName(depConf)), depConf.TargetFileOrderNumber); break; @@ -682,9 +682,13 @@ private static string FormatOutputFileName(Project.Configuration conf) #region Utils - private static string PathMakeUnix(string path) + private static string PathMakeUnix(string path, bool escapeSpaces = true) { - return path.Replace(Util.WindowsSeparator, Util.UnixSeparator).TrimEnd(Util.UnixSeparator); + string clean = path.Replace(Util.WindowsSeparator, Util.UnixSeparator).TrimEnd(Util.UnixSeparator); + if (escapeSpaces) + return clean.Replace(" ", @"\ "); + + return clean; } private static void PathMakeUnix(IList paths) From 6772cd935710865dd1f6d3574594ebd7e85bb97a Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 20 Oct 2020 10:58:25 +0200 Subject: [PATCH 040/142] [Makefile] Fix defines containing double quotes and spaces. --- Sharpmake.Generators/Generic/Makefile.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Sharpmake.Generators/Generic/Makefile.cs b/Sharpmake.Generators/Generic/Makefile.cs index 171caaf2f..f429b6752 100644 --- a/Sharpmake.Generators/Generic/Makefile.cs +++ b/Sharpmake.Generators/Generic/Makefile.cs @@ -435,8 +435,12 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File else // Release defines.Add("NDEBUG"); - defines.AddRange(conf.Defines); - defines.InsertPrefix("-D"); + foreach (string define in conf.Defines) + { + if (!string.IsNullOrWhiteSpace(define)) + defines.Add(define.Replace(@"""", @"\""")); + } + defines.InsertPrefixSuffix(@"-D """, @""""); options["Defines"] = defines.JoinStrings(" "); // Includes From 16e240f5d481d654cba1a9e937740d2aef1f95a9 Mon Sep 17 00:00:00 2001 From: Guillaume BUCHLE Date: Wed, 22 Jul 2020 15:34:09 -0400 Subject: [PATCH 041/142] [XCode] Replace TargetDevice option object by an enum, more easy to use --- .../Apple/BaseApplePlatform.cs | 12 +++++------- Sharpmake/Options.XCode.cs | 14 ++++++++------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs index 051423f8c..fa84a36cd 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs @@ -423,7 +423,6 @@ public virtual void SelectCompilerOptions(IGenerationContext context) options["ExcludedSourceFileNames"] = XCodeUtil.XCodeFormatList(conf.ResolvedSourceFilesBuildExclude, 4); options["SpecificLibraryPaths"] = FileGeneratorUtilities.RemoveLineTag; - options["TargetedDeviceFamily"] = "1,2"; options["BuildDirectory"] = (conf.Output == Project.Configuration.OutputType.Lib) ? conf.TargetLibraryPath : conf.TargetPath; SelectPrecompiledHeaderOptions(context); @@ -682,12 +681,11 @@ public virtual void SelectCompilerOptions(IGenerationContext context) Options.Option(Options.XCode.Compiler.SkipInstall.Enable, () => options["SkipInstall"] = "YES") ); - Options.XCode.Compiler.TargetedDeviceFamily targetedDeviceFamily = Options.GetObject(conf); - if (targetedDeviceFamily != null) - options["TargetedDeviceFamily"] = targetedDeviceFamily.Value; - else - options["TargetedDeviceFamily"] = FileGeneratorUtilities.RemoveLineTag; - + context.SelectOption( + Options.Option(Options.XCode.Compiler.TargetedDeviceFamily.IosAndIpad, () => options["TargetedDeviceFamily"] = "1,2"), + Options.Option(Options.XCode.Compiler.TargetedDeviceFamily.Ios, () => options["TargetedDeviceFamily"] = "1"), + Options.Option(Options.XCode.Compiler.TargetedDeviceFamily.Ipad, () => options["TargetedDeviceFamily"] = "2") + ); Options.XCode.Compiler.ValidArchs validArchs = Options.GetObject(conf); if (validArchs != null) diff --git a/Sharpmake/Options.XCode.cs b/Sharpmake/Options.XCode.cs index 8131e1401..dbf72827a 100644 --- a/Sharpmake/Options.XCode.cs +++ b/Sharpmake/Options.XCode.cs @@ -11,6 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + using System; using System.Linq; @@ -389,13 +390,14 @@ public enum StripDebugSymbolsDuringCopy Disable } - public class TargetedDeviceFamily + [Flags] + public enum TargetedDeviceFamily { - public string Value; - public TargetedDeviceFamily(string value) - { - Value = value; - } + [Default] + Ios = 1 << 0, + Ipad = 1 << 1, + + IosAndIpad = Ios | Ipad } public class AssetCatalogCompilerAppIconName : StringOption From 6df5816c1cc6ea1aed69e4da51cf8f2bee4c108a Mon Sep 17 00:00:00 2001 From: Guillaume BUCHLE Date: Mon, 20 Jul 2020 18:29:31 -0400 Subject: [PATCH 042/142] [XCode] Add support for Solution Folder (folders in IDE explorer) --- .../Apple/XCWorkspace.Template.cs | 20 ++- Sharpmake.Generators/Apple/XCWorkspace.cs | 136 +++++++++++++++++- 2 files changed, 145 insertions(+), 11 deletions(-) diff --git a/Sharpmake.Generators/Apple/XCWorkspace.Template.cs b/Sharpmake.Generators/Apple/XCWorkspace.Template.cs index 904ad5cd8..b8081f41d 100644 --- a/Sharpmake.Generators/Apple/XCWorkspace.Template.cs +++ b/Sharpmake.Generators/Apple/XCWorkspace.Template.cs @@ -28,15 +28,23 @@ private static class Template public static string ProjectReference = "\t\n\t\n"; public static string ProjectReferenceAbsolute = -@" - +@"[indent] +[indent] "; public static string ProjectReferenceRelative = -@" - +@"[indent] +[indent] +"; + public static string GroupBegin = +@"[indent] +"; + public static string GroupEnd = +@"[indent] "; } } diff --git a/Sharpmake.Generators/Apple/XCWorkspace.cs b/Sharpmake.Generators/Apple/XCWorkspace.cs index ebfa37361..c163440e4 100644 --- a/Sharpmake.Generators/Apple/XCWorkspace.cs +++ b/Sharpmake.Generators/Apple/XCWorkspace.cs @@ -24,6 +24,8 @@ public partial class XCWorkspace : ISolutionGenerator private const string SolutionExtension = ".xcworkspace"; private const string SolutionContentsFileName = "contents.xcworkspacedata"; + private Dictionary _solutionFolderCache = new Dictionary(); + public void Generate(Builder builder, Solution solution, List configurations, string solutionFile, List generatedFiles, List skipFiles) { _builder = builder; @@ -79,12 +81,16 @@ private string Generate(Solution solution, List configur fileGenerator.Write(Template.Header); - foreach (Solution.ResolvedProject resolvedProject in solutionProjects) + _solutionFolderCache.Clear(); + List solutionsFiles = solutionProjects.Select(project => { var solutionFileItem = new SolutionFile() { Name = project.ProjectFile, Parent = ParseSolutionFolder(project.SolutionFolder) }; solutionFileItem.RegisterToParent(); return solutionFileItem; }).ToList(); + List solutionsItems = solutionsFiles.GroupBy(solutionsItem => solutionsItem.GetRoot()).Select(group => group.Key).ToList(); + solutionsItems.Sort((a, b) => string.Compare(a.Name, b.Name)); + + foreach (var solutionItem in solutionsItems) { - using (fileGenerator.Declare("projectPath", resolvedProject.ProjectFile)) - { - fileGenerator.Write(Template.ProjectReferenceAbsolute); - } + //Sort of folders content + (solutionItem as SolutionFolder)?.Sort(); + WriteSolutionItem(fileGenerator, solutionItem); } fileGenerator.Write(Template.Footer); @@ -103,5 +109,125 @@ private void Write(string value, TextWriter writer, Resolver resolver) writer.Write(str); writer.Flush(); } + + private static void WriteSolutionItem(FileGenerator fileGenerator, SolutionItem solutionItem, int nbIndent = 0) + { + bool isFolder = !solutionItem.IsFile; + string indent = new string('\t', nbIndent); + if (isFolder) + { + SolutionFolder solutionFolder = solutionItem as SolutionFolder; + + using (fileGenerator.Declare("folderName", solutionFolder.Name)) + using (fileGenerator.Declare("indent", indent)) + { + fileGenerator.Write(Template.GroupBegin); + } + + foreach (var child in solutionFolder.Childs) + { + WriteSolutionItem(fileGenerator, child, nbIndent + 1); + } + + using (fileGenerator.Declare("indent", indent)) + { + fileGenerator.Write(Template.GroupEnd); + } + } + else + { + using (fileGenerator.Declare("projectPath", solutionItem.Name)) + using (fileGenerator.Declare("indent", indent)) + { + fileGenerator.Write(Template.ProjectReferenceAbsolute); + } + } + } + + [System.Diagnostics.DebuggerDisplay("{Path}")] + private class SolutionItem + { + public string Name; + public string Path + { + get + { + if (Parent == null) + return Name; + + return System.IO.Path.Combine(Parent.Path, Name); + } + } + + public SolutionItem Parent; + + public virtual bool IsFile => true; + + public SolutionItem GetRoot() + { + return Parent == null ? this : Parent.GetRoot(); + } + } + + private class SolutionFile : SolutionItem + { + public override bool IsFile => true; + public void RegisterToParent() + { + var parent = Parent as SolutionFolder; + if (parent != null) + parent.Childs.Add(this); + } + } + + private class SolutionFolder : SolutionItem + { + public List Childs = new List(); + public void Sort() + { + Childs.Sort((a, b) => string.Compare(a.Name, b.Name)); + foreach (var child in Childs) + { + (child as SolutionFolder)?.Sort(); + } + } + public override bool IsFile => false; + } + + private SolutionFolder ParseSolutionFolder(string solutionFolders) + { + if (string.IsNullOrEmpty(solutionFolders)) + return null; + + SolutionFolder result = null; + + string path = MakeStandartPath(solutionFolders); + if (!_solutionFolderCache.TryGetValue(path, out result)) + { + List solutionFolderStack = path.Split(Util._pathSeparators, System.StringSplitOptions.RemoveEmptyEntries).ToList(); + string folderName = solutionFolderStack.Last(); + solutionFolderStack.RemoveAt(solutionFolderStack.Count - 1); + SolutionFolder parent = ParseSolutionFolder(string.Join(Path.DirectorySeparatorChar.ToString(), solutionFolderStack)); + + result = new SolutionFolder() + { + Name = folderName, + Parent = parent + }; + + if (parent != null) + { + parent.Childs.Add(result); + } + + _solutionFolderCache.Add(path, result); + } + return result; + } + + private string MakeStandartPath(string path) + { + return string.Join(Path.DirectorySeparatorChar.ToString(), path.Split(Util._pathSeparators, System.StringSplitOptions.RemoveEmptyEntries)); + } } } From 025a201e4e51a626f9c939873dea8aa20fd1caef Mon Sep 17 00:00:00 2001 From: Guillaume BUCHLE Date: Thu, 23 Jul 2020 19:00:30 -0400 Subject: [PATCH 043/142] [XCode] Add support for Manual provisionning/Signing --- .../Apple/XCodeProj.Template.cs | 1 + .../Apple/BaseApplePlatform.cs | 21 +++++----------- Sharpmake/Options.XCode.cs | 24 ++++++++----------- 3 files changed, 17 insertions(+), 29 deletions(-) diff --git a/Sharpmake.Generators/Apple/XCodeProj.Template.cs b/Sharpmake.Generators/Apple/XCodeProj.Template.cs index 96e9c3c01..bf8655774 100644 --- a/Sharpmake.Generators/Apple/XCodeProj.Template.cs +++ b/Sharpmake.Generators/Apple/XCodeProj.Template.cs @@ -260,6 +260,7 @@ private static class Template ""CODE_SIGN_IDENTITY[sdk=iphoneos*]"" = ""[item.Options.CodeSigningIdentity]""; DEBUG_INFORMATION_FORMAT = [item.Options.DebugInformationFormat]; DEAD_CODE_STRIPPING = [item.Options.DeadStripping]; + DEVELOPMENT_TEAM = [item.Options.DevelopmentTeam]; CONFIGURATION_BUILD_DIR = ""[item.Options.BuildDirectory]""; ENABLE_BITCODE = [item.Options.EnableBitcode]; EXCLUDED_SOURCE_FILE_NAMES = [item.Options.ExcludedSourceFileNames]; diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs index 051423f8c..a1549af26 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs @@ -501,17 +501,12 @@ public virtual void SelectCompilerOptions(IGenerationContext context) Options.Option(Options.XCode.Compiler.CppLanguageStandard.GNU17, () => options["CppStandard"] = "gnu++17") ); - Options.XCode.Compiler.DevelopmentTeam developmentTeam = Options.GetObject(conf); - if (developmentTeam != null) - options["DevelopmentTeam"] = developmentTeam.Value; - else - options["DevelopmentTeam"] = FileGeneratorUtilities.RemoveLineTag; + options["DevelopmentTeam"] = Options.StringOption.Get(conf); - Options.XCode.Compiler.ProvisioningStyle provisioningStyle = Options.GetObject(conf); - if (provisioningStyle != null) - options["ProvisioningStyle"] = provisioningStyle.Value; - else - options["ProvisioningStyle"] = "Automatic"; + context.SelectOption( + Options.Option(Options.XCode.Compiler.ProvisioningStyle.Automatic, () => { options["ProvisioningStyle"] = "Automatic"; }), + Options.Option(Options.XCode.Compiler.ProvisioningStyle.Manual, () => { options["ProvisioningStyle"] = "Manual"; }) + ); context.SelectOption( Options.Option(Options.XCode.Compiler.DebugInformationFormat.Dwarf, () => options["DebugInformationFormat"] = "dwarf"), @@ -667,11 +662,7 @@ public virtual void SelectCompilerOptions(IGenerationContext context) throw new NotSupportedException($"XCode generator doesn't handle {conf.Output}"); } - Options.XCode.Compiler.ProvisioningProfile provisioningProfile = Options.GetObject(conf); - if (provisioningProfile != null) - options["ProvisioningProfile"] = provisioningProfile.ProfileName; - else - options["ProvisioningProfile"] = FileGeneratorUtilities.RemoveLineTag; + options["ProvisioningProfile"] = Options.StringOption.Get(conf); Options.XCode.Compiler.SDKRoot sdkRoot = Options.GetObject(conf); if (sdkRoot != null) diff --git a/Sharpmake/Options.XCode.cs b/Sharpmake/Options.XCode.cs index 8131e1401..cadf38eab 100644 --- a/Sharpmake/Options.XCode.cs +++ b/Sharpmake/Options.XCode.cs @@ -78,21 +78,17 @@ public enum CLanguageStandard GNU11 } - public class CodeSignEntitlements + public class CodeSignEntitlements : StringOption { - public string Value; - public CodeSignEntitlements(string value) + public CodeSignEntitlements(string value) : base(value) { - Value = value; } } - public class CodeSigningIdentity + public class CodeSigningIdentity : StringOption { - public string Value; - public CodeSigningIdentity(string value) + public CodeSigningIdentity(string value) : base(value) { - Value = value; } } @@ -145,9 +141,11 @@ public class DevelopmentTeam : StringOption public DevelopmentTeam(string value) : base(value) { } } - public class ProvisioningStyle : StringOption + public enum ProvisioningStyle { - public ProvisioningStyle(string value) : base(value) { } + [Default] + Automatic, + Manual } public enum DeploymentPostProcessing @@ -329,12 +327,10 @@ public enum PrivateSymbols Enable } - public class ProvisioningProfile + public class ProvisioningProfile : StringOption { - public string ProfileName; - public ProvisioningProfile(string profileName) + public ProvisioningProfile(string profileName) : base(profileName) { - ProfileName = profileName; } } From c70b754c2aa4035e411ebe6e213747bf249da1b0 Mon Sep 17 00:00:00 2001 From: Janusz Nykiel Date: Thu, 29 Oct 2020 17:19:46 -0400 Subject: [PATCH 044/142] Respect MSVC "conformance mode" compiler option in generated .bff files --- Sharpmake.Generators/FastBuild/Bff.Template.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Sharpmake.Generators/FastBuild/Bff.Template.cs b/Sharpmake.Generators/FastBuild/Bff.Template.cs index 90e7edb26..178b91a77 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Template.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Template.cs @@ -371,6 +371,7 @@ public static class ConfigurationFile + ' [cmdLineOptions.RuntimeTypeInfo]' + ' [cmdLineOptions.OpenMP]' + ' [cmdLineOptions.LanguageStandard]' + + ' [cmdLineOptions.ConformanceMode]' // Output Files options // --------------------------- + ' [cmdLineOptions.CompilerProgramDatabaseFile]' From a51bbd3bc28aa839bae732af1c15a095e0aea13c Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sat, 31 Oct 2020 15:11:45 +0100 Subject: [PATCH 045/142] Fix templated project type names in profiler file --- Sharpmake/Builder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake/Builder.cs b/Sharpmake/Builder.cs index 0e923099d..7564eae48 100644 --- a/Sharpmake/Builder.cs +++ b/Sharpmake/Builder.cs @@ -619,7 +619,7 @@ private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs a public Project LoadProjectType(Type type) { - using (CreateProfilingScope(type.Name)) + using (CreateProfilingScope(type.ToNiceTypeName())) { Project.ProjectTypeAttribute projectTypeAttribute; if (type.IsDefined(typeof(Generate), false)) From 3c242bd8ec8ae38636c36e30cea9c2c53745de3a Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sat, 31 Oct 2020 15:12:07 +0100 Subject: [PATCH 046/142] Print the nb of configurations in the profiler tag --- Sharpmake/Project.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake/Project.cs b/Sharpmake/Project.cs index 2663b7bda..c028f0793 100644 --- a/Sharpmake/Project.cs +++ b/Sharpmake/Project.cs @@ -1818,7 +1818,7 @@ internal void Resolve(Builder builder, bool skipInvalidPath) XResourcesImg.Resolve(SourceRootPath, resolver); - using (builder.CreateProfilingScope("ResolveConfs")) + using (builder.CreateProfilingScope("ResolveConfs (" + Configurations.Count + ")")) { // Resolve Configuration foreach (Project.Configuration conf in Configurations) From d0f2fa4cfcf585ee67f38778982fce252153c5f4 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sat, 31 Oct 2020 15:13:33 +0100 Subject: [PATCH 047/142] Otpim: move type methods retrieval after we've checked that objectPath wasn't null --- Sharpmake/Resolver.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Sharpmake/Resolver.cs b/Sharpmake/Resolver.cs index e128558b8..a4e8167a1 100644 --- a/Sharpmake/Resolver.cs +++ b/Sharpmake/Resolver.cs @@ -832,8 +832,6 @@ private void ResolveObject(string objectPath, object obj, object fallbackValue) if (_resolvedObject.Add(obj) == false) return; - var typeWrapper = GetTypeWrapper(obj.GetType()); - if (objectPath != null) { if (GetResolveStatus(objectPath) == ResolveStatus.Resolved) @@ -842,6 +840,7 @@ private void ResolveObject(string objectPath, object obj, object fallbackValue) SetResolving(objectPath); } + var typeWrapper = GetTypeWrapper(obj.GetType()); if (typeWrapper == null) return; From da886c1c275129d8de4ab6b93901039292688331 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sun, 1 Nov 2020 19:46:45 +0100 Subject: [PATCH 048/142] - Update CodeAnalysis.CSharp nuget pkg to latest - Directly reference System.Collections.Immutable and System.Reflection.Metadata with explicit binding redirect to fix issues when loading plugins using more recent versions - Add an app.config for unit-tests with binding redirect since it's not receiving the ones from Sharpmake.Application --- Sharpmake.Application/app.config | 21 ++++++++++++++++----- Sharpmake.UnitTests/app.config | 19 +++++++++++++++++++ Sharpmake/Sharpmake.csproj | 4 +++- Sharpmake/Sharpmake.sharpmake.cs | 5 ++++- 4 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 Sharpmake.UnitTests/app.config diff --git a/Sharpmake.Application/app.config b/Sharpmake.Application/app.config index 2ca356719..239677133 100644 --- a/Sharpmake.Application/app.config +++ b/Sharpmake.Application/app.config @@ -1,7 +1,18 @@  - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + diff --git a/Sharpmake.UnitTests/app.config b/Sharpmake.UnitTests/app.config new file mode 100644 index 000000000..b2314f33d --- /dev/null +++ b/Sharpmake.UnitTests/app.config @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Sharpmake/Sharpmake.csproj b/Sharpmake/Sharpmake.csproj index 40e0f564f..99f2ac31a 100644 --- a/Sharpmake/Sharpmake.csproj +++ b/Sharpmake/Sharpmake.csproj @@ -135,9 +135,11 @@ - + + + \ No newline at end of file diff --git a/Sharpmake/Sharpmake.sharpmake.cs b/Sharpmake/Sharpmake.sharpmake.cs index 73bbc5d32..0675d2b79 100644 --- a/Sharpmake/Sharpmake.sharpmake.cs +++ b/Sharpmake/Sharpmake.sharpmake.cs @@ -23,7 +23,10 @@ public override void ConfigureAll(Configuration conf, Target target) conf.ReferencesByNameExternal.Add("Microsoft.Build.Utilities.Core"); conf.Options.Add(Options.CSharp.AllowUnsafeBlocks.Enabled); - conf.ReferencesByNuGetPackage.Add("Microsoft.CodeAnalysis.CSharp", "3.4.0"); + conf.ReferencesByNuGetPackage.Add("System.Collections.Immutable", "1.7.1"); + conf.ReferencesByNuGetPackage.Add("System.Reflection.Metadata", "1.7.0"); + + conf.ReferencesByNuGetPackage.Add("Microsoft.CodeAnalysis.CSharp", "3.7.0"); conf.ReferencesByNuGetPackage.Add("Microsoft.DiaSymReader.Native", "1.7.0"); conf.ReferencesByNuGetPackage.Add("Microsoft.VisualStudio.Setup.Configuration.Interop", "1.16.30"); } From 1f5f888882a64083ab55a3c018109dd43a980a74 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 2 Nov 2020 10:15:35 +0100 Subject: [PATCH 049/142] [Sln] Order the executable retrieval by project filename to make the sln output deterministic --- Sharpmake.Generators/VisualStudio/Sln.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Sharpmake.Generators/VisualStudio/Sln.cs b/Sharpmake.Generators/VisualStudio/Sln.cs index 94fcb3142..dd6cf7a4c 100644 --- a/Sharpmake.Generators/VisualStudio/Sln.cs +++ b/Sharpmake.Generators/VisualStudio/Sln.cs @@ -756,7 +756,9 @@ private Solution.Configuration.IncludedProjectInfo ResolveStartupProject(Solutio e.Configuration.Output == Project.Configuration.OutputType.DotNetConsoleApp || e.Configuration.Output == Project.Configuration.OutputType.DotNetWindowsApp || e.Configuration.Output == Project.Configuration.OutputType.Exe) - .GroupBy(e => e.Configuration.ProjectFullFileName).ToList(); + .GroupBy(e => e.Configuration.ProjectFullFileName) + .OrderBy(filename => filename.Key, StringComparer.InvariantCultureIgnoreCase) + .ToList(); // If there is more than one, set the one with the same name as the solution if (executableProjects.Count > 1) From 5ac39ff1c71243cd81af52001c2c6323ca40de22 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 2 Nov 2020 10:22:20 +0100 Subject: [PATCH 050/142] Update references following determinism fix 1f5f888 --- .../projects/fastbuildfunctionaltest.sln | 20 +++++++++---------- .../projects/configureorderingsolution.sln | 8 ++++---- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Sharpmake.FunctionalTests/FastBuildFunctionalTest/reference/projects/fastbuildfunctionaltest.sln b/Sharpmake.FunctionalTests/FastBuildFunctionalTest/reference/projects/fastbuildfunctionaltest.sln index a5adc765f..ec20630ae 100644 --- a/Sharpmake.FunctionalTests/FastBuildFunctionalTest/reference/projects/fastbuildfunctionaltest.sln +++ b/Sharpmake.FunctionalTests/FastBuildFunctionalTest/reference/projects/fastbuildfunctionaltest.sln @@ -6,8 +6,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FastBuild", "FastBuild", "{ fastbuildfunctionaltest.bff = fastbuildfunctionaltest.bff EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MixCppAndCExe", "mixcppandcexe_vs2017_win64.vcxproj", "{5A047CB1-D2C4-4765-6F6F-EDD60899737F}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ExplicitlyOrderedPostBuildTest", "explicitlyorderedpostbuildtest_vs2017_win64.vcxproj", "{77AE9D0E-D7D9-039E-9DB9-180932FD4AE9}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FastBuildFunctionalTest_All", "fastbuildfunctionaltest_all.vcxproj", "{6AE06EC2-B2C7-52F6-C657-FE1FFFA43666}" @@ -26,6 +24,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FastBuildFunctionalTest_All {573CBFD5-C93E-15F6-9BFE-132BA37EAE47} = {573CBFD5-C93E-15F6-9BFE-132BA37EAE47} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MixCppAndCExe", "mixcppandcexe_vs2017_win64.vcxproj", "{5A047CB1-D2C4-4765-6F6F-EDD60899737F}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PostBuildCopyDirTest", "postbuildcopydirtest_vs2017_win64.vcxproj", "{B0087514-0636-5209-BC43-4E8096928555}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PostBuildCopySingleFileTest", "postbuildcopysinglefiletest_vs2017_win64.vcxproj", "{B1F3B803-C020-3A59-6346-D0E116BAAA74}" @@ -56,14 +56,6 @@ Global Release|MSBuild = Release|MSBuild EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Debug|FastBuild.ActiveCfg = Debug_FastBuild_vs2017|x64 - {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Debug|FastBuild_NoBlob.ActiveCfg = Debug_FastBuild_NoBlob_vs2017|x64 - {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Debug|MSBuild.ActiveCfg = Debug_MSBuild_vs2017|x64 - {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Debug|MSBuild.Build.0 = Debug_MSBuild_vs2017|x64 - {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Release|FastBuild.ActiveCfg = Release_FastBuild_vs2017|x64 - {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Release|FastBuild_NoBlob.ActiveCfg = Release_FastBuild_NoBlob_vs2017|x64 - {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Release|MSBuild.ActiveCfg = Release_MSBuild_vs2017|x64 - {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Release|MSBuild.Build.0 = Release_MSBuild_vs2017|x64 {77AE9D0E-D7D9-039E-9DB9-180932FD4AE9}.Debug|FastBuild.ActiveCfg = Debug_FastBuild_vs2017|x64 {77AE9D0E-D7D9-039E-9DB9-180932FD4AE9}.Debug|FastBuild_NoBlob.ActiveCfg = Debug_FastBuild_NoBlob_vs2017|x64 {77AE9D0E-D7D9-039E-9DB9-180932FD4AE9}.Debug|MSBuild.ActiveCfg = Debug_MSBuild_vs2017|x64 @@ -82,6 +74,14 @@ Global {6AE06EC2-B2C7-52F6-C657-FE1FFFA43666}.Release|FastBuild_NoBlob.ActiveCfg = Release_FastBuild_NoBlob_vs2017|x64 {6AE06EC2-B2C7-52F6-C657-FE1FFFA43666}.Release|FastBuild_NoBlob.Build.0 = Release_FastBuild_NoBlob_vs2017|x64 {6AE06EC2-B2C7-52F6-C657-FE1FFFA43666}.Release|MSBuild.ActiveCfg = Release_FastBuild_NoBlob_vs2017|x64 + {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Debug|FastBuild.ActiveCfg = Debug_FastBuild_vs2017|x64 + {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Debug|FastBuild_NoBlob.ActiveCfg = Debug_FastBuild_NoBlob_vs2017|x64 + {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Debug|MSBuild.ActiveCfg = Debug_MSBuild_vs2017|x64 + {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Debug|MSBuild.Build.0 = Debug_MSBuild_vs2017|x64 + {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Release|FastBuild.ActiveCfg = Release_FastBuild_vs2017|x64 + {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Release|FastBuild_NoBlob.ActiveCfg = Release_FastBuild_NoBlob_vs2017|x64 + {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Release|MSBuild.ActiveCfg = Release_MSBuild_vs2017|x64 + {5A047CB1-D2C4-4765-6F6F-EDD60899737F}.Release|MSBuild.Build.0 = Release_MSBuild_vs2017|x64 {B0087514-0636-5209-BC43-4E8096928555}.Debug|FastBuild.ActiveCfg = Debug_FastBuild_vs2017|x64 {B0087514-0636-5209-BC43-4E8096928555}.Debug|FastBuild_NoBlob.ActiveCfg = Debug_FastBuild_NoBlob_vs2017|x64 {B0087514-0636-5209-BC43-4E8096928555}.Debug|MSBuild.ActiveCfg = Debug_MSBuild_vs2017|x64 diff --git a/samples/ConfigureOrder/reference/projects/configureorderingsolution.sln b/samples/ConfigureOrder/reference/projects/configureorderingsolution.sln index 7477b8a89..78561cc37 100644 --- a/samples/ConfigureOrder/reference/projects/configureorderingsolution.sln +++ b/samples/ConfigureOrder/reference/projects/configureorderingsolution.sln @@ -1,9 +1,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FooBarProject", "foobarproject.vcxproj", "{4D10CB07-4E09-3F8E-412E-E6DA311CC3C5}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ChildProject", "childproject.vcxproj", "{BBE4416F-6E16-43B4-BFB1-D83310280DEE}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FooBarProject", "foobarproject.vcxproj", "{4D10CB07-4E09-3F8E-412E-E6DA311CC3C5}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ParentProject", "parentproject.vcxproj", "{A793E67F-D67F-638E-6588-C6073FAFCF8E}" EndProject Global @@ -11,10 +11,10 @@ Global Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4D10CB07-4E09-3F8E-412E-E6DA311CC3C5}.Release|Win32.ActiveCfg = Release|Win32 - {4D10CB07-4E09-3F8E-412E-E6DA311CC3C5}.Release|Win32.Build.0 = Release|Win32 {BBE4416F-6E16-43B4-BFB1-D83310280DEE}.Release|Win32.ActiveCfg = Release|Win32 {BBE4416F-6E16-43B4-BFB1-D83310280DEE}.Release|Win32.Build.0 = Release|Win32 + {4D10CB07-4E09-3F8E-412E-E6DA311CC3C5}.Release|Win32.ActiveCfg = Release|Win32 + {4D10CB07-4E09-3F8E-412E-E6DA311CC3C5}.Release|Win32.Build.0 = Release|Win32 {A793E67F-D67F-638E-6588-C6073FAFCF8E}.Release|Win32.ActiveCfg = Release|Win32 {A793E67F-D67F-638E-6588-C6073FAFCF8E}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection From 7be0daf11aa369270a03c76bc7d1629712a44b2f Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 2 Nov 2020 10:29:49 +0100 Subject: [PATCH 051/142] [Sln] Use ProjectFileName instead of ProjectFullFileName to sort, since that last one is a full path hence machine specific --- Sharpmake.Generators/VisualStudio/Sln.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake.Generators/VisualStudio/Sln.cs b/Sharpmake.Generators/VisualStudio/Sln.cs index dd6cf7a4c..d8778f435 100644 --- a/Sharpmake.Generators/VisualStudio/Sln.cs +++ b/Sharpmake.Generators/VisualStudio/Sln.cs @@ -756,7 +756,7 @@ private Solution.Configuration.IncludedProjectInfo ResolveStartupProject(Solutio e.Configuration.Output == Project.Configuration.OutputType.DotNetConsoleApp || e.Configuration.Output == Project.Configuration.OutputType.DotNetWindowsApp || e.Configuration.Output == Project.Configuration.OutputType.Exe) - .GroupBy(e => e.Configuration.ProjectFullFileName) + .GroupBy(e => e.Configuration.ProjectFileName) .OrderBy(filename => filename.Key, StringComparer.InvariantCultureIgnoreCase) .ToList(); From 43e1d794fe52247dbd82632619d0d86f734d5248 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 2 Nov 2020 10:46:52 +0100 Subject: [PATCH 052/142] [Makefile] Fix sorting of include/lib paths and files, the weight set in the orderable strings wasn't taken into account --- Sharpmake.Generators/Generic/Makefile.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Sharpmake.Generators/Generic/Makefile.cs b/Sharpmake.Generators/Generic/Makefile.cs index f429b6752..b0d47cc10 100644 --- a/Sharpmake.Generators/Generic/Makefile.cs +++ b/Sharpmake.Generators/Generic/Makefile.cs @@ -450,6 +450,7 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File includePaths.AddRange(Util.PathGetRelative(projectFileInfo.DirectoryName, Util.PathGetCapitalized(conf.DependenciesIncludePaths))); PathMakeUnix(includePaths); includePaths.InsertPrefix("-I"); + includePaths.Sort(); options["Includes"] = includePaths.JoinStrings(" "); if (conf.ForcedIncludes.Count > 0) @@ -457,6 +458,7 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File OrderableStrings relativeForceIncludes = new OrderableStrings(Util.PathGetRelative(projectFileInfo.DirectoryName, conf.ForcedIncludes)); PathMakeUnix(relativeForceIncludes); relativeForceIncludes.InsertPrefix("-include "); + relativeForceIncludes.Sort(); options["Includes"] += " " + relativeForceIncludes.JoinStrings(" "); } @@ -549,11 +551,13 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File OrderableStrings dependenciesLibraryFiles = new OrderableStrings(conf.DependenciesLibraryFiles); PathMakeUnix(dependenciesLibraryFiles); dependenciesLibraryFiles.InsertPrefix("-l"); + dependenciesLibraryFiles.Sort(); options["DependenciesLibraryFiles"] = dependenciesLibraryFiles.JoinStrings(" "); // LibraryFiles OrderableStrings libraryFiles = new OrderableStrings(conf.LibraryFiles); libraryFiles.InsertPrefix("-l"); + libraryFiles.Sort(); options["LibraryFiles"] = libraryFiles.JoinStrings(" "); // LibraryPaths @@ -563,6 +567,7 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File libraryPaths.AddRange(Util.PathGetRelative(projectFileInfo.DirectoryName, conf.DependenciesBuiltTargetsLibraryPaths)); PathMakeUnix(libraryPaths); libraryPaths.InsertPrefix("-L"); + libraryPaths.Sort(); options["LibraryPaths"] = libraryPaths.JoinStrings(" "); // Dependencies @@ -584,6 +589,7 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File } var depsRelative = Util.PathGetRelative(projectFileInfo.DirectoryName, deps); PathMakeUnix(depsRelative); + depsRelative.Sort(); options["LDDEPS"] = depsRelative.JoinStrings(" "); // LinkCommand From ba2592689fcde165a5ea37151d918ce2f8b57bdf Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 18 Nov 2020 17:32:34 +0100 Subject: [PATCH 053/142] [FastBuild] Add new DLL dependency of vs2019 16.8 toolchain to the compiler section --- .../Sharpmake.CommonPlatforms/Windows/Win64Platform.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/Win64Platform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/Win64Platform.cs index 1ba361c5d..1a0205e80 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/Win64Platform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/Win64Platform.cs @@ -294,11 +294,14 @@ bool useCCompiler { Version toolsVersion = compilerDevEnv.Value.GetVisualStudioVCToolsVersion(); - if (toolsVersion >= new Version("14.22.27905")) + if (toolsVersion >= new Version("14.22.27905")) // 16.3.2 extraFiles.Add(@"$ExecutableRootPath$\tbbmalloc.dll"); - if (toolsVersion >= new Version("14.25.28610")) + if (toolsVersion >= new Version("14.25.28610")) // 16.5 extraFiles.Add(@"$ExecutableRootPath$\vcruntime140_1.dll"); + + if (toolsVersion >= new Version("14.28.29333")) // 16.8 + extraFiles.Add(@"$ExecutableRootPath$\msvcp140_atomic_wait.dll"); } try From 4dd97a162cce9066969263bde2991ea6eea01a73 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 18 Nov 2020 20:56:10 +0100 Subject: [PATCH 054/142] [Profiling] Fix the solution type that wasn't displayed in the profiling json --- Sharpmake/Builder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake/Builder.cs b/Sharpmake/Builder.cs index 7564eae48..eed2bc396 100644 --- a/Sharpmake/Builder.cs +++ b/Sharpmake/Builder.cs @@ -675,7 +675,7 @@ public Project LoadProjectType(Type type) public Solution LoadSolutionType(Type type) { - using (new Util.StopwatchProfiler(ms => { ProfileWriteLine(" |{0,5} ms| load solution {1}", ms, type.Name); })) + using (CreateProfilingScope(type.ToNiceTypeName())) { if (!type.IsDefined(typeof(Generate), false) && !type.IsDefined(typeof(Compile), false) && From e8738b5b3997f4e9968b844b75b1be91f070f472 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 18 Nov 2020 20:56:40 +0100 Subject: [PATCH 055/142] Remove /profileoutput command line, since we now have the superior /profile --- Sharpmake.Application/CommandLineArguments.cs | 7 ------- Sharpmake.Application/Program.cs | 3 --- Sharpmake/Builder.cs | 6 ------ 3 files changed, 16 deletions(-) diff --git a/Sharpmake.Application/CommandLineArguments.cs b/Sharpmake.Application/CommandLineArguments.cs index 2c0ba82b5..a129af7a2 100644 --- a/Sharpmake.Application/CommandLineArguments.cs +++ b/Sharpmake.Application/CommandLineArguments.cs @@ -61,7 +61,6 @@ public enum InputType public bool WriteFiles = true; public bool DumpDependency = false; private bool _testOptionValid = true; - public bool ProfileOutput = false; internal TestOptions TestOption; internal bool RegressionDiff = true; public DirectoryInfo OutputDirectory; @@ -157,12 +156,6 @@ public void CommandLineDebugLog(bool value) DebugLog = value; } - [CommandLine.Option("profileoutput", @"Write profiling information ( slow ): ex: /profileoutput()")] - public void CommandLineProfileOutput(bool value) - { - ProfileOutput = value; - } - [CommandLine.Option("diagnostics", @"Output more errors and warnings (slow): ex: /diagnostics")] public void CommandLineDiagnostics() { diff --git a/Sharpmake.Application/Program.cs b/Sharpmake.Application/Program.cs index ae2a0d5b2..301992d85 100644 --- a/Sharpmake.Application/Program.cs +++ b/Sharpmake.Application/Program.cs @@ -598,9 +598,6 @@ public static Builder CreateBuilder(BuildContext.BaseBuildContext context, Argum builder.EventOutputMessage += LogWrite; builder.EventOutputDebug += DebugWrite; - if (parameters.ProfileOutput) - builder.EventOutputProfile += LogWrite; - if (!string.IsNullOrEmpty(parameters.ProfileFile)) builder.EnableProfiling(); diff --git a/Sharpmake/Builder.cs b/Sharpmake/Builder.cs index eed2bc396..eea7f6f86 100644 --- a/Sharpmake/Builder.cs +++ b/Sharpmake/Builder.cs @@ -90,7 +90,6 @@ public class Builder : IDisposable public event OutputDelegate EventOutputWarning; public event OutputDelegate EventOutputMessage; public event OutputDelegate EventOutputDebug; - public event OutputDelegate EventOutputProfile; // Configure events public delegate void PreProjectConfigure(Project project); @@ -1257,11 +1256,6 @@ public void DebugWriteLine(string message, params object[] args) EventOutputDebug?.Invoke(message + Environment.NewLine, args); } - public void ProfileWriteLine(string message, params object[] args) - { - EventOutputProfile?.Invoke(message + Environment.NewLine, args); - } - #endregion #region Private From fc35d53cd26339e728d87fc82215a58d7ffadc2b Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Thu, 19 Nov 2020 09:23:35 +0100 Subject: [PATCH 056/142] Add a profiling scope for project additional filtering step --- Sharpmake/Project.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sharpmake/Project.cs b/Sharpmake/Project.cs index c028f0793..97829eb37 100644 --- a/Sharpmake/Project.cs +++ b/Sharpmake/Project.cs @@ -962,7 +962,8 @@ internal virtual void ResolveSourceFiles(Builder builder) NoneFilesCopyIfNewer.IntersectWith(SourceFilesFilters); } - AdditionalFiltering(SourceFiles, ref SourceFilesExclude); + using (builder.CreateProfilingScope("Project.ResolveSourceFiles:AdditionalFiltering")) + AdditionalFiltering(SourceFiles, ref SourceFilesExclude); // Add source files ResolvedSourceFiles.AddRange(SourceFiles); From d6b4b13328359b1f424acc8593c2ee78adc4302d Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Thu, 19 Nov 2020 12:16:55 +0100 Subject: [PATCH 057/142] Remove ResharperAnnotations from the codebase, we barely use it and it creates issues in client code. --- Sharpmake/Attributes.cs | 2 - Sharpmake/ResharperAnnotations.cs | 1065 ----------------------------- Sharpmake/Sharpmake.csproj | 1 - 3 files changed, 1068 deletions(-) delete mode 100644 Sharpmake/ResharperAnnotations.cs diff --git a/Sharpmake/Attributes.cs b/Sharpmake/Attributes.cs index 5c0c472e1..b58676526 100644 --- a/Sharpmake/Attributes.cs +++ b/Sharpmake/Attributes.cs @@ -13,7 +13,6 @@ // limitations under the License. using System; using System.Linq; -using JetBrains.Annotations; namespace Sharpmake { @@ -39,7 +38,6 @@ public class Compile : Attribute public class Export : Attribute { } - [MeansImplicitUse] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class Configure : Attribute { diff --git a/Sharpmake/ResharperAnnotations.cs b/Sharpmake/ResharperAnnotations.cs deleted file mode 100644 index 771e858de..000000000 --- a/Sharpmake/ResharperAnnotations.cs +++ /dev/null @@ -1,1065 +0,0 @@ -/* MIT License - -Copyright (c) 2016 JetBrains http://www.jetbrains.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. */ - -using System; - -#pragma warning disable 1591 -// ReSharper disable UnusedMember.Global -// ReSharper disable MemberCanBePrivate.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -// ReSharper disable IntroduceOptionalParameters.Global -// ReSharper disable MemberCanBeProtected.Global -// ReSharper disable InconsistentNaming - -namespace JetBrains.Annotations -{ - /// - /// Indicates that the value of the marked element could be null sometimes, - /// so the check for null is necessary before its usage. - /// - /// - /// [CanBeNull] object Test() => null; - /// - /// void UseTest() { - /// var p = Test(); - /// var s = p.ToString(); // Warning: Possible 'System.NullReferenceException' - /// } - /// - [AttributeUsage( - AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | - AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event | - AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter)] - internal sealed class CanBeNullAttribute : Attribute { } - - /// - /// Indicates that the value of the marked element could never be null. - /// - /// - /// [NotNull] object Foo() { - /// return null; // Warning: Possible 'null' assignment - /// } - /// - [AttributeUsage( - AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | - AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event | - AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter)] - internal sealed class NotNullAttribute : Attribute { } - - /// - /// Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task - /// and Lazy classes to indicate that the value of a collection item, of the Task.Result property - /// or of the Lazy.Value property can never be null. - /// - [AttributeUsage( - AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | - AttributeTargets.Delegate | AttributeTargets.Field)] - internal sealed class ItemNotNullAttribute : Attribute { } - - /// - /// Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task - /// and Lazy classes to indicate that the value of a collection item, of the Task.Result property - /// or of the Lazy.Value property can be null. - /// - [AttributeUsage( - AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | - AttributeTargets.Delegate | AttributeTargets.Field)] - internal sealed class ItemCanBeNullAttribute : Attribute { } - - /// - /// Indicates that the marked method builds string by format pattern and (optional) arguments. - /// Parameter, which contains format string, should be given in constructor. The format string - /// should be in -like form. - /// - /// - /// [StringFormatMethod("message")] - /// void ShowError(string message, params object[] args) { /* do something */ } - /// - /// void Foo() { - /// ShowError("Failed: {0}"); // Warning: Non-existing argument in format string - /// } - /// - [AttributeUsage( - AttributeTargets.Constructor | AttributeTargets.Method | - AttributeTargets.Property | AttributeTargets.Delegate)] - internal sealed class StringFormatMethodAttribute : Attribute - { - /// - /// Specifies which parameter of an annotated method should be treated as format-string - /// - public StringFormatMethodAttribute([NotNull] string formatParameterName) - { - FormatParameterName = formatParameterName; - } - - [NotNull] public string FormatParameterName { get; private set; } - } - - /// - /// For a parameter that is expected to be one of the limited set of values. - /// Specify fields of which type should be used as values for this parameter. - /// - [AttributeUsage( - AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field, - AllowMultiple = true)] - internal sealed class ValueProviderAttribute : Attribute - { - public ValueProviderAttribute([NotNull] string name) - { - Name = name; - } - - [NotNull] public string Name { get; private set; } - } - - /// - /// Indicates that the function argument should be string literal and match one - /// of the parameters of the caller function. For example, ReSharper annotates - /// the parameter of . - /// - /// - /// void Foo(string param) { - /// if (param == null) - /// throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol - /// } - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class InvokerParameterNameAttribute : Attribute { } - - /// - /// Indicates that the method is contained in a type that implements - /// System.ComponentModel.INotifyPropertyChanged interface and this method - /// is used to notify that some property value changed. - /// - /// - /// The method should be non-static and conform to one of the supported signatures: - /// - /// NotifyChanged(string) - /// NotifyChanged(params string[]) - /// NotifyChanged{T}(Expression{Func{T}}) - /// NotifyChanged{T,U}(Expression{Func{T,U}}) - /// SetProperty{T}(ref T, T, string) - /// - /// - /// - /// public class Foo : INotifyPropertyChanged { - /// public event PropertyChangedEventHandler PropertyChanged; - /// - /// [NotifyPropertyChangedInvocator] - /// protected virtual void NotifyChanged(string propertyName) { ... } - /// - /// string _name; - /// - /// public string Name { - /// get { return _name; } - /// set { _name = value; NotifyChanged("LastName"); /* Warning */ } - /// } - /// } - /// - /// Examples of generated notifications: - /// - /// NotifyChanged("Property") - /// NotifyChanged(() => Property) - /// NotifyChanged((VM x) => x.Property) - /// SetProperty(ref myField, value, "Property") - /// - /// - [AttributeUsage(AttributeTargets.Method)] - internal sealed class NotifyPropertyChangedInvocatorAttribute : Attribute - { - public NotifyPropertyChangedInvocatorAttribute() { } - public NotifyPropertyChangedInvocatorAttribute([NotNull] string parameterName) - { - ParameterName = parameterName; - } - - [CanBeNull] public string ParameterName { get; private set; } - } - - /// - /// Describes dependency between method input and output. - /// - /// - ///

Function Definition Table syntax:

- /// - /// FDT ::= FDTRow [;FDTRow]* - /// FDTRow ::= Input => Output | Output <= Input - /// Input ::= ParameterName: Value [, Input]* - /// Output ::= [ParameterName: Value]* {halt|stop|void|nothing|Value} - /// Value ::= true | false | null | notnull | canbenull - /// - /// If method has single input parameter, it's name could be omitted.
- /// Using halt (or void/nothing, which is the same) for method output - /// means that the methos doesn't return normally (throws or terminates the process).
- /// Value canbenull is only applicable for output parameters.
- /// You can use multiple [ContractAnnotation] for each FDT row, or use single attribute - /// with rows separated by semicolon. There is no notion of order rows, all rows are checked - /// for applicability and applied per each program state tracked by R# analysis.
- ///
- /// - /// - /// [ContractAnnotation("=> halt")] - /// public void TerminationMethod() - /// - /// - /// [ContractAnnotation("halt <= condition: false")] - /// public void Assert(bool condition, string text) // regular assertion method - /// - /// - /// [ContractAnnotation("s:null => true")] - /// public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty() - /// - /// - /// // A method that returns null if the parameter is null, - /// // and not null if the parameter is not null - /// [ContractAnnotation("null => null; notnull => notnull")] - /// public object Transform(object data) - /// - /// - /// [ContractAnnotation("=> true, result: notnull; => false, result: null")] - /// public bool TryParse(string s, out Person result) - /// - /// - [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] - internal sealed class ContractAnnotationAttribute : Attribute - { - public ContractAnnotationAttribute([NotNull] string contract) - : this(contract, false) { } - - public ContractAnnotationAttribute([NotNull] string contract, bool forceFullStates) - { - Contract = contract; - ForceFullStates = forceFullStates; - } - - [NotNull] public string Contract { get; private set; } - - public bool ForceFullStates { get; private set; } - } - - /// - /// Indicates that marked element should be localized or not. - /// - /// - /// [LocalizationRequiredAttribute(true)] - /// class Foo { - /// string str = "my string"; // Warning: Localizable string - /// } - /// - [AttributeUsage(AttributeTargets.All)] - internal sealed class LocalizationRequiredAttribute : Attribute - { - public LocalizationRequiredAttribute() : this(true) { } - - public LocalizationRequiredAttribute(bool required) - { - Required = required; - } - - public bool Required { get; private set; } - } - - /// - /// Indicates that the value of the marked type (or its derivatives) - /// cannot be compared using '==' or '!=' operators and Equals() - /// should be used instead. However, using '==' or '!=' for comparison - /// with null is always permitted. - /// - /// - /// [CannotApplyEqualityOperator] - /// class NoEquality { } - /// - /// class UsesNoEquality { - /// void Test() { - /// var ca1 = new NoEquality(); - /// var ca2 = new NoEquality(); - /// if (ca1 != null) { // OK - /// bool condition = ca1 == ca2; // Warning - /// } - /// } - /// } - /// - [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class | AttributeTargets.Struct)] - internal sealed class CannotApplyEqualityOperatorAttribute : Attribute { } - - /// - /// When applied to a target attribute, specifies a requirement for any type marked - /// with the target attribute to implement or inherit specific type or types. - /// - /// - /// [BaseTypeRequired(typeof(IComponent)] // Specify requirement - /// class ComponentAttribute : Attribute { } - /// - /// [Component] // ComponentAttribute requires implementing IComponent interface - /// class MyComponent : IComponent { } - /// - [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] - [BaseTypeRequired(typeof(Attribute))] - internal sealed class BaseTypeRequiredAttribute : Attribute - { - public BaseTypeRequiredAttribute([NotNull] Type baseType) - { - BaseType = baseType; - } - - [NotNull] public Type BaseType { get; private set; } - } - - /// - /// Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library), - /// so this symbol will not be marked as unused (as well as by other usage inspections). - /// - [AttributeUsage(AttributeTargets.All)] - internal sealed class UsedImplicitlyAttribute : Attribute - { - public UsedImplicitlyAttribute() - : this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) { } - - public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags) - : this(useKindFlags, ImplicitUseTargetFlags.Default) { } - - public UsedImplicitlyAttribute(ImplicitUseTargetFlags targetFlags) - : this(ImplicitUseKindFlags.Default, targetFlags) { } - - public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags) - { - UseKindFlags = useKindFlags; - TargetFlags = targetFlags; - } - - public ImplicitUseKindFlags UseKindFlags { get; private set; } - - public ImplicitUseTargetFlags TargetFlags { get; private set; } - } - - /// - /// Should be used on attributes and causes ReSharper to not mark symbols marked with such attributes - /// as unused (as well as by other usage inspections) - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.GenericParameter)] - internal sealed class MeansImplicitUseAttribute : Attribute - { - public MeansImplicitUseAttribute() - : this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) { } - - public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags) - : this(useKindFlags, ImplicitUseTargetFlags.Default) { } - - public MeansImplicitUseAttribute(ImplicitUseTargetFlags targetFlags) - : this(ImplicitUseKindFlags.Default, targetFlags) { } - - public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags) - { - UseKindFlags = useKindFlags; - TargetFlags = targetFlags; - } - - [UsedImplicitly] public ImplicitUseKindFlags UseKindFlags { get; private set; } - - [UsedImplicitly] public ImplicitUseTargetFlags TargetFlags { get; private set; } - } - - [Flags] - internal enum ImplicitUseKindFlags - { - Default = Access | Assign | InstantiatedWithFixedConstructorSignature, - /// Only entity marked with attribute considered used. - Access = 1, - /// Indicates implicit assignment to a member. - Assign = 2, - /// - /// Indicates implicit instantiation of a type with fixed constructor signature. - /// That means any unused constructor parameters won't be reported as such. - /// - InstantiatedWithFixedConstructorSignature = 4, - /// Indicates implicit instantiation of a type. - InstantiatedNoFixedConstructorSignature = 8, - } - - /// - /// Specify what is considered used implicitly when marked - /// with or . - /// - [Flags] - internal enum ImplicitUseTargetFlags - { - Default = Itself, - Itself = 1, - /// Members of entity marked with attribute are considered used. - Members = 2, - /// Entity marked with attribute and all its members considered used. - WithMembers = Itself | Members - } - - /// - /// This attribute is intended to mark publicly available API - /// which should not be removed and so is treated as used. - /// - [MeansImplicitUse(ImplicitUseTargetFlags.WithMembers)] - internal sealed class PublicAPIAttribute : Attribute - { - public PublicAPIAttribute() { } - - public PublicAPIAttribute([NotNull] string comment) - { - Comment = comment; - } - - [CanBeNull] public string Comment { get; private set; } - } - - /// - /// Tells code analysis engine if the parameter is completely handled when the invoked method is on stack. - /// If the parameter is a delegate, indicates that delegate is executed while the method is executed. - /// If the parameter is an enumerable, indicates that it is enumerated while the method is executed. - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class InstantHandleAttribute : Attribute { } - - /// - /// Indicates that a method does not make any observable state changes. - /// The same as System.Diagnostics.Contracts.PureAttribute. - /// - /// - /// [Pure] int Multiply(int x, int y) => x * y; - /// - /// void M() { - /// Multiply(123, 42); // Waring: Return value of pure method is not used - /// } - /// - [AttributeUsage(AttributeTargets.Method)] - internal sealed class PureAttribute : Attribute { } - - /// - /// Indicates that the return value of method invocation must be used. - /// - [AttributeUsage(AttributeTargets.Method)] - internal sealed class MustUseReturnValueAttribute : Attribute - { - public MustUseReturnValueAttribute() { } - - public MustUseReturnValueAttribute([NotNull] string justification) - { - Justification = justification; - } - - [CanBeNull] public string Justification { get; private set; } - } - - /// - /// Indicates the type member or parameter of some type, that should be used instead of all other ways - /// to get the value that type. This annotation is useful when you have some "context" value evaluated - /// and stored somewhere, meaning that all other ways to get this value must be consolidated with existing one. - /// - /// - /// class Foo { - /// [ProvidesContext] IBarService _barService = ...; - /// - /// void ProcessNode(INode node) { - /// DoSomething(node, node.GetGlobalServices().Bar); - /// // ^ Warning: use value of '_barService' field - /// } - /// } - /// - [AttributeUsage( - AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter | AttributeTargets.Method | - AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.GenericParameter)] - internal sealed class ProvidesContextAttribute : Attribute { } - - /// - /// Indicates that a parameter is a path to a file or a folder within a web project. - /// Path can be relative or absolute, starting from web root (~). - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class PathReferenceAttribute : Attribute - { - public PathReferenceAttribute() { } - - public PathReferenceAttribute([NotNull, PathReference] string basePath) - { - BasePath = basePath; - } - - [CanBeNull] public string BasePath { get; private set; } - } - - /// - /// An extension method marked with this attribute is processed by ReSharper code completion - /// as a 'Source Template'. When extension method is completed over some expression, it's source code - /// is automatically expanded like a template at call site. - /// - /// - /// Template method body can contain valid source code and/or special comments starting with '$'. - /// Text inside these comments is added as source code when the template is applied. Template parameters - /// can be used either as additional method parameters or as identifiers wrapped in two '$' signs. - /// Use the attribute to specify macros for parameters. - /// - /// - /// In this example, the 'forEach' method is a source template available over all values - /// of enumerable types, producing ordinary C# 'foreach' statement and placing caret inside block: - /// - /// [SourceTemplate] - /// public static void forEach<T>(this IEnumerable<T> xs) { - /// foreach (var x in xs) { - /// //$ $END$ - /// } - /// } - /// - /// - [AttributeUsage(AttributeTargets.Method)] - internal sealed class SourceTemplateAttribute : Attribute { } - - /// - /// Allows specifying a macro for a parameter of a source template. - /// - /// - /// You can apply the attribute on the whole method or on any of its additional parameters. The macro expression - /// is defined in the property. When applied on a method, the target - /// template parameter is defined in the property. To apply the macro silently - /// for the parameter, set the property value = -1. - /// - /// - /// Applying the attribute on a source template method: - /// - /// [SourceTemplate, Macro(Target = "item", Expression = "suggestVariableName()")] - /// public static void forEach<T>(this IEnumerable<T> collection) { - /// foreach (var item in collection) { - /// //$ $END$ - /// } - /// } - /// - /// Applying the attribute on a template method parameter: - /// - /// [SourceTemplate] - /// public static void something(this Entity x, [Macro(Expression = "guid()", Editable = -1)] string newguid) { - /// /*$ var $x$Id = "$newguid$" + x.ToString(); - /// x.DoSomething($x$Id); */ - /// } - /// - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method, AllowMultiple = true)] - internal sealed class MacroAttribute : Attribute - { - /// - /// Allows specifying a macro that will be executed for a source template - /// parameter when the template is expanded. - /// - [CanBeNull] public string Expression { get; set; } - - /// - /// Allows specifying which occurrence of the target parameter becomes editable when the template is deployed. - /// - /// - /// If the target parameter is used several times in the template, only one occurrence becomes editable; - /// other occurrences are changed synchronously. To specify the zero-based index of the editable occurrence, - /// use values >= 0. To make the parameter non-editable when the template is expanded, use -1. - /// > - public int Editable { get; set; } - - /// - /// Identifies the target parameter of a source template if the - /// is applied on a template method. - /// - [CanBeNull] public string Target { get; set; } - } - - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)] - internal sealed class AspMvcAreaMasterLocationFormatAttribute : Attribute - { - public AspMvcAreaMasterLocationFormatAttribute([NotNull] string format) - { - Format = format; - } - - [NotNull] public string Format { get; private set; } - } - - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)] - internal sealed class AspMvcAreaPartialViewLocationFormatAttribute : Attribute - { - public AspMvcAreaPartialViewLocationFormatAttribute([NotNull] string format) - { - Format = format; - } - - [NotNull] public string Format { get; private set; } - } - - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)] - internal sealed class AspMvcAreaViewLocationFormatAttribute : Attribute - { - public AspMvcAreaViewLocationFormatAttribute([NotNull] string format) - { - Format = format; - } - - [NotNull] public string Format { get; private set; } - } - - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)] - internal sealed class AspMvcMasterLocationFormatAttribute : Attribute - { - public AspMvcMasterLocationFormatAttribute([NotNull] string format) - { - Format = format; - } - - [NotNull] public string Format { get; private set; } - } - - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)] - internal sealed class AspMvcPartialViewLocationFormatAttribute : Attribute - { - public AspMvcPartialViewLocationFormatAttribute([NotNull] string format) - { - Format = format; - } - - [NotNull] public string Format { get; private set; } - } - - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)] - internal sealed class AspMvcViewLocationFormatAttribute : Attribute - { - public AspMvcViewLocationFormatAttribute([NotNull] string format) - { - Format = format; - } - - [NotNull] public string Format { get; private set; } - } - - /// - /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter - /// is an MVC action. If applied to a method, the MVC action name is calculated - /// implicitly from the context. Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] - internal sealed class AspMvcActionAttribute : Attribute - { - public AspMvcActionAttribute() { } - - public AspMvcActionAttribute([NotNull] string anonymousProperty) - { - AnonymousProperty = anonymousProperty; - } - - [CanBeNull] public string AnonymousProperty { get; private set; } - } - - /// - /// ASP.NET MVC attribute. Indicates that a parameter is an MVC area. - /// Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class AspMvcAreaAttribute : Attribute - { - public AspMvcAreaAttribute() { } - - public AspMvcAreaAttribute([NotNull] string anonymousProperty) - { - AnonymousProperty = anonymousProperty; - } - - [CanBeNull] public string AnonymousProperty { get; private set; } - } - - /// - /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is - /// an MVC controller. If applied to a method, the MVC controller name is calculated - /// implicitly from the context. Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String, String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] - internal sealed class AspMvcControllerAttribute : Attribute - { - public AspMvcControllerAttribute() { } - - public AspMvcControllerAttribute([NotNull] string anonymousProperty) - { - AnonymousProperty = anonymousProperty; - } - - [CanBeNull] public string AnonymousProperty { get; private set; } - } - - /// - /// ASP.NET MVC attribute. Indicates that a parameter is an MVC Master. Use this attribute - /// for custom wrappers similar to System.Web.Mvc.Controller.View(String, String). - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class AspMvcMasterAttribute : Attribute { } - - /// - /// ASP.NET MVC attribute. Indicates that a parameter is an MVC model type. Use this attribute - /// for custom wrappers similar to System.Web.Mvc.Controller.View(String, Object). - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class AspMvcModelTypeAttribute : Attribute { } - - /// - /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is an MVC - /// partial view. If applied to a method, the MVC partial view name is calculated implicitly - /// from the context. Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper, String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] - internal sealed class AspMvcPartialViewAttribute : Attribute { } - - /// - /// ASP.NET MVC attribute. Allows disabling inspections for MVC views within a class or a method. - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] - internal sealed class AspMvcSuppressViewErrorAttribute : Attribute { } - - /// - /// ASP.NET MVC attribute. Indicates that a parameter is an MVC display template. - /// Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Html.DisplayExtensions.DisplayForModel(HtmlHelper, String). - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class AspMvcDisplayTemplateAttribute : Attribute { } - - /// - /// ASP.NET MVC attribute. Indicates that a parameter is an MVC editor template. - /// Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Html.EditorExtensions.EditorForModel(HtmlHelper, String). - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class AspMvcEditorTemplateAttribute : Attribute { } - - /// - /// ASP.NET MVC attribute. Indicates that a parameter is an MVC template. - /// Use this attribute for custom wrappers similar to - /// System.ComponentModel.DataAnnotations.UIHintAttribute(System.String). - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class AspMvcTemplateAttribute : Attribute { } - - /// - /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter - /// is an MVC view component. If applied to a method, the MVC view name is calculated implicitly - /// from the context. Use this attribute for custom wrappers similar to - /// System.Web.Mvc.Controller.View(Object). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] - internal sealed class AspMvcViewAttribute : Attribute { } - - /// - /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter - /// is an MVC view component name. - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class AspMvcViewComponentAttribute : Attribute { } - - /// - /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter - /// is an MVC view component view. If applied to a method, the MVC view component view name is default. - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] - internal sealed class AspMvcViewComponentViewAttribute : Attribute { } - - /// - /// ASP.NET MVC attribute. When applied to a parameter of an attribute, - /// indicates that this parameter is an MVC action name. - /// - /// - /// [ActionName("Foo")] - /// public ActionResult Login(string returnUrl) { - /// ViewBag.ReturnUrl = Url.Action("Foo"); // OK - /// return RedirectToAction("Bar"); // Error: Cannot resolve action - /// } - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)] - internal sealed class AspMvcActionSelectorAttribute : Attribute { } - - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field)] - internal sealed class HtmlElementAttributesAttribute : Attribute - { - public HtmlElementAttributesAttribute() { } - - public HtmlElementAttributesAttribute([NotNull] string name) - { - Name = name; - } - - [CanBeNull] public string Name { get; private set; } - } - - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)] - internal sealed class HtmlAttributeValueAttribute : Attribute - { - public HtmlAttributeValueAttribute([NotNull] string name) - { - Name = name; - } - - [NotNull] public string Name { get; private set; } - } - - /// - /// Razor attribute. Indicates that a parameter or a method is a Razor section. - /// Use this attribute for custom wrappers similar to - /// System.Web.WebPages.WebPageBase.RenderSection(String). - /// - [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] - internal sealed class RazorSectionAttribute : Attribute { } - - /// - /// Indicates how method, constructor invocation or property access - /// over collection type affects content of the collection. - /// - [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Property)] - internal sealed class CollectionAccessAttribute : Attribute - { - public CollectionAccessAttribute(CollectionAccessType collectionAccessType) - { - CollectionAccessType = collectionAccessType; - } - - public CollectionAccessType CollectionAccessType { get; private set; } - } - - [Flags] - internal enum CollectionAccessType - { - /// Method does not use or modify content of the collection. - None = 0, - /// Method only reads content of the collection but does not modify it. - Read = 1, - /// Method can change content of the collection but does not add new elements. - ModifyExistingContent = 2, - /// Method can add new elements to the collection. - UpdatedContent = ModifyExistingContent | 4 - } - - /// - /// Indicates that the marked method is assertion method, i.e. it halts control flow if - /// one of the conditions is satisfied. To set the condition, mark one of the parameters with - /// attribute. - /// - [AttributeUsage(AttributeTargets.Method)] - internal sealed class AssertionMethodAttribute : Attribute { } - - /// - /// Indicates the condition parameter of the assertion method. The method itself should be - /// marked by attribute. The mandatory argument of - /// the attribute is the assertion type. - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class AssertionConditionAttribute : Attribute - { - public AssertionConditionAttribute(AssertionConditionType conditionType) - { - ConditionType = conditionType; - } - - public AssertionConditionType ConditionType { get; private set; } - } - - /// - /// Specifies assertion type. If the assertion method argument satisfies the condition, - /// then the execution continues. Otherwise, execution is assumed to be halted. - /// - internal enum AssertionConditionType - { - /// Marked parameter should be evaluated to true. - IS_TRUE = 0, - /// Marked parameter should be evaluated to false. - IS_FALSE = 1, - /// Marked parameter should be evaluated to null value. - IS_NULL = 2, - /// Marked parameter should be evaluated to not null value. - IS_NOT_NULL = 3, - } - - /// - /// Indicates that the marked method unconditionally terminates control flow execution. - /// For example, it could unconditionally throw exception. - /// - [Obsolete("Use [ContractAnnotation('=> halt')] instead")] - [AttributeUsage(AttributeTargets.Method)] - internal sealed class TerminatesProgramAttribute : Attribute { } - - /// - /// Indicates that method is pure LINQ method, with postponed enumeration (like Enumerable.Select, - /// .Where). This annotation allows inference of [InstantHandle] annotation for parameters - /// of delegate type by analyzing LINQ method chains. - /// - [AttributeUsage(AttributeTargets.Method)] - internal sealed class LinqTunnelAttribute : Attribute { } - - /// - /// Indicates that IEnumerable, passed as parameter, is not enumerated. - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class NoEnumerationAttribute : Attribute { } - - /// - /// Indicates that parameter is regular expression pattern. - /// - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class RegexPatternAttribute : Attribute { } - - /// - /// Prevents the Member Reordering feature from tossing members of the marked class. - /// - /// - /// The attribute must be mentioned in your member reordering patterns - /// - [AttributeUsage( - AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.Enum)] - internal sealed class NoReorderAttribute : Attribute { } - - /// - /// XAML attribute. Indicates the type that has ItemsSource property and should be treated - /// as ItemsControl-derived type, to enable inner items DataContext type resolve. - /// - [AttributeUsage(AttributeTargets.Class)] - internal sealed class XamlItemsControlAttribute : Attribute { } - - /// - /// XAML attribute. Indicates the property of some BindingBase-derived type, that - /// is used to bind some item of ItemsControl-derived type. This annotation will - /// enable the DataContext type resolve for XAML bindings for such properties. - /// - /// - /// Property should have the tree ancestor of the ItemsControl type or - /// marked with the attribute. - /// - [AttributeUsage(AttributeTargets.Property)] - internal sealed class XamlItemBindingOfItemsControlAttribute : Attribute { } - - [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] - internal sealed class AspChildControlTypeAttribute : Attribute - { - public AspChildControlTypeAttribute([NotNull] string tagName, [NotNull] Type controlType) - { - TagName = tagName; - ControlType = controlType; - } - - [NotNull] public string TagName { get; private set; } - - [NotNull] public Type ControlType { get; private set; } - } - - [AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)] - internal sealed class AspDataFieldAttribute : Attribute { } - - [AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)] - internal sealed class AspDataFieldsAttribute : Attribute { } - - [AttributeUsage(AttributeTargets.Property)] - internal sealed class AspMethodPropertyAttribute : Attribute { } - - [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] - internal sealed class AspRequiredAttributeAttribute : Attribute - { - public AspRequiredAttributeAttribute([NotNull] string attribute) - { - Attribute = attribute; - } - - [NotNull] public string Attribute { get; private set; } - } - - [AttributeUsage(AttributeTargets.Property)] - internal sealed class AspTypePropertyAttribute : Attribute - { - public bool CreateConstructorReferences { get; private set; } - - public AspTypePropertyAttribute(bool createConstructorReferences) - { - CreateConstructorReferences = createConstructorReferences; - } - } - - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] - internal sealed class RazorImportNamespaceAttribute : Attribute - { - public RazorImportNamespaceAttribute([NotNull] string name) - { - Name = name; - } - - [NotNull] public string Name { get; private set; } - } - - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] - internal sealed class RazorInjectionAttribute : Attribute - { - public RazorInjectionAttribute([NotNull] string type, [NotNull] string fieldName) - { - Type = type; - FieldName = fieldName; - } - - [NotNull] public string Type { get; private set; } - - [NotNull] public string FieldName { get; private set; } - } - - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] - internal sealed class RazorDirectiveAttribute : Attribute - { - public RazorDirectiveAttribute([NotNull] string directive) - { - Directive = directive; - } - - [NotNull] public string Directive { get; private set; } - } - - [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] - internal sealed class RazorPageBaseTypeAttribute : Attribute - { - public RazorPageBaseTypeAttribute([NotNull] string baseType) - { - BaseType = baseType; - } - public RazorPageBaseTypeAttribute([NotNull] string baseType, string pageName) - { - BaseType = baseType; - PageName = pageName; - } - - [NotNull] public string BaseType { get; private set; } - [CanBeNull] public string PageName { get; private set; } - } - - [AttributeUsage(AttributeTargets.Method)] - internal sealed class RazorHelperCommonAttribute : Attribute { } - - [AttributeUsage(AttributeTargets.Property)] - internal sealed class RazorLayoutAttribute : Attribute { } - - [AttributeUsage(AttributeTargets.Method)] - internal sealed class RazorWriteLiteralMethodAttribute : Attribute { } - - [AttributeUsage(AttributeTargets.Method)] - internal sealed class RazorWriteMethodAttribute : Attribute { } - - [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class RazorWriteMethodParameterAttribute : Attribute { } -} diff --git a/Sharpmake/Sharpmake.csproj b/Sharpmake/Sharpmake.csproj index 99f2ac31a..2aa2d0566 100644 --- a/Sharpmake/Sharpmake.csproj +++ b/Sharpmake/Sharpmake.csproj @@ -118,7 +118,6 @@ - From a2e58cd151c74eac010738c63ba0f6eff4465d70 Mon Sep 17 00:00:00 2001 From: Mihailo Gazda Date: Mon, 30 Nov 2020 17:04:15 +0000 Subject: [PATCH 058/142] .ExecAlways flag added to BuildStepExecutable step (Exec) FastBuld has .ExecAlways parameter that was not exposed to the developers that use SharpMake. Its valuable for code generation tasks that should be run every time. --- Sharpmake.Generators/FastBuild/Bff.Template.cs | 1 + Sharpmake.Generators/FastBuild/Bff.Util.cs | 3 +++ Sharpmake/Project.Configuration.cs | 9 ++++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Sharpmake.Generators/FastBuild/Bff.Template.cs b/Sharpmake.Generators/FastBuild/Bff.Template.cs index 178b91a77..2e6d4031f 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Template.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Template.cs @@ -520,6 +520,7 @@ public static class ConfigurationFile .ExecUseStdOutAsOutput = [fastBuildPrebuildUseStdOutAsOutput] .ExecAlwaysShowOutput = [fastBuildPrebuildAlwaysShowOutput] .PreBuildDependencies = [fastBuildExecPreBuildDependencies] + .ExecAlways = [fastBuildExecAlways] } "; diff --git a/Sharpmake.Generators/FastBuild/Bff.Util.cs b/Sharpmake.Generators/FastBuild/Bff.Util.cs index 7bd35e3fc..0195dd93e 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Util.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Util.cs @@ -123,6 +123,7 @@ internal class ExecNode : BffDependentNode public string WorkingPath; public bool UseStdOutAsOutput; public bool AlwaysShowOutput; + public bool ExecAlways; public ExecNode(string buildStepKey, Project.Configuration.BuildStepExecutable buildStep) { @@ -137,6 +138,7 @@ public ExecNode(string buildStepKey, Project.Configuration.BuildStepExecutable b WorkingPath = buildStep.ExecutableWorkingDirectory; UseStdOutAsOutput = buildStep.FastBuildUseStdOutAsOutput; AlwaysShowOutput = buildStep.FastBuildAlwaysShowOutput; + ExecAlways = buildStep.FastBuildExecAlways; } public override string Resolve(string rootPath, string bffFilePath, Resolver resolver) @@ -152,6 +154,7 @@ public override string Resolve(string rootPath, string bffFilePath, Resolver res using (resolver.NewScopedParameter("fastBuildPrebuildUseStdOutAsOutput", UseStdOutAsOutput ? "true" : FileGeneratorUtilities.RemoveLineTag)) using (resolver.NewScopedParameter("fastBuildPrebuildAlwaysShowOutput", AlwaysShowOutput ? "true" : FileGeneratorUtilities.RemoveLineTag)) using (resolver.NewScopedParameter("fastBuildExecPreBuildDependencies", Dependencies.Count > 0 ? UtilityMethods.FBuildFormatList(Dependencies.ToList(), 26) : FileGeneratorUtilities.RemoveLineTag)) + using (resolver.NewScopedParameter("fastBuildExecAlways", ExecAlways ? "true" : FileGeneratorUtilities.RemoveLineTag)) { return resolver.Resolve(Bff.Template.ConfigurationFile.GenericExecutableSection); } diff --git a/Sharpmake/Project.Configuration.cs b/Sharpmake/Project.Configuration.cs index 59fbdb865..5db1ea879 100644 --- a/Sharpmake/Project.Configuration.cs +++ b/Sharpmake/Project.Configuration.cs @@ -1335,7 +1335,8 @@ public BuildStepExecutable( string executableWorkingDirectory = "", bool isNameSpecific = false, bool useStdOutAsOutput = false, - bool alwaysShowOutput = false) + bool alwaysShowOutput = false, + bool executeAlways = false) { ExecutableFile = executableFile; @@ -1346,6 +1347,7 @@ public BuildStepExecutable( IsNameSpecific = isNameSpecific; FastBuildUseStdOutAsOutput = useStdOutAsOutput; FastBuildAlwaysShowOutput = alwaysShowOutput; + FastBuildExecAlways = executeAlways; } /// @@ -1385,6 +1387,11 @@ public BuildStepExecutable( public bool FastBuildAlwaysShowOutput = false; + /// + /// Gets or sets whether the step should be executed every time. + /// + public bool FastBuildExecAlways = false; + internal override void Resolve(Resolver resolver) { base.Resolve(resolver); From e0f0ea73d97514d95e6520c255d1a88eaecddabf Mon Sep 17 00:00:00 2001 From: Guilherme Malfatti Date: Thu, 10 Dec 2020 09:49:17 -0500 Subject: [PATCH 059/142] Fix typo --- .../HelloWorldMultiframework/Properties/AssemblyInfo.cs | 2 +- .../HelloWorldMultiframeworks/Properties/AssemblyInfo.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/NetCore/DotNetCoreFrameworkHelloWorld/codebase/HelloWorldMultiframework/Properties/AssemblyInfo.cs b/samples/NetCore/DotNetCoreFrameworkHelloWorld/codebase/HelloWorldMultiframework/Properties/AssemblyInfo.cs index 825ace357..a91083181 100644 --- a/samples/NetCore/DotNetCoreFrameworkHelloWorld/codebase/HelloWorldMultiframework/Properties/AssemblyInfo.cs +++ b/samples/NetCore/DotNetCoreFrameworkHelloWorld/codebase/HelloWorldMultiframework/Properties/AssemblyInfo.cs @@ -7,7 +7,7 @@ [assembly: AssemblyDescription("Dummy description")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Ubisoft")] -[assembly: AssemblyProduct("Sharpamke")] +[assembly: AssemblyProduct("Sharpmake")] [assembly: AssemblyCopyright("Copyright © Ubisoft 2020")] [assembly: AssemblyVersion("1.0.0.0")] diff --git a/samples/NetCore/DotNetMultiFrameworksHelloWorld/codebase/HelloWorldMultiframeworks/Properties/AssemblyInfo.cs b/samples/NetCore/DotNetMultiFrameworksHelloWorld/codebase/HelloWorldMultiframeworks/Properties/AssemblyInfo.cs index 825ace357..a91083181 100644 --- a/samples/NetCore/DotNetMultiFrameworksHelloWorld/codebase/HelloWorldMultiframeworks/Properties/AssemblyInfo.cs +++ b/samples/NetCore/DotNetMultiFrameworksHelloWorld/codebase/HelloWorldMultiframeworks/Properties/AssemblyInfo.cs @@ -7,7 +7,7 @@ [assembly: AssemblyDescription("Dummy description")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Ubisoft")] -[assembly: AssemblyProduct("Sharpamke")] +[assembly: AssemblyProduct("Sharpmake")] [assembly: AssemblyCopyright("Copyright © Ubisoft 2020")] [assembly: AssemblyVersion("1.0.0.0")] From ff4cc90336c577b143a805a02c7c1f36eaf57ebb Mon Sep 17 00:00:00 2001 From: Jean-Sebastien Pelletier Date: Tue, 15 Dec 2020 15:47:36 -0500 Subject: [PATCH 060/142] Added vcpkg sample --- samples/vcpkg/.gitignore | 3 + samples/vcpkg/bootstrap-sample.bat | 31 +++++ samples/vcpkg/extern/vcpkg.zip | Bin 0 -> 6301759 bytes samples/vcpkg/readme.md | 6 + .../vcpkg/sharpmake/baseclasses.sharpmake.cs | 125 ++++++++++++++++++ .../sharpmake/externprojects.sharpmake.cs | 99 ++++++++++++++ samples/vcpkg/sharpmake/main.sharpmake.cs | 32 +++++ samples/vcpkg/sharpmake/projects.sharpmake.cs | 48 +++++++ samples/vcpkg/src/vcpkgsample/main.cpp | 19 +++ samples/vcpkg/update-vcpkg-packages.bat | 59 +++++++++ 10 files changed, 422 insertions(+) create mode 100644 samples/vcpkg/.gitignore create mode 100644 samples/vcpkg/bootstrap-sample.bat create mode 100644 samples/vcpkg/extern/vcpkg.zip create mode 100644 samples/vcpkg/readme.md create mode 100644 samples/vcpkg/sharpmake/baseclasses.sharpmake.cs create mode 100644 samples/vcpkg/sharpmake/externprojects.sharpmake.cs create mode 100644 samples/vcpkg/sharpmake/main.sharpmake.cs create mode 100644 samples/vcpkg/sharpmake/projects.sharpmake.cs create mode 100644 samples/vcpkg/src/vcpkgsample/main.cpp create mode 100644 samples/vcpkg/update-vcpkg-packages.bat diff --git a/samples/vcpkg/.gitignore b/samples/vcpkg/.gitignore new file mode 100644 index 000000000..ff1fdb368 --- /dev/null +++ b/samples/vcpkg/.gitignore @@ -0,0 +1,3 @@ +extern/vcpkg/ +tmp/ +blob/ \ No newline at end of file diff --git a/samples/vcpkg/bootstrap-sample.bat b/samples/vcpkg/bootstrap-sample.bat new file mode 100644 index 000000000..350186a7d --- /dev/null +++ b/samples/vcpkg/bootstrap-sample.bat @@ -0,0 +1,31 @@ +@echo off + +SETLOCAL + +call :DECOMPRESS_VCPKG_EXPORTED_PACKAGES +IF ERRORLEVEL 1 exit /b %ERRORLEVEL% + +call :GENERATE_PROJECTS +IF ERRORLEVEL 1 exit /b %ERRORLEVEL% + +:: Final Cleanup +exit /B %ERRORLEVEL% + +:: ---------- FUNCTIONS --------------- + +:: Decompress the exported vcpkg package for consumption by Sharpmake and generated projects +:DECOMPRESS_VCPKG_EXPORTED_PACKAGES +rmdir /Q /S extern\vcpkg >NUL 2>NUL +echo Extracting extern\vcpkg.zip to extern\vcpkg +powershell Expand-Archive extern\vcpkg.zip -DestinationPath extern +exit /B %ERRORLEVEL% + +:: Generate projects using Sharpmake +:GENERATE_PROJECTS +%~dp0..\..\bin\Release\Sharpmake.Application.exe /sources(@".\sharpmake\main.sharpmake.cs") /generatedebugsolution +exit /B %ERRORLEVEL% + + + + + diff --git a/samples/vcpkg/extern/vcpkg.zip b/samples/vcpkg/extern/vcpkg.zip new file mode 100644 index 0000000000000000000000000000000000000000..7a50f16e04537d7112e908b73114cda3f4f9af1c GIT binary patch literal 6301759 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

~aehQ$ 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

4QYQpcGE@|W#UH9=5EWF*vXIM1p#$C|P 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∧O~7u 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

public bool PreferRelativePaths = true; + /// + /// Optional OS version at the end of the TargetFramework, for example, net5.0-ios13.0. + /// + /// C# only, will throw if the target doesn't have a non-default DotNetOS fragment + public string DotNetOSVersionSuffix = string.Empty; + internal override void Construct(object owner, ITarget target) { base.Construct(owner, target); diff --git a/Sharpmake/Target.cs b/Sharpmake/Target.cs index f199f2ca2..1c5801a3a 100644 --- a/Sharpmake/Target.cs +++ b/Sharpmake/Target.cs @@ -184,6 +184,19 @@ public enum DotNetFramework all_netstandard = netstandard1_0 | netstandard1_1 | netstandard1_2 | netstandard1_3 | netstandard1_4 | netstandard1_5 | netstandard1_6 | netstandard2_0 | netstandard2_1 } + // https://docs.microsoft.com/en-us/dotnet/standard/frameworks#net-5-os-specific-tfms + [Fragment, Flags] + public enum DotNetOS + { + Default = 1 << 0, + android = 1 << 1, + ios = 1 << 2, + macos = 1 << 3, + tvos = 1 << 4, + watchos = 1 << 5, + windows = 1 << 6 + } + // Optional [Fragment, Flags] public enum Blob From 35cf711e65743ddc3e0bee5bba474ee4185087d7 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sat, 30 Jan 2021 19:05:01 +0100 Subject: [PATCH 087/142] Update references following dotnet Sdk change. --- .../projects/helloworld/HelloWorld.vs2017.netcore1_0.csproj | 4 +++- .../projects/helloworld/HelloWorld.vs2019.netcore2_0.csproj | 4 +++- .../HelloWorldMultiFramework.vs2019.csproj | 4 +++- .../HelloWorldMultiFramework.vs2019.csproj | 4 +++- .../projects/HelloWorldMultiFrameworksSolution.vs2019.sln | 4 ++++ .../projects/helloworldlib/HelloWorldLib.vs2019.csproj | 4 +++- .../HelloWorldMultiFrameworks.vs2019.csproj | 4 +++- 7 files changed, 22 insertions(+), 6 deletions(-) diff --git a/samples/NetCore/DotNetCoreFrameworkHelloWorld/reference/projects/helloworld/HelloWorld.vs2017.netcore1_0.csproj b/samples/NetCore/DotNetCoreFrameworkHelloWorld/reference/projects/helloworld/HelloWorld.vs2017.netcore1_0.csproj index 0b84c1b04..361342313 100644 --- a/samples/NetCore/DotNetCoreFrameworkHelloWorld/reference/projects/helloworld/HelloWorld.vs2017.netcore1_0.csproj +++ b/samples/NetCore/DotNetCoreFrameworkHelloWorld/reference/projects/helloworld/HelloWorld.vs2017.netcore1_0.csproj @@ -1,4 +1,4 @@ - + Debug AnyCPU @@ -35,9 +35,11 @@ true false + Program.cs + \ No newline at end of file diff --git a/samples/NetCore/DotNetCoreFrameworkHelloWorld/reference/projects/helloworld/HelloWorld.vs2019.netcore2_0.csproj b/samples/NetCore/DotNetCoreFrameworkHelloWorld/reference/projects/helloworld/HelloWorld.vs2019.netcore2_0.csproj index febaf2655..e05677434 100644 --- a/samples/NetCore/DotNetCoreFrameworkHelloWorld/reference/projects/helloworld/HelloWorld.vs2019.netcore2_0.csproj +++ b/samples/NetCore/DotNetCoreFrameworkHelloWorld/reference/projects/helloworld/HelloWorld.vs2019.netcore2_0.csproj @@ -1,4 +1,4 @@ - + Debug AnyCPU @@ -35,9 +35,11 @@ true false + Program.cs + \ No newline at end of file diff --git a/samples/NetCore/DotNetCoreFrameworkHelloWorld/reference/projects/helloworldmultiframework/HelloWorldMultiFramework.vs2019.csproj b/samples/NetCore/DotNetCoreFrameworkHelloWorld/reference/projects/helloworldmultiframework/HelloWorldMultiFramework.vs2019.csproj index 6ff8942a9..b76644319 100644 --- a/samples/NetCore/DotNetCoreFrameworkHelloWorld/reference/projects/helloworldmultiframework/HelloWorldMultiFramework.vs2019.csproj +++ b/samples/NetCore/DotNetCoreFrameworkHelloWorld/reference/projects/helloworldmultiframework/HelloWorldMultiFramework.vs2019.csproj @@ -1,4 +1,4 @@ - + Debug AnyCPU @@ -60,6 +60,7 @@ true false + Program.cs @@ -68,4 +69,5 @@ Properties\AssemblyInfo.cs + \ No newline at end of file diff --git a/samples/NetCore/DotNetFrameworkHelloWorld/reference/projects/helloworldmultiframework/HelloWorldMultiFramework.vs2019.csproj b/samples/NetCore/DotNetFrameworkHelloWorld/reference/projects/helloworldmultiframework/HelloWorldMultiFramework.vs2019.csproj index ba29c7ff8..4783192c6 100644 --- a/samples/NetCore/DotNetFrameworkHelloWorld/reference/projects/helloworldmultiframework/HelloWorldMultiFramework.vs2019.csproj +++ b/samples/NetCore/DotNetFrameworkHelloWorld/reference/projects/helloworldmultiframework/HelloWorldMultiFramework.vs2019.csproj @@ -1,4 +1,4 @@ - + Debug AnyCPU @@ -60,9 +60,11 @@ true false + Program.cs + \ No newline at end of file diff --git a/samples/NetCore/DotNetMultiFrameworksHelloWorld/reference/projects/HelloWorldMultiFrameworksSolution.vs2019.sln b/samples/NetCore/DotNetMultiFrameworksHelloWorld/reference/projects/HelloWorldMultiFrameworksSolution.vs2019.sln index 232809be5..1492c6d09 100644 --- a/samples/NetCore/DotNetMultiFrameworksHelloWorld/reference/projects/HelloWorldMultiFrameworksSolution.vs2019.sln +++ b/samples/NetCore/DotNetMultiFrameworksHelloWorld/reference/projects/HelloWorldMultiFrameworksSolution.vs2019.sln @@ -16,6 +16,10 @@ Global {39A4FB20-F152-B28B-4386-81262F615392}.Debug|Any CPU.Build.0 = Debug|Any CPU {39A4FB20-F152-B28B-4386-81262F615392}.Release|Any CPU.ActiveCfg = Release|Any CPU {39A4FB20-F152-B28B-4386-81262F615392}.Release|Any CPU.Build.0 = Release|Any CPU + {2118A95F-4FDA-D7C9-6CC8-A7A85A81062E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2118A95F-4FDA-D7C9-6CC8-A7A85A81062E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2118A95F-4FDA-D7C9-6CC8-A7A85A81062E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2118A95F-4FDA-D7C9-6CC8-A7A85A81062E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/samples/NetCore/DotNetMultiFrameworksHelloWorld/reference/projects/helloworldlib/HelloWorldLib.vs2019.csproj b/samples/NetCore/DotNetMultiFrameworksHelloWorld/reference/projects/helloworldlib/HelloWorldLib.vs2019.csproj index b7e9f1d79..8ae33be63 100644 --- a/samples/NetCore/DotNetMultiFrameworksHelloWorld/reference/projects/helloworldlib/HelloWorldLib.vs2019.csproj +++ b/samples/NetCore/DotNetMultiFrameworksHelloWorld/reference/projects/helloworldlib/HelloWorldLib.vs2019.csproj @@ -1,4 +1,4 @@ - + Debug AnyCPU @@ -60,6 +60,7 @@ true false + False @@ -73,4 +74,5 @@ + \ No newline at end of file diff --git a/samples/NetCore/DotNetMultiFrameworksHelloWorld/reference/projects/helloworldmultiframeworks/HelloWorldMultiFrameworks.vs2019.csproj b/samples/NetCore/DotNetMultiFrameworksHelloWorld/reference/projects/helloworldmultiframeworks/HelloWorldMultiFrameworks.vs2019.csproj index c6d09b1c9..314b2e817 100644 --- a/samples/NetCore/DotNetMultiFrameworksHelloWorld/reference/projects/helloworldmultiframeworks/HelloWorldMultiFrameworks.vs2019.csproj +++ b/samples/NetCore/DotNetMultiFrameworksHelloWorld/reference/projects/helloworldmultiframeworks/HelloWorldMultiFrameworks.vs2019.csproj @@ -1,4 +1,4 @@ - + Debug AnyCPU @@ -60,6 +60,7 @@ true false + Program.cs @@ -74,4 +75,5 @@ HelloWorldLib + \ No newline at end of file From c916d6269cd5a5bfa25ebe9d6de7cc4217107294 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sat, 30 Jan 2021 19:00:13 +0100 Subject: [PATCH 088/142] Make Project.AfterConfigure virtual to allow user to override it, and be consistent with PreConfigure which is already virtual. --- Sharpmake/Project.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake/Project.cs b/Sharpmake/Project.cs index 97829eb37..b221145dc 100644 --- a/Sharpmake/Project.cs +++ b/Sharpmake/Project.cs @@ -1654,7 +1654,7 @@ public virtual void PreConfigure() { } - public void AfterConfigure() + public virtual void AfterConfigure() { foreach (Project.Configuration conf in Configurations) { From 22af20b9f145fd6a41b86caae2e11fbdcc25fdee Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sat, 30 Jan 2021 19:01:46 +0100 Subject: [PATCH 089/142] Use OrdinalIgnoreCase because for some reasons InvariantCulture changes depending on the machine... --- Sharpmake.Generators/VisualStudio/Csproj.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Sharpmake.Generators/VisualStudio/Csproj.cs b/Sharpmake.Generators/VisualStudio/Csproj.cs index 144fee92f..2f69572e9 100644 --- a/Sharpmake.Generators/VisualStudio/Csproj.cs +++ b/Sharpmake.Generators/VisualStudio/Csproj.cs @@ -141,7 +141,7 @@ public string Resolve(Resolver resolver) var writer = new StringWriter(); var resolvedAlwaysTrueCondition = AlwaysTrueElement?.ResolveCondition(resolver); - foreach (var conditionalItemGroup in conditionalItemGroups.OrderBy(k => k.Key, StringComparer.InvariantCultureIgnoreCase)) + foreach (var conditionalItemGroup in conditionalItemGroups.OrderBy(k => k.Key, StringComparer.OrdinalIgnoreCase)) { // No element for this ItemGroup, skip if (!conditionalItemGroup.Value.Any()) @@ -157,7 +157,7 @@ public string Resolve(Resolver resolver) writer.Write(resolver.Resolve(Template.ItemGroups.ItemGroupConditionalBegin)); } - foreach (var elem in conditionalItemGroup.Value.OrderBy(v => v, StringComparer.InvariantCultureIgnoreCase)) + foreach (var elem in conditionalItemGroup.Value.OrderBy(v => v, StringComparer.OrdinalIgnoreCase)) writer.Write(elem); writer.Write(Template.ItemGroups.ItemGroupEnd); @@ -1761,7 +1761,7 @@ List skipFiles itemGroups.Pages.Add(new ItemGroups.Page { Include = xaml, - IsApplicationDefinition = project.ApplicationDefinitionFilenames.Any(f => f.Equals(Path.GetFileName(xaml), StringComparison.InvariantCultureIgnoreCase)), + IsApplicationDefinition = project.ApplicationDefinitionFilenames.Any(f => f.Equals(Path.GetFileName(xaml), StringComparison.OrdinalIgnoreCase)), LinkFolder = GetProjectLinkedFolder(xaml, _projectPathCapitalized, project) }); remainingSourcesFiles.Remove(xaml); @@ -1862,7 +1862,7 @@ List skipFiles { string designerFile = fileAssociation.GetFilenameWithExtension(".designer.cs"); string resXFile = fileAssociation.GetFilenameWithExtension(".resx"); - bool publicAccessModifiers = publicResources.Any(f => f.Equals(resXFile, StringComparison.InvariantCultureIgnoreCase)); + bool publicAccessModifiers = publicResources.Any(f => f.Equals(resXFile, StringComparison.OrdinalIgnoreCase)); itemGroups.Compiles.Add(new ItemGroups.Compile { Include = designerFile, @@ -1875,7 +1875,7 @@ List skipFiles { Include = resXFile, Generator = publicAccessModifiers ? "PublicResXFileCodeGenerator" : "ResXFileCodeGenerator", - MergeWithCto = resXFile.EndsWith("VSPackage.resx", StringComparison.InvariantCultureIgnoreCase) ? "true" : null, + MergeWithCto = resXFile.EndsWith("VSPackage.resx", StringComparison.OrdinalIgnoreCase) ? "true" : null, LastGenOutput = Path.GetFileName(designerFile), LinkFolder = GetProjectLinkedFolder(resXFile, _projectPathCapitalized, project), SubType = "Designer" @@ -2167,7 +2167,7 @@ List skipFiles itemGroups.Pages.Add(new ItemGroups.Page { Include = xaml, - IsApplicationDefinition = project.ApplicationDefinitionFilenames.Any(f => f.Equals(xaml, StringComparison.InvariantCultureIgnoreCase)), + IsApplicationDefinition = project.ApplicationDefinitionFilenames.Any(f => f.Equals(xaml, StringComparison.OrdinalIgnoreCase)), LinkFolder = GetProjectLinkedFolder(xaml, _projectPathCapitalized, project) }); remainingSourcesFiles.Remove(xaml); @@ -2212,7 +2212,7 @@ List skipFiles itemGroups.EmbeddedResources.Add(new ItemGroups.EmbeddedResource { Include = file, - MergeWithCto = file.Equals("VSPackage.resx", StringComparison.InvariantCultureIgnoreCase) ? "true" : null, + MergeWithCto = file.Equals("VSPackage.resx", StringComparison.OrdinalIgnoreCase) ? "true" : null, LinkFolder = project.GetLinkFolder(file) }); } From e8f683d892063a585cf0cbaf969815e0ce14a276 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sat, 30 Jan 2021 19:07:14 +0100 Subject: [PATCH 090/142] [Pyproj] Make a utility method and use it to access registry. --- Sharpmake.Generators/VisualStudio/Pyproj.cs | 41 +++++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/Sharpmake.Generators/VisualStudio/Pyproj.cs b/Sharpmake.Generators/VisualStudio/Pyproj.cs index 79b71498f..f911c3af3 100644 --- a/Sharpmake.Generators/VisualStudio/Pyproj.cs +++ b/Sharpmake.Generators/VisualStudio/Pyproj.cs @@ -126,11 +126,12 @@ private string Generate(PythonProject project, List unsor // xml begin header Write(Template.Project.ProjectBegin, writer, resolver); - string defaultInterpreterRegisterKeyName = $@"HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\{ + string defaultInterpreterRegisterKeyName = $@"Software\Microsoft\VisualStudio\{ devEnvRange.MinDevEnv.GetVisualVersionString() }\PythonTools\Options\Interpreters"; - var defaultInterpreter = (string)Registry.GetValue(defaultInterpreterRegisterKeyName, "DefaultInterpreter", "{}") ?? "{00000000-0000-0000-0000-000000000000}"; - var defaultInterpreterVersion = (string)Registry.GetValue(defaultInterpreterRegisterKeyName, "DefaultInterpreterVersion", "2.7") ?? "2.7"; + + var defaultInterpreter = GetRegistryCurrentUserSubKeyValue(defaultInterpreterRegisterKeyName, "DefaultInterpreter", "{00000000-0000-0000-0000-000000000000}"); + var defaultInterpreterVersion = GetRegistryCurrentUserSubKeyValue(defaultInterpreterRegisterKeyName, "DefaultInterpreterVersion", "2.7"); string currentInterpreterId = defaultInterpreter; string currentInterpreterVersion = defaultInterpreterVersion; @@ -142,14 +143,14 @@ private string Generate(PythonProject project, List unsor if (pyEnvironment.IsActivated) { string interpreterRegisterKeyName = - $@"HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\{ + $@"Software\Microsoft\VisualStudio\{ devEnvRange.MinDevEnv.GetVisualVersionString() }\PythonTools\Interpreters\{{{pyEnvironment.Guid}}}"; - string interpreterDescription = (string)Registry.GetValue(interpreterRegisterKeyName, "Description", ""); + string interpreterDescription = GetRegistryCurrentUserSubKeyValue(interpreterRegisterKeyName, "Description", ""); if (interpreterDescription != string.Empty) { currentInterpreterId = $"{{{pyEnvironment.Guid}}}"; - currentInterpreterVersion = (string)Registry.GetValue(interpreterRegisterKeyName, "Version", currentInterpreterVersion); + currentInterpreterVersion = GetRegistryCurrentUserSubKeyValue(interpreterRegisterKeyName, "Version", currentInterpreterVersion); } } } @@ -160,14 +161,14 @@ private string Generate(PythonProject project, List unsor if (virtualEnvironment.IsDefault) { string baseInterpreterRegisterKeyName = - $@"HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\{ + $@"Software\Microsoft\VisualStudio\{ devEnvRange.MinDevEnv.GetVisualVersionString() }\PythonTools\Interpreters\{{{virtualEnvironment.BaseInterpreterGuid}}}"; - string baseInterpreterDescription = (string)Registry.GetValue(baseInterpreterRegisterKeyName, "Description", ""); + string baseInterpreterDescription = GetRegistryCurrentUserSubKeyValue(baseInterpreterRegisterKeyName, "Description", ""); if (baseInterpreterDescription != string.Empty) { currentInterpreterId = $"{{{virtualEnvironment.Guid}}}"; - currentInterpreterVersion = (string)Registry.GetValue(baseInterpreterRegisterKeyName, "Version", currentInterpreterVersion); + currentInterpreterVersion = GetRegistryCurrentUserSubKeyValue(baseInterpreterRegisterKeyName, "Version", currentInterpreterVersion); } } } @@ -215,13 +216,13 @@ private string Generate(PythonProject project, List unsor { // Verify if the interpreter exists in the register. string interpreterRegisterKeyName = - $@"HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\{ + $@"Software\Microsoft\VisualStudio\{ devEnvRange.MinDevEnv.GetVisualVersionString() }\PythonTools\Interpreters\{{{pyEnvironment.Guid}}}"; - string interpreterDescription = (string)Registry.GetValue(interpreterRegisterKeyName, "Description", ""); + string interpreterDescription = GetRegistryCurrentUserSubKeyValue(interpreterRegisterKeyName, "Description", ""); if (interpreterDescription != string.Empty) { - string interpreterVersion = (string)Registry.GetValue(interpreterRegisterKeyName, "Version", currentInterpreterVersion); + string interpreterVersion = GetRegistryCurrentUserSubKeyValue(interpreterRegisterKeyName, "Version", currentInterpreterVersion); using (resolver.NewScopedParameter("guid", $"{{{pyEnvironment.Guid}}}")) using (resolver.NewScopedParameter("version", interpreterVersion)) { @@ -383,6 +384,22 @@ private string GetProperRelativePathToSourcePath(string path) return Util.PathGetRelative(_project.SourceRootPath, _project.IsSourceFilesCaseSensitive ? Util.GetCapitalizedPath(path) : path); } + private static string GetRegistryCurrentUserSubKeyValue(string registrySubKey, string value, string fallbackValue) + { + string key = string.Empty; + + if (Util.GetExecutingPlatform().HasAnyFlag(Platform.win32 | Platform.win64)) + { + using (RegistryKey subKey = Registry.CurrentUser.OpenSubKey(registrySubKey)) + key = (string)subKey?.GetValue(value); + } + + if (string.IsNullOrEmpty(key)) + key = fallbackValue; + + return key; + } + private class ProjectDirectory { public string Name; From 47712d5a14e35cba17ef92633e14718ec951b836 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sat, 30 Jan 2021 19:07:53 +0100 Subject: [PATCH 091/142] Add VSCode dir to gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8a2f996cb..4c38c1754 100644 --- a/.gitignore +++ b/.gitignore @@ -61,7 +61,7 @@ _ReSharper*/ project.json project.lock.json Sharpmake.VC.db - +.vscode .idea # Desktop Services Store on MacOS From 442eb155d6e194692a9aaa69850de7557bfd45ef Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sat, 30 Jan 2021 19:43:09 +0100 Subject: [PATCH 092/142] Add linux binary of FastBuild 1.01, and adapt scripts Python scripts will now call the proper FastBuild version (note that on OSX and Linux they don't go further than that yet..) --- README.md | 2 +- .../FastBuildFunctionalTest.sharpmake.cs | 2 +- ...astBuildProjectFunctionalTest.sharpmake.cs | 2 +- functional_test.py | 17 ++++++------ regression_test.py | 26 ++++++++---------- .../FastBuildSimpleExecutable.sharpmake.cs | 2 +- .../HelloLinux/HelloLinux.Main.sharpmake.cs | 7 +++-- .../HelloXCode/HelloXCode.Main.sharpmake.cs | 7 +++-- samples/vcpkg/sharpmake/main.sharpmake.cs | 2 +- tools/FastBuild/Linux-x64/fbuild | Bin 0 -> 980104 bytes tools/FastBuild/{ => OSX-x64}/FBuild | Bin tools/FastBuild/{ => Windows-x64}/FBuild.exe | Bin 12 files changed, 36 insertions(+), 31 deletions(-) create mode 100644 tools/FastBuild/Linux-x64/fbuild rename tools/FastBuild/{ => OSX-x64}/FBuild (100%) rename tools/FastBuild/{ => Windows-x64}/FBuild.exe (100%) diff --git a/README.md b/README.md index 5e4c5db10..e29bbec13 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ functionality used toolset for functional tests: -tools\FastBuild\FBuild.exe (win x64) and FBuild (osx x64) - v1.01. http://www.fastbuild.org +tools\FastBuild - v1.01. http://www.fastbuild.org diff --git a/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs b/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs index 2aaee657c..162924b95 100644 --- a/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs +++ b/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs @@ -539,7 +539,7 @@ public static void SharpmakeMain(Sharpmake.Arguments arguments) FileInfo fileInfo = Util.GetCurrentSharpmakeFileInfo(); string sharpmakeRootDirectory = Util.SimplifyPath(Path.Combine(fileInfo.DirectoryName, "..", "..")); - FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeRootDirectory, @"tools\FastBuild\FBuild.exe"); + FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeRootDirectory, @"tools\FastBuild\Windows-x64\FBuild.exe"); FastBuildSettings.FastBuildWait = true; FastBuildSettings.WriteAllConfigsSection = true; diff --git a/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs b/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs index c876aa006..e39c46c3e 100644 --- a/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs +++ b/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs @@ -190,7 +190,7 @@ public static void SharpmakeMain(Arguments arguments) FileInfo fileInfo = Util.GetCurrentSharpmakeFileInfo(); string sharpmakeRootDirectory = Util.SimplifyPath(Path.Combine(fileInfo.DirectoryName, "..", "..")); - FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeRootDirectory, @"tools\FastBuild\FBuild.exe"); + FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeRootDirectory, @"tools\FastBuild\Windows-x64\FBuild.exe"); FastBuildSettings.FastBuildWait = true; FastBuildSettings.WriteAllConfigsSection = true; diff --git a/functional_test.py b/functional_test.py index b5c60c1bb..3668fc654 100644 --- a/functional_test.py +++ b/functional_test.py @@ -5,6 +5,7 @@ # This script supports Python 3. import os.path +import platform import sys if os.name != "nt": @@ -15,7 +16,7 @@ class FunctionalTest(object): def __init__(self, directory, script_name, project_root = ""): self.directory = directory self.script_name = script_name - self.use_mono = os.name == "posix" + self.runs_on_unix = os.name == "posix" if project_root == "": self.project_root = directory else: @@ -33,7 +34,7 @@ def run_test(self): write_line("Using sharpmake " + sharpmake_path) # Builds the command line argument list. - sources = "/sources(@\"{}\")".format(os.path.join(self.directory, self.script_name)) + sources = "/sources(@\'{}\')".format(os.path.join(self.directory, self.script_name)) verbose = "/verbose" args = [ @@ -41,11 +42,9 @@ def run_test(self): verbose ] - if self.use_mono: - args_string = "\" \"".join([arg.replace('"','\\"') for arg in args]) - cmd_line = "mono --debug {} \"{}\"".format(sharpmake_path, args_string) - else: - cmd_line = "{} \"{}\"".format(sharpmake_path, " ".join(args)) + cmd_line = "{} \"{}\"".format(sharpmake_path, " ".join(args)) + if self.runs_on_unix: + cmd_line = "mono --debug " + cmd_line generation_exit_code = os.system(cmd_line) @@ -130,7 +129,9 @@ def build(self, projectDir): def build_with_fastbuild(root_dir, test_dir): entry_path = os.getcwd() - fastBuildPath = os.path.join(entry_path, "tools", "FastBuild", "FBuild.exe"); + platformSystem = platform.system() + fastBuildInfo = ("Linux-x64", "fbuild") if platformSystem == "Linux" else ("OSX-x64", "FBuild") if platformSystem == "Darwin" else ("Windows-x64", "FBuild.exe") + fastBuildPath = os.path.join(entry_path, "tools", "FastBuild", fastBuildInfo[0], fastBuildInfo[1]); if not os.path.isfile(fastBuildPath): return -1 diff --git a/regression_test.py b/regression_test.py index 98ea2c434..f1703004f 100644 --- a/regression_test.py +++ b/regression_test.py @@ -16,7 +16,7 @@ def __init__(self, directory, script_name, project_root = ""): self.directory = directory self.assembly = directory + ".dll" # same name as the directory for now self.script_name = script_name - self.use_mono = os.name == "posix" + self.runs_on_unix = os.name == "posix" if project_root == "": self.project_root = directory else: @@ -34,12 +34,12 @@ def run_test(self, as_source): write_line("Using sharpmake " + sharpmake_path) # Builds the command line argument list. - sources = "/sources(@\"{}\")".format(os.path.join(self.directory, self.script_name)) - assemblies = "/assemblies(@\"{}\")".format(find_assembly_path(self.directory, self.assembly)) - referencedir = "/referencedir(@\"{}\")".format(os.path.join(self.directory, "reference")) - outputdir = "/outputdir(@\"{}\")".format(os.path.join(self.directory, "projects")) - remaproot = "/remaproot(@\"{}\")".format(self.project_root) - test = "/test(@\"Regression\")" + sources = "/sources(@\'{}\')".format(os.path.join(self.directory, self.script_name)) + assemblies = "/assemblies(@\'{}\')".format(find_assembly_path(self.directory, self.assembly)) + referencedir = "/referencedir(@\'{}\')".format(os.path.join(self.directory, "reference")) + outputdir = "/outputdir(@\'{}\')".format(os.path.join(self.directory, "projects")) + remaproot = "/remaproot(@\'{}\')".format(self.project_root) + test = "/test(@\'Regression\')" verbose = "/verbose" args = [ @@ -51,11 +51,9 @@ def run_test(self, as_source): verbose ] - if self.use_mono: - args_string = "\" \"".join([arg.replace('"','\\"') for arg in args]) - cmd_line = "mono --debug {} \"{}\"".format(sharpmake_path, args_string) - else: - cmd_line = "{} \"{}\"".format(sharpmake_path, " ".join(args)) + cmd_line = "{} \"{}\"".format(sharpmake_path, " ".join(args)) + if self.runs_on_unix: + cmd_line = "mono --debug " + cmd_line return os.system(cmd_line) @@ -105,11 +103,11 @@ def red_bg(): def green_bg(): if os.name == "nt": os.system("color 2F") - + def black_bg(): if os.name == "nt": os.system("color 0F") - + def pause(timeout=None): if timeout is None: diff --git a/samples/FastBuildSimpleExecutable/FastBuildSimpleExecutable.sharpmake.cs b/samples/FastBuildSimpleExecutable/FastBuildSimpleExecutable.sharpmake.cs index 791bb0e13..bfac3e05c 100644 --- a/samples/FastBuildSimpleExecutable/FastBuildSimpleExecutable.sharpmake.cs +++ b/samples/FastBuildSimpleExecutable/FastBuildSimpleExecutable.sharpmake.cs @@ -79,7 +79,7 @@ public void ConfigureAll(Configuration conf, Target target) [Sharpmake.Main] public static void SharpmakeMain(Sharpmake.Arguments arguments) { - FastBuildSettings.FastBuildMakeCommand = @"tools\FastBuild\FBuild.exe"; + FastBuildSettings.FastBuildMakeCommand = @"tools\FastBuild\Windows-x64\FBuild.exe"; arguments.Generate(); } diff --git a/samples/HelloLinux/HelloLinux.Main.sharpmake.cs b/samples/HelloLinux/HelloLinux.Main.sharpmake.cs index c7f193ec3..694debf02 100644 --- a/samples/HelloLinux/HelloLinux.Main.sharpmake.cs +++ b/samples/HelloLinux/HelloLinux.Main.sharpmake.cs @@ -74,11 +74,14 @@ public static void SharpmakeMain(Sharpmake.Arguments arguments) switch (Util.GetExecutingPlatform()) { case Platform.linux: - FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeFastBuildDir, "FBuild"); + FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeFastBuildDir, "Linux-x64", "fbuild"); + break; + case Platform.mac: + FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeFastBuildDir, "OSX-x64", "FBuild"); break; case Platform.win64: default: - FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeFastBuildDir, "FBuild.exe"); + FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeFastBuildDir, "Windows-x64", "FBuild.exe"); break; } diff --git a/samples/HelloXCode/HelloXCode.Main.sharpmake.cs b/samples/HelloXCode/HelloXCode.Main.sharpmake.cs index 7c350cdb5..1d5e1dc54 100644 --- a/samples/HelloXCode/HelloXCode.Main.sharpmake.cs +++ b/samples/HelloXCode/HelloXCode.Main.sharpmake.cs @@ -73,12 +73,15 @@ public static void SharpmakeMain(Sharpmake.Arguments arguments) string sharpmakeFastBuildDir = Util.PathGetAbsolute(Globals.RootDirectory, @"..\..\..\tools\FastBuild"); switch (Util.GetExecutingPlatform()) { + case Platform.linux: + FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeFastBuildDir, "Linux-x64", "fbuild"); + break; case Platform.mac: - FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeFastBuildDir, "FBuild"); + FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeFastBuildDir, "OSX-x64", "FBuild"); break; case Platform.win64: default: - FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeFastBuildDir, "FBuild.exe"); + FastBuildSettings.FastBuildMakeCommand = Path.Combine(sharpmakeFastBuildDir, "Windows-x64", "FBuild.exe"); break; } diff --git a/samples/vcpkg/sharpmake/main.sharpmake.cs b/samples/vcpkg/sharpmake/main.sharpmake.cs index 9ebaaa1a2..dc6bfbc8c 100644 --- a/samples/vcpkg/sharpmake/main.sharpmake.cs +++ b/samples/vcpkg/sharpmake/main.sharpmake.cs @@ -20,7 +20,7 @@ public static void SharpmakeMain(Sharpmake.Arguments arguments) // This is necessary since there is no rc.exe in the same directory than link.exe FastBuildSettings.SetPathToResourceCompilerInEnvironment = true; - FastBuildSettings.FastBuildMakeCommand = Util.PathGetAbsolute(sharpmakeFileDirectory, @"..\..\..\tools\FastBuild\FBuild.exe"); + FastBuildSettings.FastBuildMakeCommand = Util.PathGetAbsolute(sharpmakeFileDirectory, @"..\..\..\tools\FastBuild\Windows-x64\FBuild.exe"); Util.FilesAutoCleanupDBPath = absoluteRootPath; Util.FilesAutoCleanupActive = true; diff --git a/tools/FastBuild/Linux-x64/fbuild b/tools/FastBuild/Linux-x64/fbuild new file mode 100644 index 0000000000000000000000000000000000000000..23957c9c92d36a0326fd4899b40829f03c8e61f6 GIT binary patch literal 980104 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μqqmXXPwDH}C0ydT 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Ί$B{y-mc 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 JQ2ll59|IH_GlKvC literal 0 HcmV?d00001 diff --git a/tools/FastBuild/FBuild b/tools/FastBuild/OSX-x64/FBuild similarity index 100% rename from tools/FastBuild/FBuild rename to tools/FastBuild/OSX-x64/FBuild diff --git a/tools/FastBuild/FBuild.exe b/tools/FastBuild/Windows-x64/FBuild.exe similarity index 100% rename from tools/FastBuild/FBuild.exe rename to tools/FastBuild/Windows-x64/FBuild.exe From 72ac65ad7807c6dc2b3d9459e9edcea62553129a Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sat, 30 Jan 2021 21:48:42 +0100 Subject: [PATCH 093/142] Remove config file for unit-test wih explicit binding redirects. --- Sharpmake.UnitTests/app.config | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 Sharpmake.UnitTests/app.config diff --git a/Sharpmake.UnitTests/app.config b/Sharpmake.UnitTests/app.config deleted file mode 100644 index f1327d09d..000000000 --- a/Sharpmake.UnitTests/app.config +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - From caf55be455244c7dc6baa22340f9c5bc619b3f2a Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sun, 31 Jan 2021 13:43:59 +0100 Subject: [PATCH 094/142] Create a Globals.OutputRootPath constant. --- Sharpmake.Main.sharpmake.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Sharpmake.Main.sharpmake.cs b/Sharpmake.Main.sharpmake.cs index dd6bdfd5f..427e57b3f 100644 --- a/Sharpmake.Main.sharpmake.cs +++ b/Sharpmake.Main.sharpmake.cs @@ -19,6 +19,10 @@ namespace SharpmakeGen public static class Globals { public static string AbsoluteRootPath = string.Empty; + + // this holds the path where sharpmake binaries are expected to output + // note that it will contain an subdirectory per optimization + public const string OutputRootPath = @"[project.RootPath]\tmp\bin"; } public static class Common @@ -62,14 +66,14 @@ public virtual void ConfigureAll(Configuration conf, Target target) conf.ProjectFileName = "[project.Name]"; conf.ProjectPath = @"[project.RootPath]\tmp\projects\[project.Name]"; conf.Output = Configuration.OutputType.DotNetClassLibrary; - conf.TargetPath = @"[project.RootPath]\tmp\bin\[target.Optimization]"; + conf.TargetPath = Path.Combine(Globals.OutputRootPath, "[target.Optimization]"); conf.IntermediatePath = @"[project.RootPath]\tmp\obj\[target.Optimization]\[project.Name]"; conf.BaseIntermediateOutputPath = conf.IntermediatePath; conf.ReferencesByName.Add("System"); - conf.Options.Add(Sharpmake.Util.ConvertLanguageVersionToSharpmakeOption(Assembler.SharpmakeScriptsCSharpVersion)); + conf.Options.Add(Util.ConvertLanguageVersionToSharpmakeOption(Assembler.SharpmakeScriptsCSharpVersion)); conf.Options.Add(Options.CSharp.TreatWarningsAsErrors.Enabled); conf.Options.Add( new Options.CSharp.WarningsNotAsErrors( From 497e202516ae6cd1fbc23ede7aa5a8f2ad788ebe Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sun, 31 Jan 2021 14:01:42 +0100 Subject: [PATCH 095/142] Convert the global constant SharpmakeScriptsCSharpVersion to the sharpmake type to avoid a unnecessary dependency to CodeAnalysis in the sharpmake bootstrap scripts. --- Sharpmake.Main.sharpmake.cs | 2 +- Sharpmake/Assembler.cs | 43 ++++++++++++++++++++++++++++-- Sharpmake/DebugProjectGenerator.cs | 2 +- Sharpmake/Util.cs | 41 ---------------------------- 4 files changed, 43 insertions(+), 45 deletions(-) diff --git a/Sharpmake.Main.sharpmake.cs b/Sharpmake.Main.sharpmake.cs index 427e57b3f..d74bcdfc5 100644 --- a/Sharpmake.Main.sharpmake.cs +++ b/Sharpmake.Main.sharpmake.cs @@ -73,7 +73,7 @@ public virtual void ConfigureAll(Configuration conf, Target target) conf.ReferencesByName.Add("System"); - conf.Options.Add(Util.ConvertLanguageVersionToSharpmakeOption(Assembler.SharpmakeScriptsCSharpVersion)); + conf.Options.Add(Assembler.SharpmakeScriptsCSharpVersion); conf.Options.Add(Options.CSharp.TreatWarningsAsErrors.Enabled); conf.Options.Add( new Options.CSharp.WarningsNotAsErrors( diff --git a/Sharpmake/Assembler.cs b/Sharpmake/Assembler.cs index 62eda9d01..0eb20ca12 100644 --- a/Sharpmake/Assembler.cs +++ b/Sharpmake/Assembler.cs @@ -30,7 +30,7 @@ namespace Sharpmake { public class Assembler { - public const LanguageVersion SharpmakeScriptsCSharpVersion = LanguageVersion.CSharp7; + public const Options.CSharp.LanguageVersion SharpmakeScriptsCSharpVersion = Options.CSharp.LanguageVersion.CSharp7; /// /// Extra user directory to load assembly from using statement detection @@ -430,7 +430,7 @@ private Assembly Compile(IBuilderContext builderContext, string[] files, string { // Parse all files var syntaxTrees = new ConcurrentBag(); - var parseOptions = new CSharpParseOptions(SharpmakeScriptsCSharpVersion, DocumentationMode.None, preprocessorSymbols: _defines); + var parseOptions = new CSharpParseOptions(ConvertSharpmakeOptionToLanguageVersion(SharpmakeScriptsCSharpVersion), DocumentationMode.None, preprocessorSymbols: _defines); Parallel.ForEach(files, f => { var sourceText = ReadSourceCode(f); @@ -685,6 +685,45 @@ public static IEnumerable EnumeratePathToDotNetFramework() } } + private static LanguageVersion ConvertSharpmakeOptionToLanguageVersion(Options.CSharp.LanguageVersion languageVersion) + { + switch (languageVersion) + { + case Options.CSharp.LanguageVersion.LatestMajorVersion: + return LanguageVersion.LatestMajor; + case Options.CSharp.LanguageVersion.LatestMinorVersion: + return LanguageVersion.Latest; + case Options.CSharp.LanguageVersion.Preview: + return LanguageVersion.Preview; + case Options.CSharp.LanguageVersion.ISO1: + return LanguageVersion.CSharp1; + case Options.CSharp.LanguageVersion.ISO2: + return LanguageVersion.CSharp2; + case Options.CSharp.LanguageVersion.CSharp3: + return LanguageVersion.CSharp3; + case Options.CSharp.LanguageVersion.CSharp4: + return LanguageVersion.CSharp4; + case Options.CSharp.LanguageVersion.CSharp5: + return LanguageVersion.CSharp5; + case Options.CSharp.LanguageVersion.CSharp6: + return LanguageVersion.CSharp6; + case Options.CSharp.LanguageVersion.CSharp7: + return LanguageVersion.CSharp7; + case Options.CSharp.LanguageVersion.CSharp7_1: + return LanguageVersion.CSharp7_1; + case Options.CSharp.LanguageVersion.CSharp7_2: + return LanguageVersion.CSharp7_2; + case Options.CSharp.LanguageVersion.CSharp7_3: + return LanguageVersion.CSharp7_3; + case Options.CSharp.LanguageVersion.CSharp8: + return LanguageVersion.CSharp8; + case Options.CSharp.LanguageVersion.CSharp9: + return LanguageVersion.CSharp9; + default: + throw new NotImplementedException($"Don't know how to convert sharpmake option {languageVersion} to language version"); + } + } + public static string GetAssemblyDllPath(string fileName) { foreach (string frameworkDirectory in EnumeratePathToDotNetFramework()) diff --git a/Sharpmake/DebugProjectGenerator.cs b/Sharpmake/DebugProjectGenerator.cs index f80910c1d..c87d1f74c 100644 --- a/Sharpmake/DebugProjectGenerator.cs +++ b/Sharpmake/DebugProjectGenerator.cs @@ -323,7 +323,7 @@ public void ConfigureAll(Configuration conf, Target target) conf.DefaultOption = target.Optimization == Optimization.Debug ? Options.DefaultTarget.Debug : Options.DefaultTarget.Release; - conf.Options.Add(Util.ConvertLanguageVersionToSharpmakeOption(Assembler.SharpmakeScriptsCSharpVersion)); + conf.Options.Add(Assembler.SharpmakeScriptsCSharpVersion); conf.Defines.Add(_projectInfo.Defines.ToArray()); diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index cbf86fae2..78093ac8e 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -2108,47 +2108,6 @@ public static string GetAppxManifestFileName(Project.Configuration conf) return Path.GetFullPath(PathMakeStandard(conf.AppxManifestFilePath)); } - public static Options.CSharp.LanguageVersion ConvertLanguageVersionToSharpmakeOption(Microsoft.CodeAnalysis.CSharp.LanguageVersion languageVersion) - { - switch (languageVersion) - { - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp1: - return Options.CSharp.LanguageVersion.ISO1; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp2: - return Options.CSharp.LanguageVersion.ISO2; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp3: - return Options.CSharp.LanguageVersion.CSharp3; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp4: - return Options.CSharp.LanguageVersion.CSharp4; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp5: - return Options.CSharp.LanguageVersion.CSharp5; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp6: - return Options.CSharp.LanguageVersion.CSharp6; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp7: - return Options.CSharp.LanguageVersion.CSharp7; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp7_1: - return Options.CSharp.LanguageVersion.CSharp7_1; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp7_2: - return Options.CSharp.LanguageVersion.CSharp7_2; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp7_3: - return Options.CSharp.LanguageVersion.CSharp7_3; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp8: - return Options.CSharp.LanguageVersion.CSharp8; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp9: - return Options.CSharp.LanguageVersion.CSharp9; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.LatestMajor: - return Options.CSharp.LanguageVersion.LatestMajorVersion; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.Preview: - return Options.CSharp.LanguageVersion.Preview; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.Latest: - return Options.CSharp.LanguageVersion.LatestMinorVersion; - case Microsoft.CodeAnalysis.CSharp.LanguageVersion.Default: - return Options.CSharp.LanguageVersion.LatestMajorVersion; - default: - throw new NotImplementedException($"Don't know how to convert LanguageVersion {languageVersion} to sharpmake option"); - } - } - /// /// Extension GetValueOrAdd gets the value at the given key or adds at the given key the value provided /// From e10e3cc99c2477c831f76fc4afdcfbcc49f89c3d Mon Sep 17 00:00:00 2001 From: Olivier Boudreault Date: Mon, 1 Feb 2021 12:41:23 +0000 Subject: [PATCH 096/142] Remove the orderby on globs when writing to csproj Seems like overkill and error prone to re-order the globs configuration. --- Sharpmake.Generators/VisualStudio/Csproj.Template.cs | 8 ++++++++ Sharpmake.Generators/VisualStudio/Csproj.cs | 12 ++++++++++-- Sharpmake/Project.cs | 10 +++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Sharpmake.Generators/VisualStudio/Csproj.Template.cs b/Sharpmake.Generators/VisualStudio/Csproj.Template.cs index 253564d79..900421747 100644 --- a/Sharpmake.Generators/VisualStudio/Csproj.Template.cs +++ b/Sharpmake.Generators/VisualStudio/Csproj.Template.cs @@ -504,6 +504,14 @@ public static class ItemGroups public static string CompileBegin = @" +"; + + public static string SimpleCompileWithExclude = +@" +"; + + public static string CompileBeginWithExclude = +@" "; public static string CompileEnd = diff --git a/Sharpmake.Generators/VisualStudio/Csproj.cs b/Sharpmake.Generators/VisualStudio/Csproj.cs index 7d918747a..c987a494d 100644 --- a/Sharpmake.Generators/VisualStudio/Csproj.cs +++ b/Sharpmake.Generators/VisualStudio/Csproj.cs @@ -559,10 +559,12 @@ internal class Compile : ItemGroupItem, IResolvable public bool? DesignTimeSharedInput = null; public string DependentUpon; public string SubType = null; + public string Exclude; public string Resolve(Resolver resolver) { using (resolver.NewScopedParameter("include", Include)) + using (resolver.NewScopedParameter("exclude", Exclude ?? string.Empty)) using (resolver.NewScopedParameter("autoGen", AutoGen)) using (resolver.NewScopedParameter("designTime", DesignTime)) using (resolver.NewScopedParameter("designTimeSharedInput", DesignTimeSharedInput)) @@ -586,9 +588,9 @@ public string Resolve(Resolver resolver) AddLinkIfNeeded(writer); if (builder.Length == 0) - return resolver.Resolve(Template.ItemGroups.SimpleCompile); + return resolver.Resolve(string.IsNullOrEmpty(Exclude) ? Template.ItemGroups.SimpleCompile : Template.ItemGroups.SimpleCompileWithExclude); - builder.Insert(0, Template.ItemGroups.CompileBegin); + builder.Insert(0, string.IsNullOrEmpty(Exclude) ? Template.ItemGroups.CompileBegin : Template.ItemGroups.CompileBeginWithExclude); writer.Write(Template.ItemGroups.CompileEnd); return resolver.Resolve(writer.ToString()); } @@ -1426,6 +1428,7 @@ List skipFiles } #endregion + using (resolver.NewScopedParameter("project", project)) writer.Write(itemGroups.Resolve(resolver)); var importProjects = new List(project.ImportProjects); @@ -1627,6 +1630,11 @@ List skipFiles } #endregion + foreach(var glob in project.Globs) + { + itemGroups.Compiles.Add(new ItemGroups.Compile { Include = glob.Include, Exclude = glob.Exclude }); + } + foreach (var embeddedResource in project.AdditionalEmbeddedResourceAlwaysCopy) { string file = Util.PathGetRelative(_projectPathCapitalized, Project.GetCapitalizedFile(embeddedResource)); diff --git a/Sharpmake/Project.cs b/Sharpmake/Project.cs index 97829eb37..250cd70b2 100644 --- a/Sharpmake/Project.cs +++ b/Sharpmake/Project.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -2066,6 +2066,13 @@ public class PublishFile public FileType FileType = FileType.File; } + [Resolver.Resolvable] + public class GlobSetting + { + public string Include; + public string Exclude; + } + public enum CSharpProjectType { Test, @@ -2292,6 +2299,7 @@ public class CSharpProject : Project public List BootstrapperPackages = new List(); public List FileAssociationItems = new List(); public List PublishFiles = new List(); + public List Globs = new List(); /// /// If set to true. Will explicit the RestoreProjectStyle in the project file From 7616310ac58e884f14c2448b7abf47f0b71177d3 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 1 Feb 2021 19:46:21 +0100 Subject: [PATCH 097/142] Add a global SharpmakeDotNetFramework following the same principle as the c# version --- Sharpmake.Main.sharpmake.cs | 2 +- Sharpmake/Assembler.cs | 1 + Sharpmake/DebugProjectGenerator.cs | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Sharpmake.Main.sharpmake.cs b/Sharpmake.Main.sharpmake.cs index d74bcdfc5..0a08b143a 100644 --- a/Sharpmake.Main.sharpmake.cs +++ b/Sharpmake.Main.sharpmake.cs @@ -35,7 +35,7 @@ public static ITarget[] GetDefaultTargets() Platform.anycpu, DevEnv.vs2019, Optimization.Debug | Optimization.Release, - framework: DotNetFramework.v4_7_2 + framework: Assembler.SharpmakeDotNetFramework ) ); return result.ToArray(); diff --git a/Sharpmake/Assembler.cs b/Sharpmake/Assembler.cs index 0eb20ca12..89e4d765a 100644 --- a/Sharpmake/Assembler.cs +++ b/Sharpmake/Assembler.cs @@ -31,6 +31,7 @@ namespace Sharpmake public class Assembler { public const Options.CSharp.LanguageVersion SharpmakeScriptsCSharpVersion = Options.CSharp.LanguageVersion.CSharp7; + public const DotNetFramework SharpmakeDotNetFramework = DotNetFramework.v4_7_2; /// /// Extra user directory to load assembly from using statement detection diff --git a/Sharpmake/DebugProjectGenerator.cs b/Sharpmake/DebugProjectGenerator.cs index c87d1f74c..ad8e2c87d 100644 --- a/Sharpmake/DebugProjectGenerator.cs +++ b/Sharpmake/DebugProjectGenerator.cs @@ -230,7 +230,7 @@ internal static Target GetTargets() OutputType.Dll, Blob.NoBlob, BuildSystem.MSBuild, - DotNetFramework.v4_7_2 + Assembler.SharpmakeDotNetFramework ); } From 9813b9dc525052de48f14956973eb70c12298ce9 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 1 Feb 2021 19:48:25 +0100 Subject: [PATCH 098/142] UpdateSamplesOutput improvements - Move the code setting the sharpmake exe to the top of the file instead of in the method so we only call it once - Use single quotes instead of double --- UpdateSamplesOutput.bat | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/UpdateSamplesOutput.bat b/UpdateSamplesOutput.bat index 5884e883e..388e7dee3 100644 --- a/UpdateSamplesOutput.bat +++ b/UpdateSamplesOutput.bat @@ -7,6 +7,12 @@ COLOR call CompileSharpmake.bat Sharpmake.sln Debug "Any CPU" if %errorlevel% NEQ 0 goto error +set SHARPMAKE_EXECUTABLE=%~dp0tmp\bin\debug\Sharpmake.Application.exe +if not exist %SHARPMAKE_EXECUTABLE% set SHARPMAKE_EXECUTABLE=%~dp0tmp\bin\release\Sharpmake.Application.exe +if not exist %SHARPMAKE_EXECUTABLE% echo Cannot find sharpmake executable in %~dp0tmp\bin\[debug|release] & pause & goto error + +echo Using executable %SHARPMAKE_EXECUTABLE% + :: main set ERRORLEVEL_BACKUP=0 @@ -62,15 +68,9 @@ pushd %CD% :: set testScopedCurrentDirectory as current cd /d %~dp0%~1 -set SHARPMAKE_EXECUTABLE=%~dp0tmp\bin\debug\Sharpmake.Application.exe -if not exist %SHARPMAKE_EXECUTABLE% set SHARPMAKE_EXECUTABLE=%~dp0tmp\bin\release\Sharpmake.Application.exe -if not exist %SHARPMAKE_EXECUTABLE% echo Cannot find sharpmake executable in %~dp0tmp\bin\[debug|release] & pause & goto error - -echo Using executable %SHARPMAKE_EXECUTABLE% - echo Updating references of %2... rd /s /q "%~2\%~4" -call %SHARPMAKE_EXECUTABLE% "/sources(@"%~2\%~3") /outputdir(@"%~2\%~4") /remaproot(@"%~5") /verbose" +call %SHARPMAKE_EXECUTABLE% /sources(@'%~2\%~3') /outputdir(@'%~2\%~4') /remaproot(@'%~5') /verbose set ERRORLEVEL_BACKUP=%errorlevel% :: restore caller current directory popd From 04870612c6893852c2aeb5863b58d28e48affa9d Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 1 Feb 2021 19:50:43 +0100 Subject: [PATCH 099/142] Remove dependency to Microsoft.Build.Utilities.Core, and only consider one dotnet framework directory as source --- Sharpmake/Assembler.cs | 8 +------- Sharpmake/Sharpmake.csproj | 3 --- Sharpmake/Sharpmake.sharpmake.cs | 3 --- 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/Sharpmake/Assembler.cs b/Sharpmake/Assembler.cs index 89e4d765a..a11ac18bc 100644 --- a/Sharpmake/Assembler.cs +++ b/Sharpmake/Assembler.cs @@ -20,7 +20,6 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Build.Utilities; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Emit; @@ -678,12 +677,7 @@ private void AnalyseSourceFile(string sourceFile, IEnumerable EnumeratePathToDotNetFramework() { - for (int i = (int)TargetDotNetFrameworkVersion.VersionLatest; i >= 0; --i) - { - string frameworkDirectory = ToolLocationHelper.GetPathToDotNetFramework((TargetDotNetFrameworkVersion)i); - if (frameworkDirectory != null) - yield return frameworkDirectory; - } + yield return Path.GetDirectoryName(typeof(object).Assembly.Location); } private static LanguageVersion ConvertSharpmakeOptionToLanguageVersion(Options.CSharp.LanguageVersion languageVersion) diff --git a/Sharpmake/Sharpmake.csproj b/Sharpmake/Sharpmake.csproj index 4fb743659..dffadec41 100644 --- a/Sharpmake/Sharpmake.csproj +++ b/Sharpmake/Sharpmake.csproj @@ -52,9 +52,6 @@ 7 - - True - False diff --git a/Sharpmake/Sharpmake.sharpmake.cs b/Sharpmake/Sharpmake.sharpmake.cs index c4aeb89e4..02c216b9c 100644 --- a/Sharpmake/Sharpmake.sharpmake.cs +++ b/Sharpmake/Sharpmake.sharpmake.cs @@ -24,9 +24,6 @@ public override void ConfigureAll(Configuration conf, Target target) conf.Options.Add(Options.CSharp.AllowUnsafeBlocks.Enabled); - // this needs to remain a named reference otherwise the assembly won't work on mono for on unix platforms - conf.ReferencesByNameExternal.Add("Microsoft.Build.Utilities.Core"); - conf.ReferencesByNuGetPackage.Add("Microsoft.CodeAnalysis.CSharp", "3.8.0"); // This dependency is not strictly necessary, but Microsoft.CodeAnalysis.CSharp From 20ddf322ced57c283d8ce927428ca14780522f79 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 1 Feb 2021 19:52:07 +0100 Subject: [PATCH 100/142] Use latest MSVC Interop nuget package --- Sharpmake/Sharpmake.csproj | 2 +- Sharpmake/Sharpmake.sharpmake.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Sharpmake/Sharpmake.csproj b/Sharpmake/Sharpmake.csproj index dffadec41..2fd8d1342 100644 --- a/Sharpmake/Sharpmake.csproj +++ b/Sharpmake/Sharpmake.csproj @@ -133,7 +133,7 @@ - + \ No newline at end of file diff --git a/Sharpmake/Sharpmake.sharpmake.cs b/Sharpmake/Sharpmake.sharpmake.cs index 02c216b9c..af0be7cef 100644 --- a/Sharpmake/Sharpmake.sharpmake.cs +++ b/Sharpmake/Sharpmake.sharpmake.cs @@ -29,7 +29,7 @@ public override void ConfigureAll(Configuration conf, Target target) // This dependency is not strictly necessary, but Microsoft.CodeAnalysis.CSharp // will throw an exception at runtime if the DLL is not found next to the exe conf.ReferencesByNuGetPackage.Add("Microsoft.DiaSymReader.Native", "1.7.0"); - conf.ReferencesByNuGetPackage.Add("Microsoft.VisualStudio.Setup.Configuration.Interop", "1.16.30"); + conf.ReferencesByNuGetPackage.Add("Microsoft.VisualStudio.Setup.Configuration.Interop", "2.3.2262-g94fae01e"); } } } From 472d3ccdee7a99ce51a79989947424a3a01c636f Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 1 Feb 2021 19:53:28 +0100 Subject: [PATCH 101/142] Use RunningOnUnix instead of Mono to determine whether to lower the path or not in PathMakeStandard, which was the original intention --- Sharpmake/Util.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index 78093ac8e..6f4012f77 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -78,7 +78,7 @@ public static void PathMakeStandard(IList paths) public static string PathMakeStandard(string path) { - return PathMakeStandard(path, !Util.IsRunningInMono()); + return PathMakeStandard(path, !Util.IsRunningOnUnix()); } /// From d328150e4a2327b95b6edd1c30dd9e672f762122 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 1 Feb 2021 19:54:24 +0100 Subject: [PATCH 102/142] Improvements in utility methods on non windows platforms - Prevent registry access - Return false when testing if vs is installed --- Sharpmake/Util.cs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index 6f4012f77..f9b0a6547 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -1748,6 +1748,9 @@ public static bool IsVisualStudio2010Installed() private static bool IsVisualStudioInstalled(DevEnv devEnv) { + if (!GetExecutingPlatform().HasAnyFlag(Platform.win32 | Platform.win64)) + return false; + string registryKeyString = string.Format( @"SOFTWARE{0}\Microsoft\VisualStudio\SxS\VS7", Environment.Is64BitProcess ? @"\Wow6432Node" : string.Empty @@ -2351,21 +2354,25 @@ public static string GetRegistryLocalMachineSubKeyValue(string registrySubKey, s return registryValue; string key = string.Empty; - try + + if (GetExecutingPlatform().HasAnyFlag(Platform.win32 | Platform.win64)) { - using (RegistryKey localMachineKey = Registry.LocalMachine.OpenSubKey(registrySubKey)) + try { - if (localMachineKey != null) + using (RegistryKey localMachineKey = Registry.LocalMachine.OpenSubKey(registrySubKey)) { - key = (string)localMachineKey.GetValue(value); - if (enableLog && string.IsNullOrEmpty(key)) - LogWrite("Value '{0}' under registry subKey '{1}' is not set, fallback to default: '{2}'", value ?? "(Default)", registrySubKey, fallbackValue); + if (localMachineKey != null) + { + key = (string)localMachineKey.GetValue(value); + if (enableLog && string.IsNullOrEmpty(key)) + LogWrite("Value '{0}' under registry subKey '{1}' is not set, fallback to default: '{2}'", value ?? "(Default)", registrySubKey, fallbackValue); + } + else if (enableLog) + LogWrite("Registry subKey '{0}' is not found, fallback to default for value '{1}': '{2}'", registrySubKey, value ?? "(Default)", fallbackValue); } - else if (enableLog) - LogWrite("Registry subKey '{0}' is not found, fallback to default for value '{1}': '{2}'", registrySubKey, value ?? "(Default)", fallbackValue); } + catch { } } - catch { } if (string.IsNullOrEmpty(key)) key = fallbackValue; From a9a797f4dec0cefc692e155ad0aa2dac800703fd Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 1 Feb 2021 19:55:52 +0100 Subject: [PATCH 103/142] - Allow passing an optimisation to boostrap batch file - Update github actions to use it TODO: do the same for bootstrap.sh --- .github/workflows/actions.yml | 4 ++-- bootstrap.bat | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index 9c57e5b17..d919934fb 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -19,10 +19,10 @@ jobs: - name: Checkout the repo uses: actions/checkout@v2 - - name: Bootstrap.bat + - name: Bootstrap.bat ${{ matrix.configuration }} if: runner.os == 'Windows' shell: cmd - run: bootstrap.bat + run: bootstrap.bat Sharpmake.Main.sharpmake.cs ${{ matrix.configuration }} - name: Bootstrap.sh if: runner.os != 'Windows' diff --git a/bootstrap.bat b/bootstrap.bat index 089f73bc9..2a642f399 100644 --- a/bootstrap.bat +++ b/bootstrap.bat @@ -1,4 +1,10 @@ @echo off +:: Batch arguments: +:: %~1 Main sharpmake file +:: %~2 Target(Normally should be Debug or Release) +:: if none are passed, defaults to Sharpmake.Main.sharpmake.cs and Debug + +setlocal enabledelayedexpansion :: Clear previous run status COLOR @@ -6,13 +12,18 @@ COLOR :: set batch file directory as current pushd "%~dp0" -set SHARPMAKE_EXECUTABLE=tmp\bin\debug\Sharpmake.Application.exe +set SHARPMAKE_OPTIM=Debug +if not "%~2" == "" ( + set SHARPMAKE_OPTIM=%~2 +) + +set SHARPMAKE_EXECUTABLE=tmp\bin\%SHARPMAKE_OPTIM%\Sharpmake.Application.exe -call CompileSharpmake.bat Sharpmake.Application/Sharpmake.Application.csproj Debug AnyCPU +call CompileSharpmake.bat Sharpmake.Application/Sharpmake.Application.csproj %SHARPMAKE_OPTIM% AnyCPU if %errorlevel% NEQ 0 goto error -set SHARPMAKE_MAIN="Sharpmake.Main.sharpmake.cs" +set SHARPMAKE_MAIN='Sharpmake.Main.sharpmake.cs' if not "%~1" == "" ( - set SHARPMAKE_MAIN="%~1" + set SHARPMAKE_MAIN='%~1' ) set SM_CMD=%SHARPMAKE_EXECUTABLE% /sources(%SHARPMAKE_MAIN%) /verbose From 6cd9cd9c7304f68f10ac5ded03e1b1453699e4f7 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 1 Feb 2021 21:22:28 +0100 Subject: [PATCH 104/142] Formatting --- Sharpmake.Generators/Generic/Makefile.cs | 32 ++++++++++----------- Sharpmake.Generators/VisualStudio/Csproj.cs | 10 ++++--- Sharpmake/Builder.cs | 2 +- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/Sharpmake.Generators/Generic/Makefile.cs b/Sharpmake.Generators/Generic/Makefile.cs index b0d47cc10..b621ceb95 100644 --- a/Sharpmake.Generators/Generic/Makefile.cs +++ b/Sharpmake.Generators/Generic/Makefile.cs @@ -469,18 +469,18 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File // ExtraWarnings SelectOption(conf, Options.Option(Options.Makefile.Compiler.ExtraWarnings.Enable, () => { cflags.Append("-Wextra "); }), - Options.Option(Options.Makefile.Compiler.ExtraWarnings.Disable, () => { }) + Options.Option(Options.Makefile.Compiler.ExtraWarnings.Disable, () => { }) ); // GenerateDebugInformation SelectOption(conf, Options.Option(Options.Makefile.Compiler.GenerateDebugInformation.Enable, () => { cflags.Append("-g "); }), - Options.Option(Options.Makefile.Compiler.GenerateDebugInformation.Disable, () => { }) + Options.Option(Options.Makefile.Compiler.GenerateDebugInformation.Disable, () => { }) ); // OptimizationLevel SelectOption(conf, - Options.Option(Options.Makefile.Compiler.OptimizationLevel.Disable, () => { }), + Options.Option(Options.Makefile.Compiler.OptimizationLevel.Disable, () => { }), Options.Option(Options.Makefile.Compiler.OptimizationLevel.Standard, () => { cflags.Append("-O1 "); }), Options.Option(Options.Makefile.Compiler.OptimizationLevel.Full, () => { cflags.Append("-O2 "); }), Options.Option(Options.Makefile.Compiler.OptimizationLevel.FullWithInlining, () => { cflags.Append("-O3 "); }), @@ -489,7 +489,7 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File // Warnings SelectOption(conf, - Options.Option(Options.Makefile.Compiler.Warnings.NormalWarnings, () => { }), + Options.Option(Options.Makefile.Compiler.Warnings.NormalWarnings, () => { }), Options.Option(Options.Makefile.Compiler.Warnings.MoreWarnings, () => { cflags.Append("-Wall "); }), Options.Option(Options.Makefile.Compiler.Warnings.Disable, () => { cflags.Append("-w "); }) ); @@ -497,7 +497,7 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File // WarningsAsErrors SelectOption(conf, Options.Option(Options.Makefile.Compiler.TreatWarningsAsErrors.Enable, () => { cflags.Append("-Werror "); }), - Options.Option(Options.Makefile.Compiler.TreatWarningsAsErrors.Disable, () => { }) + Options.Option(Options.Makefile.Compiler.TreatWarningsAsErrors.Disable, () => { }) ); // AdditionalCompilerOptions @@ -512,17 +512,17 @@ private Options.ExplicitOptions GenerateOptions(Project.Configuration conf, File // CppLanguageStandard SelectOption(conf, - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Default, () => { cxxflags.Append(""); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp98, () => { cxxflags.Append("-std=c++98 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp11, () => { cxxflags.Append("-std=c++11 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp14, () => { cxxflags.Append("-std=c++14 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp17, () => { cxxflags.Append("-std=c++17 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp2a, () => { cxxflags.Append("-std=c++2a "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp98, () => { cxxflags.Append("-std=gnu++98 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp11, () => { cxxflags.Append("-std=gnu++11 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp14, () => { cxxflags.Append("-std=gnu++14 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp17, () => { cxxflags.Append("-std=gnu++17 "); }), - Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp2a, () => { cxxflags.Append("-std=gnu++2a "); }) + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Default, () => { cxxflags.Append(""); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp98, () => { cxxflags.Append("-std=c++98 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp11, () => { cxxflags.Append("-std=c++11 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp14, () => { cxxflags.Append("-std=c++14 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp17, () => { cxxflags.Append("-std=c++17 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.Cpp2a, () => { cxxflags.Append("-std=c++2a "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp98, () => { cxxflags.Append("-std=gnu++98 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp11, () => { cxxflags.Append("-std=gnu++11 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp14, () => { cxxflags.Append("-std=gnu++14 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp17, () => { cxxflags.Append("-std=gnu++17 "); }), + Options.Option(Options.Makefile.Compiler.CppLanguageStandard.GnuCpp2a, () => { cxxflags.Append("-std=gnu++2a "); }) ); // Exceptions diff --git a/Sharpmake.Generators/VisualStudio/Csproj.cs b/Sharpmake.Generators/VisualStudio/Csproj.cs index 6987c3b13..1887f9457 100644 --- a/Sharpmake.Generators/VisualStudio/Csproj.cs +++ b/Sharpmake.Generators/VisualStudio/Csproj.cs @@ -172,7 +172,8 @@ internal class TargetFrameworksCondition : UniqueList, IResolvableConditio public string ResolveCondition(Resolver resolver) { - var targetFrameworks = TargetFrameworks.Select(tuple => { + var targetFrameworks = TargetFrameworks.Select(tuple => + { var dotNetFramework = tuple.Item1; var dotNetOS = tuple.Item2; var dotNetOSVersion = tuple.Item3; @@ -1053,7 +1054,8 @@ List skipFiles List configurations = unsortedConfigurations.OrderBy(conf => conf.Name + conf.Platform).ToList(); var projectFrameworks = configurations.Select( - conf => { + conf => + { var dotNetFramework = conf.Target.GetFragment(); DotNetOS dotNetOS; if (!conf.Target.TryGetFragment(out dotNetOS)) @@ -1460,7 +1462,7 @@ List skipFiles #endregion using (resolver.NewScopedParameter("project", project)) - writer.Write(itemGroups.Resolve(resolver)); + writer.Write(itemGroups.Resolve(resolver)); var importProjects = new List(project.ImportProjects); @@ -1669,7 +1671,7 @@ List skipFiles } #endregion - foreach(var glob in project.Globs) + foreach (var glob in project.Globs) { itemGroups.Compiles.Add(new ItemGroups.Compile { Include = glob.Include, Exclude = glob.Exclude }); } diff --git a/Sharpmake/Builder.cs b/Sharpmake/Builder.cs index 304b71f04..1b3c56e0e 100644 --- a/Sharpmake/Builder.cs +++ b/Sharpmake/Builder.cs @@ -296,7 +296,7 @@ public Builder( } [Obsolete("Use the builder with the new debugScripts argument", error: false)] - public Builder(BuildContext.BaseBuildContext context, bool multithreaded, bool dumpDependencyGraph, bool cleanBlobsOnly, bool blobOnly, bool skipInvalidPath, bool diagnostics, Func getGeneratorsManagerCallBack, HashSet defines) + public Builder(BuildContext.BaseBuildContext context, bool multithreaded, bool dumpDependencyGraph, bool cleanBlobsOnly, bool blobOnly, bool skipInvalidPath, bool diagnostics, Func getGeneratorsManagerCallBack, HashSet defines) : this(context, multithreaded, dumpDependencyGraph, cleanBlobsOnly, blobOnly, skipInvalidPath, diagnostics, false, getGeneratorsManagerCallBack, defines) { } public void Dispose() From 9e90198daccc8dacc9b514bd391341e4883e3b6d Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 1 Feb 2021 20:01:00 +0100 Subject: [PATCH 105/142] Use new csproj file format for sharpmake and the debug project - Disable AppendTargetFrameworkToOutputPath so we get a flat output directory without subfolders per framework - We need to disable determinism because we use wildcards in versions. TODO: ditch that! --- .../Sharpmake.Application.csproj | 15 ++++++++++----- Sharpmake.Generators/Sharpmake.Generators.csproj | 15 ++++++++++----- Sharpmake.Main.sharpmake.cs | 10 ++++++++++ .../Sharpmake.CommonPlatforms.csproj | 15 ++++++++++----- Sharpmake/DebugProjectGenerator.cs | 10 ++++++++++ Sharpmake/Sharpmake.csproj | 13 ++++++++----- 6 files changed, 58 insertions(+), 20 deletions(-) diff --git a/Sharpmake.Application/Sharpmake.Application.csproj b/Sharpmake.Application/Sharpmake.Application.csproj index 03a6f693c..c500ca556 100644 --- a/Sharpmake.Application/Sharpmake.Application.csproj +++ b/Sharpmake.Application/Sharpmake.Application.csproj @@ -1,21 +1,25 @@ - - + Debug AnyCPU AnyCPU - {37CF3EE3-AFD3-3CC8-8F8E-B423292D491F} Exe Properties Sharpmake.Application Sharpmake.Application - v4.7.2 + net472 512 True + false + false app.manifest + + false + false + AnyCPU true @@ -46,6 +50,7 @@ false 7 + False @@ -77,5 +82,5 @@ Sharpmake - + \ No newline at end of file diff --git a/Sharpmake.Generators/Sharpmake.Generators.csproj b/Sharpmake.Generators/Sharpmake.Generators.csproj index 48d3e9340..6da8078e1 100644 --- a/Sharpmake.Generators/Sharpmake.Generators.csproj +++ b/Sharpmake.Generators/Sharpmake.Generators.csproj @@ -1,16 +1,20 @@ - - + Debug AnyCPU AnyCPU - {844F66DE-B015-340E-720A-8E158B517E93} Library Properties Sharpmake.Generators Sharpmake.Generators - v4.7.2 + net472 512 + false + false + + + false + false AnyCPU @@ -46,6 +50,7 @@ 1570,1591 7 + False @@ -114,5 +119,5 @@ Sharpmake - + \ No newline at end of file diff --git a/Sharpmake.Main.sharpmake.cs b/Sharpmake.Main.sharpmake.cs index 0a08b143a..cce00731b 100644 --- a/Sharpmake.Main.sharpmake.cs +++ b/Sharpmake.Main.sharpmake.cs @@ -56,6 +56,16 @@ protected SharpmakeBaseProject( RootPath = Globals.AbsoluteRootPath; + // Use the new csproj style + ProjectSchema = CSharpProjectSchema.NetCore; + + // prevents output dir to have a framework subfolder + CustomProperties.Add("AppendTargetFrameworkToOutputPath", "false"); + + // we need to disable determinism while because we are using wildcards in assembly versions + // error CS8357: The specified version string contains wildcards, which are not compatible with determinism + CustomProperties.Add("Deterministic", "false"); + if (excludeSharpmakeFiles) SourceFilesExcludeRegex.Add(@".*\.sharpmake.cs"); } diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj index b096d5153..f9a47d6f4 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Sharpmake.CommonPlatforms.csproj @@ -1,16 +1,20 @@ - - + Debug AnyCPU AnyCPU - {3B476462-28E6-4640-4257-7942657699ED} Library Properties Sharpmake Sharpmake.CommonPlatforms - v4.7.2 + net472 512 + false + false + + + false + false AnyCPU @@ -46,6 +50,7 @@ 1570,1591 7 + False @@ -90,5 +95,5 @@ Sharpmake - + \ No newline at end of file diff --git a/Sharpmake/DebugProjectGenerator.cs b/Sharpmake/DebugProjectGenerator.cs index ad8e2c87d..c8045efbf 100644 --- a/Sharpmake/DebugProjectGenerator.cs +++ b/Sharpmake/DebugProjectGenerator.cs @@ -311,6 +311,16 @@ public DebugProject() Name = _projectInfo.DisplayName; + // Use the new csproj style + ProjectSchema = CSharpProjectSchema.NetCore; + + // prevents output dir to have a framework subfolder + CustomProperties.Add("AppendTargetFrameworkToOutputPath", "false"); + + // we need to disable determinism while because we are using wildcards in assembly versions + // error CS8357: The specified version string contains wildcards, which are not compatible with determinism + CustomProperties.Add("Deterministic", "false"); + AddTargets(DebugProjectGenerator.GetTargets()); } diff --git a/Sharpmake/Sharpmake.csproj b/Sharpmake/Sharpmake.csproj index 2fd8d1342..492118c47 100644 --- a/Sharpmake/Sharpmake.csproj +++ b/Sharpmake/Sharpmake.csproj @@ -1,18 +1,20 @@ - - + Debug AnyCPU AnyCPU - {15F793C7-9E88-64A9-591C-7244FCC6B771} Library Properties Sharpmake Sharpmake - v4.7.2 + net472 512 + false + false + false + false https://api.nuget.org/v3/index.json @@ -51,6 +53,7 @@ 1570,1591 7 + False @@ -135,5 +138,5 @@ - + \ No newline at end of file From 7b7f7910f85fa282be2da84c8bb09e1a16cb707b Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Tue, 2 Feb 2021 17:57:17 +0100 Subject: [PATCH 106/142] Use PortablePdb on all platforms, was only on unix before. --- Sharpmake/Assembler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake/Assembler.cs b/Sharpmake/Assembler.cs index a11ac18bc..6e9102848 100644 --- a/Sharpmake/Assembler.cs +++ b/Sharpmake/Assembler.cs @@ -467,7 +467,7 @@ private Assembly Compile(IBuilderContext builderContext, IEnumerable dllStream, pdbStream, options: new EmitOptions( - debugInformationFormat: Util.IsRunningOnUnix() ? DebugInformationFormat.PortablePdb : DebugInformationFormat.Pdb, + debugInformationFormat: DebugInformationFormat.PortablePdb, pdbFilePath: pdbFilePath ) ); From 2637be45ddc5bde791dba278953583f6eb88620c Mon Sep 17 00:00:00 2001 From: Janusz Nykiel Date: Fri, 6 Nov 2020 15:12:32 -0500 Subject: [PATCH 107/142] Add a freeform "additional global settings" property to FastBuildSettings ...so that scripts can use it to set any extra properties on the global Settings node. Chosen in the course of a code review over exposing a configuration property specific to Ubisoft internal version of FASTBuild. --- Sharpmake.Generators/FastBuild/Bff.Template.cs | 1 + Sharpmake.Generators/FastBuild/MasterBff.cs | 7 +++++++ Sharpmake/FastBuildSettings.cs | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/Sharpmake.Generators/FastBuild/Bff.Template.cs b/Sharpmake.Generators/FastBuild/Bff.Template.cs index 2e6d4031f..ded3224ae 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Template.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Template.cs @@ -66,6 +66,7 @@ public static class ConfigurationFile [CachePath] [WorkerConnectionLimit] .AllowDBMigration_Experimental = [fastBuildAllowDBMigration] +[AdditionalGlobalSettings] } "; diff --git a/Sharpmake.Generators/FastBuild/MasterBff.cs b/Sharpmake.Generators/FastBuild/MasterBff.cs index d568ad5c8..8e1315146 100644 --- a/Sharpmake.Generators/FastBuild/MasterBff.cs +++ b/Sharpmake.Generators/FastBuild/MasterBff.cs @@ -530,6 +530,12 @@ private static void WriteMasterSettingsSection(FileGenerator masterBffGenerator, workerConnectionLimit = ".WorkerConnectionLimit = " + FastBuildSettings.FastBuildWorkerConnectionLimit.ToString(); } + string additionalGlobalSettings = FileGeneratorUtilities.RemoveLineTag; + if (FastBuildSettings.AdditionalGlobalSettings.Any()) + { + additionalGlobalSettings = string.Join(Environment.NewLine, FastBuildSettings.AdditionalGlobalSettings.Select(setting => " " + setting)); + } + string fastBuildPATH = FileGeneratorUtilities.RemoveLineTag; if (FastBuildSettings.SetPathToResourceCompilerInEnvironment) { @@ -609,6 +615,7 @@ private static void WriteMasterSettingsSection(FileGenerator masterBffGenerator, using (masterBffGenerator.Declare("fastBuildSystemRoot", FastBuildSettings.SystemRoot)) using (masterBffGenerator.Declare("fastBuildPATH", fastBuildPATH)) using (masterBffGenerator.Declare("fastBuildAllowDBMigration", FastBuildSettings.FastBuildAllowDBMigration ? "true" : FileGeneratorUtilities.RemoveLineTag)) + using (masterBffGenerator.Declare("AdditionalGlobalSettings", additionalGlobalSettings)) using (masterBffGenerator.Declare("fastBuildEnvironments", fastBuildEnvironments)) using (masterBffGenerator.Declare("envRemoveGuards", envRemoveGuards)) { diff --git a/Sharpmake/FastBuildSettings.cs b/Sharpmake/FastBuildSettings.cs index 5650b6c70..df25f7b0a 100644 --- a/Sharpmake/FastBuildSettings.cs +++ b/Sharpmake/FastBuildSettings.cs @@ -56,6 +56,11 @@ public static class FastBuildSettings /// public static string CachePath = null; + /// + /// Additional settings to add to the global settings node. + /// + public static readonly IList AdditionalGlobalSettings = new List(); + /// /// Path to the fastbuild plugin dll if any. This typically will be the path to the Ubisoft asset store plugin DLL but could be any other compatible implementation. /// CachePath must also be set to an appropriate url. From 0d45c8692f401586f7921fa02b07f5c425a5114e Mon Sep 17 00:00:00 2001 From: Janusz Nykiel Date: Mon, 9 Nov 2020 14:17:17 -0500 Subject: [PATCH 108/142] Expose the UseRelativePaths setting of the FASTBuild Compiler node in Sharpmake --- Sharpmake.Generators/FastBuild/Bff.Template.cs | 1 + Sharpmake.Generators/FastBuild/MasterBff.cs | 7 +++++++ Sharpmake/FastBuildSettings.cs | 6 ++++++ 3 files changed, 14 insertions(+) diff --git a/Sharpmake.Generators/FastBuild/Bff.Template.cs b/Sharpmake.Generators/FastBuild/Bff.Template.cs index ded3224ae..cae1d3ec2 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Template.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Template.cs @@ -108,6 +108,7 @@ public static class ConfigurationFile .Executable = '[fastBuildCompilerExecutable]' .ExtraFiles = [fastBuildExtraFiles] .CompilerFamily = '[fastBuildCompilerFamily]' + .UseRelativePaths_Experimental = [fastBuildCompilerUseRelativePaths] [fastBuildVS2012EnumBugWorkaround] } "; diff --git a/Sharpmake.Generators/FastBuild/MasterBff.cs b/Sharpmake.Generators/FastBuild/MasterBff.cs index 8e1315146..0cddddfb3 100644 --- a/Sharpmake.Generators/FastBuild/MasterBff.cs +++ b/Sharpmake.Generators/FastBuild/MasterBff.cs @@ -633,6 +633,12 @@ private static void WriteMasterCompilerSection(FileGenerator masterBffGenerator, var compilerPlatform = compilerSettings.PlatformFlags; string fastBuildCompilerFamily = UtilityMethods.GetFBuildCompilerFamily(compilerSettings.FastBuildCompilerFamily); + string fastBuildCompilerUseRelativePaths = FileGeneratorUtilities.RemoveLineTag; + if (FastBuildSettings.CompilersUsingRelativePaths.Contains(compiler.Key)) + { + fastBuildCompilerUseRelativePaths = "true"; + } + string fastBuildVS2012EnumBugWorkaround = FileGeneratorUtilities.RemoveLineTag; if (FastBuildSettings.EnableVS2012EnumBugWorkaround && compilerSettings.DevEnv == DevEnv.vs2012 && @@ -646,6 +652,7 @@ private static void WriteMasterCompilerSection(FileGenerator masterBffGenerator, using (masterBffGenerator.Declare("fastBuildCompilerExecutable", string.IsNullOrEmpty(compilerSettings.Executable) ? FileGeneratorUtilities.RemoveLineTag : compilerSettings.Executable)) using (masterBffGenerator.Declare("fastBuildExtraFiles", compilerSettings.ExtraFiles.Count > 0 ? UtilityMethods.FBuildCollectionFormat(compilerSettings.ExtraFiles, 28) : FileGeneratorUtilities.RemoveLineTag)) using (masterBffGenerator.Declare("fastBuildCompilerFamily", string.IsNullOrEmpty(fastBuildCompilerFamily) ? FileGeneratorUtilities.RemoveLineTag : fastBuildCompilerFamily)) + using (masterBffGenerator.Declare("fastBuildCompilerUseRelativePaths", fastBuildCompilerUseRelativePaths)) using (masterBffGenerator.Declare("fastBuildVS2012EnumBugWorkaround", fastBuildVS2012EnumBugWorkaround)) { masterBffGenerator.Write(Bff.Template.ConfigurationFile.CompilerSetting); diff --git a/Sharpmake/FastBuildSettings.cs b/Sharpmake/FastBuildSettings.cs index df25f7b0a..a8f510294 100644 --- a/Sharpmake/FastBuildSettings.cs +++ b/Sharpmake/FastBuildSettings.cs @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. using System; +using System.Collections.Generic; namespace Sharpmake { @@ -189,5 +190,10 @@ public enum CacheTypes /// Also it seems that this doesn't occurs with VS2013. /// public static bool EnableVS2012EnumBugWorkaround = false; // activate workaround for VS2012 enum bug(corrupted preprocessor output). + + /// + /// FastBuild names of compilers to set the 'UseRelativePaths_Experimental' option for. + /// + public static readonly ISet CompilersUsingRelativePaths = new HashSet(StringComparer.OrdinalIgnoreCase); } } From 8d1e117c285993d2ee3eb058783b133c392f82da Mon Sep 17 00:00:00 2001 From: Janusz Nykiel Date: Tue, 10 Nov 2020 10:38:28 -0500 Subject: [PATCH 109/142] Expose the UseRelativePaths setting of the FASTBuild Unity node in Sharpmake --- Sharpmake.Generators/FastBuild/Bff.Template.cs | 1 + Sharpmake.Generators/FastBuild/Bff.Util.cs | 5 ++++- Sharpmake.Generators/FastBuild/Bff.cs | 3 ++- Sharpmake/Project.Configuration.cs | 5 +++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Sharpmake.Generators/FastBuild/Bff.Template.cs b/Sharpmake.Generators/FastBuild/Bff.Template.cs index cae1d3ec2..331f9e842 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Template.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Template.cs @@ -566,6 +566,7 @@ public static class ConfigurationFile .UnityOutputPattern = '[unityFile.UnityOutputPattern]' .UnityNumFiles = [unityFile.UnityNumFiles] .UnityPCH = '[unityFile.UnityPCH]' + .UseRelativePaths_Experimental = [unityFile.UseRelativePaths] } "; diff --git a/Sharpmake.Generators/FastBuild/Bff.Util.cs b/Sharpmake.Generators/FastBuild/Bff.Util.cs index 0195dd93e..d9f118a93 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Util.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Util.cs @@ -40,6 +40,7 @@ public class Unity public string UnityOutputPattern = FileGeneratorUtilities.RemoveLineTag; // (optional) Pattern of output Unity file names (default Unity*cpp) public string UnityNumFiles = FileGeneratorUtilities.RemoveLineTag; // (optional) Number of Unity files to generate (default 1) public string UnityPCH = FileGeneratorUtilities.RemoveLineTag; // (optional) Precompiled Header file to add to generated Unity files + public string UseRelativePaths = FileGeneratorUtilities.RemoveLineTag; // (optional) Use relative paths for generated Unity files public const string DefaultUnityInputPatternExtension = ".cpp"; @@ -63,6 +64,7 @@ public override int GetHashCode() hash = hash * 23 + UnityOutputPattern.GetHashCode(); hash = hash * 23 + UnityNumFiles.GetHashCode(); hash = hash * 23 + UnityPCH.GetHashCode(); + hash = hash * 23 + UseRelativePaths.GetHashCode(); return hash; } @@ -93,7 +95,8 @@ private bool Equals(Unity unity) && string.Equals(UnityInputIsolateWritableFilesLimit, unity.UnityInputIsolateWritableFilesLimit) && string.Equals(UnityOutputPattern, unity.UnityOutputPattern) && string.Equals(UnityNumFiles, unity.UnityNumFiles) - && string.Equals(UnityPCH, unity.UnityPCH); + && string.Equals(UnityPCH, unity.UnityPCH) + && string.Equals(UseRelativePaths, unity.UseRelativePaths); } } diff --git a/Sharpmake.Generators/FastBuild/Bff.cs b/Sharpmake.Generators/FastBuild/Bff.cs index 5ddb39c02..cfa795f14 100644 --- a/Sharpmake.Generators/FastBuild/Bff.cs +++ b/Sharpmake.Generators/FastBuild/Bff.cs @@ -1842,7 +1842,8 @@ private void ConfigureUnities(IGenerationContext context, Dictionary public string BffFullFileName => Path.Combine(ProjectPath, BffFileName); + /// + /// Whether to use relative paths in FASTBuild-generated Unity files. + /// + public bool FastBuildUnityUseRelativePaths = false; + /// /// Gets or sets whether to generate a FASTBuild (.bff) file when using FASTBuild. /// From 964631751e8f4935f4bd2ffd59e020521e8e8b1e Mon Sep 17 00:00:00 2001 From: Janusz Nykiel Date: Thu, 12 Nov 2020 16:41:00 -0500 Subject: [PATCH 110/142] Add a property allowing scripts to add freeform settings to the Compiler node in .bff files Requested in the code review, in anticipation of the need to set config values present only in internal Ubisoft versions of FASTBuild. --- Sharpmake.Generators/FastBuild/Bff.Template.cs | 1 + Sharpmake.Generators/FastBuild/MasterBff.cs | 8 ++++++++ Sharpmake/FastBuildSettings.cs | 5 +++++ 3 files changed, 14 insertions(+) diff --git a/Sharpmake.Generators/FastBuild/Bff.Template.cs b/Sharpmake.Generators/FastBuild/Bff.Template.cs index 331f9e842..29a6adf82 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Template.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Template.cs @@ -110,6 +110,7 @@ public static class ConfigurationFile .CompilerFamily = '[fastBuildCompilerFamily]' .UseRelativePaths_Experimental = [fastBuildCompilerUseRelativePaths] [fastBuildVS2012EnumBugWorkaround] +[fastBuildCompilerAdditionalSettings] } "; diff --git a/Sharpmake.Generators/FastBuild/MasterBff.cs b/Sharpmake.Generators/FastBuild/MasterBff.cs index 0cddddfb3..c304eb657 100644 --- a/Sharpmake.Generators/FastBuild/MasterBff.cs +++ b/Sharpmake.Generators/FastBuild/MasterBff.cs @@ -647,6 +647,13 @@ private static void WriteMasterCompilerSection(FileGenerator masterBffGenerator, fastBuildVS2012EnumBugWorkaround = ".VS2012EnumBugFix = true"; } + string fastBuildCompilerAdditionalSettings = FileGeneratorUtilities.RemoveLineTag; + if (FastBuildSettings.AdditionalCompilerSettings.TryGetValue(compiler.Key, out IList extraOptions) && + extraOptions.Any()) + { + fastBuildCompilerAdditionalSettings = string.Join(Environment.NewLine, extraOptions.Select(option => " " + option)); + } + using (masterBffGenerator.Declare("fastbuildCompilerName", compiler.Key)) using (masterBffGenerator.Declare("fastBuildCompilerRootPath", compilerSettings.RootPath)) using (masterBffGenerator.Declare("fastBuildCompilerExecutable", string.IsNullOrEmpty(compilerSettings.Executable) ? FileGeneratorUtilities.RemoveLineTag : compilerSettings.Executable)) @@ -654,6 +661,7 @@ private static void WriteMasterCompilerSection(FileGenerator masterBffGenerator, using (masterBffGenerator.Declare("fastBuildCompilerFamily", string.IsNullOrEmpty(fastBuildCompilerFamily) ? FileGeneratorUtilities.RemoveLineTag : fastBuildCompilerFamily)) using (masterBffGenerator.Declare("fastBuildCompilerUseRelativePaths", fastBuildCompilerUseRelativePaths)) using (masterBffGenerator.Declare("fastBuildVS2012EnumBugWorkaround", fastBuildVS2012EnumBugWorkaround)) + using (masterBffGenerator.Declare("fastBuildCompilerAdditionalSettings", fastBuildCompilerAdditionalSettings)) { masterBffGenerator.Write(Bff.Template.ConfigurationFile.CompilerSetting); foreach (var compilerConfiguration in compilerSettings.Configurations.OrderBy(x => x.Key)) diff --git a/Sharpmake/FastBuildSettings.cs b/Sharpmake/FastBuildSettings.cs index a8f510294..cdf4a200e 100644 --- a/Sharpmake/FastBuildSettings.cs +++ b/Sharpmake/FastBuildSettings.cs @@ -195,5 +195,10 @@ public enum CacheTypes /// FastBuild names of compilers to set the 'UseRelativePaths_Experimental' option for. /// public static readonly ISet CompilersUsingRelativePaths = new HashSet(StringComparer.OrdinalIgnoreCase); + + /// + /// Additional settings to add to the Compiler node, keyed by compiler name. + /// + public static readonly IDictionary> AdditionalCompilerSettings = new Dictionary>(StringComparer.OrdinalIgnoreCase); } } From fc8da2e0397dbb7b4ee0bcfbee1ce721271aaad2 Mon Sep 17 00:00:00 2001 From: Janusz Nykiel Date: Tue, 17 Nov 2020 14:44:58 -0500 Subject: [PATCH 111/142] Allow passing different additional compiler options when PCHs are created and used This is required when using Clang to create "relocatable PCHs", useful for reproducible builds. As such, given that only FASTBuild supports other options required for such builds, these are currently only respected by the BFF generator. --- .../FastBuild/Bff.Template.cs | 7 ++++- .../VisualStudio/ProjectOptionsGenerator.cs | 28 +++++++++++++------ Sharpmake/Project.Configuration.cs | 16 +++++++++++ 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/Sharpmake.Generators/FastBuild/Bff.Template.cs b/Sharpmake.Generators/FastBuild/Bff.Template.cs index 29a6adf82..2adecc7ef 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Template.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Template.cs @@ -208,6 +208,7 @@ public static class ConfigurationFile .PCHOptions = '""%1"" /Fp""%2"" /Fo""%3"" /c' + ' /Yc""[cmdLineOptions.PrecompiledHeaderThrough]""' + ' [fastBuildPCHForceInclude]' + + ' [options.AdditionalCompilerOptionsOnPCHCreate]' + ' $CompilerExtraOptions$' + ' $CompilerOptimizations$' @@ -218,6 +219,7 @@ public static class ConfigurationFile .PCHInputFile = '[fastBuildPrecompiledSourceFile]' .PCHOutputFile = '[cmdLineOptions.PrecompiledHeaderFile]' .PCHOptions = '-o ""%2"" -c -x c++-header ""%1""' + + ' [options.AdditionalCompilerOptionsOnPCHCreate]' + ' $CompilerExtraOptions$' + ' $CompilerOptimizations$' @@ -226,8 +228,11 @@ public static class ConfigurationFile .PCHOptionsDeoptimized = .PCHOptions "; - public static string UsePrecompClang = @"-include-pch $PCHOutputFile$"; + public static string UsePrecompClang = @"-include-pch $PCHOutputFile$' + + ' [options.AdditionalCompilerOptionsOnPCHUse]' + + '"; public static string UsePrecomp = @"/Yu""[cmdLineOptions.PrecompiledHeaderThrough]"" /Fp""$PCHOutputFile$""' + + ' [options.AdditionalCompilerOptionsOnPCHUse]' + ' [fastBuildPCHForceInclude]"; public static string ResourceCompilerOptions = @" diff --git a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs index 2ebf02dd0..4a2253858 100644 --- a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs +++ b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs @@ -1042,15 +1042,25 @@ private void GenerateCompilerOptions(IGenerationContext context, ProjectOptionsG } // Options.Vc.Compiler.AdditionalOptions - if (context.Configuration.AdditionalCompilerOptions.Any()) - { - context.Configuration.AdditionalCompilerOptions.Sort(); - string additionalCompilerOptions = context.Configuration.AdditionalCompilerOptions.JoinStrings(" "); - context.Options["AdditionalCompilerOptions"] = additionalCompilerOptions; - } - else - { - context.Options["AdditionalCompilerOptions"] = FileGeneratorUtilities.RemoveLineTag; + foreach (Tuple optionsTuple in new[] + { + Tuple.Create(context.Configuration.AdditionalCompilerOptions, "AdditionalCompilerOptions"), + Tuple.Create(context.Configuration.AdditionalCompilerOptionsOnPCHCreate, "AdditionalCompilerOptionsOnPCHCreate"), + Tuple.Create(context.Configuration.AdditionalCompilerOptionsOnPCHUse, "AdditionalCompilerOptionsOnPCHUse") + }) + { + OrderableStrings optionsStrings = optionsTuple.Item1; + string optionsKey = optionsTuple.Item2; + if (optionsStrings.Any()) + { + optionsStrings.Sort(); + string additionalCompilerOptions = optionsStrings.JoinStrings(" "); + context.Options[optionsKey] = additionalCompilerOptions; + } + else + { + context.Options[optionsKey] = FileGeneratorUtilities.RemoveLineTag; + } } optionsContext.HasClrSupport = clrSupport; diff --git a/Sharpmake/Project.Configuration.cs b/Sharpmake/Project.Configuration.cs index f1c732ca9..89f1f9c66 100644 --- a/Sharpmake/Project.Configuration.cs +++ b/Sharpmake/Project.Configuration.cs @@ -827,6 +827,22 @@ public OutputType Output /// public OrderableStrings AdditionalCompilerOptions = new OrderableStrings(); + /// + /// Compiler-specific options to pass when invoking the compiler to create PCHs. + /// + /// + /// Currently only respected by the BFF generator. + /// + public OrderableStrings AdditionalCompilerOptionsOnPCHCreate = new OrderableStrings(); + + /// + /// Compiler-specific options to pass when invoking the compiler telling it to use PCHs. + /// + /// + /// Currently only respected by the BFF generator. + /// + public OrderableStrings AdditionalCompilerOptionsOnPCHUse = new OrderableStrings(); + /// /// Gets a list of file extensions that are added to a Visual Studio project with the /// None build action. From eb22674ec0d5961e74d49e293bef705e989332e5 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 3 Feb 2021 10:55:17 +0100 Subject: [PATCH 112/142] Force stack traces obtained when using portable PDBs to include source file and line information --- Sharpmake.Application/app.config | 1 + 1 file changed, 1 insertion(+) diff --git a/Sharpmake.Application/app.config b/Sharpmake.Application/app.config index b558b9fbe..c3f917f81 100644 --- a/Sharpmake.Application/app.config +++ b/Sharpmake.Application/app.config @@ -3,5 +3,6 @@ + From 4355cefb67caa24f56d60b7ac7a8ec634527493d Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 3 Feb 2021 11:09:58 +0100 Subject: [PATCH 113/142] Print full FrameworkDisplayName on startup if possible. --- Sharpmake.Application/Program.cs | 2 +- Sharpmake/Util.cs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Sharpmake.Application/Program.cs b/Sharpmake.Application/Program.cs index 8141d7066..a3b8171f1 100644 --- a/Sharpmake.Application/Program.cs +++ b/Sharpmake.Application/Program.cs @@ -194,7 +194,7 @@ private static int Main() } var osplatform = Util.GetExecutingPlatform(); - string framework = Util.IsRunningInMono() ? "Mono" : (Util.IsRunningDotNetCore() ? ".NET Core" : ".NET Framework"); + string framework = (Util.IsRunningInMono() ? "Mono | " : "") + Util.FrameworkDisplayName(); LogWriteLine($"sharpmake {versionString} ({osplatform} | {framework})"); LogWriteLine(" arguments : {0}", CommandLine.GetProgramCommandLine()); diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index f9b0a6547..2bde2bb17 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -2498,7 +2498,9 @@ private static Platform DetectExecutingPlatform() } private static readonly string s_framework = Assembly.GetEntryAssembly()?.GetCustomAttribute()?.FrameworkName; + private static readonly string s_frameworkDisplayName = Assembly.GetEntryAssembly()?.GetCustomAttribute()?.FrameworkDisplayName; private static readonly bool s_isDotNetCore = s_framework != null && !s_framework.StartsWith(".NETFramework"); + public static string FrameworkDisplayName() => s_frameworkDisplayName ?? s_framework ?? "Unknown"; public static bool IsRunningDotNetCore() => s_isDotNetCore; } } From 7baa7dd8d32504d147841ab63f17a8274f91f17d Mon Sep 17 00:00:00 2001 From: Christian Martin Date: Wed, 3 Feb 2021 10:48:34 +0000 Subject: [PATCH 114/142] Only warn when a file is missing on an exclusion rule --- Sharpmake/Project.cs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Sharpmake/Project.cs b/Sharpmake/Project.cs index 566805044..53dbc8d75 100644 --- a/Sharpmake/Project.cs +++ b/Sharpmake/Project.cs @@ -1709,15 +1709,28 @@ public virtual void PostResolve() var includePathsExcludeFromWarningRegex = RegexCache.GetCachedRegexes(IncludePathsExcludeFromWarningRegex).ToArray(); var libraryPathsExcludeFromWarningRegex = RegexCache.GetCachedRegexes(LibraryPathsExcludeFromWarningRegex).ToArray(); - // check if the files marked as excluded from build still exist + // check if the files marked with specific options still exist foreach (var array in new Dictionary { - {conf.ResolvedSourceFilesBuildExclude, nameof(conf.ResolvedSourceFilesBuildExclude)}, - {conf.ResolvedSourceFilesBlobExclude, nameof(conf.ResolvedSourceFilesBlobExclude)}, {conf.ResolvedSourceFilesWithCompileAsCLROption, nameof(conf.ResolvedSourceFilesWithCompileAsCLROption)}, {conf.ResolvedSourceFilesWithCompileAsCOption, nameof(conf.ResolvedSourceFilesWithCompileAsCOption)}, {conf.ResolvedSourceFilesWithCompileAsCPPOption, nameof(conf.ResolvedSourceFilesWithCompileAsCPPOption)}, {conf.ResolvedSourceFilesWithCompileAsNonCLROption, nameof(conf.ResolvedSourceFilesWithCompileAsNonCLROption)}, {conf.ResolvedSourceFilesWithCompileAsWinRTOption, nameof(conf.ResolvedSourceFilesWithCompileAsWinRTOption)}, + }) + { + foreach (string file in array.Key) + { + if (!File.Exists(file)) + { + ReportError($@"{conf.Project.SharpmakeCsFileName}: Error: File contained in {array.Value} doesn't exist: {file}."); + } + } + } + + // check if the files marked as excluded from build still exist + foreach (var array in new Dictionary { + {conf.ResolvedSourceFilesBuildExclude, nameof(conf.ResolvedSourceFilesBuildExclude)}, + {conf.ResolvedSourceFilesBlobExclude, nameof(conf.ResolvedSourceFilesBlobExclude)}, {conf.ResolvedSourceFilesWithExcludeAsWinRTOption, nameof(conf.ResolvedSourceFilesWithExcludeAsWinRTOption)}, {conf.PrecompSourceExclude, nameof(conf.PrecompSourceExclude)} }) @@ -1726,7 +1739,7 @@ public virtual void PostResolve() { if (!File.Exists(file)) { - ReportError($@"{conf.Project.SharpmakeCsFileName}: Error: File contained in {array.Value} doesn't exist: {file}."); + ReportError($@"{conf.Project.SharpmakeCsFileName}: Warning: File contained in {array.Value} doesn't exist: {file}.", onlyWarn: true); } } } From 4a6fe6ac524632c78c6bf6e4a4a66be0bc05223f Mon Sep 17 00:00:00 2001 From: Jean-Rene Minville Date: Wed, 3 Feb 2021 11:04:09 +0000 Subject: [PATCH 115/142] Add conf.TargetCopyFilesToSubDirectory to allow copies to a subfolder in target path. Note that it follows the same propagation rules as conf.TargetCopyFiles --- .../VisualStudio/ProjectOptionsGenerator.cs | 5 ++- Sharpmake/Project.Configuration.cs | 25 +++++++++++ Sharpmake/Resolver.cs | 41 +++++++++++++++++++ Sharpmake/Util.cs | 32 +++++++++++++++ 4 files changed, 101 insertions(+), 2 deletions(-) diff --git a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs index 2ebf02dd0..59a6fe4e3 100644 --- a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs +++ b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs @@ -1059,12 +1059,13 @@ private void GenerateCompilerOptions(IGenerationContext context, ProjectOptionsG public static List> ConvertPostBuildCopiesToRelative(Project.Configuration conf, string relativeTo) { var relativePostBuildCopies = new List>(); - if (!conf.ResolvedTargetCopyFiles.Any() && conf.CopyDependenciesBuildStep == null && !conf.EventPostBuildCopies.Any()) + if (!conf.ResolvedTargetCopyFiles.Any() && conf.CopyDependenciesBuildStep == null && !conf.EventPostBuildCopies.Any() && !conf.ResolvedTargetCopyFilesToSubDirectory.Any()) return relativePostBuildCopies; relativePostBuildCopies.AddRange(conf.ResolvedTargetCopyFiles.Select(x => new KeyValuePair(x, conf.TargetPath))); relativePostBuildCopies.AddRange(conf.EventPostBuildCopies); - + relativePostBuildCopies.AddRange(conf.ResolvedTargetCopyFilesToSubDirectory.Select(x => new KeyValuePair(x.Key, Path.Combine(conf.TargetPath, x.Value)))); + for (int i = 0; i < relativePostBuildCopies.Count;) { string sourceFileFullPath = relativePostBuildCopies[i].Key; diff --git a/Sharpmake/Project.Configuration.cs b/Sharpmake/Project.Configuration.cs index 5db1ea879..a79fa2969 100644 --- a/Sharpmake/Project.Configuration.cs +++ b/Sharpmake/Project.Configuration.cs @@ -1644,6 +1644,11 @@ internal void Resolve(Resolver resolver) /// public Strings TargetCopyFiles = new Strings(); + /// + /// Gets or sets the list of files to copy to a sub-directory of the output directory. + /// + public HashSet> TargetCopyFilesToSubDirectory = new HashSet>(); + /// /// Gets or sets the list of files that the target depends on. /// @@ -2089,6 +2094,14 @@ internal void AddMasterBff(string masterBff) /// public IEnumerable ResolvedTargetCopyFiles => _resolvedTargetCopyFiles; + private HashSet> _resolvedTargetCopyFilesToSubDirectory = new HashSet>(); + + /// + /// Gets the list of resolved files to copy to a sub directory of the target directory. + /// + public IEnumerable> ResolvedTargetCopyFilesToSubDirectory => _resolvedTargetCopyFilesToSubDirectory; + + private Strings _resolvedTargetDependsFiles = new Strings(); /// @@ -2220,6 +2233,8 @@ internal void Resolve(Resolver resolver) Util.ResolvePath(Project.SharpmakeCsPath, ref BaseIntermediateOutputPath); Util.ResolvePath(Project.SharpmakeCsPath, ref LibraryPaths); Util.ResolvePathAndFixCase(Project.SharpmakeCsPath, ref TargetCopyFiles); + Util.ResolvePathAndFixCase(Project.SharpmakeCsPath, Util.KeyValuePairResolveType.ResolveAll, ref EventPostBuildCopies); + Util.ResolvePathAndFixCase(Project.SharpmakeCsPath, Util.KeyValuePairResolveType.ResolveKey, ref TargetCopyFilesToSubDirectory); Util.ResolvePath(Project.SharpmakeCsPath, ref TargetDependsFiles); Util.ResolvePath(Project.SharpmakeCsPath, ref TargetPath); Util.ResolvePath(Project.SharpmakeCsPath, ref TargetLibraryPath); @@ -2277,6 +2292,11 @@ internal void Resolve(Resolver resolver) _resolvedTargetDependsFiles.AddRange(TargetDependsFiles); _resolvedTargetCopyFiles.AddRange(TargetCopyFiles); + foreach (var keyValuePair in TargetCopyFilesToSubDirectory) + { + _resolvedTargetCopyFilesToSubDirectory.Add(keyValuePair); + } + foreach (var tuple in new[] { Tuple.Create(EventPreBuildExe, _resolvedEventPreBuildExe), Tuple.Create(EventPostBuildExe, _resolvedEventPostBuildExe), @@ -2819,6 +2839,11 @@ internal void Link(Builder builder) _resolvedTargetDependsFiles.AddRange(dependency.TargetDependsFiles); _resolvedExecDependsFiles.AddRange(dependency.EventPreBuildExe); _resolvedExecDependsFiles.AddRange(dependency.EventPostBuildExe); + + foreach (var keyValuePair in dependency.TargetCopyFilesToSubDirectory) + { + _resolvedTargetCopyFilesToSubDirectory.Add(keyValuePair); + } } else if (Output == OutputType.None && isExport == false) { diff --git a/Sharpmake/Resolver.cs b/Sharpmake/Resolver.cs index a4e8167a1..e9d21bff4 100644 --- a/Sharpmake/Resolver.cs +++ b/Sharpmake/Resolver.cs @@ -768,6 +768,17 @@ private void ResolveMember(string objectPath, object obj, MemberInfo memberInfo, SetResolved(memberPath); } } + else if (fieldValue is HashSet>) + { + if (CanWriteFieldValue(fieldInfo)) + { + SetResolving(memberPath); + + ResolveKeyPairHashSet((HashSet>)fieldValue, fallbackValue); + + SetResolved(memberPath); + } + } else if (fieldInfo.FieldType.IsClass) { object memberObject = fieldValue; @@ -817,6 +828,14 @@ private void ResolveMember(string objectPath, object obj, MemberInfo memberInfo, SetResolved(memberPath); } + else if (propertyValue is HashSet>) + { + SetResolving(memberPath); + + ResolveKeyPairHashSet((HashSet>)propertyValue, fallbackValue); + + SetResolved(memberPath); + } else if (propertyInfo.PropertyType.IsClass) { ResolveObject(memberPath, propertyValue, fallbackValue); @@ -826,6 +845,28 @@ private void ResolveMember(string objectPath, object obj, MemberInfo memberInfo, } } + private void ResolveKeyPairHashSet(HashSet> values, object fallbackValue) + { + // Empty check to prevent a useless memory allocation in .ToList() + if (values.Count == 0) + return; + + foreach (var keyValuePair in values.ToList()) + { + bool keyChanged; + bool valueChanged; + + string key = Resolve(keyValuePair.Key, fallbackValue, out keyChanged); + string value = Resolve(keyValuePair.Value, fallbackValue, out valueChanged); + + if (keyChanged || valueChanged) + { + values.Remove(keyValuePair); + values.Add(new KeyValuePair(key, value)); + } + } + } + private void ResolveObject(string objectPath, object obj, object fallbackValue) { // prevent object resolve recursion diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index 78093ac8e..93b367447 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -584,6 +584,38 @@ internal static void ResolvePathAndFixCase(string root, ref IEnumerable paths = paths.Select(path => ResolvePathAndFixCase(root, path)); } + [Flags] + internal enum KeyValuePairResolveType + { + ResolveKey = 1 << 0, + ResolveValue = 1 << 1, + ResolveAll = ResolveKey | ResolveValue + } + + internal static void ResolvePathAndFixCase(string root, KeyValuePairResolveType resolveType, ref HashSet> paths) + { + if (paths.Count == 0) + return; + + foreach (var keyValuePair in paths.ToList()) + { + string key = keyValuePair.Key; + string value = keyValuePair.Value; + + if (resolveType.HasFlag(KeyValuePairResolveType.ResolveKey)) + key = ResolvePathAndFixCase(root, key); + + if (resolveType.HasFlag(KeyValuePairResolveType.ResolveValue)) + value = ResolvePathAndFixCase(root, value); + + if (keyValuePair.Key != key || keyValuePair.Value != value) + { + paths.Remove(keyValuePair); + paths.Add(new KeyValuePair(key, value)); + } + } + } + public static void ResolvePath(string root, ref Strings paths) { List sortedPaths = paths.Values; From 0497790f0d87da01594bce6a9377419e3e40d00e Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 3 Feb 2021 13:59:38 +0100 Subject: [PATCH 116/142] Remove now useless DiaSymReader dependency! --- Sharpmake/Sharpmake.csproj | 1 - Sharpmake/Sharpmake.sharpmake.cs | 4 ---- 2 files changed, 5 deletions(-) diff --git a/Sharpmake/Sharpmake.csproj b/Sharpmake/Sharpmake.csproj index 492118c47..b34b1cb9c 100644 --- a/Sharpmake/Sharpmake.csproj +++ b/Sharpmake/Sharpmake.csproj @@ -135,7 +135,6 @@ - diff --git a/Sharpmake/Sharpmake.sharpmake.cs b/Sharpmake/Sharpmake.sharpmake.cs index af0be7cef..f494fa984 100644 --- a/Sharpmake/Sharpmake.sharpmake.cs +++ b/Sharpmake/Sharpmake.sharpmake.cs @@ -25,10 +25,6 @@ public override void ConfigureAll(Configuration conf, Target target) conf.Options.Add(Options.CSharp.AllowUnsafeBlocks.Enabled); conf.ReferencesByNuGetPackage.Add("Microsoft.CodeAnalysis.CSharp", "3.8.0"); - - // This dependency is not strictly necessary, but Microsoft.CodeAnalysis.CSharp - // will throw an exception at runtime if the DLL is not found next to the exe - conf.ReferencesByNuGetPackage.Add("Microsoft.DiaSymReader.Native", "1.7.0"); conf.ReferencesByNuGetPackage.Add("Microsoft.VisualStudio.Setup.Configuration.Interop", "2.3.2262-g94fae01e"); } } From 59c1109a2174c90924fa3ad2bcd5d81669507092 Mon Sep 17 00:00:00 2001 From: Christian Martin Date: Wed, 3 Feb 2021 09:45:48 -0500 Subject: [PATCH 117/142] Fix for library file with fullpath being wrongly reported as missing if no library path were added to the configuration in diagnostic mode --- Sharpmake/Project.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Sharpmake/Project.cs b/Sharpmake/Project.cs index 53dbc8d75..4ee57a671 100644 --- a/Sharpmake/Project.cs +++ b/Sharpmake/Project.cs @@ -1765,6 +1765,10 @@ public virtual void PostResolve() var platformLibraryPaths = configTasks.GetPlatformLibraryPaths(conf); allLibraryPaths.AddRange(platformLibraryPaths); + // remove all the rooted files + var allRootedFiles = allLibraryFiles.Where(file => Path.IsPathRooted(file)).ToArray(); + allLibraryFiles.RemoveRange(allRootedFiles); + string platformLibExtension = "." + configTasks.GetDefaultOutputExtension(Configuration.OutputType.Lib); foreach (string folder in allLibraryPaths) { @@ -1778,7 +1782,7 @@ public virtual void PostResolve() var toRemove = new List(); foreach (string file in allLibraryFiles) { - string path = Path.IsPathRooted(file) ? file : Path.Combine(folder, file); + string path = Path.Combine(folder, file); if (File.Exists(path) || File.Exists(path + platformLibExtension) || File.Exists(Path.Combine(folder, "lib" + file + platformLibExtension))) toRemove.Add(file); } @@ -1787,6 +1791,9 @@ public virtual void PostResolve() } } + // Add all rooted files that are missing + allLibraryFiles.Add(allRootedFiles.Where(file => !File.Exists(file)).ToArray()); + // everything that remains is a missing library file foreach (string file in allLibraryFiles) { From 45b065b6aca4e4e8f0417a985986d03c5e02f3ba Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 3 Feb 2021 14:11:37 +0100 Subject: [PATCH 118/142] Fix resharper warning "Empty statement is redundant" --- Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs index 82af26a56..1914e8337 100644 --- a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs +++ b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs @@ -823,8 +823,8 @@ private void GenerateCompilerOptions(IGenerationContext context, ProjectOptionsG // Enable CreateHotPatchableCode="true" /hotpatch context.SelectOption ( - Options.Option(Options.Vc.Compiler.CreateHotPatchableCode.Default, () => { context.Options["CreateHotPatchableCode"] = FileGeneratorUtilities.RemoveLineTag; ; context.CommandLineOptions["CreateHotPatchableCode"] = FileGeneratorUtilities.RemoveLineTag; ; }), - Options.Option(Options.Vc.Compiler.CreateHotPatchableCode.Disable, () => { context.Options["CreateHotPatchableCode"] = "false"; context.CommandLineOptions["CreateHotPatchableCode"] = FileGeneratorUtilities.RemoveLineTag; ; }), + Options.Option(Options.Vc.Compiler.CreateHotPatchableCode.Default, () => { context.Options["CreateHotPatchableCode"] = FileGeneratorUtilities.RemoveLineTag; context.CommandLineOptions["CreateHotPatchableCode"] = FileGeneratorUtilities.RemoveLineTag; }), + Options.Option(Options.Vc.Compiler.CreateHotPatchableCode.Disable, () => { context.Options["CreateHotPatchableCode"] = "false"; context.CommandLineOptions["CreateHotPatchableCode"] = FileGeneratorUtilities.RemoveLineTag; }), Options.Option(Options.Vc.Compiler.CreateHotPatchableCode.Enable, () => { context.Options["CreateHotPatchableCode"] = "true"; context.CommandLineOptions["CreateHotPatchableCode"] = "/hotpatch"; }) ); From 8753bec985398fe04003a4f339584384facb2733 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 3 Feb 2021 14:12:34 +0100 Subject: [PATCH 119/142] Fix Resharper warning "Join declaration and assignment" --- Sharpmake/Assembler.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Sharpmake/Assembler.cs b/Sharpmake/Assembler.cs index 6e9102848..4f2d10446 100644 --- a/Sharpmake/Assembler.cs +++ b/Sharpmake/Assembler.cs @@ -118,13 +118,11 @@ public static TDelegate BuildDelegate(string sourceFilePath, string f ParameterInfo[] delegateParameterInfos = delegateMethodInfo.GetParameters(); ParameterInfo delegateReturnInfos = delegateMethodInfo.ReturnParameter; - Assembly assembly; - Assembler assembler = new Assembler(); assembler.UseDefaultReferences = false; assembler.Assemblies.AddRange(assemblies); - assembly = assembler.BuildAssembly(fileInfo.FullName); + Assembly assembly = assembler.BuildAssembly(fileInfo.FullName); List matchMethods = new List(); From 021a33107e717f6475b9a49281bd37af490745e3 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 3 Feb 2021 14:37:47 +0100 Subject: [PATCH 120/142] Fix GetString, was always returning an empty string... --- Sharpmake/Options.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Sharpmake/Options.cs b/Sharpmake/Options.cs index 12e5bce3a..e7ee5c69d 100644 --- a/Sharpmake/Options.cs +++ b/Sharpmake/Options.cs @@ -438,10 +438,9 @@ public static string GetString(Configuration conf) where T : StringOption for (int i = options.Count - 1; i >= 0; --i) { - string option = options[i] as string; - if (option is T) + if (options[i] is T stringOption) { - return option; + return stringOption.Value; } } return string.Empty; From b5cf126ad52c81e5d4aa2843cb137271e89bd832 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 3 Feb 2021 15:29:33 +0100 Subject: [PATCH 121/142] Use the utility method IsRunningOnUnix to initialize the FileSystemStringComparer --- Sharpmake/FileSystemStringComparer.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Sharpmake/FileSystemStringComparer.cs b/Sharpmake/FileSystemStringComparer.cs index 1e012ab2a..33e500632 100644 --- a/Sharpmake/FileSystemStringComparer.cs +++ b/Sharpmake/FileSystemStringComparer.cs @@ -35,8 +35,7 @@ public class FileSystemStringComparer : IComparer, IEqualityComparer Date: Wed, 3 Feb 2021 15:30:18 +0100 Subject: [PATCH 122/142] Use string.CompareOrdinal to make the string difference that we output in the logs, since Comparer.Default.Compare is deprecated --- Sharpmake/Util.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index 38b3b13c5..3dc68a8bc 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -1418,7 +1418,7 @@ private static int SequenceCompare(IEnumerable source1, IEnumerable source2) return 1; } // Both are still going, compare current elements - int comparison = Comparer.Default.Compare(iterator1.Current.ToString(), iterator2.Current.ToString()); + int comparison = string.CompareOrdinal(iterator1.Current.ToString(), iterator2.Current.ToString()); // If elements are non-equal, we're done if (comparison != 0) { From 931374b72b2d5b1392c45137aafd8f5c014e0041 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 3 Feb 2021 15:34:01 +0100 Subject: [PATCH 123/142] Replace usage of Environment.OSVersion since it's deprecated We now use RuntimeInformation --- Sharpmake/Util.cs | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index 3dc68a8bc..c7a8beb1f 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -20,6 +20,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Text; @@ -2490,7 +2491,7 @@ private int Parse(string version) private static readonly bool s_monoRuntimeExists = (Type.GetType("Mono.Runtime") != null); public static bool IsRunningInMono() => s_monoRuntimeExists; - private static readonly bool s_isUnix = Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX; + private static readonly bool s_isUnix = RuntimeInformation.IsOSPlatform(OSPlatform.Linux) || RuntimeInformation.IsOSPlatform(OSPlatform.OSX); public static bool IsRunningOnUnix() => s_isUnix; public static Platform GetExecutingPlatform() => s_executingPlatform; @@ -2498,33 +2499,29 @@ private int Parse(string version) private static readonly Platform s_executingPlatform = DetectExecutingPlatform(); private static Platform DetectExecutingPlatform() { - switch (Environment.OSVersion.Platform) + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - case PlatformID.Win32Windows: - case PlatformID.Win32NT: - return (Environment.Is64BitOperatingSystem) ? Platform.win64 : Platform.win32; - case PlatformID.MacOSX: - return Platform.mac; - case PlatformID.Unix: // could be mac or linux - { - bool isMacOs = false; - try - { - var p = new System.Diagnostics.Process(); - p.StartInfo.UseShellExecute = false; - p.StartInfo.RedirectStandardOutput = true; - p.StartInfo.FileName = "uname"; - p.Start(); - string output = p.StandardOutput.ReadToEnd().Trim(); - p.WaitForExit(); - - isMacOs = string.CompareOrdinal(output, "Darwin") == 0; - } - catch { } + switch (RuntimeInformation.OSArchitecture) + { + case Architecture.X86: + return Platform.win32; + case Architecture.X64: + return Platform.win64; + default: + throw new NotSupportedException($"{RuntimeInformation.OSArchitecture} Architecture is not supported on Windows"); + } + } - return isMacOs ? Platform.mac : Platform.linux; - } + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return Platform.mac; + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + return Platform.linux; } + LogWrite("Warning: Couldn't determine running platform"); return Platform.win64; // arbitrary } From fc9c4fcf41b4fafb79d1740be5ffe40329a84189 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 3 Feb 2021 15:36:06 +0100 Subject: [PATCH 124/142] Log more info on boot --- Sharpmake.Application/Program.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Sharpmake.Application/Program.cs b/Sharpmake.Application/Program.cs index a3b8171f1..4c3129f81 100644 --- a/Sharpmake.Application/Program.cs +++ b/Sharpmake.Application/Program.cs @@ -18,6 +18,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using Sharpmake.Generators; @@ -193,12 +194,12 @@ private static int Main() versionString += " " + informationalVersion; } - var osplatform = Util.GetExecutingPlatform(); - string framework = (Util.IsRunningInMono() ? "Mono | " : "") + Util.FrameworkDisplayName(); - - LogWriteLine($"sharpmake {versionString} ({osplatform} | {framework})"); - LogWriteLine(" arguments : {0}", CommandLine.GetProgramCommandLine()); - LogWriteLine(" directory : {0}", Directory.GetCurrentDirectory()); + LogWriteLine($"sharpmake {versionString}"); + LogWriteLine(" platform: {0} - {1}", Util.GetExecutingPlatform().ToString(), RuntimeInformation.OSDescription); + LogWriteLine(" compiled with framework: {0}", Util.FrameworkDisplayName()); + LogWriteLine(" running on framework: {0}", RuntimeInformation.FrameworkDescription); + LogWriteLine(" arguments: {0}", CommandLine.GetProgramCommandLine()); + LogWriteLine(" directory: {0}", Directory.GetCurrentDirectory()); LogWriteLine(string.Empty); // display help if wanted and quit From dd1bd271caf05f3eb4baab9cc09971cb9a3370d1 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 3 Feb 2021 18:57:43 +0100 Subject: [PATCH 125/142] Replace deprecated DictionaryEntry by IDictionaryEnumerator --- Sharpmake/Util.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index c7a8beb1f..f30ef2d59 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -1622,7 +1622,7 @@ private void SerializeArray(IEnumerable array) private void SerializeDictionary(IDictionary dict) { - SerializeSequence(dict, Tuple.Create('{', '}'), e => + SerializeSequence(dict, Tuple.Create('{', '}'), e => { if (!(e.Key is string)) throw new InvalidDataException(string.Format("Dictionary key '{0}' is not a string.", e.Key)); @@ -1642,7 +1642,7 @@ private void SerializeSequence(IEnumerable sequence, Tuple delimi _parents.Add(sequence); // IDictionary returns different enumerators depending on which interface GetEnumerator called from. - // IDictionary.GetEnumerator enumerates DictionaryEntry + // IDictionary.GetEnumerator enumerates IDictionaryEnumerator // IEnumerable.GetEnumerator enumerates KeyValuePair<> bool first = true; IEnumerator enumerator = (sequence as IDictionary)?.GetEnumerator() ?? sequence.GetEnumerator(); From b4e1c447def9d3b7236b6c722eb468fb37e5d6b2 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 3 Feb 2021 21:34:13 +0100 Subject: [PATCH 126/142] Revert "Replace deprecated DictionaryEntry by IDictionaryEnumerator" This reverts commit dd1bd271caf05f3eb4baab9cc09971cb9a3370d1. --- Sharpmake/Util.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index f30ef2d59..c7a8beb1f 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -1622,7 +1622,7 @@ private void SerializeArray(IEnumerable array) private void SerializeDictionary(IDictionary dict) { - SerializeSequence(dict, Tuple.Create('{', '}'), e => + SerializeSequence(dict, Tuple.Create('{', '}'), e => { if (!(e.Key is string)) throw new InvalidDataException(string.Format("Dictionary key '{0}' is not a string.", e.Key)); @@ -1642,7 +1642,7 @@ private void SerializeSequence(IEnumerable sequence, Tuple delimi _parents.Add(sequence); // IDictionary returns different enumerators depending on which interface GetEnumerator called from. - // IDictionary.GetEnumerator enumerates IDictionaryEnumerator + // IDictionary.GetEnumerator enumerates DictionaryEntry // IEnumerable.GetEnumerator enumerates KeyValuePair<> bool first = true; IEnumerator enumerator = (sequence as IDictionary)?.GetEnumerator() ?? sequence.GetEnumerator(); From af7e32dfd2a0942b3271b175e9cb740a7d3e596f Mon Sep 17 00:00:00 2001 From: Alexandre Ganea Date: Wed, 3 Feb 2021 17:10:40 -0500 Subject: [PATCH 127/142] Fix a failure in the unit tests where %TEMP%=F:\Temp but the actual path on disk was F:\temp (lowercase) The failure occured because the System.IO.DirectoryInfo.GetDirectories API returns the real path on disk. --- Sharpmake.UnitTests/UtilTest.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Sharpmake.UnitTests/UtilTest.cs b/Sharpmake.UnitTests/UtilTest.cs index 30ba181ff..9c1529787 100644 --- a/Sharpmake.UnitTests/UtilTest.cs +++ b/Sharpmake.UnitTests/UtilTest.cs @@ -253,8 +253,8 @@ public class MockPath [Test] public void PathGetCapitalizedFile() { - var mockPath1 = Path.GetTempFileName(); - var mockPath2 = Path.GetTempFileName(); + var mockPath1 = Util.GetCapitalizedPath(Path.GetTempFileName()); + var mockPath2 = Util.GetCapitalizedPath(Path.GetTempFileName()); OrderableStrings paths = new OrderableStrings { mockPath1, @@ -278,8 +278,10 @@ public void PathGetCapitalizedFile() [Test] public void PathGetCapitalizedDirectory() { - var tempDirectory1 = Directory.CreateDirectory(Path.GetTempPath() + @"\test1"); - var tempDirectory2 = Directory.CreateDirectory(Path.GetTempPath() + @"\test2"); + string temp = Util.GetCapitalizedPath(Path.GetTempPath()); + + var tempDirectory1 = Directory.CreateDirectory(temp + @"\test1"); + var tempDirectory2 = Directory.CreateDirectory(temp + @"\test2"); OrderableStrings paths = new OrderableStrings { From f537c97baa312f77e5cd80078f29e293e7aad01f Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Thu, 4 Feb 2021 10:26:36 +0100 Subject: [PATCH 128/142] Fix Framework display name with net5. --- Sharpmake/Util.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index c7a8beb1f..89b43adf9 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -2529,7 +2529,7 @@ private static Platform DetectExecutingPlatform() private static readonly string s_framework = Assembly.GetEntryAssembly()?.GetCustomAttribute()?.FrameworkName; private static readonly string s_frameworkDisplayName = Assembly.GetEntryAssembly()?.GetCustomAttribute()?.FrameworkDisplayName; private static readonly bool s_isDotNetCore = s_framework != null && !s_framework.StartsWith(".NETFramework"); - public static string FrameworkDisplayName() => s_frameworkDisplayName ?? s_framework ?? "Unknown"; + public static string FrameworkDisplayName() => !string.IsNullOrEmpty(s_frameworkDisplayName) ? s_frameworkDisplayName : !string.IsNullOrEmpty(s_framework) ? s_framework : "Unknown"; public static bool IsRunningDotNetCore() => s_isDotNetCore; } } From eb133fdf405af0f128dfe2950d8e02f7c7c75781 Mon Sep 17 00:00:00 2001 From: Alexandre Ganea Date: Mon, 8 Feb 2021 18:25:21 +0000 Subject: [PATCH 129/142] Make `functional_test.py` more resilient to different installed versions of Windows SDKs. --- .../FastBuildFunctionalTest.sharpmake.cs | 2 ++ .../NoAllFastBuildProjectFunctionalTest.sharpmake.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs b/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs index 162924b95..41afc74cd 100644 --- a/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs +++ b/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs @@ -545,6 +545,8 @@ public static void SharpmakeMain(Sharpmake.Arguments arguments) Bff.UnityResolver = new Bff.FragmentUnityResolver(); + KitsRootPaths.SetUseKitsRootForDevEnv(DevEnv.vs2017, KitsRootEnum.KitsRoot10, Options.Vc.General.WindowsTargetPlatformVersion.v10_0_19041_0); + arguments.Generate(); } } diff --git a/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs b/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs index e39c46c3e..dca784c28 100644 --- a/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs +++ b/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs @@ -196,6 +196,8 @@ public static void SharpmakeMain(Arguments arguments) Bff.UnityResolver = new Bff.FragmentUnityResolver(); + KitsRootPaths.SetUseKitsRootForDevEnv(DevEnv.vs2017, KitsRootEnum.KitsRoot10, Options.Vc.General.WindowsTargetPlatformVersion.v10_0_19041_0); + arguments.Generate(); } } From 9cde5be9b959dc5e270658edb8a32c68c8031040 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Wed, 10 Feb 2021 16:10:13 +0100 Subject: [PATCH 130/142] Revert "Make `functional_test.py` more resilient to different installed versions of Windows SDKs." This reverts commit eb133fdf405af0f128dfe2950d8e02f7c7c75781. --- .../FastBuildFunctionalTest.sharpmake.cs | 2 -- .../NoAllFastBuildProjectFunctionalTest.sharpmake.cs | 2 -- 2 files changed, 4 deletions(-) diff --git a/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs b/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs index 41afc74cd..162924b95 100644 --- a/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs +++ b/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs @@ -545,8 +545,6 @@ public static void SharpmakeMain(Sharpmake.Arguments arguments) Bff.UnityResolver = new Bff.FragmentUnityResolver(); - KitsRootPaths.SetUseKitsRootForDevEnv(DevEnv.vs2017, KitsRootEnum.KitsRoot10, Options.Vc.General.WindowsTargetPlatformVersion.v10_0_19041_0); - arguments.Generate(); } } diff --git a/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs b/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs index dca784c28..e39c46c3e 100644 --- a/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs +++ b/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs @@ -196,8 +196,6 @@ public static void SharpmakeMain(Arguments arguments) Bff.UnityResolver = new Bff.FragmentUnityResolver(); - KitsRootPaths.SetUseKitsRootForDevEnv(DevEnv.vs2017, KitsRootEnum.KitsRoot10, Options.Vc.General.WindowsTargetPlatformVersion.v10_0_19041_0); - arguments.Generate(); } } From a0c0c7fea8cb42ff2790bddc971d988832466f74 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Thu, 11 Feb 2021 18:38:45 +0100 Subject: [PATCH 131/142] Return a succesful exit code (0) if sharpmake is run with /help, but exit with error in case it is run without any arguments --- Sharpmake.Application/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sharpmake.Application/Program.cs b/Sharpmake.Application/Program.cs index 4c3129f81..0af136dd2 100644 --- a/Sharpmake.Application/Program.cs +++ b/Sharpmake.Application/Program.cs @@ -206,7 +206,7 @@ private static int Main() if ((CommandLine.GetProgramCommandLine().Length == 0) || CommandLine.ContainParameter("help")) { LogWriteLine(CommandLine.GetCommandLineHelp(typeof(Argument), false)); - return (int)ExitCode.Success; + return CommandLine.ContainParameter("help") ? (int)ExitCode.Success : (int)ExitCode.Error; } AppDomain.CurrentDomain.AssemblyLoad += AppDomain_AssemblyLoad; From 0d97abdaa35ecd0baef9b0fb992ae3dc3d684688 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Thu, 11 Feb 2021 18:39:52 +0100 Subject: [PATCH 132/142] Move back arguments and working directory at the top of the log --- Sharpmake.Application/Program.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sharpmake.Application/Program.cs b/Sharpmake.Application/Program.cs index 0af136dd2..87185f12c 100644 --- a/Sharpmake.Application/Program.cs +++ b/Sharpmake.Application/Program.cs @@ -195,11 +195,11 @@ private static int Main() } LogWriteLine($"sharpmake {versionString}"); + LogWriteLine(" arguments: {0}", CommandLine.GetProgramCommandLine()); + LogWriteLine(" directory: {0}", Directory.GetCurrentDirectory()); LogWriteLine(" platform: {0} - {1}", Util.GetExecutingPlatform().ToString(), RuntimeInformation.OSDescription); LogWriteLine(" compiled with framework: {0}", Util.FrameworkDisplayName()); LogWriteLine(" running on framework: {0}", RuntimeInformation.FrameworkDescription); - LogWriteLine(" arguments: {0}", CommandLine.GetProgramCommandLine()); - LogWriteLine(" directory: {0}", Directory.GetCurrentDirectory()); LogWriteLine(string.Empty); // display help if wanted and quit From 7826dab700f1882e9860b8e19c2cce0b2341ce63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=20V=C3=A4h=C3=A4-Salo?= Date: Thu, 11 Feb 2021 21:12:34 +0200 Subject: [PATCH 133/142] Add support for Visual Studio /std:c11 and /std:c17 switches introduced in Visual Studio 2019 version 16.8.0 --- Sharpmake.Generators/FastBuild/Bff.Template.cs | 1 + Sharpmake.Generators/FastBuild/Bff.cs | 5 +++++ .../VisualStudio/ProjectOptionsGenerator.cs | 11 +++++++++++ .../BasePlatform.Vcxproj.Template.cs | 1 + Sharpmake/Options.Vc.cs | 10 ++++++++++ 5 files changed, 28 insertions(+) diff --git a/Sharpmake.Generators/FastBuild/Bff.Template.cs b/Sharpmake.Generators/FastBuild/Bff.Template.cs index 2adecc7ef..51d43227e 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Template.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Template.cs @@ -378,6 +378,7 @@ public static class ConfigurationFile + ' [cmdLineOptions.RemoveUnreferencedCodeData]' + ' [cmdLineOptions.RuntimeTypeInfo]' + ' [cmdLineOptions.OpenMP]' + + ' [cmdLineOptions.LanguageStandard_C]' + ' [cmdLineOptions.LanguageStandard]' + ' [cmdLineOptions.ConformanceMode]' // Output Files options diff --git a/Sharpmake.Generators/FastBuild/Bff.cs b/Sharpmake.Generators/FastBuild/Bff.cs index cfa795f14..89ae3ef21 100644 --- a/Sharpmake.Generators/FastBuild/Bff.cs +++ b/Sharpmake.Generators/FastBuild/Bff.cs @@ -625,6 +625,9 @@ List skipFiles // Do not take Cpp Language conformance into account while compiling in C scopedOptions.Add(new Options.ScopedOption(confCmdLineOptions, "CppLanguageStd", FileGeneratorUtilities.RemoveLineTag)); scopedOptions.Add(new Options.ScopedOption(confOptions, "ClangCppLanguageStandard", FileGeneratorUtilities.RemoveLineTag)); + // MSVC + scopedOptions.Add(new Options.ScopedOption(confCmdLineOptions, "LanguageStandard", FileGeneratorUtilities.RemoveLineTag)); + if (clangPlatformBff != null) clangFileLanguage = "-x c "; // Compiler option to indicate that its a C file fastBuildSourceFileType = "/TC"; @@ -634,6 +637,8 @@ List skipFiles // Do not take C Language conformance into account while compiling in Cpp scopedOptions.Add(new Options.ScopedOption(confCmdLineOptions, "CLanguageStd", FileGeneratorUtilities.RemoveLineTag)); scopedOptions.Add(new Options.ScopedOption(confOptions, "ClangCLanguageStandard", FileGeneratorUtilities.RemoveLineTag)); + // MSVC + scopedOptions.Add(new Options.ScopedOption(confCmdLineOptions, "LanguageStandard_C", FileGeneratorUtilities.RemoveLineTag)); fastBuildSourceFileType = "/TP"; fastBuildUsingPlatformConfig = platformBff.CppConfigName(conf); diff --git a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs index 1914e8337..7b1544f52 100644 --- a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs +++ b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs @@ -368,6 +368,17 @@ private void GenerateCompilerOptions(IGenerationContext context, ProjectOptionsG Options.Option(Options.Vc.Compiler.CppLanguageStandard.GNU17, () => { context.Options["LanguageStandard"] = "stdcpp17"; context.CommandLineOptions["LanguageStandard"] = "/std:c++17"; }), Options.Option(Options.Vc.Compiler.CppLanguageStandard.Latest, () => { context.Options["LanguageStandard"] = "stdcpplatest"; context.CommandLineOptions["LanguageStandard"] = "/std:c++latest"; }) ); + + //Options.Vc.Compiler.CLanguageStandard. + // Legacy LanguageStandard_C="" + // C11 LanguageStandard_C="stdc11" /std:c11 + // C17 LanguageStandard_C="stdc17" /std:c17 + context.SelectOption + ( + Options.Option(Options.Vc.Compiler.CLanguageStandard.Legacy, () => { context.Options["LanguageStandard_C"] = FileGeneratorUtilities.RemoveLineTag; context.CommandLineOptions["LanguageStandard_C"] = FileGeneratorUtilities.RemoveLineTag; }), + Options.Option(Options.Vc.Compiler.CLanguageStandard.C11, () => { context.Options["LanguageStandard_C"] = "stdc11"; context.CommandLineOptions["LanguageStandard_C"] = "/std:c11"; }), + Options.Option(Options.Vc.Compiler.CLanguageStandard.C17, () => { context.Options["LanguageStandard_C"] = "stdc17"; context.CommandLineOptions["LanguageStandard_C"] = "/std:c17"; }) + ); } // Compiler section diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.Vcxproj.Template.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.Vcxproj.Template.cs index b1a9c5b03..088e122f0 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.Vcxproj.Template.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.Vcxproj.Template.cs @@ -62,6 +62,7 @@ public abstract partial class BasePlatform [options.ForceConformanceInForLoopScope] [options.RuntimeTypeInfo] [options.OpenMP] + [options.LanguageStandard_C] [options.LanguageStandard] false NoListing diff --git a/Sharpmake/Options.Vc.cs b/Sharpmake/Options.Vc.cs index a2b8025b9..1415747a9 100644 --- a/Sharpmake/Options.Vc.cs +++ b/Sharpmake/Options.Vc.cs @@ -573,6 +573,16 @@ public enum CppLanguageStandard Latest } + public enum CLanguageStandard + { + [Default] + Legacy, + [DevEnvVersion(minimum = DevEnv.vs2019)] + C11, + [DevEnvVersion(minimum = DevEnv.vs2019)] + C17 + } + public enum SupportJustMyCode { [Default] From b41a62d35cfedbfa415f39554a0d0bdd459b76a5 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Fri, 12 Feb 2021 14:45:28 +0100 Subject: [PATCH 134/142] Fix CompileSharpmake.bat so we return a proper exit code Without it, compilation failures were not detected on the CI for instance. --- CompileSharpmake.bat | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/CompileSharpmake.bat b/CompileSharpmake.bat index 31f6b7c17..23f416d13 100644 --- a/CompileSharpmake.bat +++ b/CompileSharpmake.bat @@ -6,6 +6,10 @@ :: if none are passed, defaults to building Sharpmake.sln in Debug|AnyCPU setlocal enabledelayedexpansion + +:: Clear previous run status +COLOR + : set batch file directory as current pushd "%~dp0" @@ -26,17 +30,22 @@ if not defined VSMSBUILDCMD ( echo ERROR: Cannot determine the location of Common Tools folder. goto error ) + echo MSBuild batch path: !VSMSBUILDCMD! call !VSMSBUILDCMD! -if %errorlevel% NEQ 0 goto end +if %errorlevel% NEQ 0 goto error if "%~1" == "" ( call :BuildSharpmake "Sharpmake.sln" "Debug" "Any CPU" ) else ( call :BuildSharpmake %1 %2 %3 ) -goto end +if %errorlevel% NEQ 0 goto error + +goto success + +@REM ----------------------------------------------------------------------- :: Build Sharpmake using specified arguments :BuildSharpmake echo Compiling %~1 in "%~2|%~3"... @@ -44,13 +53,27 @@ echo Compiling %~1 in "%~2|%~3"... set MSBUILD_CMD=msbuild -t:build -restore "%~1" /nologo /verbosity:m /p:Configuration="%~2" /p:Platform="%~3" echo %MSBUILD_CMD% %MSBUILD_CMD% -if %errorlevel% NEQ 0 ( +set ERROR_CODE=%errorlevel% +if %ERROR_CODE% NEQ 0 ( echo ERROR: Failed to compile %~1 in "%~2|%~3". - exit /b 1 + goto end ) -exit /b 0 +goto success -:: End of batch file +@REM ----------------------------------------------------------------------- +:success +COLOR 2F +set ERROR_CODE=0 +goto end + +@REM ----------------------------------------------------------------------- +:error +COLOR 4F +set ERROR_CODE=1 +goto end + +@REM ----------------------------------------------------------------------- :end +:: restore caller current directory popd - +exit /b %ERROR_CODE% From 3214668313939b9ea467a352c3a32be2438cd6ff Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Fri, 12 Feb 2021 14:48:02 +0100 Subject: [PATCH 135/142] [GithubActions] Add configuration to the name of some steps --- .github/workflows/actions.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index d919934fb..c9ffdbe0a 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -29,12 +29,12 @@ jobs: shell: bash run: ./bootstrap.sh - - name: CompileSharpmake.bat + - name: CompileSharpmake.bat ${{ matrix.configuration }} if: runner.os == 'Windows' shell: cmd run: CompileSharpmake.bat Sharpmake.sln "${{ matrix.configuration }}" "Any CPU" - - name: CompileSharpmake.sh + - name: CompileSharpmake.sh ${{ matrix.configuration }} if: runner.os != 'Windows' shell: bash run: ./CompileSharpmake.sh Sharpmake.sln "${{ matrix.configuration }}" From faf4c0698273e0d2238100eeb5c4778c87701690 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Fri, 12 Feb 2021 15:21:11 +0100 Subject: [PATCH 136/142] Make the bootstrap shell script more similar to the batch one * Add a second optional argument to allow a custom optimization * Use single quotes instead of double --- bootstrap.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index f6f1704a6..31b024708 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,4 +1,8 @@ #!/usr/bin/env bash +# Script arguments: +# %1: Main sharpmake file +# $2: Target(Normally should be Debug or Release) +# if arguments are omitted, defaults to Sharpmake.Main.sharpmake.cs and Debug function success { echo Bootstrap succeeded \! @@ -25,9 +29,11 @@ fi # workaround for https://github.com/mono/mono/issues/6752 TERM=xterm -SHARPMAKE_EXECUTABLE=$CURRENT_DIR/tmp/bin/debug/Sharpmake.Application.exe +SHARPMAKE_OPTIM=${2:-"debug"} -$CURRENT_DIR/CompileSharpmake.sh $CURRENT_DIR/Sharpmake.Application/Sharpmake.Application.csproj Debug AnyCPU +SHARPMAKE_EXECUTABLE=$CURRENT_DIR/tmp/bin/$SHARPMAKE_OPTIM/Sharpmake.Application.exe + +$CURRENT_DIR/CompileSharpmake.sh $CURRENT_DIR/Sharpmake.Application/Sharpmake.Application.csproj $SHARPMAKE_OPTIM AnyCPU if [ $? -ne 0 ]; then echo "The build has failed." if [ -f $SHARPMAKE_EXECUTABLE ]; then @@ -45,7 +51,7 @@ fi SHARPMAKE_MAIN=${1:-"$CURRENT_DIR/Sharpmake.Main.sharpmake.cs"} echo "Generating Sharpmake solution..." -SM_CMD="mono --debug \"${SHARPMAKE_EXECUTABLE}\" \"/sources(\\\"${SHARPMAKE_MAIN}\\\")\" /verbose" +SM_CMD="mono --debug \"${SHARPMAKE_EXECUTABLE}\" \"/sources('${SHARPMAKE_MAIN}') /verbose\"" echo $SM_CMD eval $SM_CMD || error From 403ab34ab58b5604ae4ef8bf7eb760c1bbaa6d85 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Fri, 12 Feb 2021 15:24:45 +0100 Subject: [PATCH 137/142] [GithubActions] Add optimization to bootstrap.sh calls --- .github/workflows/actions.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index c9ffdbe0a..e2ea110ba 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - configuration: [Debug, Release] + configuration: [debug, release] env: DOTNET_CLI_TELEMETRY_OPTOUT: 1 @@ -24,10 +24,10 @@ jobs: shell: cmd run: bootstrap.bat Sharpmake.Main.sharpmake.cs ${{ matrix.configuration }} - - name: Bootstrap.sh + - name: Bootstrap.sh ${{ matrix.configuration }} if: runner.os != 'Windows' shell: bash - run: ./bootstrap.sh + run: ./bootstrap.sh Sharpmake.Main.sharpmake.cs ${{ matrix.configuration }} - name: CompileSharpmake.bat ${{ matrix.configuration }} if: runner.os == 'Windows' From 650bb8fa5da3769786db46b1f0a0c6604c40e231 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Sat, 13 Feb 2021 11:44:58 +0100 Subject: [PATCH 138/142] Make functional tests use vs2019 instead of vs2017 --- .../FastBuildFunctionalTest.sharpmake.cs | 2 +- .../NoAllFastBuildProjectFunctionalTest.sharpmake.cs | 2 +- functional_test.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs b/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs index 162924b95..093155bbf 100644 --- a/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs +++ b/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs @@ -96,7 +96,7 @@ public static ITarget[] GetDefaultTargets() var targets = new List { new Target( Platform.win64, - DevEnv.vs2017, + DevEnv.vs2019, Optimization.Debug | Optimization.Release, Blob.NoBlob, BuildSystem.MSBuild diff --git a/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs b/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs index e39c46c3e..431b48d50 100644 --- a/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs +++ b/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs @@ -24,7 +24,7 @@ public static Target Get() { return new Target( Platform.win64, - DevEnv.vs2017, + DevEnv.vs2019, Optimization.Debug | Optimization.Release ); } diff --git a/functional_test.py b/functional_test.py index 3668fc654..0d8062873 100644 --- a/functional_test.py +++ b/functional_test.py @@ -94,7 +94,7 @@ def verifyCustomBuildEventsInTargetDir(self, targetDir): def verifyCustomBuildEvents(self, projectDir): output_dir = os.path.join(projectDir, self.directory, "projects", "output") - target_dirs = ["debug_fastbuild_noblob_vs2017", "debug_fastbuild_vs2017", "release_fastbuild_noblob_vs2017", "release_fastbuild_vs2017"] + target_dirs = ["debug_fastbuild_noblob_vs2019", "debug_fastbuild_vs2019", "release_fastbuild_noblob_vs2019", "release_fastbuild_vs2019"] for target_dir in target_dirs: target_dir = os.path.join(output_dir, target_dir) From 6cf4626f6e32a4ccab6bfb14519cca3f13fd93b5 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Fri, 12 Feb 2021 16:05:52 +0100 Subject: [PATCH 139/142] [GithubActions] Add functional tests --- .github/workflows/actions.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index e2ea110ba..161098c3a 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -48,3 +48,7 @@ jobs: - name: RegressionTest if: runner.os == 'Windows' run: python regression_test.py + + - name: FunctionalTest + if: runner.os == 'Windows' + run: python functional_test.py From 25a99d478078a6cf5c2fff48992080ea9d1a2cca Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 15 Feb 2021 12:21:28 +0100 Subject: [PATCH 140/142] Formatting --- Sharpmake.Generators/FastBuild/Bff.Util.cs | 60 ++++++------ .../VisualStudio/ProjectOptionsGenerator.cs | 6 +- Sharpmake/FastBuildSettings.cs | 2 +- Sharpmake/Project.Configuration.cs | 2 +- Sharpmake/Target.cs | 92 +++++++++---------- .../HelloLinux.CommonProject.sharpmake.cs | 2 +- .../HelloXCode.CommonProject.sharpmake.cs | 2 +- 7 files changed, 83 insertions(+), 83 deletions(-) diff --git a/Sharpmake.Generators/FastBuild/Bff.Util.cs b/Sharpmake.Generators/FastBuild/Bff.Util.cs index d9f118a93..643e709d6 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Util.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Util.cs @@ -25,22 +25,22 @@ public partial class Bff { public class Unity { - public string UnityName = string.Empty; // Name of unity - public string UnityOutputPath = string.Empty; // Path to output generated Unity files - public string UnityInputPath = FileGeneratorUtilities.RemoveLineTag; // (optional) Path (or paths) to find files - public string UnityInputExcludePath = FileGeneratorUtilities.RemoveLineTag; // (optional) Path (or paths) in which to ignore files - public string UnityInputExcludePattern = FileGeneratorUtilities.RemoveLineTag; // (optional) Wildcard pattern(s) of files/folders to exclude - public string UnityInputPattern = FileGeneratorUtilities.RemoveLineTag; // (optional) Pattern(s) of files to find (default *cpp) - public string UnityInputPathRecurse = FileGeneratorUtilities.RemoveLineTag; // (optional) Recurse when searching for files (default true) - public string UnityInputFiles = FileGeneratorUtilities.RemoveLineTag; // (optional) Explicit list of files to include - public string UnityInputExcludedFiles = FileGeneratorUtilities.RemoveLineTag; // (optional) Explicit list of excluded files (partial, root-relative of full path) - public string UnityInputObjectLists = FileGeneratorUtilities.RemoveLineTag; // (optional) ObjectList(s) to use as input - public string UnityInputIsolateWritableFiles = FileGeneratorUtilities.RemoveLineTag; // (optional) Build writable files individually (default false) + public string UnityName = string.Empty; // Name of unity + public string UnityOutputPath = string.Empty; // Path to output generated Unity files + public string UnityInputPath = FileGeneratorUtilities.RemoveLineTag; // (optional) Path (or paths) to find files + public string UnityInputExcludePath = FileGeneratorUtilities.RemoveLineTag; // (optional) Path (or paths) in which to ignore files + public string UnityInputExcludePattern = FileGeneratorUtilities.RemoveLineTag; // (optional) Wildcard pattern(s) of files/folders to exclude + public string UnityInputPattern = FileGeneratorUtilities.RemoveLineTag; // (optional) Pattern(s) of files to find (default *cpp) + public string UnityInputPathRecurse = FileGeneratorUtilities.RemoveLineTag; // (optional) Recurse when searching for files (default true) + public string UnityInputFiles = FileGeneratorUtilities.RemoveLineTag; // (optional) Explicit list of files to include + public string UnityInputExcludedFiles = FileGeneratorUtilities.RemoveLineTag; // (optional) Explicit list of excluded files (partial, root-relative of full path) + public string UnityInputObjectLists = FileGeneratorUtilities.RemoveLineTag; // (optional) ObjectList(s) to use as input + public string UnityInputIsolateWritableFiles = FileGeneratorUtilities.RemoveLineTag; // (optional) Build writable files individually (default false) public string UnityInputIsolateWritableFilesLimit = FileGeneratorUtilities.RemoveLineTag; // (optional) Disable isolation when many files are writable (default 0) - public string UnityOutputPattern = FileGeneratorUtilities.RemoveLineTag; // (optional) Pattern of output Unity file names (default Unity*cpp) - public string UnityNumFiles = FileGeneratorUtilities.RemoveLineTag; // (optional) Number of Unity files to generate (default 1) - public string UnityPCH = FileGeneratorUtilities.RemoveLineTag; // (optional) Precompiled Header file to add to generated Unity files - public string UseRelativePaths = FileGeneratorUtilities.RemoveLineTag; // (optional) Use relative paths for generated Unity files + public string UnityOutputPattern = FileGeneratorUtilities.RemoveLineTag; // (optional) Pattern of output Unity file names (default Unity*cpp) + public string UnityNumFiles = FileGeneratorUtilities.RemoveLineTag; // (optional) Number of Unity files to generate (default 1) + public string UnityPCH = FileGeneratorUtilities.RemoveLineTag; // (optional) Precompiled Header file to add to generated Unity files + public string UseRelativePaths = FileGeneratorUtilities.RemoveLineTag; // (optional) Use relative paths for generated Unity files public const string DefaultUnityInputPatternExtension = ".cpp"; @@ -81,22 +81,22 @@ public override bool Equals(object obj) private bool Equals(Unity unity) { - return string.Equals(UnityName, unity.UnityName) - && string.Equals(UnityOutputPath, unity.UnityOutputPath) - && string.Equals(UnityInputPath, unity.UnityInputPath) - && string.Equals(UnityInputExcludePath, unity.UnityInputExcludePath) - && string.Equals(UnityInputExcludePattern, unity.UnityInputExcludePattern) - && string.Equals(UnityInputPattern, unity.UnityInputPattern) - && string.Equals(UnityInputPathRecurse, unity.UnityInputPathRecurse) - && string.Equals(UnityInputFiles, unity.UnityInputFiles) - && string.Equals(UnityInputExcludedFiles, unity.UnityInputExcludedFiles) - && string.Equals(UnityInputObjectLists, unity.UnityInputObjectLists) - && string.Equals(UnityInputIsolateWritableFiles, unity.UnityInputIsolateWritableFiles) + return string.Equals(UnityName, unity.UnityName) + && string.Equals(UnityOutputPath, unity.UnityOutputPath) + && string.Equals(UnityInputPath, unity.UnityInputPath) + && string.Equals(UnityInputExcludePath, unity.UnityInputExcludePath) + && string.Equals(UnityInputExcludePattern, unity.UnityInputExcludePattern) + && string.Equals(UnityInputPattern, unity.UnityInputPattern) + && string.Equals(UnityInputPathRecurse, unity.UnityInputPathRecurse) + && string.Equals(UnityInputFiles, unity.UnityInputFiles) + && string.Equals(UnityInputExcludedFiles, unity.UnityInputExcludedFiles) + && string.Equals(UnityInputObjectLists, unity.UnityInputObjectLists) + && string.Equals(UnityInputIsolateWritableFiles, unity.UnityInputIsolateWritableFiles) && string.Equals(UnityInputIsolateWritableFilesLimit, unity.UnityInputIsolateWritableFilesLimit) - && string.Equals(UnityOutputPattern, unity.UnityOutputPattern) - && string.Equals(UnityNumFiles, unity.UnityNumFiles) - && string.Equals(UnityPCH, unity.UnityPCH) - && string.Equals(UseRelativePaths, unity.UseRelativePaths); + && string.Equals(UnityOutputPattern, unity.UnityOutputPattern) + && string.Equals(UnityNumFiles, unity.UnityNumFiles) + && string.Equals(UnityPCH, unity.UnityPCH) + && string.Equals(UseRelativePaths, unity.UseRelativePaths); } } diff --git a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs index 7b1544f52..f63e8193d 100644 --- a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs +++ b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs @@ -376,8 +376,8 @@ private void GenerateCompilerOptions(IGenerationContext context, ProjectOptionsG context.SelectOption ( Options.Option(Options.Vc.Compiler.CLanguageStandard.Legacy, () => { context.Options["LanguageStandard_C"] = FileGeneratorUtilities.RemoveLineTag; context.CommandLineOptions["LanguageStandard_C"] = FileGeneratorUtilities.RemoveLineTag; }), - Options.Option(Options.Vc.Compiler.CLanguageStandard.C11, () => { context.Options["LanguageStandard_C"] = "stdc11"; context.CommandLineOptions["LanguageStandard_C"] = "/std:c11"; }), - Options.Option(Options.Vc.Compiler.CLanguageStandard.C17, () => { context.Options["LanguageStandard_C"] = "stdc17"; context.CommandLineOptions["LanguageStandard_C"] = "/std:c17"; }) + Options.Option(Options.Vc.Compiler.CLanguageStandard.C11, () => { context.Options["LanguageStandard_C"] = "stdc11"; context.CommandLineOptions["LanguageStandard_C"] = "/std:c11"; }), + Options.Option(Options.Vc.Compiler.CLanguageStandard.C17, () => { context.Options["LanguageStandard_C"] = "stdc17"; context.CommandLineOptions["LanguageStandard_C"] = "/std:c17"; }) ); } @@ -1086,7 +1086,7 @@ public static List> ConvertPostBuildCopiesToRelativ relativePostBuildCopies.AddRange(conf.ResolvedTargetCopyFiles.Select(x => new KeyValuePair(x, conf.TargetPath))); relativePostBuildCopies.AddRange(conf.EventPostBuildCopies); relativePostBuildCopies.AddRange(conf.ResolvedTargetCopyFilesToSubDirectory.Select(x => new KeyValuePair(x.Key, Path.Combine(conf.TargetPath, x.Value)))); - + for (int i = 0; i < relativePostBuildCopies.Count;) { string sourceFileFullPath = relativePostBuildCopies[i].Key; diff --git a/Sharpmake/FastBuildSettings.cs b/Sharpmake/FastBuildSettings.cs index cdf4a200e..b5759cb84 100644 --- a/Sharpmake/FastBuildSettings.cs +++ b/Sharpmake/FastBuildSettings.cs @@ -199,6 +199,6 @@ public enum CacheTypes /// /// Additional settings to add to the Compiler node, keyed by compiler name. /// - public static readonly IDictionary> AdditionalCompilerSettings = new Dictionary>(StringComparer.OrdinalIgnoreCase); + public static readonly IDictionary> AdditionalCompilerSettings = new Dictionary>(StringComparer.OrdinalIgnoreCase); } } diff --git a/Sharpmake/Project.Configuration.cs b/Sharpmake/Project.Configuration.cs index bb831466c..3b2943255 100644 --- a/Sharpmake/Project.Configuration.cs +++ b/Sharpmake/Project.Configuration.cs @@ -2866,7 +2866,7 @@ internal void Link(Builder builder) _resolvedTargetDependsFiles.AddRange(dependency.TargetDependsFiles); _resolvedExecDependsFiles.AddRange(dependency.EventPreBuildExe); _resolvedExecDependsFiles.AddRange(dependency.EventPostBuildExe); - + foreach (var keyValuePair in dependency.TargetCopyFilesToSubDirectory) { _resolvedTargetCopyFilesToSubDirectory.Add(keyValuePair); diff --git a/Sharpmake/Target.cs b/Sharpmake/Target.cs index 1c5801a3a..744d0931f 100644 --- a/Sharpmake/Target.cs +++ b/Sharpmake/Target.cs @@ -85,23 +85,23 @@ public enum DevEnv [Fragment, Flags] public enum Platform { - win32 = 1 << 0, - win64 = 1 << 1, - anycpu = 1 << 2, - x360 = 1 << 3, - durango = 1 << 4, - ps3 = 1 << 5, - ps3spu = 1 << 6, - orbis = 1 << 7, - wii = 1 << 8, - wiiu = 1 << 9, - nx = 1 << 10, - nvshield = 1 << 11, - ctr = 1 << 12, - ios = 1 << 13, - android = 1 << 14, - linux = 1 << 15, - mac = 1 << 16, + win32 = 1 << 0, + win64 = 1 << 1, + anycpu = 1 << 2, + x360 = 1 << 3, + durango = 1 << 4, + ps3 = 1 << 5, + ps3spu = 1 << 6, + orbis = 1 << 7, + wii = 1 << 8, + wiiu = 1 << 9, + nx = 1 << 10, + nvshield = 1 << 11, + ctr = 1 << 12, + ios = 1 << 13, + android = 1 << 14, + linux = 1 << 15, + mac = 1 << 16, _reserved9 = 1 << 22, _reserved8 = 1 << 23, @@ -144,37 +144,37 @@ public enum DotNetFramework [Obsolete("Please use at least .net framework 3.5.", error: false)] v3 = v3_5, - v3_5 = 1 << 0, + v3_5 = 1 << 0, v3_5clientprofile = 1 << 1, - v4_0 = 1 << 2, - v4_5 = 1 << 3, - v4_5_1 = 1 << 4, - v4_5_2 = 1 << 5, + v4_0 = 1 << 2, + v4_5 = 1 << 3, + v4_5_1 = 1 << 4, + v4_5_2 = 1 << 5, v4_5clientprofile = 1 << 6, - v4_6 = 1 << 7, - v4_6_1 = 1 << 8, - v4_6_2 = 1 << 9, - v4_7 = 1 << 10, - v4_7_1 = 1 << 11, - v4_7_2 = 1 << 12, - v4_8 = 1 << 13, - netcore1_0 = 1 << 14, - netcore1_1 = 1 << 15, - netcore2_0 = 1 << 16, - netcore2_1 = 1 << 17, - netcore2_2 = 1 << 18, - netcore3_0 = 1 << 19, - netcore3_1 = 1 << 20, - net5_0 = 1 << 21, - netstandard1_0 = 1 << 22, - netstandard1_1 = 1 << 23, - netstandard1_2 = 1 << 24, - netstandard1_3 = 1 << 25, - netstandard1_4 = 1 << 26, - netstandard1_5 = 1 << 27, - netstandard1_6 = 1 << 28, - netstandard2_0 = 1 << 29, - netstandard2_1 = 1 << 30, + v4_6 = 1 << 7, + v4_6_1 = 1 << 8, + v4_6_2 = 1 << 9, + v4_7 = 1 << 10, + v4_7_1 = 1 << 11, + v4_7_2 = 1 << 12, + v4_8 = 1 << 13, + netcore1_0 = 1 << 14, + netcore1_1 = 1 << 15, + netcore2_0 = 1 << 16, + netcore2_1 = 1 << 17, + netcore2_2 = 1 << 18, + netcore3_0 = 1 << 19, + netcore3_1 = 1 << 20, + net5_0 = 1 << 21, + netstandard1_0 = 1 << 22, + netstandard1_1 = 1 << 23, + netstandard1_2 = 1 << 24, + netstandard1_3 = 1 << 25, + netstandard1_4 = 1 << 26, + netstandard1_5 = 1 << 27, + netstandard1_6 = 1 << 28, + netstandard2_0 = 1 << 29, + netstandard2_1 = 1 << 30, [CompositeFragment] all_netframework = v3_5 | v3_5clientprofile | v4_0 | v4_5 | v4_5_1 | v4_5_2 | v4_5clientprofile | v4_6 | v4_6_1 | v4_6_2 | v4_7 | v4_7_1 | v4_7_2 | v4_8, diff --git a/samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs b/samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs index 836bdbf29..cf514a6bf 100644 --- a/samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs +++ b/samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs @@ -61,7 +61,7 @@ public virtual void ConfigureAll(Configuration conf, CommonTarget target) // different names per configurations to work properly... //conf.TargetFileName += "_" + target.Optimization.ToString().ToLowerInvariant().First(); // suffix with lowered first letter of optim //if (conf.IsFastBuild) - //conf.TargetFileName += "x"; + //conf.TargetFileName += "x"; conf.Output = Configuration.OutputType.Lib; // defaults to creating static libs } diff --git a/samples/HelloXCode/HelloXCode.CommonProject.sharpmake.cs b/samples/HelloXCode/HelloXCode.CommonProject.sharpmake.cs index 338162e78..8543868df 100644 --- a/samples/HelloXCode/HelloXCode.CommonProject.sharpmake.cs +++ b/samples/HelloXCode/HelloXCode.CommonProject.sharpmake.cs @@ -61,7 +61,7 @@ public virtual void ConfigureAll(Configuration conf, CommonTarget target) // different names per configurations to work properly... //conf.TargetFileName += "_" + target.Optimization.ToString().ToLowerInvariant().First(); // suffix with lowered first letter of optim //if (conf.IsFastBuild) - //conf.TargetFileName += "x"; + //conf.TargetFileName += "x"; conf.Output = Configuration.OutputType.Lib; // defaults to creating static libs } From 0cf74c3d5caa915f2c5218a0fba5cefe956f62ac Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 15 Feb 2021 13:45:08 +0100 Subject: [PATCH 141/142] Update headers with proper copyright year/range when file was created/changed. --- Sharpmake.Application/CommandLineArguments.cs | 2 +- Sharpmake.Application/Program.cs | 2 +- Sharpmake.Application/Properties/AssemblyInfo.cs | 2 +- .../FastBuildFunctionalTest.sharpmake.cs | 2 +- .../NoAllFastBuildProjectFunctionalTest.sharpmake.cs | 2 +- Sharpmake.Generators/Apple/XCWorkspace.Template.cs | 2 +- Sharpmake.Generators/Apple/XCWorkspace.cs | 2 +- Sharpmake.Generators/Apple/XCode.Util.cs | 2 +- Sharpmake.Generators/Apple/XCodeProj.Template.cs | 2 +- Sharpmake.Generators/Apple/XCodeProj.cs | 2 +- Sharpmake.Generators/CompilerSettings.cs | 2 +- Sharpmake.Generators/FastBuild/Bff.Template.cs | 2 +- Sharpmake.Generators/FastBuild/Bff.Util.cs | 2 +- Sharpmake.Generators/FastBuild/Bff.cs | 2 +- Sharpmake.Generators/FastBuild/IBffGenerationContext.cs | 2 +- Sharpmake.Generators/FastBuild/IPlatformBff.cs | 2 +- Sharpmake.Generators/FastBuild/MasterBff.cs | 2 +- Sharpmake.Generators/FileGenerator.cs | 2 +- Sharpmake.Generators/GeneratorManager.cs | 2 +- Sharpmake.Generators/Generic/JsonCompilationDatabase.cs | 2 +- Sharpmake.Generators/Generic/MakeApplication.Template.cs | 2 +- Sharpmake.Generators/Generic/MakeApplication.cs | 2 +- Sharpmake.Generators/Generic/MakeProject.Template.cs | 2 +- Sharpmake.Generators/Generic/MakeProject.cs | 2 +- Sharpmake.Generators/Generic/Makefile.Template.cs | 2 +- Sharpmake.Generators/Generic/Makefile.cs | 2 +- Sharpmake.Generators/IGenerationContext.cs | 2 +- Sharpmake.Generators/Properties/AssemblyInfo.cs | 2 +- Sharpmake.Generators/VisualStudio/Androidproj.Template.cs | 2 +- Sharpmake.Generators/VisualStudio/Androidproj.cs | 2 +- Sharpmake.Generators/VisualStudio/Csproj.Template.cs | 2 +- Sharpmake.Generators/VisualStudio/Csproj.cs | 2 +- Sharpmake.Generators/VisualStudio/IPlatformVcxproj.cs | 2 +- Sharpmake.Generators/VisualStudio/IVcxprojGenerationContext.cs | 2 +- Sharpmake.Generators/VisualStudio/PackagesConfig.Template.cs | 2 +- Sharpmake.Generators/VisualStudio/PackagesConfig.cs | 2 +- Sharpmake.Generators/VisualStudio/ProjectJson.Template.cs | 2 +- Sharpmake.Generators/VisualStudio/ProjectJson.cs | 2 +- Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs | 2 +- Sharpmake.Generators/VisualStudio/Pyproj.Template.cs | 2 +- Sharpmake.Generators/VisualStudio/Pyproj.cs | 2 +- Sharpmake.Generators/VisualStudio/Sln.Template.cs | 2 +- Sharpmake.Generators/VisualStudio/Sln.cs | 2 +- Sharpmake.Generators/VisualStudio/UserFile.cs | 2 +- Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs | 2 +- Sharpmake.Generators/VisualStudio/Vcxproj.cs | 2 +- Sharpmake.Generators/VisualStudio/VsProjCommon.Template.cs | 2 +- Sharpmake.Generators/VisualStudio/VsProjCommon.cs | 2 +- Sharpmake.Generators/VisualStudio/VsUtil.cs | 2 +- Sharpmake.Generators/XmlFileGenerator.cs | 2 +- .../Sharpmake.CommonPlatforms/Android/AndroidBuildTargets.cs | 2 +- .../Android/AndroidPlatform.Vcxproj.Template.cs | 2 +- .../Sharpmake.CommonPlatforms/Android/AndroidPlatform.cs | 2 +- .../Sharpmake.CommonPlatforms/Android/GlobalSettings.cs | 2 +- Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/Util.cs | 2 +- .../Apple/BaseApplePlatform.Bff.Template.cs | 2 +- .../Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs | 2 +- .../Sharpmake.CommonPlatforms/Apple/MacOsPlatform.cs | 2 +- .../Sharpmake.CommonPlatforms/Apple/iOsPlatform.Bff.Template.cs | 2 +- .../Sharpmake.CommonPlatforms/Apple/iOsPlatform.cs | 2 +- .../BaseMicrosoftPlatform.Vcxproj.Template.cs | 2 +- .../Sharpmake.CommonPlatforms/BaseMicrosoftPlatform.cs | 2 +- .../Sharpmake.CommonPlatforms/BasePlatform.Vcxproj.Template.cs | 2 +- Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.cs | 2 +- .../Sharpmake.CommonPlatforms/DefaultPlatform.cs | 2 +- .../Sharpmake.CommonPlatforms/Linux/GlobalSettings.cs | 2 +- .../Sharpmake.CommonPlatforms/Linux/LinuxOptions.cs | 2 +- .../Linux/LinuxPlatform.Bff.Template.cs | 2 +- .../Linux/LinuxPlatform.Vcxproj.Template.cs | 2 +- .../Sharpmake.CommonPlatforms/Linux/LinuxPlatform.cs | 2 +- .../Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs | 2 +- .../Sharpmake.CommonPlatforms/Windows/BaseWindowsPlatform.cs | 2 +- .../Windows/ClangForWindowsSettings.cs | 2 +- .../Sharpmake.CommonPlatforms/Windows/Win32Platform.cs | 2 +- .../Sharpmake.CommonPlatforms/Windows/Win64Platform.cs | 2 +- .../Sharpmake.NvShield/NvShieldPlatform.Vcxproj.Template.cs | 2 +- Sharpmake.Platforms/Sharpmake.NvShield/NvShieldPlatform.cs | 2 +- .../Sharpmake.NvShield/Properties/AssemblyInfo.cs | 2 +- Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs | 2 +- .../Sharpmake.X360/X360Platform.Vcxproj.Template.cs | 2 +- Sharpmake.Platforms/Sharpmake.X360/X360Platform.cs | 2 +- Sharpmake.UnitTests/CSharpDependencyPropagationTest.cs | 2 +- Sharpmake.UnitTests/CommandLineTest.cs | 2 +- Sharpmake.UnitTests/ConfigureAttributesTest.cs | 2 +- Sharpmake.UnitTests/DependencyPropagationTest.cs | 2 +- Sharpmake.UnitTests/DotNetReferenceCollectionTest.cs | 2 +- Sharpmake.UnitTests/JsonSerializerTest.cs | 2 +- Sharpmake.UnitTests/KitsRootPathsTests.cs | 2 +- Sharpmake.UnitTests/OrderableStringsTests.cs | 2 +- Sharpmake.UnitTests/PackageReferencesTest.cs | 2 +- Sharpmake.UnitTests/ResolverTest.cs | 2 +- Sharpmake.UnitTests/SharpmakeFileParserTest.cs | 2 +- Sharpmake.UnitTests/StringsTests.cs | 2 +- Sharpmake.UnitTests/TargetTests.cs | 2 +- Sharpmake.UnitTests/TestProjectBuilder.cs | 2 +- Sharpmake.UnitTests/UniqueListTests.cs | 2 +- Sharpmake.UnitTests/UtilTest.cs | 2 +- Sharpmake/Analyzer/Analyzer.cs | 2 +- Sharpmake/Assembler.cs | 2 +- Sharpmake/AttributeParsers.cs | 2 +- Sharpmake/Attributes.cs | 2 +- Sharpmake/BuildContext/BaseBuildContext.cs | 2 +- Sharpmake/BuildContext/ConfigureDependencyAnalyzer.cs | 2 +- Sharpmake/BuildContext/RegressionTest.cs | 2 +- Sharpmake/Builder.cs | 2 +- Sharpmake/BuilderExtension.cs | 2 +- Sharpmake/CommandLine.cs | 2 +- Sharpmake/Configurable.cs | 2 +- Sharpmake/ConfigureCollection.cs | 2 +- Sharpmake/DebugProjectGenerator.cs | 2 +- Sharpmake/DependencyTracker.cs | 2 +- Sharpmake/DotNetReferenceCollection.cs | 2 +- Sharpmake/EnumExtensions.cs | 2 +- Sharpmake/Exception.cs | 2 +- Sharpmake/ExtensionLoader.cs | 2 +- Sharpmake/ExtensionMethods.cs | 2 +- Sharpmake/FakeFileTree.cs | 2 +- Sharpmake/FastBuildSettings.cs | 2 +- Sharpmake/FileSystemStringComparer.cs | 2 +- Sharpmake/GeneratedAssemblyConfig.cs | 2 +- Sharpmake/GeneratorManager.cs | 2 +- Sharpmake/IAssemblerContext.cs | 2 +- Sharpmake/IFastBuildCompilerSettings.cs | 2 +- Sharpmake/IPlatformDescriptor.cs | 2 +- Sharpmake/IResolverHelper.cs | 2 +- Sharpmake/IWindowsFastBuildCompilerSettings.cs | 2 +- Sharpmake/KitsRootPaths.cs | 2 +- Sharpmake/MSBuildGlobalSettings.cs | 2 +- Sharpmake/Options.Android.cs | 2 +- Sharpmake/Options.CSharp.cs | 2 +- Sharpmake/Options.Clang.cs | 2 +- Sharpmake/Options.Makefile.cs | 2 +- Sharpmake/Options.Vc.cs | 2 +- Sharpmake/Options.XCode.cs | 2 +- Sharpmake/Options.cs | 2 +- Sharpmake/PackageReferences.Template.cs | 2 +- Sharpmake/PackageReferences.cs | 2 +- Sharpmake/PlatformAttributes.cs | 2 +- Sharpmake/PlatformExceptions.cs | 2 +- Sharpmake/PlatformRegistry.cs | 2 +- Sharpmake/PreprocessorConditionParser.cs | 2 +- Sharpmake/Project.Configuration.cs | 2 +- Sharpmake/Project.cs | 2 +- Sharpmake/Properties/AssemblyInfo.cs | 2 +- Sharpmake/ReferenceAlias.cs | 2 +- Sharpmake/RegexCache.cs | 2 +- Sharpmake/Resolver.cs | 2 +- Sharpmake/SharpmakeExtension.cs | 2 +- Sharpmake/Solution.Configuration.cs | 2 +- Sharpmake/Solution.cs | 2 +- Sharpmake/SourceAttributeParser.cs | 2 +- Sharpmake/Strings.cs | 2 +- Sharpmake/Target.cs | 2 +- Sharpmake/TrackedConfiguration.cs | 2 +- Sharpmake/TrackedProject.cs | 2 +- Sharpmake/UniqueList.cs | 2 +- Sharpmake/Util.cs | 2 +- samples/CPPCLI/CLRTest.sharpmake.cs | 2 +- samples/CPPCLI/Properties/AssemblyInfo.cs | 2 +- .../CPPCLI/codebase/OtherCSharpProj/Properties/AssemblyInfo.cs | 2 +- .../codebase/TestCSharpConsole/Properties/AssemblyInfo.cs | 2 +- samples/CPPCLI/projects.sharpmake.cs | 2 +- samples/CSharpHelloWorld/HelloWorld.sharpmake.cs | 2 +- .../codebase/HelloWorld/Properties/AssemblyInfo.cs | 2 +- samples/CSharpHelloWorld/common.sharpmake.cs | 2 +- samples/CSharpImports/CSharpImports.sharpmake.cs | 2 +- .../codebase/CSharpImports/Properties/AssemblyInfo.cs | 2 +- samples/CSharpImports/common.sharpmake.cs | 2 +- samples/CSharpVsix/CSharpVsix.sharpmake.cs | 2 +- .../CSharpVsix/codebase/CSharpVsix/Properties/AssemblyInfo.cs | 2 +- samples/CSharpVsix/common.sharpmake.cs | 2 +- samples/CSharpWCF/CSharpWCF.sharpmake.cs | 2 +- samples/CSharpWCF/codebase/CSharpWCF/Properties/AssemblyInfo.cs | 2 +- .../CSharpWCF/codebase/CSharpWCFApp/Properties/AssemblyInfo.cs | 2 +- samples/CSharpWCF/common.sharpmake.cs | 2 +- .../CompileCommandDatabase/CompileCommandDatabase.sharpmake.cs | 2 +- samples/ConfigureOrder/ConfigureOrdering.sharpmake.cs | 2 +- samples/ConfigureOrder/Properties/AssemblyInfo.cs | 2 +- samples/ConfigureOrder/Util.sharpmake.cs | 2 +- samples/ConfigureOrder/main.sharpmake.cs | 2 +- .../FastBuildSimpleExecutable.sharpmake.cs | 2 +- samples/FastBuildSimpleExecutable/Properties/AssemblyInfo.cs | 2 +- samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs | 2 +- samples/HelloLinux/HelloLinux.CommonSolution.sharpmake.cs | 2 +- samples/HelloLinux/HelloLinux.CommonTarget.sharpmake.cs | 2 +- samples/HelloLinux/HelloLinux.Main.sharpmake.cs | 2 +- samples/HelloLinux/Properties/AssemblyInfo.cs | 2 +- samples/HelloLinux/codebase/HelloXCode.sharpmake.cs | 2 +- samples/HelloLinux/codebase/dll1/dll1.sharpmake.cs | 2 +- samples/HelloLinux/codebase/exe/exe.sharpmake.cs | 2 +- .../HelloLinux/codebase/static lib2/static_lib2.sharpmake.cs | 2 +- .../HelloLinux/codebase/static_lib1/static_lib1.sharpmake.cs | 2 +- samples/HelloWorld/HelloWorld.sharpmake.cs | 2 +- samples/HelloWorld/Properties/AssemblyInfo.cs | 2 +- samples/HelloXCode/HelloXCode.CommonProject.sharpmake.cs | 2 +- samples/HelloXCode/HelloXCode.CommonSolution.sharpmake.cs | 2 +- samples/HelloXCode/HelloXCode.CommonTarget.sharpmake.cs | 2 +- samples/HelloXCode/HelloXCode.Main.sharpmake.cs | 2 +- samples/HelloXCode/Properties/AssemblyInfo.cs | 2 +- samples/HelloXCode/codebase/HelloXCode.sharpmake.cs | 2 +- samples/HelloXCode/codebase/dll1/dll1.sharpmake.cs | 2 +- samples/HelloXCode/codebase/exe/exe.sharpmake.cs | 2 +- .../HelloXCode/codebase/static lib2/static_lib2.sharpmake.cs | 2 +- .../HelloXCode/codebase/static_lib1/static_lib1.sharpmake.cs | 2 +- .../DotNetCoreFrameworkHelloWorld/HelloWorld.sharpmake.cs | 2 +- .../NetCore/DotNetFrameworkHelloWorld/HelloWorld.sharpmake.cs | 2 +- .../DotNetMultiFrameworksHelloWorld/HelloWorld.sharpmake.cs | 2 +- samples/PackageReferences/PackageReferences.sharpmake.cs | 2 +- .../codebase/PackageReferences/Properties/AssemblyInfo.cs | 2 +- samples/QTFileCustomBuild/QTFileCustomBuild.sharpmake.cs | 2 +- samples/SimpleExeLibDependency/LibStuff.sharpmake.cs | 2 +- .../SimpleExeLibDependency/SimpleExeLibDependency.sharpmake.cs | 2 +- 212 files changed, 212 insertions(+), 212 deletions(-) diff --git a/Sharpmake.Application/CommandLineArguments.cs b/Sharpmake.Application/CommandLineArguments.cs index ec25d3d9f..6d9473b3f 100644 --- a/Sharpmake.Application/CommandLineArguments.cs +++ b/Sharpmake.Application/CommandLineArguments.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Application/Program.cs b/Sharpmake.Application/Program.cs index 87185f12c..1c009730f 100644 --- a/Sharpmake.Application/Program.cs +++ b/Sharpmake.Application/Program.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Application/Properties/AssemblyInfo.cs b/Sharpmake.Application/Properties/AssemblyInfo.cs index 60e484e97..3bd54155a 100644 --- a/Sharpmake.Application/Properties/AssemblyInfo.cs +++ b/Sharpmake.Application/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs b/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs index 093155bbf..280fbc211 100644 --- a/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs +++ b/Sharpmake.FunctionalTests/FastBuildFunctionalTest/FastBuildFunctionalTest.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2019-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs b/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs index 431b48d50..dbf338dd2 100644 --- a/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs +++ b/Sharpmake.FunctionalTests/NoAllFastBuildProjectFunctionalTest/NoAllFastBuildProjectFunctionalTest.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Apple/XCWorkspace.Template.cs b/Sharpmake.Generators/Apple/XCWorkspace.Template.cs index b8081f41d..d079dc7a6 100644 --- a/Sharpmake.Generators/Apple/XCWorkspace.Template.cs +++ b/Sharpmake.Generators/Apple/XCWorkspace.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Apple/XCWorkspace.cs b/Sharpmake.Generators/Apple/XCWorkspace.cs index c163440e4..f90b16047 100644 --- a/Sharpmake.Generators/Apple/XCWorkspace.cs +++ b/Sharpmake.Generators/Apple/XCWorkspace.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Apple/XCode.Util.cs b/Sharpmake.Generators/Apple/XCode.Util.cs index 6b0bb0c47..ded1c4122 100644 --- a/Sharpmake.Generators/Apple/XCode.Util.cs +++ b/Sharpmake.Generators/Apple/XCode.Util.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Apple/XCodeProj.Template.cs b/Sharpmake.Generators/Apple/XCodeProj.Template.cs index bf8655774..8caca1a15 100644 --- a/Sharpmake.Generators/Apple/XCodeProj.Template.cs +++ b/Sharpmake.Generators/Apple/XCodeProj.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Apple/XCodeProj.cs b/Sharpmake.Generators/Apple/XCodeProj.cs index 21e8ae45f..49e94d460 100644 --- a/Sharpmake.Generators/Apple/XCodeProj.cs +++ b/Sharpmake.Generators/Apple/XCodeProj.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/CompilerSettings.cs b/Sharpmake.Generators/CompilerSettings.cs index 0075d7078..d9c674661 100644 --- a/Sharpmake.Generators/CompilerSettings.cs +++ b/Sharpmake.Generators/CompilerSettings.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/FastBuild/Bff.Template.cs b/Sharpmake.Generators/FastBuild/Bff.Template.cs index 51d43227e..bb4ebbaea 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Template.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/FastBuild/Bff.Util.cs b/Sharpmake.Generators/FastBuild/Bff.Util.cs index 643e709d6..dfaddb241 100644 --- a/Sharpmake.Generators/FastBuild/Bff.Util.cs +++ b/Sharpmake.Generators/FastBuild/Bff.Util.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/FastBuild/Bff.cs b/Sharpmake.Generators/FastBuild/Bff.cs index 89ae3ef21..f143f0246 100644 --- a/Sharpmake.Generators/FastBuild/Bff.cs +++ b/Sharpmake.Generators/FastBuild/Bff.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/FastBuild/IBffGenerationContext.cs b/Sharpmake.Generators/FastBuild/IBffGenerationContext.cs index 0b6aff8d3..4ac9d5202 100644 --- a/Sharpmake.Generators/FastBuild/IBffGenerationContext.cs +++ b/Sharpmake.Generators/FastBuild/IBffGenerationContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/FastBuild/IPlatformBff.cs b/Sharpmake.Generators/FastBuild/IPlatformBff.cs index 9d30a19db..d42a67d76 100644 --- a/Sharpmake.Generators/FastBuild/IPlatformBff.cs +++ b/Sharpmake.Generators/FastBuild/IPlatformBff.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/FastBuild/MasterBff.cs b/Sharpmake.Generators/FastBuild/MasterBff.cs index c304eb657..ec0f9d94a 100644 --- a/Sharpmake.Generators/FastBuild/MasterBff.cs +++ b/Sharpmake.Generators/FastBuild/MasterBff.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/FileGenerator.cs b/Sharpmake.Generators/FileGenerator.cs index d57c13c8e..9687aee8c 100644 --- a/Sharpmake.Generators/FileGenerator.cs +++ b/Sharpmake.Generators/FileGenerator.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/GeneratorManager.cs b/Sharpmake.Generators/GeneratorManager.cs index 965de138a..76e5f6a50 100644 --- a/Sharpmake.Generators/GeneratorManager.cs +++ b/Sharpmake.Generators/GeneratorManager.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Generic/JsonCompilationDatabase.cs b/Sharpmake.Generators/Generic/JsonCompilationDatabase.cs index 9c6e90156..cc8ccf989 100644 --- a/Sharpmake.Generators/Generic/JsonCompilationDatabase.cs +++ b/Sharpmake.Generators/Generic/JsonCompilationDatabase.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Generic/MakeApplication.Template.cs b/Sharpmake.Generators/Generic/MakeApplication.Template.cs index 93e57ca57..1a224671f 100644 --- a/Sharpmake.Generators/Generic/MakeApplication.Template.cs +++ b/Sharpmake.Generators/Generic/MakeApplication.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Generic/MakeApplication.cs b/Sharpmake.Generators/Generic/MakeApplication.cs index da13a4acc..1da9f6acb 100644 --- a/Sharpmake.Generators/Generic/MakeApplication.cs +++ b/Sharpmake.Generators/Generic/MakeApplication.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Generic/MakeProject.Template.cs b/Sharpmake.Generators/Generic/MakeProject.Template.cs index 71b367ad0..6402074e7 100644 --- a/Sharpmake.Generators/Generic/MakeProject.Template.cs +++ b/Sharpmake.Generators/Generic/MakeProject.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Generic/MakeProject.cs b/Sharpmake.Generators/Generic/MakeProject.cs index 349f50547..6f494e99d 100644 --- a/Sharpmake.Generators/Generic/MakeProject.cs +++ b/Sharpmake.Generators/Generic/MakeProject.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Generic/Makefile.Template.cs b/Sharpmake.Generators/Generic/Makefile.Template.cs index 6493c7cdb..0e249d888 100644 --- a/Sharpmake.Generators/Generic/Makefile.Template.cs +++ b/Sharpmake.Generators/Generic/Makefile.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Generic/Makefile.cs b/Sharpmake.Generators/Generic/Makefile.cs index b621ceb95..190a045fb 100644 --- a/Sharpmake.Generators/Generic/Makefile.cs +++ b/Sharpmake.Generators/Generic/Makefile.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/IGenerationContext.cs b/Sharpmake.Generators/IGenerationContext.cs index 74572a476..95b0cd61a 100644 --- a/Sharpmake.Generators/IGenerationContext.cs +++ b/Sharpmake.Generators/IGenerationContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/Properties/AssemblyInfo.cs b/Sharpmake.Generators/Properties/AssemblyInfo.cs index 335613bde..c9847e101 100644 --- a/Sharpmake.Generators/Properties/AssemblyInfo.cs +++ b/Sharpmake.Generators/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/Androidproj.Template.cs b/Sharpmake.Generators/VisualStudio/Androidproj.Template.cs index 08f7ba4c5..8480cde56 100644 --- a/Sharpmake.Generators/VisualStudio/Androidproj.Template.cs +++ b/Sharpmake.Generators/VisualStudio/Androidproj.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/Androidproj.cs b/Sharpmake.Generators/VisualStudio/Androidproj.cs index e04e89b98..ce181636e 100644 --- a/Sharpmake.Generators/VisualStudio/Androidproj.cs +++ b/Sharpmake.Generators/VisualStudio/Androidproj.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/Csproj.Template.cs b/Sharpmake.Generators/VisualStudio/Csproj.Template.cs index 947d0941f..a75d464b2 100644 --- a/Sharpmake.Generators/VisualStudio/Csproj.Template.cs +++ b/Sharpmake.Generators/VisualStudio/Csproj.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/Csproj.cs b/Sharpmake.Generators/VisualStudio/Csproj.cs index 1887f9457..32547f05e 100644 --- a/Sharpmake.Generators/VisualStudio/Csproj.cs +++ b/Sharpmake.Generators/VisualStudio/Csproj.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/IPlatformVcxproj.cs b/Sharpmake.Generators/VisualStudio/IPlatformVcxproj.cs index 11ba20137..8105ee3df 100644 --- a/Sharpmake.Generators/VisualStudio/IPlatformVcxproj.cs +++ b/Sharpmake.Generators/VisualStudio/IPlatformVcxproj.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/IVcxprojGenerationContext.cs b/Sharpmake.Generators/VisualStudio/IVcxprojGenerationContext.cs index 883853d60..83ad49467 100644 --- a/Sharpmake.Generators/VisualStudio/IVcxprojGenerationContext.cs +++ b/Sharpmake.Generators/VisualStudio/IVcxprojGenerationContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/PackagesConfig.Template.cs b/Sharpmake.Generators/VisualStudio/PackagesConfig.Template.cs index 292546f8e..6e6935cb1 100644 --- a/Sharpmake.Generators/VisualStudio/PackagesConfig.Template.cs +++ b/Sharpmake.Generators/VisualStudio/PackagesConfig.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/PackagesConfig.cs b/Sharpmake.Generators/VisualStudio/PackagesConfig.cs index f07e94a8f..681d2a9e1 100644 --- a/Sharpmake.Generators/VisualStudio/PackagesConfig.cs +++ b/Sharpmake.Generators/VisualStudio/PackagesConfig.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/ProjectJson.Template.cs b/Sharpmake.Generators/VisualStudio/ProjectJson.Template.cs index d774b7244..e926a0071 100644 --- a/Sharpmake.Generators/VisualStudio/ProjectJson.Template.cs +++ b/Sharpmake.Generators/VisualStudio/ProjectJson.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/ProjectJson.cs b/Sharpmake.Generators/VisualStudio/ProjectJson.cs index d400f5793..a4a09c67d 100644 --- a/Sharpmake.Generators/VisualStudio/ProjectJson.cs +++ b/Sharpmake.Generators/VisualStudio/ProjectJson.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs index f63e8193d..b43eb45d8 100644 --- a/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs +++ b/Sharpmake.Generators/VisualStudio/ProjectOptionsGenerator.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/Pyproj.Template.cs b/Sharpmake.Generators/VisualStudio/Pyproj.Template.cs index f517d354a..130646ead 100644 --- a/Sharpmake.Generators/VisualStudio/Pyproj.Template.cs +++ b/Sharpmake.Generators/VisualStudio/Pyproj.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/Pyproj.cs b/Sharpmake.Generators/VisualStudio/Pyproj.cs index f911c3af3..ca92978e1 100644 --- a/Sharpmake.Generators/VisualStudio/Pyproj.cs +++ b/Sharpmake.Generators/VisualStudio/Pyproj.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/Sln.Template.cs b/Sharpmake.Generators/VisualStudio/Sln.Template.cs index 2ec5e7e03..ea38f8d70 100644 --- a/Sharpmake.Generators/VisualStudio/Sln.Template.cs +++ b/Sharpmake.Generators/VisualStudio/Sln.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/Sln.cs b/Sharpmake.Generators/VisualStudio/Sln.cs index 41b1eb926..9f60c9897 100644 --- a/Sharpmake.Generators/VisualStudio/Sln.cs +++ b/Sharpmake.Generators/VisualStudio/Sln.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/UserFile.cs b/Sharpmake.Generators/VisualStudio/UserFile.cs index 1c1f7a11f..a9d6347c5 100644 --- a/Sharpmake.Generators/VisualStudio/UserFile.cs +++ b/Sharpmake.Generators/VisualStudio/UserFile.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs b/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs index 6301be311..314315129 100644 --- a/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs +++ b/Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/Vcxproj.cs b/Sharpmake.Generators/VisualStudio/Vcxproj.cs index 09e7596ae..b2907c2fd 100644 --- a/Sharpmake.Generators/VisualStudio/Vcxproj.cs +++ b/Sharpmake.Generators/VisualStudio/Vcxproj.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/VsProjCommon.Template.cs b/Sharpmake.Generators/VisualStudio/VsProjCommon.Template.cs index 537141a9d..8c75e5006 100644 --- a/Sharpmake.Generators/VisualStudio/VsProjCommon.Template.cs +++ b/Sharpmake.Generators/VisualStudio/VsProjCommon.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/VsProjCommon.cs b/Sharpmake.Generators/VisualStudio/VsProjCommon.cs index 3afcf3edb..93e06eec7 100644 --- a/Sharpmake.Generators/VisualStudio/VsProjCommon.cs +++ b/Sharpmake.Generators/VisualStudio/VsProjCommon.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/VisualStudio/VsUtil.cs b/Sharpmake.Generators/VisualStudio/VsUtil.cs index 6ec2ba595..703a93efc 100644 --- a/Sharpmake.Generators/VisualStudio/VsUtil.cs +++ b/Sharpmake.Generators/VisualStudio/VsUtil.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Generators/XmlFileGenerator.cs b/Sharpmake.Generators/XmlFileGenerator.cs index adc31353b..733129f1a 100644 --- a/Sharpmake.Generators/XmlFileGenerator.cs +++ b/Sharpmake.Generators/XmlFileGenerator.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/AndroidBuildTargets.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/AndroidBuildTargets.cs index 4003a2da3..c17151a4d 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/AndroidBuildTargets.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/AndroidBuildTargets.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/AndroidPlatform.Vcxproj.Template.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/AndroidPlatform.Vcxproj.Template.cs index 164590324..dc9ee02ee 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/AndroidPlatform.Vcxproj.Template.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/AndroidPlatform.Vcxproj.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/AndroidPlatform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/AndroidPlatform.cs index e5617a203..f712b76d8 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/AndroidPlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/AndroidPlatform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/GlobalSettings.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/GlobalSettings.cs index 6c4d14eed..fa4828b96 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/GlobalSettings.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/GlobalSettings.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/Util.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/Util.cs index 8fc19d458..baea9d852 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/Util.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Android/Util.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.Bff.Template.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.Bff.Template.cs index 7b22e8765..9f5be0327 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.Bff.Template.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.Bff.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs index 0a0e8bc03..dd45aefa7 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/BaseApplePlatform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/MacOsPlatform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/MacOsPlatform.cs index 92a77257d..acf4a6c7b 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/MacOsPlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/MacOsPlatform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/iOsPlatform.Bff.Template.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/iOsPlatform.Bff.Template.cs index bc08701af..44274c8c6 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/iOsPlatform.Bff.Template.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/iOsPlatform.Bff.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/iOsPlatform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/iOsPlatform.cs index ca0625516..e2cad64df 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/iOsPlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Apple/iOsPlatform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BaseMicrosoftPlatform.Vcxproj.Template.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BaseMicrosoftPlatform.Vcxproj.Template.cs index 573f8aad1..b2bcd79e3 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BaseMicrosoftPlatform.Vcxproj.Template.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BaseMicrosoftPlatform.Vcxproj.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BaseMicrosoftPlatform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BaseMicrosoftPlatform.cs index 731519711..736ec5fa9 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BaseMicrosoftPlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BaseMicrosoftPlatform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.Vcxproj.Template.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.Vcxproj.Template.cs index 088e122f0..3094672e2 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.Vcxproj.Template.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.Vcxproj.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.cs index e38896720..6a6bec12f 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/BasePlatform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/DefaultPlatform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/DefaultPlatform.cs index c8f8d7fb7..667845d74 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/DefaultPlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/DefaultPlatform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/GlobalSettings.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/GlobalSettings.cs index 4284eb1e8..ee713fb32 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/GlobalSettings.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/GlobalSettings.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxOptions.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxOptions.cs index bda228bdd..fd0191a30 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxOptions.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.Bff.Template.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.Bff.Template.cs index 87182b277..98c477f36 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.Bff.Template.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.Bff.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.Vcxproj.Template.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.Vcxproj.Template.cs index e3240e12f..bea0237fd 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.Vcxproj.Template.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.Vcxproj.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.cs index 11bd958de..8998d3587 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Linux/LinuxPlatform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs index 472226d47..03c9173a1 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/BaseWindowsPlatform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/BaseWindowsPlatform.cs index 0ac5eb9be..0100d8053 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/BaseWindowsPlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/BaseWindowsPlatform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/ClangForWindowsSettings.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/ClangForWindowsSettings.cs index 12167f3e0..7393e1d9e 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/ClangForWindowsSettings.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/ClangForWindowsSettings.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/Win32Platform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/Win32Platform.cs index 9c837ff68..11423258f 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/Win32Platform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/Win32Platform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/Win64Platform.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/Win64Platform.cs index 1a0205e80..49df27317 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/Win64Platform.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Windows/Win64Platform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.NvShield/NvShieldPlatform.Vcxproj.Template.cs b/Sharpmake.Platforms/Sharpmake.NvShield/NvShieldPlatform.Vcxproj.Template.cs index 682b15e28..234dae049 100644 --- a/Sharpmake.Platforms/Sharpmake.NvShield/NvShieldPlatform.Vcxproj.Template.cs +++ b/Sharpmake.Platforms/Sharpmake.NvShield/NvShieldPlatform.Vcxproj.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.NvShield/NvShieldPlatform.cs b/Sharpmake.Platforms/Sharpmake.NvShield/NvShieldPlatform.cs index 783621c60..601103b13 100644 --- a/Sharpmake.Platforms/Sharpmake.NvShield/NvShieldPlatform.cs +++ b/Sharpmake.Platforms/Sharpmake.NvShield/NvShieldPlatform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.NvShield/Properties/AssemblyInfo.cs b/Sharpmake.Platforms/Sharpmake.NvShield/Properties/AssemblyInfo.cs index a1db522d1..8c92538f7 100644 --- a/Sharpmake.Platforms/Sharpmake.NvShield/Properties/AssemblyInfo.cs +++ b/Sharpmake.Platforms/Sharpmake.NvShield/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs b/Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs index 2ce6b594b..21b7d0ca9 100644 --- a/Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs +++ b/Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.X360/X360Platform.Vcxproj.Template.cs b/Sharpmake.Platforms/Sharpmake.X360/X360Platform.Vcxproj.Template.cs index ae70a4104..32c3cad13 100644 --- a/Sharpmake.Platforms/Sharpmake.X360/X360Platform.Vcxproj.Template.cs +++ b/Sharpmake.Platforms/Sharpmake.X360/X360Platform.Vcxproj.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.Platforms/Sharpmake.X360/X360Platform.cs b/Sharpmake.Platforms/Sharpmake.X360/X360Platform.cs index a20090058..ed77cc5ab 100644 --- a/Sharpmake.Platforms/Sharpmake.X360/X360Platform.cs +++ b/Sharpmake.Platforms/Sharpmake.X360/X360Platform.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/CSharpDependencyPropagationTest.cs b/Sharpmake.UnitTests/CSharpDependencyPropagationTest.cs index f59e018f1..d89127532 100644 --- a/Sharpmake.UnitTests/CSharpDependencyPropagationTest.cs +++ b/Sharpmake.UnitTests/CSharpDependencyPropagationTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/CommandLineTest.cs b/Sharpmake.UnitTests/CommandLineTest.cs index e06fe1d81..d0159425e 100644 --- a/Sharpmake.UnitTests/CommandLineTest.cs +++ b/Sharpmake.UnitTests/CommandLineTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/ConfigureAttributesTest.cs b/Sharpmake.UnitTests/ConfigureAttributesTest.cs index 6e2d96f91..f196ed88a 100644 --- a/Sharpmake.UnitTests/ConfigureAttributesTest.cs +++ b/Sharpmake.UnitTests/ConfigureAttributesTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/DependencyPropagationTest.cs b/Sharpmake.UnitTests/DependencyPropagationTest.cs index 668fb8f08..3cb9c7a0e 100644 --- a/Sharpmake.UnitTests/DependencyPropagationTest.cs +++ b/Sharpmake.UnitTests/DependencyPropagationTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/DotNetReferenceCollectionTest.cs b/Sharpmake.UnitTests/DotNetReferenceCollectionTest.cs index ea7aed044..54281497d 100644 --- a/Sharpmake.UnitTests/DotNetReferenceCollectionTest.cs +++ b/Sharpmake.UnitTests/DotNetReferenceCollectionTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/JsonSerializerTest.cs b/Sharpmake.UnitTests/JsonSerializerTest.cs index 500ed373a..587edcce5 100644 --- a/Sharpmake.UnitTests/JsonSerializerTest.cs +++ b/Sharpmake.UnitTests/JsonSerializerTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/KitsRootPathsTests.cs b/Sharpmake.UnitTests/KitsRootPathsTests.cs index 0f5f514f2..73597fd71 100644 --- a/Sharpmake.UnitTests/KitsRootPathsTests.cs +++ b/Sharpmake.UnitTests/KitsRootPathsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/OrderableStringsTests.cs b/Sharpmake.UnitTests/OrderableStringsTests.cs index 6996750c8..9b4aefab9 100644 --- a/Sharpmake.UnitTests/OrderableStringsTests.cs +++ b/Sharpmake.UnitTests/OrderableStringsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/PackageReferencesTest.cs b/Sharpmake.UnitTests/PackageReferencesTest.cs index c9c9a01b1..faed1a613 100644 --- a/Sharpmake.UnitTests/PackageReferencesTest.cs +++ b/Sharpmake.UnitTests/PackageReferencesTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/ResolverTest.cs b/Sharpmake.UnitTests/ResolverTest.cs index 0798ab521..6d6742fb4 100644 --- a/Sharpmake.UnitTests/ResolverTest.cs +++ b/Sharpmake.UnitTests/ResolverTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/SharpmakeFileParserTest.cs b/Sharpmake.UnitTests/SharpmakeFileParserTest.cs index 7602a97bf..1ee8d858c 100644 --- a/Sharpmake.UnitTests/SharpmakeFileParserTest.cs +++ b/Sharpmake.UnitTests/SharpmakeFileParserTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/StringsTests.cs b/Sharpmake.UnitTests/StringsTests.cs index 92aebb98f..e79102523 100644 --- a/Sharpmake.UnitTests/StringsTests.cs +++ b/Sharpmake.UnitTests/StringsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/TargetTests.cs b/Sharpmake.UnitTests/TargetTests.cs index 21f8a6ed5..929a6f3e0 100644 --- a/Sharpmake.UnitTests/TargetTests.cs +++ b/Sharpmake.UnitTests/TargetTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/TestProjectBuilder.cs b/Sharpmake.UnitTests/TestProjectBuilder.cs index a56f76842..833d4a08f 100644 --- a/Sharpmake.UnitTests/TestProjectBuilder.cs +++ b/Sharpmake.UnitTests/TestProjectBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/UniqueListTests.cs b/Sharpmake.UnitTests/UniqueListTests.cs index 7ef2dcfc8..90483967d 100644 --- a/Sharpmake.UnitTests/UniqueListTests.cs +++ b/Sharpmake.UnitTests/UniqueListTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake.UnitTests/UtilTest.cs b/Sharpmake.UnitTests/UtilTest.cs index 9c1529787..9ecd81d57 100644 --- a/Sharpmake.UnitTests/UtilTest.cs +++ b/Sharpmake.UnitTests/UtilTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018, 2020-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Analyzer/Analyzer.cs b/Sharpmake/Analyzer/Analyzer.cs index 0fa2e8c7e..6e5961826 100644 --- a/Sharpmake/Analyzer/Analyzer.cs +++ b/Sharpmake/Analyzer/Analyzer.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Assembler.cs b/Sharpmake/Assembler.cs index 4f2d10446..219cc7af5 100644 --- a/Sharpmake/Assembler.cs +++ b/Sharpmake/Assembler.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/AttributeParsers.cs b/Sharpmake/AttributeParsers.cs index 5feaa7231..1655da386 100644 --- a/Sharpmake/AttributeParsers.cs +++ b/Sharpmake/AttributeParsers.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Attributes.cs b/Sharpmake/Attributes.cs index b58676526..0cf1e5875 100644 --- a/Sharpmake/Attributes.cs +++ b/Sharpmake/Attributes.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/BuildContext/BaseBuildContext.cs b/Sharpmake/BuildContext/BaseBuildContext.cs index 48cbb4d83..38e52e989 100644 --- a/Sharpmake/BuildContext/BaseBuildContext.cs +++ b/Sharpmake/BuildContext/BaseBuildContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/BuildContext/ConfigureDependencyAnalyzer.cs b/Sharpmake/BuildContext/ConfigureDependencyAnalyzer.cs index c29babe07..5ce256665 100644 --- a/Sharpmake/BuildContext/ConfigureDependencyAnalyzer.cs +++ b/Sharpmake/BuildContext/ConfigureDependencyAnalyzer.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/BuildContext/RegressionTest.cs b/Sharpmake/BuildContext/RegressionTest.cs index 1e22ee098..9c79e5361 100644 --- a/Sharpmake/BuildContext/RegressionTest.cs +++ b/Sharpmake/BuildContext/RegressionTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Builder.cs b/Sharpmake/Builder.cs index 1b3c56e0e..c532b0f9c 100644 --- a/Sharpmake/Builder.cs +++ b/Sharpmake/Builder.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/BuilderExtension.cs b/Sharpmake/BuilderExtension.cs index 2095f16a4..aa95eed04 100644 --- a/Sharpmake/BuilderExtension.cs +++ b/Sharpmake/BuilderExtension.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/CommandLine.cs b/Sharpmake/CommandLine.cs index eb5015cea..3d4570fe0 100644 --- a/Sharpmake/CommandLine.cs +++ b/Sharpmake/CommandLine.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Configurable.cs b/Sharpmake/Configurable.cs index 048d1ac65..32578b343 100644 --- a/Sharpmake/Configurable.cs +++ b/Sharpmake/Configurable.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/ConfigureCollection.cs b/Sharpmake/ConfigureCollection.cs index 9e7ddc6d3..895d620f8 100644 --- a/Sharpmake/ConfigureCollection.cs +++ b/Sharpmake/ConfigureCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/DebugProjectGenerator.cs b/Sharpmake/DebugProjectGenerator.cs index c8045efbf..f6271ae1f 100644 --- a/Sharpmake/DebugProjectGenerator.cs +++ b/Sharpmake/DebugProjectGenerator.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/DependencyTracker.cs b/Sharpmake/DependencyTracker.cs index 62b3e52b9..e28a34217 100644 --- a/Sharpmake/DependencyTracker.cs +++ b/Sharpmake/DependencyTracker.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/DotNetReferenceCollection.cs b/Sharpmake/DotNetReferenceCollection.cs index 331106530..2b75166fe 100644 --- a/Sharpmake/DotNetReferenceCollection.cs +++ b/Sharpmake/DotNetReferenceCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/EnumExtensions.cs b/Sharpmake/EnumExtensions.cs index a268b7a58..1269e34e2 100644 --- a/Sharpmake/EnumExtensions.cs +++ b/Sharpmake/EnumExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Exception.cs b/Sharpmake/Exception.cs index fb0f632a5..084085fd5 100644 --- a/Sharpmake/Exception.cs +++ b/Sharpmake/Exception.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/ExtensionLoader.cs b/Sharpmake/ExtensionLoader.cs index 07e5f8e38..c2f1baf06 100644 --- a/Sharpmake/ExtensionLoader.cs +++ b/Sharpmake/ExtensionLoader.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/ExtensionMethods.cs b/Sharpmake/ExtensionMethods.cs index b9feb6107..268de2f5b 100644 --- a/Sharpmake/ExtensionMethods.cs +++ b/Sharpmake/ExtensionMethods.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/FakeFileTree.cs b/Sharpmake/FakeFileTree.cs index 536c24181..9965be2e7 100644 --- a/Sharpmake/FakeFileTree.cs +++ b/Sharpmake/FakeFileTree.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/FastBuildSettings.cs b/Sharpmake/FastBuildSettings.cs index b5759cb84..f4d8f8e27 100644 --- a/Sharpmake/FastBuildSettings.cs +++ b/Sharpmake/FastBuildSettings.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/FileSystemStringComparer.cs b/Sharpmake/FileSystemStringComparer.cs index 33e500632..db3875f5c 100644 --- a/Sharpmake/FileSystemStringComparer.cs +++ b/Sharpmake/FileSystemStringComparer.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/GeneratedAssemblyConfig.cs b/Sharpmake/GeneratedAssemblyConfig.cs index 6a5d3aee7..4825a7cc4 100644 --- a/Sharpmake/GeneratedAssemblyConfig.cs +++ b/Sharpmake/GeneratedAssemblyConfig.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/GeneratorManager.cs b/Sharpmake/GeneratorManager.cs index 8102b3038..b27697f4e 100644 --- a/Sharpmake/GeneratorManager.cs +++ b/Sharpmake/GeneratorManager.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/IAssemblerContext.cs b/Sharpmake/IAssemblerContext.cs index b60d66acb..f840953dc 100644 --- a/Sharpmake/IAssemblerContext.cs +++ b/Sharpmake/IAssemblerContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/IFastBuildCompilerSettings.cs b/Sharpmake/IFastBuildCompilerSettings.cs index c39a27753..41076597b 100644 --- a/Sharpmake/IFastBuildCompilerSettings.cs +++ b/Sharpmake/IFastBuildCompilerSettings.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/IPlatformDescriptor.cs b/Sharpmake/IPlatformDescriptor.cs index fb7922640..6b4d18281 100644 --- a/Sharpmake/IPlatformDescriptor.cs +++ b/Sharpmake/IPlatformDescriptor.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/IResolverHelper.cs b/Sharpmake/IResolverHelper.cs index e12a1ca1d..cae539601 100644 --- a/Sharpmake/IResolverHelper.cs +++ b/Sharpmake/IResolverHelper.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/IWindowsFastBuildCompilerSettings.cs b/Sharpmake/IWindowsFastBuildCompilerSettings.cs index 43a612c60..05933633e 100644 --- a/Sharpmake/IWindowsFastBuildCompilerSettings.cs +++ b/Sharpmake/IWindowsFastBuildCompilerSettings.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/KitsRootPaths.cs b/Sharpmake/KitsRootPaths.cs index 021df0542..32f529647 100644 --- a/Sharpmake/KitsRootPaths.cs +++ b/Sharpmake/KitsRootPaths.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/MSBuildGlobalSettings.cs b/Sharpmake/MSBuildGlobalSettings.cs index 1831e6c4f..629081f8e 100644 --- a/Sharpmake/MSBuildGlobalSettings.cs +++ b/Sharpmake/MSBuildGlobalSettings.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Options.Android.cs b/Sharpmake/Options.Android.cs index c1022257f..b63712d02 100644 --- a/Sharpmake/Options.Android.cs +++ b/Sharpmake/Options.Android.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Options.CSharp.cs b/Sharpmake/Options.CSharp.cs index ce1d0d6e3..90619c5ef 100644 --- a/Sharpmake/Options.CSharp.cs +++ b/Sharpmake/Options.CSharp.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Options.Clang.cs b/Sharpmake/Options.Clang.cs index 742db8dea..2832a53ad 100644 --- a/Sharpmake/Options.Clang.cs +++ b/Sharpmake/Options.Clang.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Options.Makefile.cs b/Sharpmake/Options.Makefile.cs index 3feefb642..88dc4dafc 100644 --- a/Sharpmake/Options.Makefile.cs +++ b/Sharpmake/Options.Makefile.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Options.Vc.cs b/Sharpmake/Options.Vc.cs index 1415747a9..7f97b9100 100644 --- a/Sharpmake/Options.Vc.cs +++ b/Sharpmake/Options.Vc.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Options.XCode.cs b/Sharpmake/Options.XCode.cs index 008ee7a36..533870feb 100644 --- a/Sharpmake/Options.XCode.cs +++ b/Sharpmake/Options.XCode.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Options.cs b/Sharpmake/Options.cs index e7ee5c69d..b09c316fe 100644 --- a/Sharpmake/Options.cs +++ b/Sharpmake/Options.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/PackageReferences.Template.cs b/Sharpmake/PackageReferences.Template.cs index e613fe3bd..b21c27ff8 100644 --- a/Sharpmake/PackageReferences.Template.cs +++ b/Sharpmake/PackageReferences.Template.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/PackageReferences.cs b/Sharpmake/PackageReferences.cs index 7d95f1253..31a618272 100644 --- a/Sharpmake/PackageReferences.cs +++ b/Sharpmake/PackageReferences.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/PlatformAttributes.cs b/Sharpmake/PlatformAttributes.cs index 02f3c1953..456fb22c2 100644 --- a/Sharpmake/PlatformAttributes.cs +++ b/Sharpmake/PlatformAttributes.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2018 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/PlatformExceptions.cs b/Sharpmake/PlatformExceptions.cs index 451a73213..6dd007fb1 100644 --- a/Sharpmake/PlatformExceptions.cs +++ b/Sharpmake/PlatformExceptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/PlatformRegistry.cs b/Sharpmake/PlatformRegistry.cs index 95c1b3db1..b5abc986e 100644 --- a/Sharpmake/PlatformRegistry.cs +++ b/Sharpmake/PlatformRegistry.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/PreprocessorConditionParser.cs b/Sharpmake/PreprocessorConditionParser.cs index cd0984adc..8fae920e1 100644 --- a/Sharpmake/PreprocessorConditionParser.cs +++ b/Sharpmake/PreprocessorConditionParser.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Project.Configuration.cs b/Sharpmake/Project.Configuration.cs index 3b2943255..9f457b267 100644 --- a/Sharpmake/Project.Configuration.cs +++ b/Sharpmake/Project.Configuration.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Project.cs b/Sharpmake/Project.cs index 4ee57a671..7c33856f7 100644 --- a/Sharpmake/Project.cs +++ b/Sharpmake/Project.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Properties/AssemblyInfo.cs b/Sharpmake/Properties/AssemblyInfo.cs index 3fde408e6..f6917b6fb 100644 --- a/Sharpmake/Properties/AssemblyInfo.cs +++ b/Sharpmake/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/ReferenceAlias.cs b/Sharpmake/ReferenceAlias.cs index 2fa50c7dc..b8abf1438 100644 --- a/Sharpmake/ReferenceAlias.cs +++ b/Sharpmake/ReferenceAlias.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/RegexCache.cs b/Sharpmake/RegexCache.cs index 7a5ccd2ae..c48a8c91e 100644 --- a/Sharpmake/RegexCache.cs +++ b/Sharpmake/RegexCache.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Resolver.cs b/Sharpmake/Resolver.cs index e9d21bff4..02a331f50 100644 --- a/Sharpmake/Resolver.cs +++ b/Sharpmake/Resolver.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/SharpmakeExtension.cs b/Sharpmake/SharpmakeExtension.cs index a6ad14ee8..db793916f 100644 --- a/Sharpmake/SharpmakeExtension.cs +++ b/Sharpmake/SharpmakeExtension.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Solution.Configuration.cs b/Sharpmake/Solution.Configuration.cs index d02fea55f..7534e7676 100644 --- a/Sharpmake/Solution.Configuration.cs +++ b/Sharpmake/Solution.Configuration.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Solution.cs b/Sharpmake/Solution.cs index 548c03a92..33da248ef 100644 --- a/Sharpmake/Solution.cs +++ b/Sharpmake/Solution.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/SourceAttributeParser.cs b/Sharpmake/SourceAttributeParser.cs index db6362221..aa589ebeb 100644 --- a/Sharpmake/SourceAttributeParser.cs +++ b/Sharpmake/SourceAttributeParser.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Strings.cs b/Sharpmake/Strings.cs index 7e00b2c5e..5720edb6a 100644 --- a/Sharpmake/Strings.cs +++ b/Sharpmake/Strings.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Target.cs b/Sharpmake/Target.cs index 744d0931f..27a118808 100644 --- a/Sharpmake/Target.cs +++ b/Sharpmake/Target.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/TrackedConfiguration.cs b/Sharpmake/TrackedConfiguration.cs index 01e5bf880..048329e8a 100644 --- a/Sharpmake/TrackedConfiguration.cs +++ b/Sharpmake/TrackedConfiguration.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/TrackedProject.cs b/Sharpmake/TrackedProject.cs index 71c62a0a4..ac69929f3 100644 --- a/Sharpmake/TrackedProject.cs +++ b/Sharpmake/TrackedProject.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/UniqueList.cs b/Sharpmake/UniqueList.cs index eefd5eb82..5cf768d03 100644 --- a/Sharpmake/UniqueList.cs +++ b/Sharpmake/UniqueList.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Sharpmake/Util.cs b/Sharpmake/Util.cs index 89b43adf9..539d45493 100644 --- a/Sharpmake/Util.cs +++ b/Sharpmake/Util.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/CPPCLI/CLRTest.sharpmake.cs b/samples/CPPCLI/CLRTest.sharpmake.cs index d1367c3fc..d90ec3c18 100644 --- a/samples/CPPCLI/CLRTest.sharpmake.cs +++ b/samples/CPPCLI/CLRTest.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/CPPCLI/Properties/AssemblyInfo.cs b/samples/CPPCLI/Properties/AssemblyInfo.cs index 1e4de0b60..ef55d1c36 100644 --- a/samples/CPPCLI/Properties/AssemblyInfo.cs +++ b/samples/CPPCLI/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/CPPCLI/codebase/OtherCSharpProj/Properties/AssemblyInfo.cs b/samples/CPPCLI/codebase/OtherCSharpProj/Properties/AssemblyInfo.cs index 589f5483e..2274af5d8 100644 --- a/samples/CPPCLI/codebase/OtherCSharpProj/Properties/AssemblyInfo.cs +++ b/samples/CPPCLI/codebase/OtherCSharpProj/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Ubisoft")] [assembly: AssemblyProduct("OtherCSharpProj")] -[assembly: AssemblyCopyright("Copyright © Ubisoft 2019")] +[assembly: AssemblyCopyright("Copyright © Ubisoft 2017, 2019")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/samples/CPPCLI/codebase/TestCSharpConsole/Properties/AssemblyInfo.cs b/samples/CPPCLI/codebase/TestCSharpConsole/Properties/AssemblyInfo.cs index 25177a5c2..75f0686f1 100644 --- a/samples/CPPCLI/codebase/TestCSharpConsole/Properties/AssemblyInfo.cs +++ b/samples/CPPCLI/codebase/TestCSharpConsole/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Ubisoft")] [assembly: AssemblyProduct("TestCSharpConsole")] -[assembly: AssemblyCopyright("Copyright © Ubisoft 2019")] +[assembly: AssemblyCopyright("Copyright © Ubisoft 2017, 2019")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/samples/CPPCLI/projects.sharpmake.cs b/samples/CPPCLI/projects.sharpmake.cs index 7f49f04b8..5cc76982a 100644 --- a/samples/CPPCLI/projects.sharpmake.cs +++ b/samples/CPPCLI/projects.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/CSharpHelloWorld/HelloWorld.sharpmake.cs b/samples/CSharpHelloWorld/HelloWorld.sharpmake.cs index 848e9cf02..e68d8dcc8 100644 --- a/samples/CSharpHelloWorld/HelloWorld.sharpmake.cs +++ b/samples/CSharpHelloWorld/HelloWorld.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/CSharpHelloWorld/codebase/HelloWorld/Properties/AssemblyInfo.cs b/samples/CSharpHelloWorld/codebase/HelloWorld/Properties/AssemblyInfo.cs index f0f99af14..e0b5191a1 100644 --- a/samples/CSharpHelloWorld/codebase/HelloWorld/Properties/AssemblyInfo.cs +++ b/samples/CSharpHelloWorld/codebase/HelloWorld/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Ubisoft")] [assembly: AssemblyProduct("ExampleCodeProject")] -[assembly: AssemblyCopyright("Copyright © Ubisoft 2019")] +[assembly: AssemblyCopyright("Copyright © Ubisoft 2017, 2019")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/samples/CSharpHelloWorld/common.sharpmake.cs b/samples/CSharpHelloWorld/common.sharpmake.cs index e7a4b149e..48f5721db 100644 --- a/samples/CSharpHelloWorld/common.sharpmake.cs +++ b/samples/CSharpHelloWorld/common.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/CSharpImports/CSharpImports.sharpmake.cs b/samples/CSharpImports/CSharpImports.sharpmake.cs index 2dff2374e..550aedeb2 100644 --- a/samples/CSharpImports/CSharpImports.sharpmake.cs +++ b/samples/CSharpImports/CSharpImports.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/CSharpImports/codebase/CSharpImports/Properties/AssemblyInfo.cs b/samples/CSharpImports/codebase/CSharpImports/Properties/AssemblyInfo.cs index f0f99af14..500276595 100644 --- a/samples/CSharpImports/codebase/CSharpImports/Properties/AssemblyInfo.cs +++ b/samples/CSharpImports/codebase/CSharpImports/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Ubisoft")] [assembly: AssemblyProduct("ExampleCodeProject")] -[assembly: AssemblyCopyright("Copyright © Ubisoft 2019")] +[assembly: AssemblyCopyright("Copyright © Ubisoft 2020")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/samples/CSharpImports/common.sharpmake.cs b/samples/CSharpImports/common.sharpmake.cs index e7a4b149e..ed1a6692a 100644 --- a/samples/CSharpImports/common.sharpmake.cs +++ b/samples/CSharpImports/common.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/CSharpVsix/CSharpVsix.sharpmake.cs b/samples/CSharpVsix/CSharpVsix.sharpmake.cs index 52f257e8b..a5d1fca2f 100644 --- a/samples/CSharpVsix/CSharpVsix.sharpmake.cs +++ b/samples/CSharpVsix/CSharpVsix.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/CSharpVsix/codebase/CSharpVsix/Properties/AssemblyInfo.cs b/samples/CSharpVsix/codebase/CSharpVsix/Properties/AssemblyInfo.cs index 634cd2013..cebdbc655 100644 --- a/samples/CSharpVsix/codebase/CSharpVsix/Properties/AssemblyInfo.cs +++ b/samples/CSharpVsix/codebase/CSharpVsix/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Ubisoft")] [assembly: AssemblyProduct("CSharpVsix")] -[assembly: AssemblyCopyright("Copyright © Ubisoft 2019")] +[assembly: AssemblyCopyright("Copyright © Ubisoft 2017, 2019")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/samples/CSharpVsix/common.sharpmake.cs b/samples/CSharpVsix/common.sharpmake.cs index 08d997b14..358f0ccbe 100644 --- a/samples/CSharpVsix/common.sharpmake.cs +++ b/samples/CSharpVsix/common.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/CSharpWCF/CSharpWCF.sharpmake.cs b/samples/CSharpWCF/CSharpWCF.sharpmake.cs index 3c54c5cec..cfecab3ae 100644 --- a/samples/CSharpWCF/CSharpWCF.sharpmake.cs +++ b/samples/CSharpWCF/CSharpWCF.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/CSharpWCF/codebase/CSharpWCF/Properties/AssemblyInfo.cs b/samples/CSharpWCF/codebase/CSharpWCF/Properties/AssemblyInfo.cs index 48f1cd705..afb46a1ad 100644 --- a/samples/CSharpWCF/codebase/CSharpWCF/Properties/AssemblyInfo.cs +++ b/samples/CSharpWCF/codebase/CSharpWCF/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Ubisoft")] [assembly: AssemblyProduct("CSharpWCF")] -[assembly: AssemblyCopyright("Copyright © Ubisoft 2019")] +[assembly: AssemblyCopyright("Copyright © Ubisoft 2018-2019")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/samples/CSharpWCF/codebase/CSharpWCFApp/Properties/AssemblyInfo.cs b/samples/CSharpWCF/codebase/CSharpWCFApp/Properties/AssemblyInfo.cs index f4500a8e5..df3c595fa 100644 --- a/samples/CSharpWCF/codebase/CSharpWCFApp/Properties/AssemblyInfo.cs +++ b/samples/CSharpWCF/codebase/CSharpWCFApp/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Ubisoft")] [assembly: AssemblyProduct("CSharpWCFApp")] -[assembly: AssemblyCopyright("Copyright © Ubisoft 2019")] +[assembly: AssemblyCopyright("Copyright © Ubisoft 2018-2019")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/samples/CSharpWCF/common.sharpmake.cs b/samples/CSharpWCF/common.sharpmake.cs index 08d997b14..df0d7f756 100644 --- a/samples/CSharpWCF/common.sharpmake.cs +++ b/samples/CSharpWCF/common.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/CompileCommandDatabase/CompileCommandDatabase.sharpmake.cs b/samples/CompileCommandDatabase/CompileCommandDatabase.sharpmake.cs index 77eb19705..69f430436 100644 --- a/samples/CompileCommandDatabase/CompileCommandDatabase.sharpmake.cs +++ b/samples/CompileCommandDatabase/CompileCommandDatabase.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/ConfigureOrder/ConfigureOrdering.sharpmake.cs b/samples/ConfigureOrder/ConfigureOrdering.sharpmake.cs index d8dc8a0c5..13446da17 100644 --- a/samples/ConfigureOrder/ConfigureOrdering.sharpmake.cs +++ b/samples/ConfigureOrder/ConfigureOrdering.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/ConfigureOrder/Properties/AssemblyInfo.cs b/samples/ConfigureOrder/Properties/AssemblyInfo.cs index 2eeb7ada2..ecd8ea569 100644 --- a/samples/ConfigureOrder/Properties/AssemblyInfo.cs +++ b/samples/ConfigureOrder/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/ConfigureOrder/Util.sharpmake.cs b/samples/ConfigureOrder/Util.sharpmake.cs index a93e5017b..ec951ed34 100644 --- a/samples/ConfigureOrder/Util.sharpmake.cs +++ b/samples/ConfigureOrder/Util.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/ConfigureOrder/main.sharpmake.cs b/samples/ConfigureOrder/main.sharpmake.cs index 909daa704..31802822d 100644 --- a/samples/ConfigureOrder/main.sharpmake.cs +++ b/samples/ConfigureOrder/main.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/FastBuildSimpleExecutable/FastBuildSimpleExecutable.sharpmake.cs b/samples/FastBuildSimpleExecutable/FastBuildSimpleExecutable.sharpmake.cs index bfac3e05c..12bc35078 100644 --- a/samples/FastBuildSimpleExecutable/FastBuildSimpleExecutable.sharpmake.cs +++ b/samples/FastBuildSimpleExecutable/FastBuildSimpleExecutable.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2019, 2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/FastBuildSimpleExecutable/Properties/AssemblyInfo.cs b/samples/FastBuildSimpleExecutable/Properties/AssemblyInfo.cs index 0b3fe9e0c..d47c23981 100644 --- a/samples/FastBuildSimpleExecutable/Properties/AssemblyInfo.cs +++ b/samples/FastBuildSimpleExecutable/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs b/samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs index cf514a6bf..4d3ad1cac 100644 --- a/samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs +++ b/samples/HelloLinux/HelloLinux.CommonProject.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloLinux/HelloLinux.CommonSolution.sharpmake.cs b/samples/HelloLinux/HelloLinux.CommonSolution.sharpmake.cs index 9869c5060..30319918c 100644 --- a/samples/HelloLinux/HelloLinux.CommonSolution.sharpmake.cs +++ b/samples/HelloLinux/HelloLinux.CommonSolution.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloLinux/HelloLinux.CommonTarget.sharpmake.cs b/samples/HelloLinux/HelloLinux.CommonTarget.sharpmake.cs index 20552282f..9d37391c4 100644 --- a/samples/HelloLinux/HelloLinux.CommonTarget.sharpmake.cs +++ b/samples/HelloLinux/HelloLinux.CommonTarget.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloLinux/HelloLinux.Main.sharpmake.cs b/samples/HelloLinux/HelloLinux.Main.sharpmake.cs index 694debf02..adf37f3d0 100644 --- a/samples/HelloLinux/HelloLinux.Main.sharpmake.cs +++ b/samples/HelloLinux/HelloLinux.Main.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloLinux/Properties/AssemblyInfo.cs b/samples/HelloLinux/Properties/AssemblyInfo.cs index 191db1679..db1978b0d 100644 --- a/samples/HelloLinux/Properties/AssemblyInfo.cs +++ b/samples/HelloLinux/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloLinux/codebase/HelloXCode.sharpmake.cs b/samples/HelloLinux/codebase/HelloXCode.sharpmake.cs index d426b4b86..4555106c8 100644 --- a/samples/HelloLinux/codebase/HelloXCode.sharpmake.cs +++ b/samples/HelloLinux/codebase/HelloXCode.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloLinux/codebase/dll1/dll1.sharpmake.cs b/samples/HelloLinux/codebase/dll1/dll1.sharpmake.cs index 1eb9e8987..98bd4a16b 100644 --- a/samples/HelloLinux/codebase/dll1/dll1.sharpmake.cs +++ b/samples/HelloLinux/codebase/dll1/dll1.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloLinux/codebase/exe/exe.sharpmake.cs b/samples/HelloLinux/codebase/exe/exe.sharpmake.cs index 83b2be627..3205c5890 100644 --- a/samples/HelloLinux/codebase/exe/exe.sharpmake.cs +++ b/samples/HelloLinux/codebase/exe/exe.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloLinux/codebase/static lib2/static_lib2.sharpmake.cs b/samples/HelloLinux/codebase/static lib2/static_lib2.sharpmake.cs index 4c36dd045..78336ae8c 100644 --- a/samples/HelloLinux/codebase/static lib2/static_lib2.sharpmake.cs +++ b/samples/HelloLinux/codebase/static lib2/static_lib2.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloLinux/codebase/static_lib1/static_lib1.sharpmake.cs b/samples/HelloLinux/codebase/static_lib1/static_lib1.sharpmake.cs index 1034a65fe..8f765f576 100644 --- a/samples/HelloLinux/codebase/static_lib1/static_lib1.sharpmake.cs +++ b/samples/HelloLinux/codebase/static_lib1/static_lib1.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloWorld/HelloWorld.sharpmake.cs b/samples/HelloWorld/HelloWorld.sharpmake.cs index c6e2fdbba..34b6a5176 100644 --- a/samples/HelloWorld/HelloWorld.sharpmake.cs +++ b/samples/HelloWorld/HelloWorld.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloWorld/Properties/AssemblyInfo.cs b/samples/HelloWorld/Properties/AssemblyInfo.cs index 13e60138f..da5dcc910 100644 --- a/samples/HelloWorld/Properties/AssemblyInfo.cs +++ b/samples/HelloWorld/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloXCode/HelloXCode.CommonProject.sharpmake.cs b/samples/HelloXCode/HelloXCode.CommonProject.sharpmake.cs index 8543868df..fda6d93df 100644 --- a/samples/HelloXCode/HelloXCode.CommonProject.sharpmake.cs +++ b/samples/HelloXCode/HelloXCode.CommonProject.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloXCode/HelloXCode.CommonSolution.sharpmake.cs b/samples/HelloXCode/HelloXCode.CommonSolution.sharpmake.cs index 0fd2b81a0..8784e1e09 100644 --- a/samples/HelloXCode/HelloXCode.CommonSolution.sharpmake.cs +++ b/samples/HelloXCode/HelloXCode.CommonSolution.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloXCode/HelloXCode.CommonTarget.sharpmake.cs b/samples/HelloXCode/HelloXCode.CommonTarget.sharpmake.cs index f2a2a311b..2c8b757bb 100644 --- a/samples/HelloXCode/HelloXCode.CommonTarget.sharpmake.cs +++ b/samples/HelloXCode/HelloXCode.CommonTarget.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloXCode/HelloXCode.Main.sharpmake.cs b/samples/HelloXCode/HelloXCode.Main.sharpmake.cs index 1d5e1dc54..9193f649f 100644 --- a/samples/HelloXCode/HelloXCode.Main.sharpmake.cs +++ b/samples/HelloXCode/HelloXCode.Main.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020-2021 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloXCode/Properties/AssemblyInfo.cs b/samples/HelloXCode/Properties/AssemblyInfo.cs index 049c96c4d..926caf1c2 100644 --- a/samples/HelloXCode/Properties/AssemblyInfo.cs +++ b/samples/HelloXCode/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloXCode/codebase/HelloXCode.sharpmake.cs b/samples/HelloXCode/codebase/HelloXCode.sharpmake.cs index b50f9df71..0d04440ec 100644 --- a/samples/HelloXCode/codebase/HelloXCode.sharpmake.cs +++ b/samples/HelloXCode/codebase/HelloXCode.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloXCode/codebase/dll1/dll1.sharpmake.cs b/samples/HelloXCode/codebase/dll1/dll1.sharpmake.cs index f14502266..0c6018084 100644 --- a/samples/HelloXCode/codebase/dll1/dll1.sharpmake.cs +++ b/samples/HelloXCode/codebase/dll1/dll1.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloXCode/codebase/exe/exe.sharpmake.cs b/samples/HelloXCode/codebase/exe/exe.sharpmake.cs index de8b866dd..1431c3707 100644 --- a/samples/HelloXCode/codebase/exe/exe.sharpmake.cs +++ b/samples/HelloXCode/codebase/exe/exe.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloXCode/codebase/static lib2/static_lib2.sharpmake.cs b/samples/HelloXCode/codebase/static lib2/static_lib2.sharpmake.cs index 6b14ec969..6bdde23e4 100644 --- a/samples/HelloXCode/codebase/static lib2/static_lib2.sharpmake.cs +++ b/samples/HelloXCode/codebase/static lib2/static_lib2.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/HelloXCode/codebase/static_lib1/static_lib1.sharpmake.cs b/samples/HelloXCode/codebase/static_lib1/static_lib1.sharpmake.cs index 882aaa94f..3135d0e26 100644 --- a/samples/HelloXCode/codebase/static_lib1/static_lib1.sharpmake.cs +++ b/samples/HelloXCode/codebase/static_lib1/static_lib1.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/NetCore/DotNetCoreFrameworkHelloWorld/HelloWorld.sharpmake.cs b/samples/NetCore/DotNetCoreFrameworkHelloWorld/HelloWorld.sharpmake.cs index 082485367..02f982e3b 100644 --- a/samples/NetCore/DotNetCoreFrameworkHelloWorld/HelloWorld.sharpmake.cs +++ b/samples/NetCore/DotNetCoreFrameworkHelloWorld/HelloWorld.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/NetCore/DotNetFrameworkHelloWorld/HelloWorld.sharpmake.cs b/samples/NetCore/DotNetFrameworkHelloWorld/HelloWorld.sharpmake.cs index 7eb15270c..c7a77aa8e 100644 --- a/samples/NetCore/DotNetFrameworkHelloWorld/HelloWorld.sharpmake.cs +++ b/samples/NetCore/DotNetFrameworkHelloWorld/HelloWorld.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/NetCore/DotNetMultiFrameworksHelloWorld/HelloWorld.sharpmake.cs b/samples/NetCore/DotNetMultiFrameworksHelloWorld/HelloWorld.sharpmake.cs index a10a98944..32fe29618 100644 --- a/samples/NetCore/DotNetMultiFrameworksHelloWorld/HelloWorld.sharpmake.cs +++ b/samples/NetCore/DotNetMultiFrameworksHelloWorld/HelloWorld.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/PackageReferences/PackageReferences.sharpmake.cs b/samples/PackageReferences/PackageReferences.sharpmake.cs index 15eef1a3f..10b9cf407 100644 --- a/samples/PackageReferences/PackageReferences.sharpmake.cs +++ b/samples/PackageReferences/PackageReferences.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017-2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/PackageReferences/codebase/PackageReferences/Properties/AssemblyInfo.cs b/samples/PackageReferences/codebase/PackageReferences/Properties/AssemblyInfo.cs index f0f99af14..e0b5191a1 100644 --- a/samples/PackageReferences/codebase/PackageReferences/Properties/AssemblyInfo.cs +++ b/samples/PackageReferences/codebase/PackageReferences/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Ubisoft")] [assembly: AssemblyProduct("ExampleCodeProject")] -[assembly: AssemblyCopyright("Copyright © Ubisoft 2019")] +[assembly: AssemblyCopyright("Copyright © Ubisoft 2017, 2019")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/samples/QTFileCustomBuild/QTFileCustomBuild.sharpmake.cs b/samples/QTFileCustomBuild/QTFileCustomBuild.sharpmake.cs index 50ebc3a85..406c7bde5 100644 --- a/samples/QTFileCustomBuild/QTFileCustomBuild.sharpmake.cs +++ b/samples/QTFileCustomBuild/QTFileCustomBuild.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2018-2019 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/SimpleExeLibDependency/LibStuff.sharpmake.cs b/samples/SimpleExeLibDependency/LibStuff.sharpmake.cs index 9096086dd..c6e83c003 100644 --- a/samples/SimpleExeLibDependency/LibStuff.sharpmake.cs +++ b/samples/SimpleExeLibDependency/LibStuff.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/samples/SimpleExeLibDependency/SimpleExeLibDependency.sharpmake.cs b/samples/SimpleExeLibDependency/SimpleExeLibDependency.sharpmake.cs index 5c24c078c..919c8d9a0 100644 --- a/samples/SimpleExeLibDependency/SimpleExeLibDependency.sharpmake.cs +++ b/samples/SimpleExeLibDependency/SimpleExeLibDependency.sharpmake.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ubisoft Entertainment +// Copyright (c) 2017, 2019-2020 Ubisoft Entertainment // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. From 9da3857e81fd9fd3410fd815d215a62a47b5cb44 Mon Sep 17 00:00:00 2001 From: Lambert Clara Date: Mon, 15 Feb 2021 14:12:20 +0100 Subject: [PATCH 142/142] Bump version number to 0.15.0 --- Sharpmake.Application/Properties/AssemblyInfo.cs | 2 +- Sharpmake.Generators/Properties/AssemblyInfo.cs | 2 +- .../Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs | 2 +- .../Sharpmake.NvShield/Properties/AssemblyInfo.cs | 2 +- Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs | 2 +- Sharpmake/Properties/AssemblyInfo.cs | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Sharpmake.Application/Properties/AssemblyInfo.cs b/Sharpmake.Application/Properties/AssemblyInfo.cs index 3bd54155a..919758783 100644 --- a/Sharpmake.Application/Properties/AssemblyInfo.cs +++ b/Sharpmake.Application/Properties/AssemblyInfo.cs @@ -43,4 +43,4 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.14.6.*")] +[assembly: AssemblyVersion("0.15.0.0")] diff --git a/Sharpmake.Generators/Properties/AssemblyInfo.cs b/Sharpmake.Generators/Properties/AssemblyInfo.cs index c9847e101..7ec5f3346 100644 --- a/Sharpmake.Generators/Properties/AssemblyInfo.cs +++ b/Sharpmake.Generators/Properties/AssemblyInfo.cs @@ -44,6 +44,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.14.6.*")] +[assembly: AssemblyVersion("0.15.0.0")] [assembly: InternalsVisibleTo("Sharpmake")] diff --git a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs index 03c9173a1..953d57cba 100644 --- a/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs +++ b/Sharpmake.Platforms/Sharpmake.CommonPlatforms/Properties/AssemblyInfo.cs @@ -44,6 +44,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.14.6.*")] +[assembly: AssemblyVersion("0.15.0.0")] [assembly: SharpmakeExtension] diff --git a/Sharpmake.Platforms/Sharpmake.NvShield/Properties/AssemblyInfo.cs b/Sharpmake.Platforms/Sharpmake.NvShield/Properties/AssemblyInfo.cs index 8c92538f7..7ed380187 100644 --- a/Sharpmake.Platforms/Sharpmake.NvShield/Properties/AssemblyInfo.cs +++ b/Sharpmake.Platforms/Sharpmake.NvShield/Properties/AssemblyInfo.cs @@ -44,6 +44,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.14.6.*")] +[assembly: AssemblyVersion("0.15.0.0")] [assembly: SharpmakeExtension] diff --git a/Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs b/Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs index 21b7d0ca9..9a5328287 100644 --- a/Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs +++ b/Sharpmake.Platforms/Sharpmake.X360/Properties/AssemblyInfo.cs @@ -44,6 +44,6 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.14.6.*")] +[assembly: AssemblyVersion("0.15.0.0")] [assembly: SharpmakeExtension] diff --git a/Sharpmake/Properties/AssemblyInfo.cs b/Sharpmake/Properties/AssemblyInfo.cs index f6917b6fb..89c1b159d 100644 --- a/Sharpmake/Properties/AssemblyInfo.cs +++ b/Sharpmake/Properties/AssemblyInfo.cs @@ -44,9 +44,9 @@ // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("0.14.6.*")] +[assembly: AssemblyVersion("0.15.0.0")] #pragma warning disable CS7035 -[assembly: AssemblyFileVersion("0.14.6.* (LocalBuild)")] +[assembly: AssemblyFileVersion("0.15.0.0 (LocalBuild)")] #pragma warning restore [assembly: InternalsVisibleTo("Sharpmake.Application")]