Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 32 additions & 33 deletions Sharpmake.Generators/GeneratorManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,45 +129,44 @@ public void Generate(Builder builder,
List<string> generatedFiles,
List<string> skipFiles)
{
if (configurations[0].Platform == Platform.ios || configurations[0].Platform == Platform.mac)
DevEnv devEnv = configurations[0].Target.GetFragment<DevEnv>();
switch (devEnv)
{
XCWorkspaceGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
if (UtilityMethods.HasFastBuildConfig(configurations))
{
MasterBffGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
}
}
else
{
DevEnv devEnv = configurations[0].Target.GetFragment<DevEnv>();
switch (devEnv)
{
case DevEnv.make:
case DevEnv.make:
{
if (configurations[0].Platform == Platform.android)
MakeApplicationGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
else
MakefileGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
break;
}
case DevEnv.vs2015:
case DevEnv.vs2017:
case DevEnv.vs2019:
case DevEnv.vs2022:
{
if (UtilityMethods.HasFastBuildConfig(configurations))
{
if (configurations[0].Platform == Platform.android)
MakeApplicationGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
else
MakefileGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
break;
MasterBffGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
}
case DevEnv.vs2015:
case DevEnv.vs2017:
case DevEnv.vs2019:
case DevEnv.vs2022:
{
if (UtilityMethods.HasFastBuildConfig(configurations))
{
MasterBffGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
}

SlnGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
break;
}
default:
SlnGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
break;
}
case DevEnv.xcode4ios:
{
if (UtilityMethods.HasFastBuildConfig(configurations))
{
throw new Error("Generate called with unknown DevEnv: " + devEnv);
MasterBffGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
}
}

XCWorkspaceGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
break;
}
default:
{
throw new Error("Generate called with unknown DevEnv: " + devEnv);
}
}
}
}
Expand Down
8 changes: 8 additions & 0 deletions Sharpmake.Generators/VisualStudio/Androidproj.Template.cs
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,14 @@ public static class Project

public const string ProjectFilesHeader =
@" <ClInclude Include=""[file.FileNameProjectRelative]"" />
";

public const string ProjectFilesSource =
@" <JavaCompile Include=""[file.FileNameProjectRelative]"" />
";

public const string ProjectFilesContent =
@" <Content Include=""[file.FileNameProjectRelative]"" />
";

