Procházet zdrojové kódy

fix spdlog (#490)

* improve spdlog patch

Co-authored-by: fasiondog <[email protected]>
ruki před 4 roky
rodič
revize
f1a43ef05f

+ 144 - 0
packages/s/spdlog/patches/1.8.5/spdlog-1.8.5-fmt8.patch

@@ -0,0 +1,144 @@
+diff --git a/include/spdlog/common-inl.h b/include/spdlog/common-inl.h
+index 378efe60..3632ec94 100644
+--- a/include/spdlog/common-inl.h
++++ b/include/spdlog/common-inl.h
+@@ -60,7 +60,7 @@ SPDLOG_INLINE spdlog_ex::spdlog_ex(std::string msg)
+ SPDLOG_INLINE spdlog_ex::spdlog_ex(const std::string &msg, int last_errno)
+ {
+     memory_buf_t outbuf;
+-    fmt::format_system_error(outbuf, last_errno, msg);
++    fmt::format_system_error(outbuf, last_errno, msg.c_str());
+     msg_ = fmt::to_string(outbuf);
+ }
+ 
+diff --git a/src/fmt.cpp b/src/fmt.cpp
+index 9e91beb1..edd52dd5 100644
+--- a/src/fmt.cpp
++++ b/src/fmt.cpp
+@@ -10,94 +10,58 @@
+ #include <spdlog/fmt/bundled/format-inl.h>
+ 
+ 
++
+ FMT_BEGIN_NAMESPACE
+ namespace detail {
+ 
+-template <typename T>
+-int format_float(char* buf, std::size_t size, const char* format, int precision,
+-                 T value) {
+-#ifdef FMT_FUZZ
+-  if (precision > 100000)
+-    throw std::runtime_error(
+-        "fuzz mode - avoid large allocation inside snprintf");
+-#endif
+-  // Suppress the warning about nonliteral format string.
+-  int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF;
+-  return precision < 0 ? snprintf_ptr(buf, size, format, value)
+-                       : snprintf_ptr(buf, size, format, precision, value);
++template<typename T>
++int format_float(char *buf, std::size_t size, const char *format, int precision, T value)
++{
++#    ifdef FMT_FUZZ
++    if (precision > 100000)
++        throw std::runtime_error("fuzz mode - avoid large allocation inside snprintf");
++#    endif
++    // Suppress the warning about nonliteral format string.
++    int (*snprintf_ptr)(char *, size_t, const char *, ...) = FMT_SNPRINTF;
++    return precision < 0 ? snprintf_ptr(buf, size, format, value) : snprintf_ptr(buf, size, format, precision, value);
+ }
+ 
+-template FMT_API dragonbox::decimal_fp<float> dragonbox::to_decimal(float x)
+-    FMT_NOEXCEPT;
+-template FMT_API dragonbox::decimal_fp<double> dragonbox::to_decimal(double x)
+-    FMT_NOEXCEPT;
+-
+-// DEPRECATED! This function exists for ABI compatibility.
+-template <typename Char>
+-typename basic_format_context<std::back_insert_iterator<buffer<Char>>,
+-                              Char>::iterator
+-vformat_to(buffer<Char>& buf, basic_string_view<Char> format_str,
+-           basic_format_args<basic_format_context<
+-               std::back_insert_iterator<buffer<type_identity_t<Char>>>,
+-               type_identity_t<Char>>>
+-               args) {
+-  using iterator = std::back_insert_iterator<buffer<char>>;
+-  using context = basic_format_context<
+-      std::back_insert_iterator<buffer<type_identity_t<Char>>>,
+-      type_identity_t<Char>>;
+-  auto out = iterator(buf);
+-  format_handler<iterator, Char, context> h(out, format_str, args, {});
+-  parse_format_string<false>(format_str, h);
+-  return out;
+-}
+-template basic_format_context<std::back_insert_iterator<buffer<char>>,
+-                              char>::iterator
+-vformat_to(buffer<char>&, string_view,
+-           basic_format_args<basic_format_context<
+-               std::back_insert_iterator<buffer<type_identity_t<char>>>,
+-               type_identity_t<char>>>);
+-}  // namespace detail
+-
+-template struct FMT_INSTANTIATION_DEF_API detail::basic_data<void>;
++template FMT_API dragonbox::decimal_fp<float> dragonbox::to_decimal(float x) FMT_NOEXCEPT;
++template FMT_API dragonbox::decimal_fp<double> dragonbox::to_decimal(double x) FMT_NOEXCEPT;
++} // namespace detail
+ 
+ // Workaround a bug in MSVC2013 that prevents instantiation of format_float.
+-int (*instantiate_format_float)(double, int, detail::float_specs,
+-                                detail::buffer<char>&) = detail::format_float;
++int (*instantiate_format_float)(double, int, detail::float_specs, detail::buffer<char> &) = detail::format_float;
+ 
+-#ifndef FMT_STATIC_THOUSANDS_SEPARATOR
+-template FMT_API detail::locale_ref::locale_ref(const std::locale& loc);
++#    ifndef FMT_STATIC_THOUSANDS_SEPARATOR
++template FMT_API detail::locale_ref::locale_ref(const std::locale &loc);
+ template FMT_API std::locale detail::locale_ref::get<std::locale>() const;
+-#endif
++#    endif
+ 
+ // Explicit instantiations for char.
+ 
+-template FMT_API std::string detail::grouping_impl<char>(locale_ref);
+-template FMT_API char detail::thousands_sep_impl(locale_ref);
++template FMT_API auto detail::thousands_sep_impl(locale_ref) -> thousands_sep_result<char>;
+ template FMT_API char detail::decimal_point_impl(locale_ref);
+ 
+-template FMT_API void detail::buffer<char>::append(const char*, const char*);
++template FMT_API void detail::buffer<char>::append(const char *, const char *);
+ 
+ template FMT_API void detail::vformat_to(
+-    detail::buffer<char>&, string_view,
+-    basic_format_args<FMT_BUFFER_CONTEXT(char)>, detail::locale_ref);
+-
+-template FMT_API int detail::snprintf_float(double, int, detail::float_specs,
+-                                            detail::buffer<char>&);
+-template FMT_API int detail::snprintf_float(long double, int,
+-                                            detail::float_specs,
+-                                            detail::buffer<char>&);
+-template FMT_API int detail::format_float(double, int, detail::float_specs,
+-                                          detail::buffer<char>&);
+-template FMT_API int detail::format_float(long double, int, detail::float_specs,
+-                                          detail::buffer<char>&);
++    detail::buffer<char> &, string_view, basic_format_args<FMT_BUFFER_CONTEXT(char)>, detail::locale_ref);
++
++template FMT_API int detail::snprintf_float(double, int, detail::float_specs, detail::buffer<char> &);
++template FMT_API int detail::snprintf_float(long double, int, detail::float_specs, detail::buffer<char> &);
++template FMT_API int detail::format_float(double, int, detail::float_specs, detail::buffer<char> &);
++template FMT_API int detail::format_float(long double, int, detail::float_specs, detail::buffer<char> &);
+ 
+ // Explicit instantiations for wchar_t.
+ 
+-template FMT_API std::string detail::grouping_impl<wchar_t>(locale_ref);
+-template FMT_API wchar_t detail::thousands_sep_impl(locale_ref);
++template FMT_API auto detail::thousands_sep_impl(locale_ref) -> thousands_sep_result<wchar_t>;
+ template FMT_API wchar_t detail::decimal_point_impl(locale_ref);
+ 
+-template FMT_API void detail::buffer<wchar_t>::append(const wchar_t*,
+-                                                      const wchar_t*);
++template FMT_API void detail::buffer<wchar_t>::append(const wchar_t *, const wchar_t *);
++
++template struct detail::basic_data<void>;
++
+ FMT_END_NAMESPACE
++
+ #endif // !SPDLOG_FMT_EXTERNAL

