Skip to content

Commit a0c127e

Browse files
committed
[New][Bff] Record the unity files in the auto cleanup db, so we can auto remove stale ones
1 parent 76637b8 commit a0c127e

File tree

3 files changed

+38
-4
lines changed

3 files changed

+38
-4
lines changed

Sharpmake.Generators/FastBuild/Bff.Util.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ public class Unity
4343
public string UseRelativePaths = FileGeneratorUtilities.RemoveLineTag; // (optional) Use relative paths for generated Unity files
4444

4545
public const string DefaultUnityInputPatternExtension = ".cpp";
46+
public const string DefaultUnityOutputPatternExtension = "Unity*.cpp";
47+
48+
internal string UnityFullOutputPath = string.Empty; // Path to output generated Unity files
4649

4750
public override int GetHashCode()
4851
{

Sharpmake.Generators/FastBuild/Bff.cs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,10 +1366,35 @@ List<string> skipFiles
13661366
}
13671367

13681368
// Write all unity sections together at the beginning of the .bff just after the header.
1369-
foreach (var unityFile in _unities.Keys.OrderBy(u => u.UnityName))
1369+
if (_unities.Any())
13701370
{
1371-
using (bffWholeFileGenerator.Declare("unityFile", unityFile))
1372-
bffWholeFileGenerator.Write(Template.ConfigurationFile.UnitySection);
1371+
foreach (var unityFile in _unities.Keys.OrderBy(u => u.UnityName))
1372+
{
1373+
using (bffWholeFileGenerator.Declare("unityFile", unityFile))
1374+
bffWholeFileGenerator.Write(Template.ConfigurationFile.UnitySection);
1375+
1376+
// Record the unities in the autocleanupdb to allow auto removal when they become stale.
1377+
// Note that can't record them as 'generated', since they are created by FastBuild and not by us.
1378+
int nbUnities = 1;
1379+
if (unityFile.UnityNumFiles != FileGeneratorUtilities.RemoveLineTag)
1380+
{
1381+
if (!int.TryParse(unityFile.UnityNumFiles, out nbUnities))
1382+
throw new Error("'{0}' cannot be converted to int!", unityFile.UnityNumFiles);
1383+
}
1384+
1385+
string outputPattern = unityFile.UnityOutputPattern == FileGeneratorUtilities.RemoveLineTag ? Sharpmake.Generators.FastBuild.Bff.Unity.DefaultUnityOutputPatternExtension : unityFile.UnityOutputPattern;
1386+
int wildcardIndex = outputPattern.IndexOf('*');
1387+
if (wildcardIndex == -1)
1388+
throw new Error("UnityOutputPattern must include a '*', but none was found in '{0}'!", unityFile.UnityNumFiles);
1389+
1390+
string firstStringChunk = outputPattern.Substring(0, wildcardIndex);
1391+
string lastStringChunk = outputPattern.Substring(wildcardIndex + 1);
1392+
for (int i = 1; i <= nbUnities; ++i)
1393+
{
1394+
string fullPath = Path.Combine(unityFile.UnityFullOutputPath, $"{firstStringChunk}{i}{lastStringChunk}");
1395+
Util.RecordInAutoCleanupDatabase(fullPath);
1396+
}
1397+
}
13731398
}
13741399

13751400
// Now combine all the streams.
@@ -1878,6 +1903,7 @@ private void ConfigureUnities(IGenerationContext context, Dictionary<Project.Con
18781903
{
18791904
// Note that the UnityName and UnityOutputPattern are intentionally left empty: they will be set in the Resolve
18801905
UnityOutputPath = CurrentBffPathKeyCombine(Util.PathGetRelative(context.ProjectDirectoryCapitalized, conf.FastBuildUnityPath, true)),
1906+
UnityFullOutputPath = Path.Combine(context.ProjectDirectoryCapitalized, conf.FastBuildUnityPath),
18811907
UnityInputIsolateWritableFiles = conf.FastBuildUnityInputIsolateWritableFiles.ToString().ToLower(),
18821908
UnityInputIsolateWritableFilesLimit = conf.FastBuildUnityInputIsolateWritableFiles ? conf.FastBuildUnityInputIsolateWritableFilesLimit.ToString() : FileGeneratorUtilities.RemoveLineTag,
18831909
UnityPCH = conf.PrecompHeader ?? FileGeneratorUtilities.RemoveLineTag,

Sharpmake/Util.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,10 +212,15 @@ public static bool FileWriteIfDifferent(FileInfo file, MemoryStream stream)
212212
return Builder.Instance.Context.WriteGeneratedFile(null, file, stream);
213213
}
214214

215+
internal static bool RecordInAutoCleanupDatabase(string fullPath)
216+
{
217+
return s_writtenFiles.TryAdd(fullPath, DateTime.Now);
218+
}
219+
215220
internal static bool FileWriteIfDifferentInternal(FileInfo file, MemoryStream stream, bool bypassAutoCleanupDatabase = false)
216221
{
217222
if (!bypassAutoCleanupDatabase)
218-
s_writtenFiles.TryAdd(file.FullName, DateTime.Now);
223+
RecordInAutoCleanupDatabase(file.FullName);
219224

220225
if (file.Exists)
221226
{

0 commit comments

Comments
 (0)