public static string ContentSimple =
Expand Down
55 changes: 24 additions & 31 deletions Sharpmake.Generators/VisualStudio/Androidproj.cs
Original file line number Diff line number Diff line change
Expand Up @@ -275,9 +275,6 @@ private void GenerateFilesSection(

// Add source files
var allFiles = new List<Vcxproj.ProjectFile>();
var includeFiles = new List<Vcxproj.ProjectFile>();
var sourceFiles = new List<Vcxproj.ProjectFile>();
var contentFiles = new List<Vcxproj.ProjectFile>();

foreach (string file in projectFiles)
{
Expand All @@ -287,56 +284,52 @@ private void GenerateFilesSection(

allFiles.Sort((l, r) => { return string.Compare(l.FileNameProjectRelative, r.FileNameProjectRelative, StringComparison.InvariantCultureIgnoreCase); });

// type -> files
var customSourceFiles = new Dictionary<string, List<Vcxproj.ProjectFile>>();
var sourceFiles = new List<Vcxproj.ProjectFile>();
var contentFiles = new List<Vcxproj.ProjectFile>();

foreach (var projectFile in allFiles)
{
string type = null;
if (context.Project.ExtensionBuildTools.TryGetValue(projectFile.FileExtension, out type))
{
List<Vcxproj.ProjectFile> files = null;
if (!customSourceFiles.TryGetValue(type, out files))
{
files = new List<Vcxproj.ProjectFile>();
customSourceFiles[type] = files;
}
files.Add(projectFile);
}
else if (context.Project.SourceFilesCompileExtensions.Contains(projectFile.FileExtension) ||
(string.Compare(projectFile.FileExtension, ".rc", StringComparison.OrdinalIgnoreCase) == 0))
if (context.Project.SourceFilesCompileExtensions.Contains(projectFile.FileExtension))
{
sourceFiles.Add(projectFile);
}
else if (string.Compare(projectFile.FileExtension, ".h", StringComparison.OrdinalIgnoreCase) == 0)
{
includeFiles.Add(projectFile);
}
else
{
contentFiles.Add(projectFile);
}
}

// Write header files
if (includeFiles.Count > 0)
// Write content files
if (contentFiles.Count > 0)
{
// Filter out the main 3 files from the list since they might share extensions
string[] coreFiles =
{
fileGenerator.Resolver.Resolve(context.AndroidPackageProject.AntBuildXml),
fileGenerator.Resolver.Resolve(context.AndroidPackageProject.AntProjectPropertiesFile),
fileGenerator.Resolver.Resolve(context.AndroidPackageProject.AndroidManifest),
};

fileGenerator.Write(Template.Project.ProjectFilesBegin);
foreach (var file in includeFiles)
foreach (var file in contentFiles)
{
using (fileGenerator.Declare("file", file))
fileGenerator.Write(Template.Project.ProjectFilesHeader);
if (!coreFiles.Contains(fileGenerator.Resolver.Resolve(file.FileNameProjectRelative)))
{
using (fileGenerator.Declare("file", file))
fileGenerator.Write(Template.Project.ContentSimple);
}
}
fileGenerator.Write(Template.Project.ProjectFilesEnd);
}

// Write content files
if (contentFiles.Count > 0)
// Write source files
if (sourceFiles.Count > 0)
{
fileGenerator.Write(Template.Project.ProjectFilesBegin);
foreach (var file in contentFiles)
foreach (var file in sourceFiles)
{
using (fileGenerator.Declare("file", file))
fileGenerator.Write(Template.Project.ContentSimple);
fileGenerator.Write(Template.Project.ProjectFilesSource);
}
fileGenerator.Write(Template.Project.ProjectFilesEnd);
}
Expand Down
2 changes: 2 additions & 0 deletions Sharpmake.Generators/VisualStudio/Csproj.Template.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ public static class Project
<ProjectTypeGuids>[projectTypeGuids]</ProjectTypeGuids>
<IsPublishable>[options.IsPublishable]</IsPublishable>
<PublishUrl>[options.PublishUrl]</PublishUrl>
<PublishSingleFile>[options.PublishSingleFile]</PublishSingleFile>
<PublishTrimmed>[options.PublishTrimmed]</PublishTrimmed>
<InstallUrl>[options.InstallUrl]</InstallUrl>
<ManifestKeyFile>[options.ManifestKeyFile]</ManifestKeyFile>
<ManifestCertificateThumbprint>[options.ManifestCertificateThumbprint]</ManifestCertificateThumbprint>
Expand Down
71 changes: 58 additions & 13 deletions Sharpmake.Generators/VisualStudio/Csproj.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1179,7 +1179,7 @@ List<string> skipFiles

var preImportCustomProperties = new Dictionary<string, string>(project.PreImportCustomProperties);
AddPreImportCustomProperties(preImportCustomProperties, project, projectPath);
WriteCustomProperties(preImportCustomProperties, project, writer, resolver);
WriteCustomProperties(preImportCustomProperties, writer, resolver);

var preImportProjects = new List<ImportProject>(project.PreImportProjects);
WriteImportProjects(preImportProjects.Distinct(EqualityComparer<ImportProject>.Default), project, configurations.First(), writer, resolver);
Expand Down Expand Up @@ -1281,7 +1281,7 @@ List<string> skipFiles
Write(Template.MSBuild14PropertyGroup, writer, resolver);
}

WriteCustomProperties(project.CustomProperties, project, writer, resolver);
WriteCustomProperties(project.CustomProperties, writer, resolver);

if (project.ProjectTypeGuids == CSharpProjectType.Wcf)
{
Expand Down Expand Up @@ -1501,6 +1501,7 @@ List<string> skipFiles
}

WriteImportProjects(importProjects.Distinct(EqualityComparer<ImportProject>.Default), project, configurations.First(), writer, resolver);
WriteCustomProperties(project.PostImportCustomProperties, writer, resolver);

foreach (var element in project.UsingTasks)
{
Expand Down Expand Up @@ -1614,7 +1615,7 @@ private static void WriteImportProjects(IEnumerable<ImportProject> importProject
}

// TODO: remove this and use Sharpmake.Generators.VisualStudio.VsProjCommon.WriteCustomProperties instead
private static void WriteCustomProperties(Dictionary<string, string> customProperties, Project project, StreamWriter writer, Resolver resolver)
private static void WriteCustomProperties(Dictionary<string, string> customProperties, StreamWriter writer, Resolver resolver)
{
if (customProperties.Any())
{
Expand All @@ -1629,13 +1630,6 @@ private static void WriteCustomProperties(Dictionary<string, string> customPrope
}
}

internal enum CopyToOutputDirectory
{
Never,
Always,
PreserveNewest
}

private void GenerateFiles(
CSharpProject project,
List<Project.Configuration> configurations,
Expand All @@ -1649,7 +1643,7 @@ List<string> skipFiles
foreach (var file in project.ResolvedContentFullFileNames)
{
string include = Util.PathGetRelative(_projectPathCapitalized, file);
itemGroups.Contents.Add(new ItemGroups.Content { Include = include, LinkFolder = project.GetLinkFolder(include) });
itemGroups.Contents.Add(new ItemGroups.Content { Include = include, CopyToOutputDirectory = project.DefaultContentCopyOperation, LinkFolder = project.GetLinkFolder(include) });
}


Expand Down Expand Up @@ -1741,7 +1735,7 @@ List<string> skipFiles

HashSet<string> allContents = new HashSet<string>(itemGroups.Contents.Select(c => c.Include));
List<string> resolvedSources = project.ResolvedSourceFiles.Select(source => Util.PathGetRelative(_projectPathCapitalized, Project.GetCapitalizedFile(source))).ToList();
List<string> resolvedResources = project.ResourceFiles.Concat(project.ResolvedResourcesFullFileNames).Select(resource => Util.PathGetRelative(_projectPathCapitalized, Project.GetCapitalizedFile(resource))).Distinct().ToList();
List<string> resolvedResources = project.ResourceFiles.Concat(project.NonEmbeddedResourceFiles).Concat(project.ResolvedResourcesFullFileNames).Select(resource => Util.PathGetRelative(_projectPathCapitalized, Project.GetCapitalizedFile(resource))).Distinct().ToList();
List<string> resolvedEmbeddedResource = project.ResourceFiles.Concat(project.AdditionalEmbeddedResource).Concat(project.AdditionalEmbeddedAssemblies).Select(f => Util.PathGetRelative(_projectPathCapitalized, Project.GetCapitalizedFile(f))).Distinct().ToList();
List<string> resolvedNoneFiles =
(project.NoneFiles.Select(file => Util.PathGetRelative(_projectPathCapitalized, Project.GetCapitalizedFile(file))))
Expand Down Expand Up @@ -2169,7 +2163,7 @@ List<string> skipFiles
bool runtimeTemplate = project.AdditionalRuntimeTemplates.Contains(ttFile);
string expectedExtension =
runtimeTemplate ? ".cs" :
Util.GetTextTemplateDirectiveParam(Path.Combine(_projectPath, ttFile), "output", "extension") ?? ".cs";
Util.GetTextTemplateOutputExtension(Path.Combine(_projectPath, ttFile)) ?? ".cs";
if (!expectedExtension.StartsWith(".", StringComparison.Ordinal))
expectedExtension = "." + expectedExtension;
string fileNameWithoutExtension = ttFile.Substring(0, ttFile.Length - TTExtension.Length);
Expand Down Expand Up @@ -2285,6 +2279,16 @@ List<string> skipFiles
};
itemGroups.AddReference(dotNetFramework, referencesByName);
}
foreach (var str in conf.InteropReferencesByName)
{
var referencesByName = new ItemGroups.Reference
{
Include = str,
Private = project.DependenciesCopyLocal.HasFlag(Project.DependenciesCopyLocalTypes.DotNetReferences) ? default(bool?) : false,
EmbedInteropTypes = true
};
itemGroups.AddReference(dotNetFramework, referencesByName);
}
}
}

Expand All @@ -2300,6 +2304,16 @@ List<string> skipFiles
};
itemGroups.AddReference(dotNetFramework, referencesByNameExternal);
}
foreach (var str in conf.InteropReferencesByNameExternal)
{
var referencesByNameExternal = new ItemGroups.Reference
{
Include = str,
Private = project.DependenciesCopyLocal.HasFlag(Project.DependenciesCopyLocalTypes.DotNetExtensions),
EmbedInteropTypes = true
};
itemGroups.AddReference(dotNetFramework, referencesByNameExternal);
}
}