+ 58 - 56
packages/s/spdlog/xmake.lua

@@ -1,56 +1,58 @@
-package("spdlog")
-
-    set_homepage("https://github.com/gabime/spdlog")
-    set_description("Fast C++ logging library.")
-
-    set_urls("https://github.com/gabime/spdlog/archive/$(version).zip",
-             "https://github.com/gabime/spdlog.git")
-             
-    add_versions("v1.8.5", "6e66c8ed4c014b0fb00c74d34eea95b5d34f6e4b51b746b1ea863dc3c2e854fd")
-    add_versions("v1.8.2", "f0410b12b526065802b40db01304783550d3d20b4b6fe2f8da55f9d08ed2035d")
-    add_versions("v1.8.1", "eed0095a1d52d08a0834feda146d4f9148fa4125620cd04d8ea57e0238fa39cd")
-    add_versions("v1.8.0", "3cc41508fcd79e5141a6ef350506ef82982ca42a875e0588c02c19350ac3702e")
-    add_versions("v1.5.0", "87e87c989f15d6b9f5379385aec1001c89a42941341ebaa09ec895b98a00efb4")
-    add_versions("v1.4.2", "56b90f0bd5b126cf1b623eeb19bf4369516fa68f036bbc22d9729d2da511fb5a")
-    add_versions("v1.3.1", "db6986d0141546d4fba5220944cc1f251bd8afdfc434bda173b4b0b6406e3cd0")
-
-    add_configs("header_only",  { description = "Use header only", default = true, type = "boolean"})
-    add_configs("fmt_external", { description = "Use external fmt library instead of bundled", default = false, type = "boolean"})
-    add_configs("noexcept",     { description = "Compile with -fno-exceptions. Call abort() on any spdlog exceptions", default = false, type = "boolean"})
-
-    on_load(function (package)
-        if not package:config("header_only") then
-            package:add("defines", "SPDLOG_COMPILE_LIB")
-        end
-        if package:config("fmt_external") then
-            package:add("defines", "SPDLOG_FMT_EXTERNAL")
-        end
-        if package:version():ge("1.4.0") and not package:config("header_only") then
-            package:add("deps", "cmake")
-        end
-        if package:config("fmt_external") then
-            package:add("deps", "fmt", {configs = {header_only = true}})
-        end
-    end)
-
-    on_install(function (package)
-        if package:version():lt("1.4.0") or package:config("header_only") then
-            os.cp("include", package:installdir())
-            return
-        end
-
-        local configs = {}
-        if package:config("shared") and is_plat("windows") then
-            raise("spdlog shared lib is not yet supported under windows!")
-        end
-        table.insert(configs, "-DSPDLOG_BUILD_SHARED=" .. (package:config("shared") and "ON" or "OFF"))
-        table.insert(configs, "-DSPDLOG_FMT_EXTERNAL=" .. (package:config("fmt_external") and "ON" or "OFF"))
-        table.insert(configs, "-SPDLOG_NO_EXCEPTIONS=" .. (package:config("noexcept") and "ON" or "OFF"))
-        table.insert(configs, "-DSPDLOG_BUILD_TESTS=OFF")
-        table.insert(configs, "-DSPDLOG_BUILD_EXAMPLE=OFF")
-        import("package.tools.cmake").install(package, configs)
-    end)
-
-    on_test(function (package)
-        assert(package:has_cxxfuncs("spdlog::info(\"\")", {includes = "spdlog/spdlog.h", configs = {languages = "c++11"}}))
-    end)
+package("spdlog")
+
+    set_homepage("https://github.com/gabime/spdlog")
+    set_description("Fast C++ logging library.")
+
+    set_urls(--"https://github.com/gabime/spdlog/archive/$(version).zip",
+             "https://github.com/gabime/spdlog.git")
+
+    add_versions("v1.8.5", "6e66c8ed4c014b0fb00c74d34eea95b5d34f6e4b51b746b1ea863dc3c2e854fd")
+    add_versions("v1.8.2", "f0410b12b526065802b40db01304783550d3d20b4b6fe2f8da55f9d08ed2035d")
+    add_versions("v1.8.1", "eed0095a1d52d08a0834feda146d4f9148fa4125620cd04d8ea57e0238fa39cd")
+    add_versions("v1.8.0", "3cc41508fcd79e5141a6ef350506ef82982ca42a875e0588c02c19350ac3702e")
+    add_versions("v1.5.0", "87e87c989f15d6b9f5379385aec1001c89a42941341ebaa09ec895b98a00efb4")
+    add_versions("v1.4.2", "56b90f0bd5b126cf1b623eeb19bf4369516fa68f036bbc22d9729d2da511fb5a")
+    add_versions("v1.3.1", "db6986d0141546d4fba5220944cc1f251bd8afdfc434bda173b4b0b6406e3cd0")
+
+    add_patches("v1.8.5", path.join(os.scriptdir(), "patches", "1.8.5", "spdlog-1.8.5-fmt8.patch"), "843ae1f3e654bc545ede6b3b2171ea9ffe10a2befa77cd8d503d6a67acb3034f")
+
+    add_configs("header_only",  { description = "Use header only", default = true, type = "boolean"})
+    add_configs("fmt_external", { description = "Use external fmt library instead of bundled", default = false, type = "boolean"})
+    add_configs("noexcept",     { description = "Compile with -fno-exceptions. Call abort() on any spdlog exceptions", default = false, type = "boolean"})
+
+    on_load(function (package)
+        if not package:config("header_only") then
+            package:add("defines", "SPDLOG_COMPILE_LIB")
+        end
+        if package:config("fmt_external") then
+            package:add("defines", "SPDLOG_FMT_EXTERNAL")
+        end
+        if package:version():ge("1.4.0") and not package:config("header_only") then
+            package:add("deps", "cmake")
+        end
+        if package:config("fmt_external") then
+            package:add("deps", "fmt", {configs = {header_only = true}})
+        end
+    end)
+
+    on_install(function (package)
+        if package:version():lt("1.4.0") or package:config("header_only") then
+            os.cp("include", package:installdir())
+            return
+        end
+
+        local configs = {}
+        if package:config("shared") and is_plat("windows") then
+            raise("spdlog shared lib is not yet supported under windows!")
+        end
+        table.insert(configs, "-DSPDLOG_BUILD_SHARED=" .. (package:config("shared") and "ON" or "OFF"))
+        table.insert(configs, "-DSPDLOG_FMT_EXTERNAL=" .. (package:config("fmt_external") and "ON" or "OFF"))
+        table.insert(configs, "-SPDLOG_NO_EXCEPTIONS=" .. (package:config("noexcept") and "ON" or "OFF"))
+        table.insert(configs, "-DSPDLOG_BUILD_TESTS=OFF")
+        table.insert(configs, "-DSPDLOG_BUILD_EXAMPLE=OFF")
+        import("package.tools.cmake").install(package, configs)
+    end)
+
+    on_test(function (package)
+        assert(package:has_cxxfuncs("spdlog::info(\"\")", {includes = "spdlog/spdlog.h", configs = {languages = "c++11"}}))
+    end)