bool deps_json_t::process_runtime_targets(const json_value& json, const pal::string_t& target_name, const rid_fallback_graph_t& rid_fallback_graph, rid_specific_assets_t* p_assets) { rid_specific_assets_t& assets = *p_assets; for (const auto& package : json.at(_X("targets")).at(target_name).as_object()) { const auto& targets = package.second.as_object(); auto iter = targets.find(_X("runtimeTargets")); if (iter == targets.end()) { continue; } const auto& files = iter->second.as_object(); for (const auto& file : files) { const auto& type = file.second.at(_X("assetType")).as_string(); for (int i = 0; i < deps_entry_t::s_known_asset_types.size(); ++i) { if (pal::strcasecmp(type.c_str(), deps_entry_t::s_known_asset_types[i]) == 0) { const auto& rid = file.second.at(_X("rid")).as_string(); assets.libs[package.first].rid_assets[rid].by_type[i].vec.push_back(file.first); } } } } if (!perform_rid_fallback(&assets, rid_fallback_graph)) { return false; } return true; }
bool deps_json_t::process_targets(const json_value& json, const pal::string_t& target_name, deps_assets_t* p_assets) { deps_assets_t& assets = *p_assets; for (const auto& package : json.at(_X("targets")).at(target_name).as_object()) { const auto& asset_types = package.second.as_object(); for (int i = 0; i < deps_entry_t::s_known_asset_types.size(); ++i) { auto iter = asset_types.find(deps_entry_t::s_known_asset_types[i]); if (iter != asset_types.end()) { for (const auto& file : iter->second.as_object()) { trace::info(_X("Adding %s asset %s from %s"), deps_entry_t::s_known_asset_types[i], file.first.c_str(), package.first.c_str()); assets.libs[package.first].by_type[i].vec.push_back(file.first); } } } } return true; }
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()); } } } }