foreach (var conf in configurations)
Expand All @@ -2316,6 +2330,18 @@ List<string> skipFiles
};
itemGroups.AddReference(dotNetFramework, referencesByPath);
}
foreach (var str in conf.InteropReferencesByPath.Select(Util.GetCapitalizedPath))
{
var referencesByPath = new ItemGroups.Reference
{
Include = Path.GetFileNameWithoutExtension(str),
SpecificVersion = false,
HintPath = Util.PathGetRelative(_projectPathCapitalized, str),
Private = project.DependenciesCopyLocal.HasFlag(Project.DependenciesCopyLocalTypes.ExternalReferences),
EmbedInteropTypes = true
};
itemGroups.AddReference(dotNetFramework, referencesByPath);
}

foreach (var str in project.AdditionalEmbeddedAssemblies.Select(Util.GetCapitalizedPath))
{
Expand Down Expand Up @@ -3437,6 +3463,25 @@ private Options.ExplicitOptions GenerateOptions(CSharpProject project, Project.C
Options.Option(Options.CSharp.IsPublishable.Disabled, () => { options["IsPublishable"] = "false"; })
);

if (conf.Target.GetFragment<DotNetFramework>().IsDotNetCore())
{
SelectOption
(
Options.Option(Options.CSharp.PublishSingleFile.Enabled, () => { options["PublishSingleFile"] = "true"; }),
Options.Option(Options.CSharp.PublishSingleFile.Disabled, () => { options["PublishSingleFile"] = RemoveLineTag; })
);
SelectOption
(
Options.Option(Options.CSharp.PublishTrimmed.Enabled, () => { options["PublishTrimmed"] = "true"; }),
Options.Option(Options.CSharp.PublishTrimmed.Disabled, () => { options["PublishTrimmed"] = RemoveLineTag; })
);
}
else
{
options["PublishSingleFile"] = RemoveLineTag;
options["PublishTrimmed"] = RemoveLineTag;
}

options["AssemblyOriginatorKeyFile"] = Options.PathOption.Get<Options.CSharp.AssemblyOriginatorKeyFile>(conf, RemoveLineTag, _projectPath);
options["MinimumVisualStudioVersion"] = Options.StringOption.Get<Options.CSharp.MinimumVisualStudioVersion>(conf);
options["OldToolsVersion"] = Options.StringOption.Get<Options.CSharp.OldToolsVersion>(conf);
Expand Down
1 change: 0 additions & 1 deletion Sharpmake.Generators/VisualStudio/IPlatformVcxproj.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ public interface IPlatformVcxproj
string SharedLibraryFileFullExtension { get; }
string ProgramDatabaseFileFullExtension { get; }
string StaticLibraryFileFullExtension { get; }
string StaticOutputLibraryFileFullExtension { get; }

bool ExcludesPrecompiledHeadersFromBuild { get; }
bool HasUserAccountControlSupport { get; }
Expand Down
Loading