diff --git a/changelog/visuald-copyfiles.dd b/changelog/visuald-copyfiles.dd new file mode 100644 index 0000000..72c8058 --- /dev/null +++ b/changelog/visuald-copyfiles.dd @@ -0,0 +1,5 @@ +copyFiles can now be used in VisualD projects. + +Files that are needed for the application to run can be specified in the `copyFiles` build option, +which causes these files to be copied to the target path. The dub generator for VisualD now replicates +this behaviour, so that this kind of applications can be successfully debugged in Visual Studio. diff --git a/source/dub/generators/visuald.d b/source/dub/generators/visuald.d index 3781b47..6db18ab 100644 --- a/source/dub/generators/visuald.d +++ b/source/dub/generators/visuald.d @@ -169,38 +169,38 @@ // Add all files auto files = targets[packname].buildSettings; SourceFile[string] sourceFiles; - void addSourceFile(NativePath file_path, NativePath structure_path, bool build) + void addSourceFile(NativePath file_path, NativePath structure_path, SourceFile.Action action) { auto key = file_path.toString(); auto sf = sourceFiles.get(key, SourceFile.init); sf.filePath = file_path; - if (!sf.build) { - sf.build = build; + if (sf.action == SourceFile.Action.none) { + sf.action = action; sf.structurePath = structure_path; } sourceFiles[key] = sf; } - void addFile(string s, bool build) { + void addFile(string s, SourceFile.Action action) { auto sp = NativePath(s); assert(sp.absolute, format("Source path in %s expected to be absolute: %s", packname, s)); //if( !sp.absolute ) sp = pack.path ~ sp; - addSourceFile(sp.relativeTo(project_file_dir), determineStructurePath(sp, targets[packname]), build); + addSourceFile(sp.relativeTo(project_file_dir), determineStructurePath(sp, targets[packname]), action); } foreach (p; targets[packname].packages) if (!p.recipePath.empty) - addFile(p.recipePath.toNativeString(), false); + addFile(p.recipePath.toNativeString(), SourceFile.Action.none); if (files.targetType == TargetType.staticLibrary) - foreach(s; files.sourceFiles.filter!(s => !isLinkerFile(settings.platform, s))) addFile(s, true); + foreach(s; files.sourceFiles.filter!(s => !isLinkerFile(settings.platform, s))) addFile(s, SourceFile.Action.build); else - foreach(s; files.sourceFiles.filter!(s => !s.endsWith(".lib"))) addFile(s, true); + foreach(s; files.sourceFiles.filter!(s => !s.endsWith(".lib"))) addFile(s, SourceFile.Action.build); - foreach(s; files.importFiles) addFile(s, false); - foreach(s; files.stringImportFiles) addFile(s, false); - findFilesMatchingGlobs(root_package_path, files.copyFiles, s => addFile(s, false)); - findFilesMatchingGlobs(root_package_path, files.extraDependencyFiles, s => addFile(s, false)); + foreach(s; files.importFiles) addFile(s, SourceFile.Action.none); + foreach(s; files.stringImportFiles) addFile(s, SourceFile.Action.none); + findFilesMatchingGlobs(root_package_path, files.copyFiles, s => addFile(s, SourceFile.Action.copy)); + findFilesMatchingGlobs(root_package_path, files.extraDependencyFiles, s => addFile(s, SourceFile.Action.none)); // Create folders and files ret.formattedWrite(" ", getPackageFileName(packname)); @@ -223,7 +223,18 @@ ret.formattedWrite("\n ", cur[same + idx].name); lastFolder = cur; } - ret.formattedWrite("\n ", source.build ? "" : "tool=\"None\" ", source.filePath.toNativeString()); + final switch (source.action) with (SourceFile.Action) + { + case none: + ret.formattedWrite("\n ", source.filePath.toNativeString()); + break; + case build: + ret.formattedWrite("\n ", source.filePath.toNativeString()); + break; + case copy: + ret.formattedWrite("\n ", source.filePath.toNativeString()); + break; + } } // Finalize all open folders foreach(unused; 0..lastFolder.length) @@ -463,9 +474,10 @@ private struct SourceFile { NativePath structurePath; NativePath filePath; - bool build; + enum Action { none, build, copy }; + Action action = Action.none; - size_t toHash() const nothrow @trusted { return structurePath.toHash() ^ filePath.toHash() ^ (build * 0x1f3e7b2c); } + size_t toHash() const nothrow @trusted { return structurePath.toHash() ^ filePath.toHash() ^ (action * 0x1f3e7b2c); } int opCmp(ref const SourceFile rhs) const { return sortOrder(this, rhs); } // "a < b" for folder structures (deepest folder first, else lexical) private final static int sortOrder(ref const SourceFile a, ref const SourceFile b) { diff --git a/test/issue1053-extra-files-visuald.sh b/test/issue1053-extra-files-visuald.sh index 845f93f..4c8d979 100755 --- a/test/issue1053-extra-files-visuald.sh +++ b/test/issue1053-extra-files-visuald.sh @@ -20,3 +20,7 @@ if [ `grep -c -e "README.txt" .dub/extra_files.visualdproj` -ne 1 ]; then die $LINENO 'Regression of issue #1053.' fi + +if [ `grep -e "README.txt" .dub/extra_files.visualdproj | grep -c -e 'copy /Y $(InputPath) $(TargetDir)'` -ne 1 ]; then + die $LINENO 'Copying of copyFiles seems broken for visuald.' +fi