#pragma once #include #include #include #include namespace cmkr { namespace parser { template using Condition = tsl::ordered_map; using ConditionVector = Condition>; struct Setting { std::string name; std::string comment; mpark::variant val; bool cache = false; bool force = false; }; struct Option { std::string name; std::string comment; bool val = false; }; struct Package { std::string name; std::string condition; std::string version; bool required = true; bool config = false; std::vector components; }; struct Vcpkg { std::string version; std::string url; struct Package { std::string name; std::vector features; }; std::vector packages; }; enum TargetType { target_executable, target_library, target_shared, target_static, target_interface, target_custom, target_object, target_template, target_last, }; extern const char *targetTypeNames[target_last]; struct Target { std::string name; TargetType type = target_last; std::string type_name; ConditionVector headers; ConditionVector sources; // https://cmake.org/cmake/help/latest/manual/cmake-commands.7.html#project-commands ConditionVector compile_definitions; ConditionVector private_compile_definitions; ConditionVector compile_features; ConditionVector private_compile_features; ConditionVector compile_options; ConditionVector private_compile_options; ConditionVector include_directories; ConditionVector private_include_directories; ConditionVector link_directories; ConditionVector private_link_directories; ConditionVector link_libraries; ConditionVector private_link_libraries; ConditionVector link_options; ConditionVector private_link_options; ConditionVector precompile_headers; ConditionVector private_precompile_headers; std::string condition; std::string alias; Condition> properties; Condition cmake_before; Condition cmake_after; ConditionVector include_before; ConditionVector include_after; }; struct Template { Target outline; std::string add_function; bool pass_sources_to_add_function = false; }; struct Test { std::string name; std::string condition; std::vector configurations; std::string working_directory; std::string command; std::vector arguments; }; struct Install { std::string condition; std::vector targets; std::vector files; std::vector dirs; std::vector configs; std::string destination; std::string component; }; struct Subdir { std::string name; std::string condition; Condition cmake_before; Condition cmake_after; ConditionVector include_before; ConditionVector include_after; }; struct Content { std::string name; std::string condition; tsl::ordered_map arguments; Condition cmake_before; Condition cmake_after; ConditionVector include_before; ConditionVector include_after; }; struct Project { // This is the CMake version required to use all cmkr versions. std::string cmake_version = "3.15"; std::string cmkr_include = "cmkr.cmake"; std::string build_dir = "build"; std::string generator; std::string config; bool allow_in_tree = false; Condition> project_subdirs; std::vector cppflags; std::vector cflags; std::vector linkflags; std::vector gen_args; std::vector build_args; std::string project_name; std::string project_version; std::string project_description; std::vector project_languages; Condition cmake_before; Condition cmake_after; ConditionVector include_before; ConditionVector include_after; std::vector settings; std::vector