diff --git a/source/dub/compilers/compiler.d b/source/dub/compilers/compiler.d index 7128f05..58080eb 100644 --- a/source/dub/compilers/compiler.d +++ b/source/dub/compilers/compiler.d @@ -63,6 +63,7 @@ /// BuildPlatform specific settings, like needed libraries or additional /// include paths. struct BuildSettings { + TargetType targetType; string[] dflags; string[] lflags; string[] libs; @@ -134,6 +135,16 @@ all = dflags|lflags|libs|sourceFiles|copyFiles|versions|importPaths|stringImportPaths } +enum TargetType { + autodetect, + executable, + library, + sourceLibrary, + dynamicLibrary, + staticLibrary +} + + private { Compiler[] s_compilers; } diff --git a/source/dub/compilers/dmd.d b/source/dub/compilers/dmd.d index fb3f6ff..e50dd6e 100644 --- a/source/dub/compilers/dmd.d +++ b/source/dub/compilers/dmd.d @@ -93,6 +93,18 @@ void setTarget(ref BuildSettings settings, Path binary_path) { + final switch(settings.targetType){ + case TargetType.autodetect: assert(false, "Invalid target type: autodetect"); + case TargetType.sourceLibrary: assert(false, "Invalid target type: sourceLibrary"); + case TargetType.executable: break; + case TargetType.library: + case TargetType.staticLibrary: + settings.addDFlags("-lib"); + break; + case TargetType.dynamicLibrary: + break; + } + settings.addDFlags("-of"~binary_path.toNativeString()); } } diff --git a/source/dub/compilers/gdc.d b/source/dub/compilers/gdc.d index 707c413..f5b3c92 100644 --- a/source/dub/compilers/gdc.d +++ b/source/dub/compilers/gdc.d @@ -134,6 +134,19 @@ void setTarget(ref BuildSettings settings, Path binary_path) { + final switch(settings.targetType){ + case TargetType.autodetect: assert(false, "Invalid target type: autodetect"); + case TargetType.sourceLibrary: assert(false, "Invalid target type: sourceLibrary"); + case TargetType.executable: break; + case TargetType.library: + case TargetType.staticLibrary: + settings.addDFlags("-c"); + break; + case TargetType.dynamicLibrary: + settings.addDFlags("-shared", "-fPIC"); + break; + } + settings.addDFlags("-o", binary_path.toNativeString()); } } diff --git a/source/dub/compilers/ldc.d b/source/dub/compilers/ldc.d index abfb71c..beaa59d 100644 --- a/source/dub/compilers/ldc.d +++ b/source/dub/compilers/ldc.d @@ -90,6 +90,19 @@ void setTarget(ref BuildSettings settings, Path binary_path) { + final switch(settings.targetType){ + case TargetType.autodetect: assert(false, "Invalid target type: autodetect"); + case TargetType.sourceLibrary: assert(false, "Invalid target type: sourceLibrary"); + case TargetType.executable: break; + case TargetType.library: + case TargetType.staticLibrary: + assert(false, "No LDC static libraries supported"); + break; + case TargetType.dynamicLibrary: + assert(false, "No LDC dynamic libraries supported"); + break; + } + settings.addDFlags("-of"~binary_path.toNativeString()); } } diff --git a/source/dub/package_.d b/source/dub/package_.d index c030302..f9b9706 100644 --- a/source/dub/package_.d +++ b/source/dub/package_.d @@ -123,14 +123,24 @@ // generate default configurations if none are defined if( m_info.configurations.length == 0 ){ - if( app_files.length ){ + if( m_info.buildSettings.targetType == TargetType.executable ){ BuildSettingsTemplate app_settings; - app_settings.sourceFiles[""] = app_files; - m_info.configurations["application"] = app_settings; - } + app_settings.targetType = TargetType.executable; + m_info.configurations["application"] = ConfigurationInfo(app_settings); + } else { + if( m_info.buildSettings.targetType == TargetType.autodetect ){ + if( app_files.length ){ + BuildSettingsTemplate app_settings; + app_settings.targetType = TargetType.executable; + app_settings.sourceFiles[""] = app_files; + m_info.configurations["application"] = ConfigurationInfo(app_settings); + } + } - BuildSettingsTemplate lib_settings; - m_info.configurations["library"] = lib_settings; + BuildSettingsTemplate lib_settings; + lib_settings.targetType = TargetType.library; + m_info.configurations["library"] = ConfigurationInfo(lib_settings); + } } // determine all source folders @@ -151,7 +161,7 @@ if(isDir(d.name)) continue; auto p = Path(d.name); auto src = p.relativeTo(this.path); - if( !app_files.map!(p => Path(p))().canFind(src) ) + if( m_info.buildSettings.targetType != TargetType.autodetect || !app_files.map!(p => Path(p))().canFind(src) ) sources ~= src.toNativeString(); } } @@ -187,7 +197,7 @@ assert(config in m_info.configurations, "Unknown configuration for "~m_info.name~": "~config); BuildSettings ret; m_info.buildSettings.getPlatformSettings(ret, platform); - m_info.configurations[config].getPlatformSettings(ret, platform); + m_info.configurations[config].buildSettings.getPlatformSettings(ret, platform); return ret; } @@ -257,7 +267,7 @@ string[] sourcePaths; BuildSettingsTemplate buildSettings; string[string] defaultConfiguration; - BuildSettingsTemplate[string] configurations; + ConfigurationInfo[string] configurations; void parseJson(Json json) { @@ -301,9 +311,9 @@ case "sourcePaths": this.sourcePaths = deserializeJson!(string[])(value); break; case "configurations": foreach( string config, settings; value ){ - BuildSettingsTemplate bs; - bs.parseJson(settings); - this.configurations[config] = bs; + ConfigurationInfo ci; + ci.parseJson(settings); + this.configurations[config] = ci; } break; } @@ -340,14 +350,32 @@ foreach( suffix, conf; defaultConfiguration ) configs["default"~suffix] = conf; foreach(config, settings; this.configurations) - configs[config] = settings.toJson(); + configs[config] = settings.buildSettings.toJson(); ret.configurations = configs; } return ret; } } +struct ConfigurationInfo { + BuildSettingsTemplate buildSettings; + + void parseJson(Json json) + { + + foreach(string name, value; json){ + switch(name){ + default: break; + } + } + + BuildSettingsTemplate bs; + this.buildSettings.parseJson(json); + } +} + struct BuildSettingsTemplate { + TargetType targetType = TargetType.autodetect; string[][string] dflags; string[][string] lflags; string[][string] libs; @@ -371,9 +399,14 @@ else basename = name; switch(basename){ default: break; + case "targetType": + enforce(suffix.empty, "targetType does not support platform customization."); + targetType = value.get!string().to!TargetType(); + break; case "dflags": this.dflags[suffix] = deserializeJson!(string[])(value); break; case "lflags": this.lflags[suffix] = deserializeJson!(string[])(value); break; case "libs": this.libs[suffix] = deserializeJson!(string[])(value); break; + case "files": logWarn(`The "files" field has been deprecated, please use "sourceFiles" instad.`); goto case; case "sourceFiles": this.sourceFiles[suffix] = deserializeJson!(string[])(value); break; case "copyFiles": this.copyFiles[suffix] = deserializeJson!(string[])(value); break; case "versions": this.versions[suffix] = deserializeJson!(string[])(value); break; @@ -407,6 +440,7 @@ void getPlatformSettings(ref BuildSettings dst, BuildPlatform platform) const { + dst.targetType = this.targetType; getPlatformSetting!("dflags", "addDFlags")(dst, platform); getPlatformSetting!("lflags", "addLFlags")(dst, platform); getPlatformSetting!("libs", "addLibs")(dst, platform); @@ -430,6 +464,7 @@ } } + private bool matchesPlatform(string suffix, BuildPlatform platform) { if( suffix.length == 0 ) return true;