diff --git a/source/dub/commandline.d b/source/dub/commandline.d index 5b1a208..3e2579f 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -776,9 +776,9 @@ "", "The accepted values for --data=VALUE are:", "", - "main-source-file, dflags, lflags, libs, lib-files, source-files, " - "versions, debug-versions, import-paths, string-import-paths, " - "import-files, options", + "main-source-file, dflags, lflags, libs, linker-files, d-files, " + "source-files, versions, debug-versions, import-paths, " + "string-import-paths, import-files, options", "", "The following are also accepted by --data if --data-list is used:", "", diff --git a/source/dub/compilers/buildsettings.d b/source/dub/compilers/buildsettings.d index 190dd00..752c44e 100644 --- a/source/dub/compilers/buildsettings.d +++ b/source/dub/compilers/buildsettings.d @@ -29,7 +29,6 @@ string[] dflags; string[] lflags; string[] libs; - string[] libFiles; string[] sourceFiles; string[] copyFiles; string[] versions; @@ -45,6 +44,18 @@ @byName BuildRequirements requirements; @byName BuildOptions options; + string[] dFiles() + { + import dub.compilers.compiler : isLinkerFile; + return sourceFiles.filter!(f => !isLinkerFile(f)).array(); + } + + string[] linkerFiles() + { + import dub.compilers.compiler : isLinkerFile; + return sourceFiles.filter!(f => isLinkerFile(f)).array(); + } + BuildSettings dup() const { BuildSettings ret; @@ -65,7 +76,6 @@ addDFlags(bs.dflags); addLFlags(bs.lflags); addLibs(bs.libs); - addLibFiles(bs.libFiles); addSourceFiles(bs.sourceFiles); addCopyFiles(bs.copyFiles); addVersions(bs.versions); @@ -84,7 +94,6 @@ void removeDFlags(in string[] value...) { remove(dflags, value); } void addLFlags(in string[] value...) { lflags ~= value; } void addLibs(in string[] value...) { add(libs, value); } - void addLibFiles(in string[] value...) { add(libFiles, value); } void addSourceFiles(in string[] value...) { add(sourceFiles, value); } void prependSourceFiles(in string[] value...) { prepend(sourceFiles, value); } void removeSourceFiles(in string[] value...) { removePaths(sourceFiles, value); } diff --git a/source/dub/generators/targetdescription.d b/source/dub/generators/targetdescription.d index bd208ef..4125505 100644 --- a/source/dub/generators/targetdescription.d +++ b/source/dub/generators/targetdescription.d @@ -7,8 +7,11 @@ */ module dub.generators.targetdescription; +import dub.compilers.buildsettings; +import dub.compilers.compiler; import dub.description; import dub.generators.generator; +import dub.internal.vibecompat.inet.path; import dub.project; class TargetDescriptionGenerator : ProjectGenerator { @@ -25,7 +28,11 @@ auto configs = m_project.getPackageConfigs(settings.platform, settings.config); targetDescriptions.length = targets.length; size_t i = 0; + size_t rootIndex; foreach (t; targets) { + if (t.pack.name == m_project.rootPackage.name) + rootIndex = i; + TargetDescription d; d.rootPackage = t.pack.name; d.packages = t.packages.map!(p => p.name).array; @@ -37,5 +44,18 @@ targetDescriptionLookup[d.rootPackage] = i; targetDescriptions[i++] = d; } + + // Add static library dependencies + auto bs = targetDescriptions[rootIndex].buildSettings; + foreach (ref desc; targetDescriptions) { + foreach (linkDepName; desc.linkDependencies) { + auto linkDepTarget = targetDescriptions[ targetDescriptionLookup[linkDepName] ]; + auto dbs = linkDepTarget.buildSettings; + if (bs.targetType != TargetType.staticLibrary) { + bs.addSourceFiles((Path(dbs.targetPath) ~ getTargetFileName(dbs, settings.platform)).toNativeString()); + } + } + } + targetDescriptions[rootIndex].buildSettings = bs; } } diff --git a/source/dub/project.d b/source/dub/project.d index 9b423c4..ea8bc09 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -653,12 +653,13 @@ { case "dflags": case "mainSourceFile": - case "libFiles": case "importFiles": values = formatBuildSettingPlain!attributeName(platform, configs, projectDescription); break; case "lflags": + case "linkerFiles": + case "dFiles": case "sourceFiles": case "versions": case "debugVersions": @@ -675,7 +676,20 @@ else static if (attributeName == "stringImportPaths") bs.stringImportPaths = bs.stringImportPaths.map!(ensureTrailingSlash).array(); - compiler.prepareBuildSettings(bs, BuildSetting.all & ~to!BuildSetting(attributeName)); + // linkerFiles and dFiles are functions, not regular BuildSetting fields + auto buildSettingField = attributeName; + static if(attributeName == "linkerFiles") + { + buildSettingField = "sourceFiles"; + bs.sourceFiles = bs.linkerFiles(); + } + else static if(attributeName == "dFiles") + { + buildSettingField = "sourceFiles"; + bs.sourceFiles = bs.dFiles(); + } + + compiler.prepareBuildSettings(bs, BuildSetting.all & ~to!BuildSetting(buildSettingField)); values = bs.dflags; break; @@ -706,7 +720,8 @@ switch (attributeName) { case "mainSourceFile": - case "libFiles": + case "linkerFiles": + case "dFiles": case "copyFiles": case "importFiles": case "stringImportFiles": @@ -739,7 +754,13 @@ // is empty string an actual permitted value instead of // a missing value? auto getRawBuildSetting(Package pack, bool allowEmptyString) { - auto value = __traits(getMember, buildSettings, attributeName); + // linkerFiles and dFiles are implemented as member functions + static if(attributeName == "linkerFiles") + auto value = buildSettings.linkerFiles(); + else static if(attributeName == "dFiles") + auto value = buildSettings.dFiles(); + else + auto value = __traits(getMember, buildSettings, attributeName); static if( is(typeof(value) == string[]) ) return value; @@ -776,7 +797,8 @@ // Is relative path(s) to a file? enum isRelativeFile = - attributeName == "sourceFiles" || attributeName == "importFiles" || + attributeName == "sourceFiles" || attributeName == "linkerFiles" || + attributeName == "dFiles" || attributeName == "importFiles" || attributeName == "stringImportFiles" || attributeName == "copyFiles" || attributeName == "mainSourceFile"; @@ -857,7 +879,8 @@ case "dflags": return listBuildSetting!"dflags"(args); case "lflags": return listBuildSetting!"lflags"(args); case "libs": return listBuildSetting!"libs"(args); - case "lib-files": return listBuildSetting!"libFiles"(args); + case "d-files": return listBuildSetting!"dFiles"(args); + case "linker-files": return listBuildSetting!"linkerFiles"(args); case "source-files": return listBuildSetting!"sourceFiles"(args); case "copy-files": return listBuildSetting!"copyFiles"(args); case "versions": return listBuildSetting!"versions"(args); @@ -887,20 +910,11 @@ { auto projectDescription = describe(platform, config, buildType); auto configs = getPackageConfigs(platform, config); - - // Include link dependencies - auto target = projectDescription.lookupTarget(projectDescription.rootPackage); - auto bs = target.buildSettings; - foreach (ldep; target.linkDependencies) { - auto dbs = projectDescription.lookupTarget(ldep).buildSettings; - if (bs.targetType != TargetType.staticLibrary) { - bs.addLibFiles((Path(dbs.targetPath) ~ getTargetFileName(dbs, platform)).toNativeString()); - } + PackageDescription packageDescription; + foreach (pack; projectDescription.packages) { + if (pack.name == projectDescription.rootPackage) + packageDescription = pack; } - target.buildSettings = bs; - - // Update projectDescription.targets - projectDescription.lookupTarget(projectDescription.rootPackage) = target; // Genrate results if (formattingCompiler) diff --git a/test/4-describe-data-dmd.sh b/test/4-describe-data-dmd.sh index 849ee35..5b994c6 100755 --- a/test/4-describe-data-dmd.sh +++ b/test/4-describe-data-dmd.sh @@ -15,8 +15,8 @@ if ! $DUB describe --compiler=dmd \ --data=main-source-file \ --data=dflags,lflags \ - --data=libs,lib-files \ - --data=source-files \ + --data=libs,linker-files \ + --data=d-files,source-files \ --data=versions \ --data=debug-versions \ --data=import-paths \ @@ -41,11 +41,15 @@ echo -n "-lssl " >> "$expected_file" echo -n "-lcrypto " >> "$expected_file" echo -n "-lcurl " >> "$expected_file" -# --data=lib-files +# --data=linker-files echo -n "'$CURR_DIR/describe-dependency-3/libdescribe-dependency-3.a' " >> "$expected_file" +# --data=d-files +echo -n "'$CURR_DIR/describe-project/src/dummy.d' " >> "$expected_file" +echo -n "'$CURR_DIR/describe-dependency-1/source/dummy.d' " >> "$expected_file" # --data=source-files echo -n "'$CURR_DIR/describe-project/src/dummy.d' " >> "$expected_file" echo -n "'$CURR_DIR/describe-dependency-1/source/dummy.d' " >> "$expected_file" +echo -n "'$CURR_DIR/describe-dependency-3/libdescribe-dependency-3.a' " >> "$expected_file" # --data=versions echo -n "-version=someVerIdent " >> "$expected_file" echo -n "-version=anotherVerIdent " >> "$expected_file" diff --git a/test/4-describe-data-list.sh b/test/4-describe-data-list.sh index 4d76d64..fe824d4 100755 --- a/test/4-describe-data-list.sh +++ b/test/4-describe-data-list.sh @@ -17,8 +17,8 @@ '--data= working-directory ' \ --data=main-source-file \ '--data=dflags,lflags' \ - '--data=libs, lib-files' \ - '--data=source-files, copy-files' \ + '--data=libs, linker-files' \ + '--data=d-files, source-files, copy-files' \ '--data=versions, debug-versions' \ --data=import-paths \ --data=string-import-paths \ @@ -62,12 +62,17 @@ echo "ssl" >> "$expected_file" echo "curl" >> "$expected_file" echo >> "$expected_file" -# --data=lib-files +# --data=linker-files echo "$CURR_DIR/describe-dependency-3/libdescribe-dependency-3.a" >> "$expected_file" echo >> "$expected_file" +# --data=d-files +echo "$CURR_DIR/describe-project/src/dummy.d" >> "$expected_file" +echo "$CURR_DIR/describe-dependency-1/source/dummy.d" >> "$expected_file" +echo >> "$expected_file" # --data=source-files echo "$CURR_DIR/describe-project/src/dummy.d" >> "$expected_file" echo "$CURR_DIR/describe-dependency-1/source/dummy.d" >> "$expected_file" +echo "$CURR_DIR/describe-dependency-3/libdescribe-dependency-3.a" >> "$expected_file" echo >> "$expected_file" # --data=copy-files echo "$CURR_DIR/describe-project/data/dummy.dat" >> "$expected_file" diff --git a/test/4-describe-data-zero-delim.sh b/test/4-describe-data-zero-delim.sh index abc1446..0055f86 100755 --- a/test/4-describe-data-zero-delim.sh +++ b/test/4-describe-data-zero-delim.sh @@ -54,7 +54,8 @@ --data=dflags \ --data=lflags \ --data=libs \ - --data=lib-files \ + --data=linker-files \ + --data=d-files \ --data=source-files \ --data=copy-files \ --data=versions \ @@ -82,7 +83,8 @@ --data=dflags \ --data=lflags \ --data=libs \ - --data=lib-files \ + --data=linker-files \ + --data=d-files \ --data=source-files \ --data=copy-files \ --data=versions \