Add compilation support with Newlib nano for embedded targets

Remove the dependency on std::locale to reduce executable sizes

For embedded target the usage of locale bring a huge amount of code to the executable, just to get hold of the thousands separator. Using a static defined thousands separator makes libfmt embedded target friendly.
diff --git a/include/fmt/format-inl.h b/include/fmt/format-inl.h
index b147b77..49779a0 100644
--- a/include/fmt/format-inl.h
+++ b/include/fmt/format-inl.h
@@ -18,7 +18,9 @@
 #include <cmath>
 #include <cstdarg>
 #include <cstddef>  // for std::ptrdiff_t
-#include <locale>
+#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR)
+# include <locale>
+#endif
 
 #if defined(_WIN32) && defined(__MINGW32__)
 # include <cstring>
@@ -193,6 +195,7 @@
 }
 }  // namespace
 
+#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR)
 class locale {
  private:
   std::locale locale_;
@@ -217,6 +220,12 @@
   std::locale loc = lp ? lp->locale().get() : std::locale();
   return std::use_facet<std::numpunct<Char>>(loc).thousands_sep();
 }
+#else
+template <typename Char>
+FMT_FUNC Char internal::thousands_sep(locale_provider *lp) {
+  return FMT_STATIC_THOUSANDS_SEPARATOR;
+}
+#endif
 
 FMT_FUNC void system_error::init(
     int err_code, string_view format_str, format_args args) {
@@ -569,8 +578,9 @@
   std::fputs(internal::data::RESET_COLOR, stdout);
 }
 #endif
-
+#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR)
 FMT_FUNC locale locale_provider::locale() { return fmt::locale(); }
+#endif
 
 FMT_END_NAMESPACE