diff --git a/source/app.d b/source/app.d index 07e8e25..9e2ee98 100644 --- a/source/app.d +++ b/source/app.d @@ -122,6 +122,9 @@ case "run": case "build": dub.loadPackagefromCwd(); + auto def_config = dub.getDefaultConfiguration(build_platform); + if( !build_config.length ) build_config = def_config; + if( print_builds ){ logInfo("Available build types:"); foreach( tp; ["debug", "release", "unittest", "profile"] ) @@ -132,7 +135,7 @@ if( print_configs ){ logInfo("Available configurations:"); foreach( tp; dub.configurations ) - logInfo(" %s", tp); + logInfo(" %s%s", tp, tp == def_config ? " [deault]" : null); logInfo(""); } diff --git a/source/dub/dub.d b/source/dub/dub.d index 9c8a8e0..4803dc6 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -93,6 +93,18 @@ @property Path binaryPath() const { auto p = m_main.binaryPath; return p.length ? Path(p) : Path("./"); } + string getDefaultConfiguration(BuildPlatform platform) + const { + string ret; + foreach( p; m_dependencies ){ + auto c = p.getDefaultConfiguration(platform); + if( c.length ) ret = c; + } + auto c = m_main.getDefaultConfiguration(platform); + if( c ) ret = c; + return ret; + } + /// Gathers information string info() const { if(!m_main) @@ -336,7 +348,7 @@ RequestedDependency[string] oldMissing; while( missing.length > 0 ) { logTrace("Try to resolve %s", missing.keys); - if( missing.keys == oldMissing.keys ){ + if( missing.keys == oldMissing.keys ){ // FIXME: should actually compare the complete AA here bool different = false; foreach(string pkg, reqDep; missing) { auto o = pkg in oldMissing; @@ -505,6 +517,8 @@ /// properly. BuildSettings getBuildSettings(BuildPlatform platform, string config) { return m_app.getBuildSettings(platform, config); } + string getDefaultConfiguration(BuildPlatform platform) const { return m_app.getDefaultConfiguration(platform); } + /// Lists all installed modules void list() { logInfo(m_app.info()); diff --git a/source/dub/package_.d b/source/dub/package_.d index 27103b0..94091c9 100644 --- a/source/dub/package_.d +++ b/source/dub/package_.d @@ -71,27 +71,38 @@ private string[] getPlatformField(in Json json, string name, BuildPlatform platform) const { - auto c = platform.compiler; - auto ret = appender!(string[])(); - // TODO: turn these loops around and iterate over m_metas fields instead for efficiency reason - foreach( j; json[name].opt!(Json[]) ) ret.put(j.get!string); - foreach( j; json[name~"-"~c].opt!(Json[]) ) ret.put(j.get!string); + foreach( suffix; getPlatformSuffixIterator(platform) ){ + foreach( j; json[name~suffix].opt!(Json[]) ) + ret.put(j.get!string); + } + return ret.data; + } +} + +int delegate(scope int delegate(ref string)) getPlatformSuffixIterator(BuildPlatform platform) +{ + int iterator(scope int delegate(ref string s) del) + { + auto c = platform.compiler; + int delwrap(string s) { return del(s); } + if( auto ret = delwrap(null) ) return ret; + if( auto ret = delwrap("-"~c) ) return ret; foreach( p; platform.platform ){ - foreach( j; json[name~"-"~p].opt!(Json[]) ) ret.put(j.get!string); - foreach( j; json[name~"-"~p~"-"~c].opt!(Json[]) ) ret.put(j.get!string); + if( auto ret = delwrap("-"~p) ) return ret; + if( auto ret = delwrap("-"~p~"-"~c) ) return ret; foreach( a; platform.architecture ){ - foreach( j; json[name~"-"~p~"-"~a].opt!(Json[]) ) ret.put(j.get!string); - foreach( j; json[name~"-"~p~"-"~a~"-"~c].opt!(Json[]) ) ret.put(j.get!string); + if( auto ret = delwrap("-"~p~"-"~a) ) return ret; + if( auto ret = delwrap("-"~p~"-"~a~"-"~c) ) return ret; } } foreach( a; platform.architecture ){ - foreach( j; json[name~"-"~a].opt!(Json[]) ) ret.put(j.get!string); - foreach( j; json[name~"-"~a~"-"~c].opt!(Json[]) ) ret.put(j.get!string); + if( auto ret = delwrap("-"~a) ) return ret; + if( auto ret = delwrap("-"~a~"-"~c) ) return ret; } - return ret.data; - + return 0; } + return &iterator; } /// Representing an installed package @@ -156,7 +167,7 @@ @property const(Dependency[string]) dependencies() const { return m_dependencies; } @property const(LocalPacageDef)[] localPackageDefs() const { return m_localPackageDefs; } @property string binaryPath() const { return m_meta["binaryPath"].opt!string; } - + @property string[] configurations() const { auto pv = "configurations" in m_meta; @@ -181,6 +192,16 @@ return ret; } + string getDefaultConfiguration(BuildPlatform platform) + const { + string ret; + auto cfgs = m_meta["configurations"].opt!(Json[string]); + foreach( suffix; getPlatformSuffixIterator(platform) ) + if( auto pv = ("default"~suffix) in cfgs ) + ret = pv.get!string(); + return ret; + } + string info() const { string s; s ~= cast(string)m_meta["name"] ~ ", version '" ~ cast(string)m_meta["version"] ~ "'";