- /+ dub.sdl:
- name "issue2377_dynlib_dep_extra_files"
- +/
-
- module issue2377_dynlib_dep_extra_files.script;
-
- import std.exception : enforce;
- import std.file;
- import std.path;
-
- version (DigitalMars) version (Windows) version = DMD_Windows;
- version (DMD_Windows) {
- void main() {
- import std.stdio;
- writeln("WARNING: skipping test '" ~ __FILE_FULL_PATH__.baseName ~ "' with DMD on Windows.");
- }
- } else:
-
- void main() {
- import std.process : environment;
-
- version (Windows) enum exeExt = ".exe";
- else enum exeExt = "";
- const dub = environment.get("DUB", buildPath(__FILE_FULL_PATH__.dirName.dirName, "bin", "dub"~exeExt));
-
- enum testDir = buildPath(__FILE_FULL_PATH__.dirName, "issue2377-dynLib-dep-extra-files");
-
- // 1. `parent` as root package (depending on dynamic/static dep1, which depends on dynamic/static dep2)
- chdir(buildPath(testDir, "parent"));
- if (exists("output"))
- rmdirRecurse("output");
-
- // 1.1 dynlib config
- run(dub ~ " build -c dynlib");
- chdir("output/dynlib");
- assertDynLibExists("parent");
- assertDynLibExists("dep1");
- assertDynLibExists("dep2");
- version (Windows) {
- assertFileExists("parent.pdb");
- assertFileExists("parent.lib");
- assertFileExists("parent.exp");
- assertFileExists("dep1.pdb");
- assertFileExists("dep1.lib");
- assertFileExists("dep1.exp");
- assertFileExists("dep2.pdb");
- assertFileExists("dep2.lib");
- assertFileExists("dep2.exp");
- }
- chdir("../..");
-
- // 1.2 dynlib_static config
- run(dub ~ " build -c dynlib_static");
- chdir("output/dynlib_static");
- assertDynLibExists("parent");
- version (Windows) {
- assertFileExists("parent.pdb");
- assertFileExists("parent.lib");
- assertFileExists("parent.exp");
- }
- enforce(!canFindFiles("*dep*"), "unexpected dependency files in statically linked dynlib output dir");
- chdir("../..");
-
- // 1.3 exe_static config
- run(dub ~ " build -c exe_static");
- chdir("output/exe_static");
- version (Windows) run(`.\parent.exe`);
- else run("./parent");
- version (Windows) {
- assertFileExists("parent.pdb");
- enforce(!exists("parent.lib"), "unexpected import .lib for executable");
- enforce(!exists("parent.exp"), "unexpected .exp file for executable");
- }
- enforce(!canFindFiles("*dep*"), "unexpected dependency files in statically linked executable output dir");
- chdir("../..");
-
- // 1.4 exe_dynamic config
- run(dub ~ " build -c exe_dynamic");
- chdir("output/exe_dynamic");
- version (Windows) run(`.\parent.exe`);
- else run(`LD_LIBRARY_PATH=".:${LD_LIBRARY_PATH:-}" ./parent`);
- assertDynLibExists("dep1");
- assertDynLibExists("dep2");
- version (Windows) {
- assertFileExists("dep1.pdb");
- assertFileExists("dep2.pdb");
- enforce(!canFindFiles("*.lib"), "unexpected import libs in dynamically linked executable output dir");
- enforce(!canFindFiles("*.exp"), "unexpected .exp files in dynamically linked executable output dir");
- }
- chdir("../..");
-
- // 2. `framework` as root package (targetType `none`)
- chdir(buildPath(testDir, "framework"));
- run(dub ~ " build");
- assertDynLibExists("dep1");
- assertDynLibExists("dep2");
- version (Windows) {
- assertFileExists("dep1.pdb");
- assertFileExists("dep1.lib");
- assertFileExists("dep1.exp");
- assertFileExists("dep2.pdb");
- assertFileExists("dep2.lib");
- assertFileExists("dep2.exp");
- }
- }
-
- void run(string command) {
- import std.process;
- const status = spawnShell(command).wait();
- enforce(status == 0, "command '" ~ command ~ "' failed");
- }
-
- void assertFileExists(string path) {
- enforce(exists(path), "expected file '" ~ path ~ "' not found");
- }
-
- void assertDynLibExists(string name) {
- version (Windows) {
- enum prefix = "";
- enum suffix = ".dll";
- } else version (OSX) {
- enum prefix = "lib";
- enum suffix = ".dylib";
- } else {
- enum prefix = "lib";
- enum suffix = ".so";
- }
-
- assertFileExists(prefix ~ name ~ suffix);
- }
-
- bool canFindFiles(string pattern) {
- auto entries = dirEntries(".", pattern, SpanMode.shallow);
- return !entries.empty();
- }