Sharpmake.FunctionalTests/OnlyNeededFastBuildTest/OnlyNeededFastBuildTest.sharpmake.cs (183 lines of code) (raw):
// Copyright (c) 2022 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 System.IO;
using System.Linq;
using System.Reflection;
using Sharpmake;
using Sharpmake.Generators.FastBuild;
namespace SharpmakeGen.FunctionalTests
{
[DebuggerDisplay("\"{Platform}_{DevEnv}\" {Name}")]
public class Target : Sharpmake.ITarget
{
public Platform Platform;
public DevEnv DevEnv;
public Optimization Optimization;
public Blob Blob;
public BuildSystem BuildSystem;
public Target() { }
public Target(
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<string>();
nameParts.Add(Optimization.ToString());
nameParts.Add(BuildSystem.ToString());
if ((BuildSystem == BuildSystem.FastBuild && Blob == Blob.NoBlob) || Blob == Blob.Blob)
nameParts.Add(Blob.ToString());
nameParts.Add(DevEnv.ToString());
return string.Join("_", nameParts);
}
}
public string NameForSolution
{
get
{
return Optimization.ToString();
}
}
public string SolutionPlatformName
{
get
{
var nameParts = new List<string>();
nameParts.Add(BuildSystem.ToString());
if (BuildSystem == BuildSystem.FastBuild && Blob == Blob.NoBlob)
nameParts.Add(Blob.ToString());
return string.Join("_", nameParts);
}
}
public static ITarget[] GetDefaultTargets()
{
var targets = new List<ITarget> {
new Target(
Platform.win64,
DevEnv.vs2019,
Optimization.Debug | Optimization.Release,
Blob.NoBlob,
BuildSystem.MSBuild
)
};
// and a fastbuild unity version of the target
targets.Add(targets.First().Clone(Blob.FastBuildUnitys, BuildSystem.FastBuild));
return targets.ToArray();
}
}
public abstract class CommonProject : Project
{
public CommonProject()
: base(typeof(Target))
{
RootPath = @"[project.SharpmakeCsPath]";
SourceRootPath = @"[project.RootPath]\codebase\[project.Name]";
AddTargets(Target.GetDefaultTargets());
}
[ConfigurePriority(-100)]
[Configure]
public virtual void ConfigureAll(Configuration conf, Target target)
{
conf.IsFastBuild = target.BuildSystem == BuildSystem.FastBuild;
conf.ProjectFileName = "[project.Name]_[target.Platform]_[target.DevEnv]";
if (conf.IsFastBuild)
{
conf.ProjectName += "_FastBuild";
conf.ProjectFileName += "_FastBuild";
conf.SolutionFolder = "FastBuild";
}
conf.ProjectPath = @"[project.SharpmakeCsPath]\projects";
conf.IntermediatePath = @"[conf.ProjectPath]\build\[conf.Name]\[project.Name]";
conf.TargetPath = @"[conf.ProjectPath]\output\[conf.Name]";
conf.Output = Configuration.OutputType.Lib; // defaults to creating static libs
// .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 = "[conf.IntermediatePath]";
}
[Configure(BuildSystem.FastBuild)]
public virtual void ConfigureFastBuild(Configuration conf, Target target)
{
conf.BlobPath = @"[conf.ProjectPath]\unity\[project.Name]";
conf.FastBuildBlobbed = target.Blob == Blob.FastBuildUnitys;
// Force writing to pdb from different cl.exe process to go through the pdb server
conf.AdditionalCompilerOptions.Add("/FS");
}
}
public abstract class CommonExeProject : CommonProject
{
public override void ConfigureAll(Configuration conf, Target target)
{
base.ConfigureAll(conf, target);
conf.Output = Configuration.OutputType.Exe;
// workaround necessity of rc.exe
if (target.Platform == Platform.win64)
conf.Options.Add(Options.Vc.Linker.EmbedManifest.No);
}
}
[Generate]
public class SomeLib : CommonProject
{
public SomeLib()
{
}
}
[Generate]
public class SomeExeWithLib : CommonExeProject
{
public SomeExeWithLib()
{
}
public override void ConfigureAll(Configuration conf, Target target)
{
base.ConfigureAll(conf, target);
conf.AddPublicDependency<SomeLib>(target);
}
}
[Generate]
public class SomeStandaloneExe : CommonExeProject
{
public SomeStandaloneExe()
{
}
}
[Sharpmake.Generate]
public class OnlyNeededFastBuildTestSolution : Sharpmake.Solution
{
public OnlyNeededFastBuildTestSolution()
: base(typeof(Target))
{
Name = "OnlyNeededFastBuildTest";
AddTargets(Target.GetDefaultTargets());
}
[Configure]
public void ConfigureAll(Configuration conf, Target target)
{
conf.SolutionFileName = "[solution.Name]";
conf.SolutionPath = @"[solution.SharpmakeCsPath]\projects";
conf.Name = "[target.NameForSolution]";
conf.PlatformName = "[target.SolutionPlatformName]";
conf.IncludeOnlyNeededFastBuildProjects = true;
conf.AddProject<SomeStandaloneExe>(target);
conf.AddProject<SomeExeWithLib>(target);
}
}
public static class Main
{
[Sharpmake.Main]
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\Windows-x64\FBuild.exe");
FastBuildSettings.FastBuildWait = true;
FastBuildSettings.WriteAllConfigsSection = true;
KitsRootPaths.SetUseKitsRootForDevEnv(DevEnv.vs2019, KitsRootEnum.KitsRoot10, Options.Vc.General.WindowsTargetPlatformVersion.Latest);
Bff.UnityResolver = new Bff.FragmentUnityResolver();
arguments.Generate<OnlyNeededFastBuildTestSolution>();
}
}
}