Fix recursive binary modules usage in scripting

This commit is contained in:
Wojciech Figat
2022-12-06 11:43:19 +01:00
parent f918fa2a32
commit f426c75696
2 changed files with 39 additions and 12 deletions

View File

@@ -31,6 +31,25 @@ namespace Flax.Build
public IGrouping<string, Module>[] BinaryModules;
public BuildTargetInfo BuildInfo;
public Dictionary<ProjectInfo, BuildData> ReferenceBuilds = new Dictionary<ProjectInfo, BuildData>();
public BuildTargetBinaryModuleInfo FinReferenceBuildModule(string name)
{
if (BuildInfo != null && BuildInfo.BinaryModules != null)
{
foreach (var e in BuildInfo.BinaryModules)
{
if (string.Equals(e.Name, name, StringComparison.Ordinal))
return e;
}
}
foreach (var e in ReferenceBuilds)
{
var q = e.Value.FinReferenceBuildModule(name);
if (q != null)
return q;
}
return null;
}
}
public class BuildTargetBinaryModuleInfo
@@ -751,6 +770,7 @@ namespace Flax.Build
buildData.BinaryModules = GetBinaryModules(project, target, buildData.Modules);
// Inject binary modules symbols import/export defines
var moduleNamesUsed = new HashSet<string>();
for (int i = 0; i < buildData.BinaryModules.Length; i++)
{
var binaryModule = buildData.BinaryModules[i];
@@ -765,22 +785,28 @@ namespace Flax.Build
moduleOptions.CompileEnv.PreprocessorDefinitions.Add(binaryModuleNameUpper + (target.UseSymbolsExports ? "_API=" + toolchain.DllExport : "_API="));
// Import symbols from binary modules containing the referenced modules (from this project only, external ones are handled via ReferenceBuilds below)
foreach (var moduleName in moduleOptions.PrivateDependencies)
foreach (var moduleName in moduleOptions.PrivateDependencies.Concat(moduleOptions.PublicDependencies))
{
var dependencyModule = buildData.Rules.GetModule(moduleName);
if (dependencyModule != null && !string.IsNullOrEmpty(dependencyModule.BinaryModuleName) && dependencyModule.BinaryModuleName != binaryModule.Key && IsModuleFromProject(dependencyModule, project) && buildData.Modules.TryGetValue(dependencyModule, out var dependencyOptions))
{
// Import symbols from referenced binary module
moduleOptions.CompileEnv.PreprocessorDefinitions.Add(dependencyModule.BinaryModuleName.ToUpperInvariant() + "_API=" + toolchain.DllImport);
}
}
foreach (var moduleName in moduleOptions.PublicDependencies)
{
var dependencyModule = buildData.Rules.GetModule(moduleName);
if (dependencyModule != null && !string.IsNullOrEmpty(dependencyModule.BinaryModuleName) && dependencyModule.BinaryModuleName != binaryModule.Key && IsModuleFromProject(dependencyModule, project) && buildData.Modules.TryGetValue(dependencyModule, out var dependencyOptions))
if (dependencyModule != null &&
!string.IsNullOrEmpty(dependencyModule.BinaryModuleName) &&
dependencyModule.BinaryModuleName != binaryModule.Key &&
!moduleNamesUsed.Contains(dependencyModule.BinaryModuleName) &&
GetModuleProject(dependencyModule, project) != null &&
buildData.Modules.TryGetValue(dependencyModule, out var dependencyOptions))
{
// Import symbols from referenced binary module
moduleOptions.CompileEnv.PreprocessorDefinitions.Add(dependencyModule.BinaryModuleName.ToUpperInvariant() + "_API=" + toolchain.DllImport);
var dependencyModuleBuild = buildData.FinReferenceBuildModule(moduleName);
if (dependencyModuleBuild != null)
{
// Link against the referenced binary module
if (toolchain.UseImportLibraryWhenLinking)
moduleOptions.LinkEnv.InputLibraries.Add(Path.ChangeExtension(dependencyModuleBuild.NativePath, toolchain.Platform.StaticLibraryFileExtension));
else
moduleOptions.LinkEnv.InputLibraries.Add(dependencyModuleBuild.NativePath);
}
}
}
}
@@ -825,6 +851,7 @@ namespace Flax.Build
}
}
}
moduleNamesUsed.Clear();
}
}

View File

@@ -150,7 +150,7 @@ namespace Flax.Build.NativeCpp
/// <summary>
/// The collection of defines with preprocessing symbol for a source files.
/// </summary>
public readonly List<string> PreprocessorDefinitions = new List<string>();
public readonly HashSet<string> PreprocessorDefinitions = new HashSet<string>();
/// <summary>
/// The additional paths to add to the list of directories searched for include files.