Bläddra i källkod

cppli: add package (#8644)

* cppli: add package

* Update xmake.lua

* Update xmake.lua

* Try downgrade minimum required cmake version

* Update xmake.lua

* Create fix-clang.patch

* Update fix-clang.patch

* Update xmake.lua

* Try resolve NDK issue

* Update xmake.lua

* Update xmake.lua

* Update xmake.lua

* Drop FreeBSD support

* Keep FreeBSD

---------

Co-authored-by: ruki <[email protected]>
Co-authored-by: Saikari <[email protected]>
The Bearodactyl 3 veckor sedan
förälder
incheckning
29533713a3
2 ändrade filer med 220 tillägg och 0 borttagningar
  1. 183 0
      packages/c/cppli/patches/2025.10.22/fix-clang.patch
  2. 37 0
      packages/c/cppli/xmake.lua

+ 183 - 0
packages/c/cppli/patches/2025.10.22/fix-clang.patch

@@ -0,0 +1,183 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 1e4e1b6..c919063 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1,4 +1,4 @@
+-cmake_minimum_required(VERSION 4.1.1)
++cmake_minimum_required(VERSION 3.5)
+ 
+ project(
+     cppli
+@@ -7,7 +7,7 @@ project(
+     LANGUAGES CXX
+ )
+ 
+-set(CMAKE_CXX_STANDARD 23)
++set(CMAKE_CXX_STANDARD 20)
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
+ set(CMAKE_CXX_EXTENSIONS OFF)
+ 
+@@ -31,7 +31,7 @@ target_include_directories(
+         $<INSTALL_INTERFACE:include>
+ )
+ 
+-target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_23)
++target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20)
+ 
+ #if(MSVC)
+ #    target_compile_options(${PROJECT_NAME} PRIVATE /W4 /WX)
+@@ -78,7 +78,7 @@ if(CPPLI_BUILD_TESTS)
+         PRIVATE ${PROJECT_NAME} Catch2::Catch2WithMain
+     )
+ 
+-    target_compile_features(cppli_tests PRIVATE cxx_std_23)
++    target_compile_features(cppli_tests PRIVATE cxx_std_20)
+ 
+     include(CTest)
+     include(Catch)
+diff --git a/src/cppli_types.cpp b/src/cppli_types.cpp
+index 91f17c3..d8f4ba0 100644
+--- a/src/cppli_types.cpp
++++ b/src/cppli_types.cpp
+@@ -1,57 +1,102 @@
+-#include <charconv>
+ #include <cppli_error.hpp>
+ #include <cppli_types.hpp>
+ #include <string>
+ #include <system_error>
+ 
++#if __cpp_lib_charconv >= 201606L && !defined(__GNUC__) || __GNUC__ >= 8
++    #define USE_FROM_CHARS
++#endif
++
++#if defined(USE_FROM_CHARS)
++    #include <charconv>
++#else
++    #include <sstream>
++#endif
++
+ namespace cli {
+-	Result<int> ValueConverter<int>::from_string(std::string_view str) {
+-		int value{};
+-		auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), value);
++#ifdef USE_FROM_CHARS
++    Result<int> ValueConverter<int>::from_string(std::string_view str) {
++        int value{};
++        auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), value);
++
++        if (ec == std::errc()) {
++            return Result<int>::ok(value);
++        }
+ 
+-		if (ec == std::errc()) {
+-			return Result<int>::ok(value);
+-		}
++        if (ec == std::errc::invalid_argument) {
++            return Result<int>::err(Error(ErrorCode::InvalidFlagValue, "Invalid integer format"));
++        }
+ 
+-		if (ec == std::errc::invalid_argument) {
+-			return Result<int>::err(Error(ErrorCode::InvalidFlagValue, "Invalid integer format"));
+-		}
++        if (ec == std::errc::result_out_of_range) {
++            return Result<int>::err(Error(ErrorCode::InvalidFlagValue, "Integer out of range"));
++        }
+ 
+-		if (ec == std::errc::result_out_of_range) {
+-			return Result<int>::err(Error(ErrorCode::InvalidFlagValue, "Integer out of range"));
+-		}
++        return Result<int>::err(Error(ErrorCode::InvalidFlagValue, "Unknown conversion error"));
++    }
+ 
+-		return Result<int>::err(Error(ErrorCode::InvalidFlagValue, "Unknown conversion error"));
+-	}
++    Result<double> ValueConverter<double>::from_string(std::string_view str) {
++        double value{};
++        auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), value);
+ 
+-	Result<double> ValueConverter<double>::from_string(std::string_view str) {
+-		double value{};
+-		auto [ptr, ec] = std::from_chars(str.data(), str.data() + str.size(), value);
++        if (ec == std::errc()) {
++            return Result<double>::ok(value);
++        }
+ 
+-		if (ec == std::errc()) {
+-			return Result<double>::ok(value);
+-		}
++        if (ec == std::errc::invalid_argument) {
++            return Result<double>::err(Error(ErrorCode::InvalidFlagValue, "Invalid floating-point format"));
++        }
+ 
+-		if (ec == std::errc::invalid_argument) {
+-			return Result<double>::err(Error(ErrorCode::InvalidFlagValue, "Invalid floating-point format"));
+-		}
++        if (ec == std::errc::result_out_of_range) {
++            return Result<double>::err(Error(ErrorCode::InvalidFlagValue, "Floating-point out of range"));
++        }
+ 
+-		if (ec == std::errc::result_out_of_range) {
+-			return Result<double>::err(Error(ErrorCode::InvalidFlagValue, "Floating-point out of range"));
+-		}
++        return Result<double>::err(Error(ErrorCode::InvalidFlagValue, "Unknown conversion error"));
++    }
++#else
++    Result<int> ValueConverter<int>::from_string(std::string_view str) {
++        try {
++            std::string str_copy(str);
++            std::istringstream iss(str_copy);
++            int value{};
++            iss >> value;
++            
++            if (iss.fail() || !iss.eof()) {
++                return Result<int>::err(Error(ErrorCode::InvalidFlagValue, "Invalid integer format"));
++            }
++            
++            return Result<int>::ok(value);
++        } catch (const std::exception&) {
++            return Result<int>::err(Error(ErrorCode::InvalidFlagValue, "Invalid integer format"));
++        }
++    }
+ 
+-		return Result<double>::err(Error(ErrorCode::InvalidFlagValue, "Unknown conversion error"));
+-	}
++    Result<double> ValueConverter<double>::from_string(std::string_view str) {
++        try {
++            std::string str_copy(str);
++            std::istringstream iss(str_copy);
++            double value{};
++            iss >> value;
++            
++            if (iss.fail() || !iss.eof()) {
++                return Result<double>::err(Error(ErrorCode::InvalidFlagValue, "Invalid floating-point format"));
++            }
++            
++            return Result<double>::ok(value);
++        } catch (const std::exception&) {
++            return Result<double>::err(Error(ErrorCode::InvalidFlagValue, "Invalid floating-point format"));
++        }
++    }
++#endif
+ 
+-	Result<bool> ValueConverter<bool>::from_string(std::string_view str) {
+-		if (str == "true" || str == "1" || str == "yes" || str == "on") {
+-			return Result<bool>::ok(true);
+-		}
++    Result<bool> ValueConverter<bool>::from_string(std::string_view str) {
++        if (str == "true" || str == "1" || str == "yes" || str == "on") {
++            return Result<bool>::ok(true);
++        }
+ 
+-		if (str == "false" || str == "0" || str == "no" || str == "off") {
+-			return Result<bool>::ok(false);
+-		}
++        if (str == "false" || str == "0" || str == "no" || str == "off") {
++            return Result<bool>::ok(false);
++        }
+ 
+-		return Result<bool>::err(Error(ErrorCode::InvalidFlagValue, "Invalid boolean value (expected: true/false, 1/0, yes/no, on/off)"));
+-	}
+-}// namespace cli
++        return Result<bool>::err(Error(ErrorCode::InvalidFlagValue, "Invalid boolean value (expected: true/false, 1/0, yes/no, on/off)"));
++    }
++} // namespace cli

