|
|
|
@@ -42,107 +42,6 @@ dependency dependency::parse_depends_string(std::string_view str) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
using sdist_index_type = std::map<std::string, std::reference_wrapper<const sdist>>; |
|
|
|
using sdist_names = std::set<std::string>; |
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
void resolve_ureqs_(shared_compile_file_rules& rules, |
|
|
|
const package_manifest& man, |
|
|
|
const sdist_index_type& sd_idx) { |
|
|
|
for (const dependency& dep : man.dependencies) { |
|
|
|
auto found = sd_idx.find(dep.name); |
|
|
|
if (found == sd_idx.end()) { |
|
|
|
throw std::runtime_error( |
|
|
|
fmt::format("Unable to resolve dependency '{}' (required by '{}')", |
|
|
|
dep.name, |
|
|
|
man.pkg_id.to_string())); |
|
|
|
} |
|
|
|
resolve_ureqs_(rules, found->second.get().manifest, sd_idx); |
|
|
|
auto lib_src = found->second.get().path / "src"; |
|
|
|
auto lib_include = found->second.get().path / "include"; |
|
|
|
if (fs::exists(lib_include)) { |
|
|
|
rules.include_dirs().push_back(lib_include); |
|
|
|
} else { |
|
|
|
rules.include_dirs().push_back(lib_src); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void resolve_ureqs(shared_compile_file_rules rules, |
|
|
|
const sdist& sd, |
|
|
|
const library& lib, |
|
|
|
const library_plan& lib_plan, |
|
|
|
build_env_ref env, |
|
|
|
usage_requirement_map& ureqs) { |
|
|
|
// Add the transitive requirements for this library to our compile rules. |
|
|
|
for (auto&& use : lib.manifest().uses) { |
|
|
|
ureqs.apply(rules, use.namespace_, use.name); |
|
|
|
} |
|
|
|
|
|
|
|
// Create usage requirements for this libary. |
|
|
|
lm::library& reqs = ureqs.add(sd.manifest.namespace_, lib.manifest().name); |
|
|
|
reqs.include_paths.push_back(lib.public_include_dir()); |
|
|
|
reqs.name = lib.manifest().name; |
|
|
|
reqs.uses = lib.manifest().uses; |
|
|
|
reqs.links = lib.manifest().links; |
|
|
|
if (lib_plan.create_archive()) { |
|
|
|
reqs.linkable_path = lib_plan.create_archive()->calc_archive_file_path(env); |
|
|
|
} |
|
|
|
// TODO: preprocessor definitions |
|
|
|
} |
|
|
|
|
|
|
|
void add_sdist_to_dep_plan(build_plan& plan, |
|
|
|
const sdist& sd, |
|
|
|
build_env_ref env, |
|
|
|
const sdist_index_type& sd_idx, |
|
|
|
usage_requirement_map& ureqs, |
|
|
|
sdist_names& already_added) { |
|
|
|
if (already_added.find(sd.manifest.pkg_id.name) != already_added.end()) { |
|
|
|
// We've already loaded this package into the plan. |
|
|
|
return; |
|
|
|
} |
|
|
|
spdlog::debug("Add to plan: {}", sd.manifest.pkg_id.name); |
|
|
|
// First, load every dependency |
|
|
|
for (const auto& dep : sd.manifest.dependencies) { |
|
|
|
auto other = sd_idx.find(dep.name); |
|
|
|
assert(other != sd_idx.end() |
|
|
|
&& "Failed to load a transitive dependency shortly after initializing them. What?"); |
|
|
|
add_sdist_to_dep_plan(plan, other->second, env, sd_idx, ureqs, already_added); |
|
|
|
} |
|
|
|
// Record that we have been processed: |
|
|
|
already_added.insert(sd.manifest.pkg_id.name); |
|
|
|
// Add the package: |
|
|
|
auto& pkg = plan.add_package(package_plan(sd.manifest.pkg_id.name, sd.manifest.namespace_)); |
|
|
|
auto libs = collect_libraries(sd.path); |
|
|
|
for (const auto& lib : libs) { |
|
|
|
shared_compile_file_rules comp_rules = lib.base_compile_rules(); |
|
|
|
library_build_params params; |
|
|
|
auto lib_plan = library_plan::create(lib, params, ureqs); |
|
|
|
resolve_ureqs(comp_rules, sd, lib, lib_plan, env, ureqs); |
|
|
|
pkg.add_library(std::move(lib_plan)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} // namespace |
|
|
|
|
|
|
|
build_plan dds::create_deps_build_plan(const std::vector<sdist>& deps, build_env_ref env) { |
|
|
|
auto sd_idx = deps // |
|
|
|
| ranges::views::transform([](const auto& sd) { |
|
|
|
return std::pair(sd.manifest.pkg_id.name, std::cref(sd)); |
|
|
|
}) // |
|
|
|
| ranges::to<sdist_index_type>(); |
|
|
|
|
|
|
|
build_plan plan; |
|
|
|
usage_requirement_map ureqs; |
|
|
|
sdist_names already_added; |
|
|
|
for (const sdist& sd : deps) { |
|
|
|
spdlog::info("Recording dependency: {}", sd.manifest.pkg_id.name); |
|
|
|
add_sdist_to_dep_plan(plan, sd, env, sd_idx, ureqs, already_added); |
|
|
|
} |
|
|
|
return plan; |
|
|
|
} |
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
fs::path generate_lml(const library_plan& lib, path_ref libdir, const build_env& env) { |