diff --git a/code/compiler/core/build-engine.wren b/code/compiler/core/build-engine.wren index 7118690..57b4c66 100644 --- a/code/compiler/core/build-engine.wren +++ b/code/compiler/core/build-engine.wren @@ -474,7 +474,7 @@ class BuildEngine { Soup.info("Pass Along Public Includes") for (directory in arguments.PublicIncludes) { - result.PublicIncludes.add(directory) + result.PublicIncludes.add(directory) } } } diff --git a/code/compiler/gcc-tests/gcc-argument-builder-unit-tests.wren b/code/compiler/gcc-tests/gcc-argument-builder-unit-tests.wren index 9acd69d..13659cb 100644 --- a/code/compiler/gcc-tests/gcc-argument-builder-unit-tests.wren +++ b/code/compiler/gcc-tests/gcc-argument-builder-unit-tests.wren @@ -301,7 +301,9 @@ class GCCArgumentBuilderUnitTests { "./module.cpp", "-o", "C:/target/module.obj", - "-fmodules-ts", + "-interface", + "-ifcOutput", + "C:/target/module.ifc", ] Assert.ListEqual(expectedArguments, actualArguments) diff --git a/code/extension-tests/tasks/recipe-build-task-unit-tests.wren b/code/extension-tests/tasks/recipe-build-task-unit-tests.wren index 8f10ba2..e8a0546 100644 --- a/code/extension-tests/tasks/recipe-build-task-unit-tests.wren +++ b/code/extension-tests/tasks/recipe-build-task-unit-tests.wren @@ -58,7 +58,7 @@ class RecipeBuildTaskUnitTests { var expectedActiveState = { "Build": { "LinkLibraries": [], - "PublicHeaderSets": [], + "KnownPublicHeaderSets": [], "TargetType": "StaticLibrary", "TargetRootDirectory": "/(TARGET)/", "Compiler": "MOCK", @@ -132,7 +132,7 @@ class RecipeBuildTaskUnitTests { "LinkLibraries": [ "/Direct/Library.lib" ], - "PublicHeaderSets": [], + "KnownPublicHeaderSets": [], "TargetType": "StaticLibrary", "TargetRootDirectory": "/(TARGET)/", "Compiler": "MOCK", diff --git a/code/extension/recipe.sml b/code/extension/recipe.sml index 57e9fab..341baf3 100644 --- a/code/extension/recipe.sml +++ b/code/extension/recipe.sml @@ -1,6 +1,6 @@ Name: 'cpp' Language: 'Wren|0' -Version: 0.19.3 +Version: 0.19.4 Dependencies: { Runtime: [ 'soup|cpp-compiler@0' diff --git a/code/extension/tasks/expand-source-task.wren b/code/extension/tasks/expand-source-task.wren index 1730f3c..1d952d4 100644 --- a/code/extension/tasks/expand-source-task.wren +++ b/code/extension/tasks/expand-source-task.wren @@ -34,7 +34,11 @@ class ExpandSourceTask is SoupTask { var activeState = Soup.activeState var buildTable = activeState["Build"] + ExpandSourceTask.expandSource(globalState, buildTable) + ExpandSourceTask.expandPublicHeaderSets(globalState, buildTable) + } + static expandSource(globalState, buildTable) { var allowedPaths = [] if (buildTable.containsKey("KnownSource")) { // Fill in the info on existing source files @@ -62,20 +66,66 @@ class ExpandSourceTask is SoupTask { sourceFiles) } + static expandPublicHeaderSets(globalState, buildTable) { + if (buildTable.containsKey("KnownPublicHeaderSets")) { + // Expand the source from all discovered files + Soup.info("Expand Public Header Sets") + var filesystem = globalState["FileSystem"] + + var publicHeaderSets = [] + for (value in buildTable["KnownPublicHeaderSets"]) { + var packageHeaderSet = {} + var root = Path.new(value["Root"]) + packageHeaderSet["Root"] = root.toString + if (value.containsKey("Target")) { + packageHeaderSet["Target"] = value["Target"] + } + + var allowedPaths = [] + if (value.containsKey("Files")) { + // Fill in the info on existing files + for (file in ListExtensions.ConvertToPathList(value["Files"])) { + allowedPaths.add(root + file) + } + } else { + // Default to matching all header files under the root + allowedPaths.add(root + Path.new("./**/*.h")) + } + + var headerFiles = ExpandSourceTask.DiscoverHeaderFiles( + filesystem, Path.new(), allowedPaths) + + // Strip out the root so we can still resolve the final file path correctly + var relativeHeaderFiles = [] + for (file in headerFiles) { + relativeHeaderFiles.add(file.GetRelativeTo(root)) + } + + packageHeaderSet["Files"] = ListExtensions.ConvertFromPathList(relativeHeaderFiles) + + publicHeaderSets.add(packageHeaderSet) + } + + ListExtensions.Append( + MapExtensions.EnsureList(buildTable, "PublicHeaderSets"), + publicHeaderSets) + } + } + static DiscoverCompileFiles( currentDirectory, workingDirectory, preprocessors, allowedPaths, excludePaths) { var files = [] for (directoryEntity in currentDirectory) { if (directoryEntity is String) { var file = workingDirectory + Path.new(directoryEntity) - Soup.info("Check File: %(file)") + // Soup.info("Check File: %(file)") if (ExpandSourceTask.ShouldInclude(allowedPaths, excludePaths, file)) { files.add(ExpandSourceTask.CreateSourceInfo(file, preprocessors)) } } else { for (child in directoryEntity) { var directory = workingDirectory + Path.new(child.key) - Soup.info("Found Directory: %(directory)") + // Soup.info("Found Directory: %(directory)") var subFiles = ExpandSourceTask.DiscoverCompileFiles( child.value, directory, preprocessors, allowedPaths, excludePaths) ListExtensions.Append(files, subFiles) @@ -86,6 +136,29 @@ class ExpandSourceTask is SoupTask { return files } + static DiscoverHeaderFiles(currentDirectory, workingDirectory, allowedPaths) { + var files = [] + for (directoryEntity in currentDirectory) { + if (directoryEntity is String) { + var file = workingDirectory + Path.new(directoryEntity) + // Soup.info("Check File: %(file)") + if (ExpandSourceTask.IsMatchAny(allowedPaths, file)) { + files.add(file) + } + } else { + for (child in directoryEntity) { + var directory = workingDirectory + Path.new(child.key) + // Soup.info("Found Directory: %(directory)") + var subFiles = ExpandSourceTask.DiscoverHeaderFiles( + child.value, directory, allowedPaths) + ListExtensions.Append(files, subFiles) + } + } + } + + return files + } + static ShouldInclude(allowedPaths, excludePaths, file) { if (ExpandSourceTask.IsMatchAny(allowedPaths, file)) { // If we matched included, check if there is an explicit exclude diff --git a/code/extension/tasks/recipe-build-task.wren b/code/extension/tasks/recipe-build-task.wren index ece53f2..5a59d63 100644 --- a/code/extension/tasks/recipe-build-task.wren +++ b/code/extension/tasks/recipe-build-task.wren @@ -161,7 +161,6 @@ class RecipeBuildTask is SoupTask { } } - var knownExcludeFiles = null if (recipe.containsKey("Exclude")) { knownExcludeFiles = [] @@ -177,9 +176,9 @@ class RecipeBuildTask is SoupTask { } // Load the public header files if present - var publicHeaderSets = [] + var knownPublicHeaderSets = [] if (recipe.containsKey("PublicHeaders")) { - publicHeaderSets = recipe["PublicHeaders"] + knownPublicHeaderSets = recipe["PublicHeaders"] } // Check for warning settings @@ -248,8 +247,8 @@ class RecipeBuildTask is SoupTask { MapExtensions.EnsureList(build, "AssemblySource"), assemblySourceFiles) ListExtensions.Append( - MapExtensions.EnsureList(build, "PublicHeaderSets"), - publicHeaderSets) + MapExtensions.EnsureList(build, "KnownPublicHeaderSets"), + knownPublicHeaderSets) build["EnableWarningsAsErrors"] = enableWarningsAsErrors