| params.out_root = out_path.Get(); | params.out_root = out_path.Get(); | ||||
| params.toolchain = tc.get_toolchain(); | params.toolchain = tc.get_toolchain(); | ||||
| params.parallel_jobs = n_jobs.Get(); | params.parallel_jobs = n_jobs.Get(); | ||||
| params.emit_lmi = lmi_path.Get(); | |||||
| dds::builder bd; | dds::builder bd; | ||||
| dds::sdist_build_params sdist_params; | dds::sdist_build_params sdist_params; |
| return ureqs; | return ureqs; | ||||
| } | } | ||||
| void write_lml(build_env_ref env, const library_plan& lib, path_ref lml_path) { | |||||
| fs::create_directories(lml_path.parent_path()); | |||||
| auto out = open(lml_path, std::ios::binary | std::ios::out); | |||||
| out << "Type: Library\n" | |||||
| << "Name: " << lib.name() << '\n' | |||||
| << "Include-Path: " << lib.library_().public_include_dir().generic_string() << '\n'; | |||||
| for (auto&& use : lib.uses()) { | |||||
| out << "Uses: " << use.namespace_ << "/" << use.name << '\n'; | |||||
| } | |||||
| for (auto&& link : lib.links()) { | |||||
| out << "Links: " << link.namespace_ << "/" << link.name << '\n'; | |||||
| } | |||||
| if (auto&& arc = lib.create_archive()) { | |||||
| out << "Path: " | |||||
| << (env.output_root / arc->calc_archive_file_path(env.toolchain)).generic_string() | |||||
| << '\n'; | |||||
| } | |||||
| } | |||||
| void write_lmp(build_env_ref env, const package_plan& pkg, path_ref lmp_path) { | |||||
| fs::create_directories(lmp_path.parent_path()); | |||||
| auto out = open(lmp_path, std::ios::binary | std::ios::out); | |||||
| out << "Type: Package\n" | |||||
| << "Name: " << pkg.name() << '\n' | |||||
| << "Namespace: " << pkg.namespace_() << '\n'; | |||||
| for (const auto& lib : pkg.libraries()) { | |||||
| auto lml_path = lmp_path.parent_path() / pkg.namespace_() / (lib.name() + ".lml"); | |||||
| write_lml(env, lib, lml_path); | |||||
| out << "Library: " << lml_path.generic_string() << '\n'; | |||||
| } | |||||
| } | |||||
| void write_lmi(build_env_ref env, const build_plan& plan, path_ref base_dir, path_ref lmi_path) { | |||||
| fs::create_directories(lmi_path.parent_path()); | |||||
| auto out = open(lmi_path, std::ios::binary | std::ios::out); | |||||
| out << "Type: Index\n"; | |||||
| for (const auto& pkg : plan.packages()) { | |||||
| auto lmp_path = base_dir / "_libman" / (pkg.name() + ".lmp"); | |||||
| write_lmp(env, pkg, lmp_path); | |||||
| out << "Package: " << pkg.name() << "; " << lmp_path.generic_string() << '\n'; | |||||
| } | |||||
| } | |||||
| } // namespace | } // namespace | ||||
| void builder::build(const build_params& params) const { | void builder::build(const build_params& params) const { | ||||
| if (!test_failures.empty()) { | if (!test_failures.empty()) { | ||||
| throw compile_failure("Test failures during the build!"); | throw compile_failure("Test failures during the build!"); | ||||
| } | } | ||||
| if (params.emit_lmi) { | |||||
| write_lmi(env, plan, params.out_root, *params.emit_lmi); | |||||
| } | |||||
| } | } |
| struct build_params { | struct build_params { | ||||
| fs::path out_root; | fs::path out_root; | ||||
| std::optional<fs::path> existing_lm_index; | std::optional<fs::path> existing_lm_index; | ||||
| std::optional<fs::path> emit_lmi; | |||||
| dds::toolchain toolchain; | dds::toolchain toolchain; | ||||
| bool generate_compdb = true; | bool generate_compdb = true; | ||||
| int parallel_jobs = 0; | int parallel_jobs = 0; |
| dds.catalog_import(dds.source_root / 'catalog.json') | dds.catalog_import(dds.source_root / 'catalog.json') | ||||
| dds.build_deps(['-d', 'deps.dds']) | dds.build_deps(['-d', 'deps.dds']) | ||||
| assert (dds.deps_build_dir / 'neo-sqlite3@0.1.0').is_dir() | assert (dds.deps_build_dir / 'neo-sqlite3@0.1.0').is_dir() | ||||
| assert (dds.scratch_dir / 'INDEX.lmi').is_file() | |||||
| assert (dds.deps_build_dir / '_libman/neo-sqlite3.lmp').is_file() | |||||
| assert (dds.deps_build_dir / '_libman/neo/sqlite3.lml').is_file() | |||||
| def test_build_deps_from_cmd(dds: DDS): | def test_build_deps_from_cmd(dds: DDS): | ||||
| dds.catalog_import(dds.source_root / 'catalog.json') | dds.catalog_import(dds.source_root / 'catalog.json') | ||||
| dds.build_deps(['neo-sqlite3 =0.1.0']) | dds.build_deps(['neo-sqlite3 =0.1.0']) | ||||
| assert (dds.deps_build_dir / 'neo-sqlite3@0.1.0').is_dir() | assert (dds.deps_build_dir / 'neo-sqlite3@0.1.0').is_dir() | ||||
| assert (dds.scratch_dir / 'INDEX.lmi').is_file() | |||||
| assert (dds.deps_build_dir / '_libman/neo-sqlite3.lmp').is_file() | |||||
| assert (dds.deps_build_dir / '_libman/neo/sqlite3.lml').is_file() | |||||
| def test_multiple_deps(dds: DDS): | def test_multiple_deps(dds: DDS): | ||||
| dds.catalog_import(dds.source_root / 'catalog.json') | dds.catalog_import(dds.source_root / 'catalog.json') | ||||
| dds.build_deps(['neo-sqlite3 ^0.1.0', 'neo-sqlite3 ~0.2.0']) | dds.build_deps(['neo-sqlite3 ^0.1.0', 'neo-sqlite3 ~0.2.0']) | ||||
| assert (dds.deps_build_dir / 'neo-sqlite3@0.2.2').is_dir() | assert (dds.deps_build_dir / 'neo-sqlite3@0.2.2').is_dir() | ||||
| assert (dds.scratch_dir / 'INDEX.lmi').is_file() | |||||
| assert (dds.deps_build_dir / '_libman/neo-sqlite3.lmp').is_file() | |||||
| assert (dds.deps_build_dir / '_libman/neo/sqlite3.lml').is_file() |