+ while(!unordered_plugins.empty())
+ {
+ bool any_added = false;
+ for(auto i=unordered_plugins.begin(); i!=unordered_plugins.end(); )
+ {
+ const vector<string> &required = i->plugin->get_required_plugins();
+ if(all_of(required.begin(), required.end(), have_plugin))
+ {
+ plugins.push_back(move(*i));
+ i = unordered_plugins.erase(i);
+ any_added = true;
+ }
+ else
+ ++i;
+ }
+
+ if(!any_added)
+ break;
+ }
+
+ for(const LoadedPlugin &p: unordered_plugins)
+ {
+ vector<string> missing;
+ for(const string &r: p.plugin->get_required_plugins())
+ if(!have_plugin(r))
+ missing.push_back(r);
+ logger->log("plugins", "Missing required plugins for plugin %s: %s",
+ FS::basename(p.path), join(missing.begin(), missing.end()));