+ 37 - 0
packages/c/cppli/xmake.lua

@@ -0,0 +1,37 @@
+package("cppli")
+    set_homepage("https://cppli.bearodactyl.dev")
+    set_description("an intuitive CLI framework for C++")
+    
+    add_urls("https://github.com/TheBearodactyl/cppli.git")
+
+    add_versions("2025.10.22", "98c8c2e8ee65d7a5a6b160cf0b85ba1be39ffb05")
+
+    add_patches("2025.10.22", "patches/2025.10.22/fix-clang.patch", "7d7c1363774e4279636455b7cfe4806138a272a03d10f6bfce6dda00b3b17d0d")
+
+    add_configs("shared", {description = "Build shared library.", default = false, type = "boolean", readonly = true})
+
+    add_deps("cmake")
+
+    on_check(function (package)
+        assert(package:check_cxxsnippets({test = [[
+            #if !__has_include(<source_location>)
+            #   error source_location is not supported by compiler
+            #endif
+        ]]}, {configs = {languages = "c++20"}}), "package(cppli): need std::source_location from <source_location> header.")
+    end)
+
+    on_install(function (package)
+        local configs = {}
+        table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:is_debug() and "Debug" or "Release"))
+        table.insert(configs, "-DCPPLI_BUILD_TESTS=OFF")
+        import("package.tools.cmake").install(package, configs)
+    end)
+    
+    on_test(function (package)
+        assert(package:check_cxxsnippets({test = [[
+            void test() {
+                cli::Parser parser("myapp", "A test application");
+                std::string help = parser.generate_help();
+            }
+        ]]}, {configs = {languages = "c++20"}, includes = "cppli.hpp"}))
+    end)