Skip to content

Commit b344ab0

Browse files
Extend FASTBuild bff generator to support CustomFileBuildStep.AdditionalInputs. (#443)
For some reason Sharpmake currently doesn't support having multiple inputs for the FASTBuild .Exec function generated from CustomFileBuildStep whereas it does for the .Exec function generated from the custom pre or post build exe steps. FASTBuild .Exec supports multiple input files, so it's fairly trivial to support this and it's useful for correct dependency checking of per-file custom build steps. Co-authored-by: Martin Ecker <[email protected]>
1 parent 45eeddd commit b344ab0

File tree

6 files changed

+46
-16
lines changed

6 files changed

+46
-16
lines changed

Sharpmake.Generators/FastBuild/Bff.Util.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,9 +859,16 @@ internal static void WriteCustomBuildStepAsGenericExecutable(string projectRoot,
859859
return relativePath;
860860
});
861861

862+
Strings inputFiles = new();
863+
inputFiles.Add(relativeBuildStep.KeyInput);
864+
foreach (string inputFile in relativeBuildStep.AdditionalInputs)
865+
{
866+
inputFiles.Add(inputFile);
867+
}
868+
862869
using (bffGenerator.Declare("fastBuildPreBuildName", relativeBuildStep.Description))
863870
using (bffGenerator.Declare("fastBuildPrebuildExeFile", relativeBuildStep.Executable))
864-
using (bffGenerator.Declare("fastBuildPreBuildInputFiles", FBuildFormatSingleListItem(relativeBuildStep.KeyInput)))
871+
using (bffGenerator.Declare("fastBuildPreBuildInputFiles", FBuildFormatList(inputFiles.ToList(), 26)))
865872
using (bffGenerator.Declare("fastBuildPreBuildOutputFile", relativeBuildStep.Output))
866873
using (bffGenerator.Declare("fastBuildPreBuildArguments", string.IsNullOrWhiteSpace(relativeBuildStep.ExecutableArguments) ? FileGeneratorUtilities.RemoveLineTag : relativeBuildStep.ExecutableArguments))
867874
// This is normally the project directory.

Sharpmake/Project.Configuration.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2360,7 +2360,6 @@ public enum ProjectFilter
23602360
public string OutputItemType = "";
23612361

23622362
/// <summary>
2363-
/// Not supported by FASTBuild.
23642363
/// Additional files that will cause a re-run of this custom build step can be be specified here.
23652364
/// </summary>
23662365
public Strings AdditionalInputs = new Strings();

samples/CustomBuildStep/CustomBuildStep.sharpmake.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public CustomBuildStepProject()
1414
SourceRootPath = @"[project.SharpmakeCsPath]\codebase";
1515
SourceFilesExtensions.Add(".bat");
1616

17-
// need to add it explicitly since it's gonna be generated it doesn't exist yet
17+
// need to add generated files explicitly since they don't exist yet
1818
SourceFiles.Add(@"[project.SourceRootPath]\main.cpp");
1919
SourceFiles.Add(@"[project.SourceRootPath]\secondaryfile.cpp");
2020

@@ -33,6 +33,7 @@ public CustomBuildStepProject()
3333
[Configure]
3434
public void ConfigureAll(Configuration conf, Target target)
3535
{
36+
// A simple custom build step that generates main.cpp via a .bat file
3637
conf.CustomFileBuildSteps.Add(
3738
new Configuration.CustomFileBuildStep
3839
{
@@ -41,13 +42,17 @@ public void ConfigureAll(Configuration conf, Target target)
4142
Description = $"Generate main.cpp",
4243
Executable = "generatemain.bat"
4344
});
45+
// Demonstrates a custom file build step that has two inputs and one output
4446
conf.CustomFileBuildSteps.Add(
4547
new Configuration.CustomFileBuildStep
4648
{
4749
KeyInput = "generatesecondaryfile.bat",
4850
Output = "secondaryfile.cpp",
4951
Description = $"Generate secondaryfile.cpp",
50-
Executable = "generatesecondaryfile.bat"
52+
Executable = "generatesecondaryfile.bat",
53+
ExecutableArguments = "../codebase/concatenate_file1.in ../codebase/concatenate_file2.in",
54+
AdditionalInputs = { "[project.SourceRootPath]\\concatenate_file1.in", "[project.SourceRootPath]\\concatenate_file2.in" }
55+
5156
});
5257

5358
conf.ProjectFileName = "[project.Name]_[target.DevEnv]_[target.Platform]";
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#include <stdio.h>
2+
3+
const char *GetFile1Content()
4+
{
5+
return "This is the content of file 1.\n";
6+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const char *GetFile2Content()
2+
{
3+
return "This is the content of file 2.\n";
4+
}
5+
6+
void PrintSecondaryFileContent()
7+
{
8+
printf("%s", GetFile1Content());
9+
printf("%s", GetFile2Content());
10+
}
Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
@echo off
22
setlocal
33

4-
set OUTPUT=%~dp0secondaryfile.cpp
5-
echo Generating %OUTPUT%
6-
7-
:: Note: ^ is used to escape < and >
8-
> "%OUTPUT%" echo #include ^<stdio.h^>
9-
>>"%OUTPUT%" echo void PrintSecondaryFileContent()
10-
>>"%OUTPUT%" echo {
11-
>>"%OUTPUT%" echo printf("This is secondary file\n");
12-
>>"%OUTPUT%" echo }
13-
14-
echo Done
15-
goto :eof
4+
if "%~2"=="" goto :usage
5+
6+
set OUTPUT=%~dp0\secondaryfile.cpp
7+
8+
echo Concatenating "%~f1" + "%~f2" into "%OUTPUT%"
9+
>"%OUTPUT%" type "%~f1"
10+
>>"%OUTPUT%" type "%~f2"
11+
12+
echo Done.
13+
goto :eof
14+
15+
:usage
16+
echo Usage: %~n0 file1.cpp file2.cpp
17+
echo Concatenates file1.cpp and file2.cpp into %~dp0concatenated.cpp
18+
exit /b 1

0 commit comments

Comments
 (0)