diff --git a/Source/Tools/Flax.Build/Build/NativeCpp/Builder.NativeCpp.cs b/Source/Tools/Flax.Build/Build/NativeCpp/Builder.NativeCpp.cs index 9dba593a1..050afbad3 100644 --- a/Source/Tools/Flax.Build/Build/NativeCpp/Builder.NativeCpp.cs +++ b/Source/Tools/Flax.Build/Build/NativeCpp/Builder.NativeCpp.cs @@ -31,6 +31,25 @@ namespace Flax.Build public IGrouping[] BinaryModules; public BuildTargetInfo BuildInfo; public Dictionary ReferenceBuilds = new Dictionary(); + + 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(); 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(); } } diff --git a/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs b/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs index 522099c62..2579dadd0 100644 --- a/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs +++ b/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs @@ -150,7 +150,7 @@ namespace Flax.Build.NativeCpp /// /// The collection of defines with preprocessing symbol for a source files. /// - public readonly List PreprocessorDefinitions = new List(); + public readonly HashSet PreprocessorDefinitions = new HashSet(); /// /// The additional paths to add to the list of directories searched for include files.