#include "cmake.hpp" #include #include #include namespace fs = std::filesystem; namespace cmkr::cmake { namespace detail { std::vector to_string_vec( const std::vector> &vals) { std::vector temp; for (const auto &val : vals) temp.push_back(val.as_string()); return temp; } } // namespace detail CMake::CMake(const std::string &path, bool build) { if (!fs::exists(fs::path(path) / "cmake.toml")) { throw std::runtime_error("No cmake.toml was found!"); } const auto toml = toml::parse(fs::path(path) / "cmake.toml"); if (build) { if (toml.contains("cmake")) { const auto &cmake = toml::find(toml, "cmake"); if (cmake.contains("bin-dir")) { bin_dir = toml::find(cmake, "bin-dir").as_string(); } if (cmake.contains("generator")) { generator = toml::find(cmake, "generator").as_string(); } if (cmake.contains("arguments")) { gen_args = detail::to_string_vec(toml::find(cmake, "arguments").as_array()); } } } else { if (toml.contains("cmake")) { const auto &cmake = toml::find(toml, "cmake"); cmake_version = toml::find(cmake, "minimum").as_string(); if (cmake.contains("cpp-flags")) { cppflags = detail::to_string_vec(toml::find(cmake, "cpp-flags").as_array()); } if (cmake.contains("c-flags")) { cflags = detail::to_string_vec(toml::find(cmake, "c-flags").as_array()); } if (cmake.contains("link-flags")) { linkflags = detail::to_string_vec(toml::find(cmake, "link-flags").as_array()); } if (cmake.contains("subdirs")) { subdirs = detail::to_string_vec(toml::find(cmake, "subdirs").as_array()); } } if (toml.contains("project")) { const auto &project = toml::find(toml, "project"); proj_name = toml::find(project, "name").as_string(); proj_version = toml::find(project, "version").as_string(); } if (toml.contains("options")) { using opts_map = std::map>; const auto &opts = toml::find(toml, "options"); for (const auto opt : opts) { Option o; o.name = opt.first; if (opt.second.is_boolean()) { o.val = opt.second.as_boolean(); } else { if (opt.second.contains("comment")) { o.comment = toml::find(opt.second, "comment").as_string(); } if (opt.second.contains("value")) { o.val = toml::find(opt.second, "value").as_boolean(); } } options.push_back(o); } } if (toml.contains("find-package")) { using pkg_map = std::map>; const auto &pkgs = toml::find(toml, "find-package"); for (const auto &pkg : pkgs) { Package p; p.name = pkg.first; if (pkg.second.is_string()) { p.version = pkg.second.as_string(); } else { if (pkg.second.contains("version")) { p.version = toml::find(pkg.second, "version").as_string(); } if (pkg.second.contains("required")) { p.required = toml::find(pkg.second, "required").as_boolean(); } if (pkg.second.contains("components")) { p.components = detail::to_string_vec(toml::find(pkg.second, "components").as_array()); } } packages.push_back(p); } } if (toml.contains("fetch-content")) { using content_map = std::map>; contents = toml::find(toml, "fetch-content"); } if (toml.contains("bin")) { const auto &bins = toml::find(toml, "bin").as_array(); for (const auto &bin : bins) { Bin b; b.name = toml::find(bin, "name").as_string(); b.type = toml::find(bin, "type").as_string(); b.sources = detail::to_string_vec(toml::find(bin, "sources").as_array()); b.alias = toml::find(bin, "alias").as_string(); if (bin.contains("include-dirs")) { b.include_dirs = detail::to_string_vec(toml::find(bin, "include-dirs").as_array()); } if (bin.contains("link-libs")) { b.link_libs = detail::to_string_vec(toml::find(bin, "link-libs").as_array()); } if (bin.contains("features")) { b.features = detail::to_string_vec(toml::find(bin, "features").as_array()); } if (bin.contains("defines")) { b.defines = detail::to_string_vec(toml::find(bin, "defines").as_array()); } binaries.push_back(b); } } } } } // namespace cmkr::cmake