void MooseApp::dynamicRegistration(const Parameters & params) { // first convert the app name to a library name std::string library_name = appNameToLibName(params.get<std::string>("app_name")); // Create a vector of paths that we can search inside for libraries std::vector<std::string> paths; std::string library_path = params.get<std::string>("library_path"); if (library_path != "") MooseUtils::tokenize(library_path, paths, 1, ":"); char * moose_lib_path_env = std::getenv("MOOSE_LIBRARY_PATH"); if (moose_lib_path_env) { std::string moose_lib_path(moose_lib_path_env); std::vector<std::string> tmp_paths; MooseUtils::tokenize(moose_lib_path, tmp_paths, 1, ":"); // merge the two vectors together (all possible search paths) paths.insert(paths.end(), tmp_paths.begin(), tmp_paths.end()); } // Attempt to dynamically load the library for (std::vector<std::string>::const_iterator path_it = paths.begin(); path_it != paths.end(); ++path_it) if (MooseUtils::checkFileReadable(*path_it + '/' + library_name, false, false)) loadLibraryAndDependencies(*path_it + '/' + library_name, params); else mooseWarning("Unable to open library file \"" << *path_it + '/' + library_name << "\". Double check for spelling errors."); }
void MooseApp::dynamicAppRegistration(const std::string & app_name, std::string library_path, const std::string & library_name) { Parameters params; params.set<std::string>("app_name") = app_name; params.set<RegistrationType>("reg_type") = APPLICATION; params.set<std::string>("registration_method") = app_name + "__registerApps"; params.set<std::string>("library_path") = library_path; params.set<std::string>("library_name") = library_name; dynamicRegistration(params); // At this point the application should be registered so check it if (!AppFactory::instance().isRegistered(app_name)) { std::ostringstream oss; std::set<std::string> paths = getLoadedLibraryPaths(); oss << "Unable to locate library for \"" << app_name << "\".\nWe attempted to locate the library \"" << appNameToLibName(app_name) << "\" in the following paths:\n\t"; std::copy(paths.begin(), paths.end(), infix_ostream_iterator<std::string>(oss, "\n\t")); oss << "\n\nMake sure you have compiled the library and either set the \"library_path\" " "variable " << "in your input file or exported \"MOOSE_LIBRARY_PATH\".\n" << "Compiled in debug mode to see the list of libraries checked for dynamic loading " "methods."; mooseError(oss.str()); } }