Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
77 changes: 32 additions & 45 deletions Sharpmake.Generators/GeneratorManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,56 +120,43 @@ public void Generate(Builder builder,
}

public void Generate(Builder builder,
Solution solution,
List<Solution.Configuration> configurations,
string solutionFile,
List<string> generatedFiles,
List<string> skipFiles)
Solution solution,
List<Solution.Configuration> configurations,
string solutionFile,
List<string> generatedFiles,
List<string> skipFiles)
{
if (configurations[0].Platform == Platform.ios ||
configurations[0].Platform == Platform.mac ||
configurations[0].Platform == Platform.tvos ||
configurations[0].Platform == Platform.watchos ||
configurations[0].Platform == Platform.maccatalyst
)
if (UtilityMethods.HasFastBuildConfig(configurations))
{
XCWorkspaceGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
if (UtilityMethods.HasFastBuildConfig(configurations))
{
MasterBffGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
}
MasterBffGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
}
else

var devEnv = configurations[0].Target.GetFragment<DevEnv>();
switch (devEnv)
{
DevEnv devEnv = configurations[0].Target.GetFragment<DevEnv>();
switch (devEnv)
case DevEnv.xcode:
XCWorkspaceGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
break;
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:
case DevEnv.vs2026:
{
if (UtilityMethods.HasFastBuildConfig(configurations))
{
MasterBffGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
}

SlnGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
break;
}
default:
{
throw new Error("Generate called with unknown DevEnv: " + devEnv);
}
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:
case DevEnv.vs2026:
{
SlnGenerator.Generate(builder, solution, configurations, solutionFile, generatedFiles, skipFiles);
break;
}
default:
{
throw new Error("Generate called with unknown DevEnv: " + devEnv);
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions Sharpmake.Generators/VisualStudio/IPlatformVcxproj.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ public interface IPlatformVcxproj
bool HasUserAccountControlSupport { get; }
bool HasEditAndContinueDebuggingSupport { get; }

// When false, the generator will skip the standard Microsoft.Cpp.*.props/targets imports.
bool IsMSVC { get; }

IEnumerable<string> GetImplicitlyDefinedSymbols(IGenerationContext context);

IEnumerable<string> GetLibraryPaths(IGenerationContext context);
Expand Down
29 changes: 25 additions & 4 deletions Sharpmake.Generators/VisualStudio/Vcxproj.Template.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,12 @@ public static class Project
public static string ProjectEnd =
@"</Project>";

public static string ProjectAfterConfigurationsGeneral =
public static string MicrosoftCppProps =
@" <Import Project=""[vcTargetsPath]\Microsoft.Cpp.props"" />
<ImportGroup Label=""ExtensionSettings"">
";

public static string ProjectAfterConfigurationsGeneral =
@" <ImportGroup Label=""ExtensionSettings"">
";
public static string ProjectAfterConfigurationsGeneralImportPropertySheets =
@" <ImportGroup Label=""PropertySheets"">
Expand Down Expand Up @@ -138,9 +141,12 @@ public static class Project
@" </ItemDefinitionGroup>
";

public static string ProjectTargetsBegin =
public static string ImportMicrosoftCppTargets =
@" <Import Project=""[vcTargetsPath]\Microsoft.Cpp.targets"" />
<ImportGroup Label=""ExtensionTargets"">
";

public static string ProjectTargetsBegin =
@" <ImportGroup Label=""ExtensionTargets"">
";

public static string ProjectTargetsItem =
Expand Down Expand Up @@ -182,6 +188,18 @@ public static class Project
@" </Target>
";

public static string NMakeBuildTargets =
@" <Target Name=""Build"" Condition=""'$(NMakeBuildCommandLine)' != ''"" >
<Exec Command=""$(NMakeBuildCommandLine)"" WorkingDirectory=""$(NMakeWorkingDirectory)""/>
</Target>
<Target Name=""Rebuild"" Condition=""'$(NMakeReBuildCommandLine)' != ''"" >
<Exec Command=""$(NMakeReBuildCommandLine)"" WorkingDirectory=""$(NMakeWorkingDirectory)""/>
</Target>
<Target Name=""Clean"" Condition=""'$(NMakeCleanCommandLine)' != ''"" >
<Exec Command=""$(NMakeCleanCommandLine)"" WorkingDirectory=""$(NMakeWorkingDirectory)""/>
</Target>
";

public static string ProjectConfigurationsResourceCompile =
@" <ResourceCompile>[options.ResourceCompileTag]
<PreprocessorDefinitions>[options.ResourcePreprocessorDefinitions];%(PreprocessorDefinitions)</PreprocessorDefinitions>
Expand Down Expand Up @@ -367,6 +385,9 @@ public static class Project

public static string ProjectFilesSourceExcludeFromBuild =
@" <ExcludedFromBuild Condition=""'$(Configuration)|$(Platform)'=='[conf.Name]|[platformName]'"">true</ExcludedFromBuild>
";
public static string ProjectFilesSourceRemoveFromBuild =
@" <ClCompile Remove=""[file.FilePath]"" Condition=""'$(Configuration)|$(Platform)'=='[conf.Name]|[platformName]'"" />
";
public static string ProjectFilesSourceConsumeWinRTExtensions =
@" <CompileAsWinRT Condition=""'$(Configuration)|$(Platform)'=='[conf.Name]|[platformName]'"">true</CompileAsWinRT>
Expand Down
49 changes: 42 additions & 7 deletions Sharpmake.Generators/VisualStudio/Vcxproj.cs
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,9 @@ private void GenerateImpl(GenerationContext context, IList<string> generatedFile
foreach (var platform in context.PresentPlatforms.Values)
platform.GenerateProjectPlatformSdkDirectoryDescription(context, fileGenerator);

fileGenerator.Write(Template.Project.ImportCppDefaultProps);
bool isMSVC = context.PresentPlatforms.Values.Any(p => p.IsMSVC);
if (isMSVC)
fileGenerator.Write(Template.Project.ImportCppDefaultProps);

foreach (var platform in context.PresentPlatforms.Values)
platform.GeneratePostDefaultPropsImport(context, fileGenerator);
Expand Down Expand Up @@ -495,6 +497,8 @@ private void GenerateImpl(GenerationContext context, IList<string> generatedFile
}

// .props files
if (isMSVC)
fileGenerator.Write(Template.Project.MicrosoftCppProps);
fileGenerator.Write(Template.Project.ProjectAfterConfigurationsGeneral);
if (context.Project.ContainsASM)
{
Expand Down Expand Up @@ -671,20 +675,26 @@ private void GenerateImpl(GenerationContext context, IList<string> generatedFile

// .targets files
{
if (isMSVC)
fileGenerator.Write(Template.Project.ImportMicrosoftCppTargets);
fileGenerator.Write(Template.Project.ProjectTargetsBegin);
if (context.Project.ContainsASM)
{
fileGenerator.Write(Template.Project.ProjectMasmTargetsItem);
if (isMSVC)
fileGenerator.Write(Template.Project.ProjectMasmTargetsItem);
}
if (context.Project.ContainsNASM)
{
if (context.Project.NasmExePath.Length == 0)
{
throw new ArgumentNullException("NasmExePath not set and needed for NASM assembly files.");
}
using (fileGenerator.Declare("importedNasmTargetsFile", context.Project.NasmTargetsFile))
if (isMSVC)
{
fileGenerator.Write(Template.Project.ProjectNasmTargetsItem);
using (fileGenerator.Declare("importedNasmTargetsFile", context.Project.NasmTargetsFile))
{
fileGenerator.Write(Template.Project.ProjectNasmTargetsItem);
}
}
}

Expand Down Expand Up @@ -754,6 +764,9 @@ private void GenerateImpl(GenerationContext context, IList<string> generatedFile
platform.GenerateRunFromPcDeployment(context, fileGenerator);
}

if (!isMSVC)
fileGenerator.Write(Template.Project.NMakeBuildTargets);

fileGenerator.Write(Template.Project.ProjectEnd);

// remove all line that contain RemoveLineTag
Expand All @@ -780,7 +793,8 @@ private static void FillIncludeDirectoriesOptions(GenerationContext context)
context.Options["AdditionalPlatformIncludeDirectories"] = platformIncludePaths.Any() ? Util.PathGetRelative(context.ProjectDirectory, platformIncludePaths).JoinStrings(";") : FileGeneratorUtilities.RemoveLineTag;

var nmakeIncludeSearchPath = includePaths.Concat(platformIncludePaths);
context.Options["NMakeIncludeSearchPath"] = nmakeIncludeSearchPath.Any() ? Util.PathGetRelative(context.ProjectDirectory, nmakeIncludeSearchPath).JoinStrings(";") : FileGeneratorUtilities.RemoveLineTag;

context.Options["NMakeIncludeSearchPath"] = nmakeIncludeSearchPath.Any() ? string.Join(";", nmakeIncludeSearchPath) : FileGeneratorUtilities.RemoveLineTag;

// Fill resource include dirs
var resourceIncludePaths = platformVcxproj.GetResourceIncludePaths(context);
Expand Down Expand Up @@ -1591,6 +1605,9 @@ IList<string> skipFiles
foreach (Project.Configuration conf in context.ProjectConfigurations)
configurationCompiledFiles.Add(new List<ProjectFile>());

// Collects files excluded from build on non-MSVC platforms; written as <ClCompile Remove> after the ItemGroup
var nonMSVCExcludedFiles = new List<(ProjectFile File, Project.Configuration Conf)>();

bool hasCustomBuildForAllSources = context.ProjectConfigurations.First().CustomBuildForAllSources != null;
if (hasCustomBuildForAllSources)
{
Expand Down Expand Up @@ -1675,6 +1692,9 @@ IList<string> skipFiles
if (!isExcludeFromBuild && !isResource)
compiledFiles.Add(file);

if (isExcludeFromBuild && !platformVcxproj.IsMSVC && !isResource)
nonMSVCExcludedFiles.Add((file, conf));

if (isCompileAsCLRFile || consumeWinRTExtensions || excludeWinRTExtensions)
isDontUsePrecomp = true;
if (string.Compare(file.FileExtension, ".c", StringComparison.OrdinalIgnoreCase) == 0)
Expand All @@ -1697,7 +1717,7 @@ IList<string> skipFiles
bool hasExceptionSetting = !string.IsNullOrEmpty(exceptionSetting);

haveFileOptions = haveFileOptions ||
isExcludeFromBuild ||
(isExcludeFromBuild && platformVcxproj.IsMSVC) ||
isPrecompSource ||
(isDontUsePrecomp && hasPrecomp) ||
hasForcedIncludes ||
Expand Down Expand Up @@ -1736,7 +1756,8 @@ IList<string> skipFiles

if (isExcludeFromBuild)
{
fileGenerator.Write(Template.Project.ProjectFilesSourceExcludeFromBuild);
if (platformVcxproj.IsMSVC)
fileGenerator.Write(Template.Project.ProjectFilesSourceExcludeFromBuild);
}
else
{
Expand Down Expand Up @@ -1998,6 +2019,20 @@ IList<string> skipFiles
}
}
}

// Write <ClCompile Remove> entries for files excluded from build on non-MSVC platforms
if (nonMSVCExcludedFiles.Count > 0)
{
foreach (var (excludedFile, excludedConf) in nonMSVCExcludedFiles)
{
using (fileGenerator.Declare("file", excludedFile))
using (fileGenerator.Declare("conf", excludedConf))
using (fileGenerator.Declare("platformName", Util.GetToolchainPlatformString(excludedConf.Platform, excludedConf.Project, excludedConf.Target)))
{
fileGenerator.Write(Template.Project.ProjectFilesSourceRemoveFromBuild);
}
}
}

// done!
fileGenerator.Write(Template.Project.ProjectFilesEnd);
Expand Down
Loading
Loading