#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); |