From 15ec3340c9870879f74ed72b3ab0e6fd78e58154 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 10 Feb 2025 21:44:08 +0000 Subject: [PATCH] Codechange: Compile fmt internals in a separate translation unit Instead of defining FMT_HEADER_ONLY to include fmt internals in the headers included by all fmt-using translation units. --- CMakeLists.txt | 1 + src/3rdparty/fmt/CMakeLists.txt | 1 + src/3rdparty/fmt/format.cc | 43 +++++++++++++++++++++++++++++++++ src/settingsgen/CMakeLists.txt | 1 + src/stdafx.h | 3 --- src/strgen/CMakeLists.txt | 1 + 6 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 src/3rdparty/fmt/format.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 6dd5d9d172..a7c0535e0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -260,6 +260,7 @@ target_precompile_headers(openttd_lib src/stdafx.h src/core/format.hpp ) +set_source_files_properties(src/3rdparty/fmt/format.cc PROPERTIES SKIP_PRECOMPILE_HEADERS ON) add_subdirectory(${CMAKE_SOURCE_DIR}/bin) add_subdirectory(${CMAKE_SOURCE_DIR}/src) diff --git a/src/3rdparty/fmt/CMakeLists.txt b/src/3rdparty/fmt/CMakeLists.txt index e687b2b3d8..edc97e1fa3 100644 --- a/src/3rdparty/fmt/CMakeLists.txt +++ b/src/3rdparty/fmt/CMakeLists.txt @@ -1,6 +1,7 @@ add_files( chrono.h core.h + format.cc format.h format-inl.h ostream.h diff --git a/src/3rdparty/fmt/format.cc b/src/3rdparty/fmt/format.cc new file mode 100644 index 0000000000..d503fe1133 --- /dev/null +++ b/src/3rdparty/fmt/format.cc @@ -0,0 +1,43 @@ +// Formatting library for C++ +// +// Copyright (c) 2012 - 2016, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#include "format-inl.h" + +FMT_BEGIN_NAMESPACE +namespace detail { + +template FMT_API auto dragonbox::to_decimal(float x) noexcept + -> dragonbox::decimal_fp; +template FMT_API auto dragonbox::to_decimal(double x) noexcept + -> dragonbox::decimal_fp; + +#ifndef FMT_STATIC_THOUSANDS_SEPARATOR +template FMT_API locale_ref::locale_ref(const std::locale& loc); +template FMT_API auto locale_ref::get() const -> std::locale; +#endif + +// Explicit instantiations for char. + +template FMT_API auto thousands_sep_impl(locale_ref) + -> thousands_sep_result; +template FMT_API auto decimal_point_impl(locale_ref) -> char; + +template FMT_API void buffer::append(const char*, const char*); + +template FMT_API void vformat_to(buffer&, string_view, + typename vformat_args<>::type, locale_ref); + +// Explicit instantiations for wchar_t. + +template FMT_API auto thousands_sep_impl(locale_ref) + -> thousands_sep_result; +template FMT_API auto decimal_point_impl(locale_ref) -> wchar_t; + +template FMT_API void buffer::append(const wchar_t*, const wchar_t*); + +} // namespace detail +FMT_END_NAMESPACE diff --git a/src/settingsgen/CMakeLists.txt b/src/settingsgen/CMakeLists.txt index 91c8eca7c8..9e71393ed6 100644 --- a/src/settingsgen/CMakeLists.txt +++ b/src/settingsgen/CMakeLists.txt @@ -5,6 +5,7 @@ if (NOT HOST_BINARY_DIR) set(sourcefiles settingsgen.cpp + ../3rdparty/fmt/format.cc ../core/alloc_func.cpp ../misc/getoptdata.cpp ../error.cpp diff --git a/src/stdafx.h b/src/stdafx.h index bdfc049cb6..b689aeeb57 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -298,9 +298,6 @@ char (&ArraySizeHelper(T (&array)[N]))[N]; # define GNU_TARGET(x) #endif /* __GNUC__ || __clang__ */ -/* For the FMT library we only want to use the headers, not link to some library. */ -#define FMT_HEADER_ONLY - [[noreturn]] void NOT_REACHED(const std::source_location location = std::source_location::current()); [[noreturn]] void AssertFailedError(const char *expression, const std::source_location location = std::source_location::current()); diff --git a/src/strgen/CMakeLists.txt b/src/strgen/CMakeLists.txt index 554a9db20a..40aff5556d 100644 --- a/src/strgen/CMakeLists.txt +++ b/src/strgen/CMakeLists.txt @@ -8,6 +8,7 @@ if (NOT HOST_BINARY_DIR) set(sourcefiles strgen.cpp strgen_base.cpp + ../3rdparty/fmt/format.cc ../core/alloc_func.cpp ../misc/getoptdata.cpp ../error.cpp