host_mode_t detect_operating_mode(const int argc, const pal::char_t* argv[], pal::string_t* p_own_dir) { pal::string_t own_path; if (!pal::get_own_executable_path(&own_path) || !pal::realpath(&own_path)) { trace::error(_X("Failed to locate current executable")); return host_mode_t::invalid; } pal::string_t own_name = get_filename(own_path); pal::string_t own_dir = get_directory(own_path); if (p_own_dir) { p_own_dir->assign(own_dir); } pal::string_t own_dll_filename = strip_file_ext(own_name) + _X(".dll"); pal::string_t own_dll = own_dir; append_path(&own_dll, own_dll_filename.c_str()); trace::info(_X("Own DLL path=[%s]"), own_dll.c_str()); if (coreclr_exists_in_dir(own_dir) || pal::file_exists(own_dll)) { pal::string_t own_deps_json = own_dir; pal::string_t own_deps_filename = strip_file_ext(own_name) + _X(".deps.json"); pal::string_t own_config_filename = strip_file_ext(own_name) + _X(".runtimeconfig.json"); append_path(&own_deps_json, own_deps_filename.c_str()); if (trace::is_enabled()) { trace::info(_X("Detecting mode... CoreCLR present in own dir [%s] and checking if [%s] file present=[%d]"), own_dir.c_str(), own_deps_filename.c_str(), pal::file_exists(own_deps_json)); } return ((pal::file_exists(own_deps_json) || !pal::file_exists(own_config_filename)) && pal::file_exists(own_dll)) ? host_mode_t::standalone : host_mode_t::split_fx; } else { return host_mode_t::muxer; } }
void deps_json_t::reconcile_libraries_with_targets( const json_value& json, const std::function<bool(const pal::string_t&)>& library_exists_fn, const std::function<const std::vector<pal::string_t>&(const pal::string_t&, int, bool*)>& get_rel_paths_by_asset_type_fn) { const auto& libraries = json.at(_X("libraries")).as_object(); for (const auto& library : libraries) { trace::info(_X("Reconciling library %s"), library.first.c_str()); if (pal::to_lower(library.second.at(_X("type")).as_string()) != _X("package")) { trace::info(_X("Library %s is not a package"), library.first.c_str()); continue; } if (!library_exists_fn(library.first)) { trace::info(_X("Library %s does not exist"), library.first.c_str()); continue; } const auto& properties = library.second.as_object(); const pal::string_t& hash = properties.at(_X("sha512")).as_string(); bool serviceable = properties.at(_X("serviceable")).as_bool(); for (int i = 0; i < deps_entry_t::s_known_asset_types.size(); ++i) { bool rid_specific = false; for (const auto& rel_path : get_rel_paths_by_asset_type_fn(library.first, i, &rid_specific)) { bool ni_dll = false; auto asset_name = get_filename_without_ext(rel_path); if (ends_with(asset_name, _X(".ni"), false)) { ni_dll = true; asset_name = strip_file_ext(asset_name); } deps_entry_t entry; size_t pos = library.first.find(_X("/")); entry.library_name = library.first.substr(0, pos); entry.library_version = library.first.substr(pos + 1); entry.library_type = _X("package"); entry.library_hash = hash; entry.asset_name = asset_name; entry.asset_type = (deps_entry_t::asset_types) i; entry.relative_path = rel_path; entry.is_serviceable = serviceable; entry.is_rid_specific = rid_specific; // TODO: Deps file does not follow spec. It uses '\\', should use '/' replace_char(&entry.relative_path, _X('\\'), _X('/')); m_deps_entries[i].push_back(entry); if (ni_dll) { m_ni_entries[entry.asset_name] = m_deps_entries [deps_entry_t::asset_types::runtime].size() - 1; } trace::info(_X("Added %s %s deps entry [%d] [%s, %s, %s]"), deps_entry_t::s_known_asset_types[i], entry.asset_name.c_str(), m_deps_entries[i].size() - 1, entry.library_name.c_str(), entry.library_version.c_str(), entry.relative_path.c_str()); } } } }