diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 599cb0e..5af2eb9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,11 +46,13 @@ jobs: - name: Get lowercase OS name id: osname uses: ASzc/change-string-case-action@07c1e24a97f0951e13f88870b99c058fcf0b14cf # v5 + if: ${{ startsWith(github.ref, 'refs/tags/') }} with: string: ${{ runner.os }} - name: Compress artifacts uses: vimtor/action-zip@26a249fb00d43ca98dad77a4b3838025fc226aa1 # v1.1 + if: ${{ startsWith(github.ref, 'refs/tags/') }} with: files: install/bin/ dest: ${{ github.event.repository.name }}-${{ steps.osname.outputs.lowercase }}.zip diff --git a/docs/cmake-toml.md b/docs/cmake-toml.md index 16a7a86..1b7aea7 100644 --- a/docs/cmake-toml.md +++ b/docs/cmake-toml.md @@ -72,7 +72,7 @@ unix = "UNIX" bsd = "CMAKE_SYSTEM_NAME MATCHES \"BSD\"" linux = "CMAKE_SYSTEM_NAME MATCHES \"Linux\"" gcc = "CMAKE_CXX_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"GNU\"" -clang = "CMAKE_CXX_COMPILER_ID MATCHES \"Clang\" OR CMAKE_C_COMPILER_ID MATCHES \"Clang\"" +clang = "(CMAKE_CXX_COMPILER_ID MATCHES \"Clang\" AND NOT CMAKE_CXX_COMPILER_FRONTEND_VARIANT MATCHES \"^MSVC$\") OR (CMAKE_C_COMPILER_ID MATCHES \"Clang\" AND NOT CMAKE_C_COMPILER_FRONTEND_VARIANT MATCHES \"^MSVC$\")" msvc = "MSVC" root = "CMKR_ROOT_PROJECT" x64 = "CMAKE_SIZEOF_VOID_P EQUAL 8" @@ -137,6 +137,7 @@ components = ["mycomponent"] condition = "mycondition" git = "https://github.com/myuser/gitcontent" tag = "v0.1" +shallow = false [fetch-content.svncontent] condition = "mycondition" @@ -146,7 +147,10 @@ rev = "svn_rev" [fetch-content.urlcontent] condition = "mycondition" url = "https://content-host.com/urlcontent.zip" -hash = "123123123123" +# These are equivalent, supported algorithms: +# md5, sha1, sha224, sha256, sha384, sha512, sha3_224, sha3_256, sha3_384, sha3_512 +hash = "SHA1 502a4e25b8b209889c99c7fa0732102682c2e4ff" +sha1 = "502a4e25b8b209889c99c7fa0732102682c2e4ff" ``` ## Targets diff --git a/include/project_parser.hpp b/include/project_parser.hpp index 1887029..33e4d7a 100644 --- a/include/project_parser.hpp +++ b/include/project_parser.hpp @@ -199,6 +199,7 @@ struct Project { Project(const Project *parent, const std::string &path, bool build); const Project *root() const; + bool cmake_minimum_version(int major, int minor) const; }; bool is_root_path(const std::string &path); diff --git a/src/project_parser.cpp b/src/project_parser.cpp index 206de11..c26b1ef 100644 --- a/src/project_parser.cpp +++ b/src/project_parser.cpp @@ -265,7 +265,8 @@ Project::Project(const Project *parent, const std::string &path, bool build) : p conditions["bsd"] = R"cmake(CMAKE_SYSTEM_NAME MATCHES "BSD")cmake"; conditions["linux"] = conditions["lunix"] = R"cmake(CMAKE_SYSTEM_NAME MATCHES "Linux")cmake"; conditions["gcc"] = R"cmake(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "GNU")cmake"; - conditions["clang"] = R"cmake(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "Clang")cmake"; + conditions["clang"] = + R"cmake((CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT CMAKE_CXX_COMPILER_FRONTEND_VARIANT MATCHES "^MSVC$") OR (CMAKE_C_COMPILER_ID MATCHES "Clang" AND NOT CMAKE_C_COMPILER_FRONTEND_VARIANT MATCHES "^MSVC$"))cmake"; conditions["msvc"] = R"cmake(MSVC)cmake"; conditions["root"] = R"cmake(CMKR_ROOT_PROJECT)cmake"; conditions["x64"] = R"cmake(CMAKE_SIZEOF_VOID_P EQUAL 8)cmake"; @@ -741,6 +742,26 @@ const Project *Project::root() const { return root; } +bool Project::cmake_minimum_version(int major, int minor) const { + // NOTE: this code is like pulling teeth, sorry + auto root_version = root()->cmake_version; + puts(root_version.c_str()); + auto range_index = root_version.find("..."); + if (range_index != std::string::npos) { + root_version.resize(range_index); + } + + auto period_index = root_version.find('.'); + auto root_major = atoi(root_version.substr(0, period_index).c_str()); + int root_minor = 0; + if (period_index != std::string::npos) { + auto end_index = root_version.find('.', period_index + 1); + root_minor = atoi(root_version.substr(period_index + 1, end_index).c_str()); + } + + return std::tie(root_major, root_minor) >= std::tie(major, minor); +} + bool is_root_path(const std::string &path) { const auto toml_path = fs::path(path) / "cmake.toml"; if (!fs::exists(toml_path)) {