| #include <dds/build/plan/compile_file.hpp> | #include <dds/build/plan/compile_file.hpp> | ||||
| #include <dds/logging.hpp> | #include <dds/logging.hpp> | ||||
| #include <dds/proc.hpp> | #include <dds/proc.hpp> | ||||
| #include <dds/project.hpp> | |||||
| #include <dds/source.hpp> | #include <dds/source.hpp> | ||||
| #include <dds/toolchain.hpp> | #include <dds/toolchain.hpp> | ||||
| #include <dds/usage_reqs.hpp> | #include <dds/usage_reqs.hpp> | ||||
| plan.archive_all(env, params.parallel_jobs); | plan.archive_all(env, params.parallel_jobs); | ||||
| plan.link_all(env, params.parallel_jobs); | plan.link_all(env, params.parallel_jobs); | ||||
| auto project = project::from_directory(params.root); | |||||
| // int n_test_fails = 0; | // int n_test_fails = 0; | ||||
| // for (path_ref test_exe : all_tests) { | // for (path_ref test_exe : all_tests) { | ||||
| // spdlog::info("Running test: {}", fs::relative(test_exe, params.out_root).string()); | // spdlog::info("Running test: {}", fs::relative(test_exe, params.out_root).string()); |
| int run() { | int run() { | ||||
| auto repo_dir = repo_where.Get(); | auto repo_dir = repo_where.Get(); | ||||
| // TODO: Generate a unique name to avoid conflicts | // TODO: Generate a unique name to avoid conflicts | ||||
| auto tmp_sdist = repo_dir / ".tmp.sdist"; | |||||
| auto tmp_sdist = dds::fs::temp_directory_path() / ".dds-sdist"; | |||||
| if (dds::fs::exists(tmp_sdist)) { | if (dds::fs::exists(tmp_sdist)) { | ||||
| dds::fs::remove_all(tmp_sdist); | dds::fs::remove_all(tmp_sdist); | ||||
| } | } |
| #include <dds/project.hpp> | |||||
| #include <dds/source.hpp> | |||||
| #include <range/v3/range/conversion.hpp> | |||||
| #include <range/v3/view/filter.hpp> | |||||
| #include <range/v3/view/transform.hpp> | |||||
| using namespace dds; | |||||
| namespace { | |||||
| bool has_library_dirs(path_ref p) { return fs::exists(p / "src") || fs::exists(p / "include"); } | |||||
| std::vector<library> collect_submodules(path_ref pf_libs_dir) { | |||||
| if (!fs::exists(pf_libs_dir)) { | |||||
| return {}; | |||||
| } | |||||
| using namespace ranges::views; | |||||
| return fs::directory_iterator(pf_libs_dir) // | |||||
| | filter(has_library_dirs) // | |||||
| | transform([](auto&& entry) { return library::from_directory(entry); }) // | |||||
| | ranges::to_vector; | |||||
| } | |||||
| } // namespace | |||||
| project project::from_directory(path_ref pf_dir_path) { | |||||
| std::optional<library> main_lib; | |||||
| if (has_library_dirs(pf_dir_path)) { | |||||
| main_lib = library::from_directory(pf_dir_path); | |||||
| } | |||||
| package_manifest man; | |||||
| auto man_path = pf_dir_path / "package.dds"; | |||||
| if (fs::is_regular_file(man_path)) { | |||||
| man = package_manifest::load_from_file(man_path); | |||||
| } | |||||
| return project(pf_dir_path, | |||||
| std::move(main_lib), | |||||
| collect_submodules(pf_dir_path / "libs"), | |||||
| std::move(man)); | |||||
| } |
| #pragma once | |||||
| #include <dds/library.hpp> | |||||
| #include <dds/package_manifest.hpp> | |||||
| #include <dds/util/fs.hpp> | |||||
| #include <optional> | |||||
| #include <vector> | |||||
| namespace dds { | |||||
| class project { | |||||
| fs::path _root; | |||||
| std::optional<library> _main_lib; | |||||
| std::vector<library> _submodules; | |||||
| package_manifest _man; | |||||
| project(path_ref root, | |||||
| std::optional<library>&& ml, | |||||
| std::vector<library>&& mods, | |||||
| package_manifest&& man) | |||||
| : _root(root) | |||||
| , _main_lib(std::move(ml)) | |||||
| , _submodules(std::move(mods)) | |||||
| , _man(std::move(man)) {} | |||||
| public: | |||||
| static project from_directory(path_ref pr_dir); | |||||
| const library* main_library() const noexcept { | |||||
| if (_main_lib) { | |||||
| return &*_main_lib; | |||||
| } | |||||
| return nullptr; | |||||
| } | |||||
| auto& submodules() const noexcept { return _submodules; } | |||||
| auto& manifest() const noexcept { return _man; } | |||||
| path_ref root() const noexcept { return _root; } | |||||
| }; | |||||
| } // namespace dds |
| #include "./sdist.hpp" | #include "./sdist.hpp" | ||||
| #include <dds/project.hpp> | |||||
| #include <dds/temp.hpp> | #include <dds/temp.hpp> | ||||
| #include <dds/util/fs.hpp> | #include <dds/util/fs.hpp> | ||||
| } | } | ||||
| sdist dds::create_sdist_in_dir(path_ref out, const sdist_params& params) { | sdist dds::create_sdist_in_dir(path_ref out, const sdist_params& params) { | ||||
| auto project = project::from_directory(params.project_dir); | |||||
| auto libs = collect_libraries(params.project_dir); | |||||
| browns::md5 md5; | browns::md5 md5; | ||||
| if (project.main_library()) { | |||||
| sdist_copy_library(out, *project.main_library(), params, md5); | |||||
| for (const library& lib : libs) { | |||||
| sdist_copy_library(out, lib, params, md5); | |||||
| } | } | ||||
| for (const library& submod : project.submodules()) { | |||||
| sdist_copy_library(out, submod, params, md5); | |||||
| } | |||||
| auto man_path = project.root() / "package.dds"; | |||||
| auto man_path = params.project_dir / "package.dds"; | |||||
| if (!fs::is_regular_file(man_path)) { | if (!fs::is_regular_file(man_path)) { | ||||
| throw std::runtime_error(fmt::format( | throw std::runtime_error(fmt::format( | ||||
| "Creating a source distribution requires a package.dds file for the project")); | "Creating a source distribution requires a package.dds file for the project")); | ||||
| } | } | ||||
| sdist_export_file(out, params.project_dir, man_path, md5); | sdist_export_file(out, params.project_dir, man_path, md5); | ||||
| auto pkg_man = package_manifest::load_from_file(man_path); | |||||
| md5.pad(); | md5.pad(); | ||||
| auto hash_str = browns::format_digest(md5.digest()); | auto hash_str = browns::format_digest(md5.digest()); | ||||
| spdlog::info("Generated export as {}-{}", project.manifest().name, hash_str); | |||||
| spdlog::info("Generated export as {}-{}", pkg_man.name, hash_str); | |||||
| std::vector<lm::pair> pairs; | std::vector<lm::pair> pairs; | ||||
| pairs.emplace_back("MD5-Hash", hash_str); | pairs.emplace_back("MD5-Hash", hash_str); |