Inherit conditions from the parent project

toml-checker archive_a718dfd6
Duncan Ogilvie 3 years ago
parent 25da3171f0
commit a718dfd675

@ -1,11 +1,13 @@
#pragma once #pragma once
#include "project_parser.hpp"
namespace cmkr { namespace cmkr {
namespace gen { namespace gen {
int generate_project(const char *typ); int generate_project(const char *typ);
int generate_cmake(const char *path, bool root = true); int generate_cmake(const char *path, const parser::Project *parent_project = nullptr);
} // namespace gen } // namespace gen
} // namespace cmkr } // namespace cmkr

@ -152,7 +152,7 @@ struct Project {
tsl::ordered_map<std::string, std::string> conditions; tsl::ordered_map<std::string, std::string> conditions;
std::vector<Subdir> subdirs; std::vector<Subdir> subdirs;
Project(const std::string &path, bool build); Project(const Project *parent, const std::string &path, bool build);
}; };
bool is_root_path(const std::string &path); bool is_root_path(const std::string &path);

@ -1,7 +1,7 @@
#include "build.hpp" #include "build.hpp"
#include "project_parser.hpp"
#include "error.hpp"
#include "cmake_generator.hpp" #include "cmake_generator.hpp"
#include "error.hpp"
#include "project_parser.hpp"
#include "fs.hpp" #include "fs.hpp"
#include <sstream> #include <sstream>
@ -14,7 +14,7 @@ namespace cmkr {
namespace build { namespace build {
int run(int argc, char **argv) { int run(int argc, char **argv) {
parser::Project project(".", true); parser::Project project(nullptr, ".", true);
if (argc > 2) { if (argc > 2) {
for (int i = 2; i < argc; ++i) { for (int i = 2; i < argc; ++i) {
project.build_args.push_back(argv[i]); project.build_args.push_back(argv[i]);
@ -50,7 +50,7 @@ int run(int argc, char **argv) {
int clean() { int clean() {
bool ret = false; bool ret = false;
parser::Project project(".", true); parser::Project project(nullptr, ".", true);
if (fs::exists(project.build_dir)) { if (fs::exists(project.build_dir)) {
ret = fs::remove_all(project.build_dir); ret = fs::remove_all(project.build_dir);
fs::create_directory(project.build_dir); fs::create_directory(project.build_dir);
@ -59,7 +59,7 @@ int clean() {
} }
int install() { int install() {
parser::Project project(".", false); parser::Project project(nullptr, ".", false);
auto cmd = "cmake --install " + project.build_dir; auto cmd = "cmake --install " + project.build_dir;
return ::system(cmd.c_str()); return ::system(cmd.c_str());
} }

@ -1,7 +1,6 @@
#include "cmake_generator.hpp" #include "cmake_generator.hpp"
#include "error.hpp" #include "error.hpp"
#include "literals.hpp" #include "literals.hpp"
#include "project_parser.hpp"
#include "fs.hpp" #include "fs.hpp"
#include <cassert> #include <cassert>
@ -440,12 +439,12 @@ static std::string vcpkg_escape_identifier(const std::string &name) {
return escaped; return escaped;
} }
int generate_cmake(const char *path, bool root) { int generate_cmake(const char *path, const parser::Project *parent_project) {
if (!fs::exists(fs::path(path) / "cmake.toml")) { if (!fs::exists(fs::path(path) / "cmake.toml")) {
throw std::runtime_error("No cmake.toml found!"); throw std::runtime_error("No cmake.toml found!");
} }
parser::Project project(path, false); parser::Project project(parent_project, path, false);
Generator gen(project); Generator gen(project);
// Helper lambdas for more convenient CMake generation // Helper lambdas for more convenient CMake generation
@ -461,7 +460,8 @@ int generate_cmake(const char *path, bool root) {
comment("See " + cmkr_url + " for more information"); comment("See " + cmkr_url + " for more information");
endl(); endl();
if (root) { // Root project doesn't have a parent
if (parent_project == nullptr) {
cmd("cmake_minimum_required")("VERSION", project.cmake_version).endl(); cmd("cmake_minimum_required")("VERSION", project.cmake_version).endl();
if (!project.allow_in_tree) { if (!project.allow_in_tree) {
@ -919,7 +919,7 @@ int generate_cmake(const char *path, bool root) {
} }
} }
auto generate_subdir = [path](const fs::path &sub) { auto generate_subdir = [path, &project](const fs::path &sub) {
// Skip generating for subdirectories that have a cmake.toml with a [project] in it // Skip generating for subdirectories that have a cmake.toml with a [project] in it
fs::path subpath; fs::path subpath;
for (const auto &p : sub) { for (const auto &p : sub) {
@ -931,7 +931,7 @@ int generate_cmake(const char *path, bool root) {
subpath = path / sub; subpath = path / sub;
if (fs::exists(subpath / "cmake.toml")) { if (fs::exists(subpath / "cmake.toml")) {
generate_cmake(subpath.string().c_str(), false); generate_cmake(subpath.string().c_str(), &project);
} }
}; };
for (const auto &itr : project.project_subdirs) { for (const auto &itr : project.project_subdirs) {

@ -61,7 +61,7 @@ static void get_optional(const TomlBasicValue &v, const toml::key &ky, T &destin
} }
} }
Project::Project(const std::string &path, bool build) { Project::Project(const Project *parent, const std::string &path, bool build) {
const auto toml_path = fs::path(path) / "cmake.toml"; const auto toml_path = fs::path(path) / "cmake.toml";
if (!fs::exists(toml_path)) { if (!fs::exists(toml_path)) {
throw std::runtime_error("No cmake.toml was found!"); throw std::runtime_error("No cmake.toml was found!");
@ -313,14 +313,18 @@ Project::Project(const std::string &path, bool build) {
} }
// Reasonable default conditions (you can override these if you desire) // Reasonable default conditions (you can override these if you desire)
conditions["windows"] = R"cmake(WIN32)cmake"; if (parent == nullptr) {
conditions["macos"] = R"cmake(CMAKE_SYSTEM_NAME MATCHES "Darwin")cmake"; conditions["windows"] = R"cmake(WIN32)cmake";
conditions["unix"] = R"cmake(UNIX)cmake"; conditions["macos"] = R"cmake(CMAKE_SYSTEM_NAME MATCHES "Darwin")cmake";
conditions["bsd"] = R"cmake(CMAKE_SYSTEM_NAME MATCHES "BSD")cmake"; conditions["unix"] = R"cmake(UNIX)cmake";
conditions["linux"] = conditions["lunix"] = R"cmake(CMAKE_SYSTEM_NAME MATCHES "Linux")cmake"; conditions["bsd"] = R"cmake(CMAKE_SYSTEM_NAME MATCHES "BSD")cmake";
conditions["gcc"] = R"cmake(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "GNU")cmake"; conditions["linux"] = conditions["lunix"] = R"cmake(CMAKE_SYSTEM_NAME MATCHES "Linux")cmake";
conditions["clang"] = R"cmake(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "Clang")cmake"; conditions["gcc"] = R"cmake(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "GNU")cmake";
conditions["msvc"] = R"cmake(MSVC)cmake"; conditions["clang"] = R"cmake(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "Clang")cmake";
conditions["msvc"] = R"cmake(MSVC)cmake";
} else {
conditions = parent->conditions;
}
if (toml.contains("conditions")) { if (toml.contains("conditions")) {
auto conds = toml::find<decltype(conditions)>(toml, "conditions"); auto conds = toml::find<decltype(conditions)>(toml, "conditions");

Loading…
Cancel
Save