You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by sw...@apache.org on 2023/01/23 23:36:26 UTC

[logging-log4cxx] branch master updated: Check 'std::basic_ostringstream' is supported. (#186)

This is an automated email from the ASF dual-hosted git repository.

swebb2066 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git


The following commit(s) were added to refs/heads/master by this push:
     new 23e2e085 Check 'std::basic_ostringstream<UniChar>' is supported. (#186)
23e2e085 is described below

commit 23e2e085ba84d6d0598a6bab493b07dcc7b2523b
Author: Stephen Webb <st...@ieee.org>
AuthorDate: Tue Jan 24 10:36:20 2023 +1100

    Check 'std::basic_ostringstream<UniChar>' is supported. (#186)
    
    * Check 'std::basic_ostringstream<UniChar>' is supported by the standard library.
    
    * Show 'std::string<UniChar>' support in cmake status report.
    
    * Restructure cmake code towards a better separation of concerns.
---
 CMakeLists.txt                                     | 22 ++++---
 src/CMakeLists.txt                                 |  2 +
 src/cmake/boost-fallback/boost-fallback.cmake      | 56 ++++++++++++++++-
 .../compiler-features/check-compiler-support.cmake | 26 ++++++++
 .../makeunique.h.cmake                             |  0
 .../test-make-unique.cpp                           |  0
 .../{ => compiler-features}/test-thread-local.cpp  |  0
 src/cmake/compiler-features/test-unicode.cpp       | 17 +++++
 src/main/include/CMakeLists.txt                    | 73 +---------------------
 9 files changed, 114 insertions(+), 82 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7cab7484..4f55805d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -194,13 +194,14 @@ endif(LOG4CXX_QT_SUPPORT)
 get_directory_property( HAS_LIBESMTP DIRECTORY src/main/include DEFINITION HAS_LIBESMTP )
 get_directory_property( HAS_ODBC DIRECTORY src/main/include DEFINITION HAS_ODBC )
 get_directory_property( HAS_SYSLOG DIRECTORY src/main/include DEFINITION HAS_SYSLOG )
-get_directory_property( THREAD_IMPL DIRECTORY src/main/include DEFINITION THREAD_IMPL )
-get_directory_property( SMART_PTR_IMPL DIRECTORY src/main/include DEFINITION SMART_PTR_IMPL )
-get_directory_property( MUTEX_IMPL DIRECTORY src/main/include DEFINITION MUTEX_IMPL )
-get_directory_property( SHARED_MUTEX_IMPL DIRECTORY src/main/include DEFINITION SHARED_MUTEX_IMPL )
-get_directory_property( ATOMIC_IMPL DIRECTORY src/main/include DEFINITION ATOMIC_IMPL )
-get_directory_property( FILESYSTEM_IMPL DIRECTORY src/main/include DEFINITION FILESYSTEM_IMPL )
-get_directory_property( STD_MAKE_UNIQUE_IMPL DIRECTORY src/main/include DEFINITION STD_MAKE_UNIQUE_IMPL )
+get_directory_property( THREAD_IMPL DIRECTORY src DEFINITION THREAD_IMPL )
+get_directory_property( SMART_PTR_IMPL DIRECTORY src DEFINITION SMART_PTR_IMPL )
+get_directory_property( MUTEX_IMPL DIRECTORY src DEFINITION MUTEX_IMPL )
+get_directory_property( SHARED_MUTEX_IMPL DIRECTORY src DEFINITION SHARED_MUTEX_IMPL )
+get_directory_property( ATOMIC_IMPL DIRECTORY src DEFINITION ATOMIC_IMPL )
+get_directory_property( FILESYSTEM_IMPL DIRECTORY src DEFINITION FILESYSTEM_IMPL )
+get_directory_property( STD_MAKE_UNIQUE_IMPL DIRECTORY src DEFINITION STD_MAKE_UNIQUE_IMPL )
+get_directory_property( STD_LIB_HAS_UNICODE_STRING DIRECTORY src DEFINITION STD_LIB_HAS_UNICODE_STRING )
 
 foreach(varName HAS_STD_LOCALE  HAS_ODBC  HAS_MBSRTOWCS  HAS_WCSTOMBS  HAS_FWIDE  HAS_LIBESMTP  HAS_SYSLOG HAS_FMT)
   if(${varName} EQUAL 0)
@@ -259,9 +260,13 @@ message(STATUS "  Build tests ..................... : ${BUILD_TESTING}")
 message(STATUS "  Build site ...................... : ${BUILD_SITE}")
 message(STATUS "  Install prefix .................. : ${CMAKE_INSTALL_PREFIX}")
 message(STATUS "  C++ compiler .................... : ${CMAKE_CXX_COMPILER}")
-message(STATUS "  log4cxx char API ................ : ${LOG4CXX_CHAR}")
+message(STATUS "  std::make_unique found? ......... : ${STD_MAKE_UNIQUE_IMPL}")
+message(STATUS "  std::basic_string<UniChar> ok? .. : ${STD_LIB_HAS_UNICODE_STRING}")
+message(STATUS "  log4cxx char API ................ : ON")
 message(STATUS "  log4cxx wchar API ............... : ${LOG4CXX_WCHAR_T}")
+if(STD_LIB_HAS_UNICODE_STRING)
 message(STATUS "  log4cxx unichar API ............. : ${LOG4CXX_UNICHAR}")
+endif()
 if(APPLE)
 message(STATUS "  log4cxx cfstring API ............ : ${LOG4CXX_CFSTRING}")
 endif()
@@ -281,7 +286,6 @@ message(STATUS "  shared_ptr implementation ....... : ${SMART_PTR_IMPL}")
 message(STATUS "  shared_mutex implementation ..... : ${SHARED_MUTEX_IMPL}")
 message(STATUS "  atomic implementation ........... : ${ATOMIC_IMPL}")
 message(STATUS "  filesystem implementation ....... : ${FILESYSTEM_IMPL}")
-message(STATUS "  std::make_unique found? ......... : ${STD_MAKE_UNIQUE_IMPL}")
 
 if(BUILD_TESTING)
 message(STATUS "Applications required for tests:")
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index c037bb87..788320de 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -15,6 +15,8 @@
 # limitations under the License.
 #
 cmake_policy(SET CMP0079 NEW)
+include(${CMAKE_CURRENT_LIST_DIR}/cmake/boost-fallback/boost-fallback.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/cmake/compiler-features/check-compiler-support.cmake)
 
 add_subdirectory(main)
 target_compile_definitions(log4cxx PRIVATE ${LOG4CXX_COMPILE_DEFINITIONS} ${APR_COMPILE_DEFINITIONS} ${APR_UTIL_COMPILE_DEFINITIONS} )
diff --git a/src/cmake/boost-fallback/boost-fallback.cmake b/src/cmake/boost-fallback/boost-fallback.cmake
index 8473721f..1a0a8493 100644
--- a/src/cmake/boost-fallback/boost-fallback.cmake
+++ b/src/cmake/boost-fallback/boost-fallback.cmake
@@ -64,8 +64,6 @@ try_compile(STD_FILESYSTEM_FOUND "${CMAKE_BINARY_DIR}/boost-fallback-compile-tes
     "${CMAKE_CURRENT_LIST_DIR}/test-stdfilesystem.cpp")
 try_compile(STD_EXPERIMENTAL_FILESYSTEM_FOUND "${CMAKE_BINARY_DIR}/boost-fallback-compile-tests"
     "${CMAKE_CURRENT_LIST_DIR}/test-stdexpfilesystem.cpp")
-try_compile(STD_MAKE_UNIQUE_FOUND "${CMAKE_BINARY_DIR}/boost-fallback-compile-tests"
-    "${CMAKE_CURRENT_LIST_DIR}/test-make-unique.cpp")
 
 # We need to have all three boost components in order to run our tests
 # Boost thread requires chrono and atomic to work
@@ -105,4 +103,58 @@ function(boostfallback_link target)
     endif()
 endfunction()
 
+# Check for standard headers that we need, fall back to boost if they're not found
+set(NAMESPACE_ALIAS log4cxx)
+option(PREFER_BOOST "Prefer Boost over std:: equivalents" OFF)
+
+if( ${STD_THREAD_FOUND} AND NOT ${PREFER_BOOST} )
+    set( THREAD_IMPL "std::thread" )
+elseif( ${Boost_THREAD_FOUND} )
+    set( THREAD_IMPL "boost::thread" )
+else()
+    set( THREAD_IMPL "NONE" )
+endif()
+
+if( ${STD_MUTEX_FOUND} AND NOT ${PREFER_BOOST} )
+    set( MUTEX_IMPL "std::mutex" )
+elseif( ${Boost_MUTEX_FOUND} )
+    set( MUTEX_IMPL "boost::mutex" )
+else()
+    set( MUTEX_IMPL "NONE" )
+endif()
+
+if( ${STD_SHARED_PTR_FOUND} AND NOT ${PREFER_BOOST} )
+    set( SMART_PTR_IMPL "std::shared_ptr" )
+elseif( ${Boost_SHARED_PTR_FOUND} )
+    set( SMART_PTR_IMPL "boost::shared_ptr" )
+else()
+    set( SMART_PTR_IMPL "NONE" )
+endif()
+
+if( ${STD_SHARED_MUTEX_FOUND} AND NOT ${PREFER_BOOST} )
+    set( SHARED_MUTEX_IMPL "std::shared_mutex" )
+elseif( ${Boost_SHARED_MUTEX_FOUND} )
+    set( SHARED_MUTEX_IMPL "boost::shared_mutex" )
+else()
+    set( SHARED_MUTEX_IMPL "NONE" )
+endif()
+
+if( ${STD_ATOMIC_FOUND} AND NOT ${PREFER_BOOST} )
+    set( ATOMIC_IMPL "std::atomic" )
+elseif( ${Boost_ATOMIC_FOUND} )
+    set( ATOMIC_IMPL "boost::atomic" )
+else()
+    set( ATOMIC_IMPL "NONE" )
+endif()
+
+if( ${STD_FILESYSTEM_FOUND} AND NOT ${PREFER_BOOST} )
+	set( FILESYSTEM_IMPL "std::filesystem" )
+elseif( ${STD_EXPERIMENTAL_FILESYSTEM_FOUND} AND NOT ${PREFER_BOOST} )
+	set( FILESYSTEM_IMPL "std::experimental::filesystem" )
+elseif( ${Boost_FILESYSTEM_FOUND} )
+	set( FILESYSTEM_IMPL "boost::filesystem" )
+else()
+	set( FILESYSTEM_IMPL "NONE" )
+endif()
+
 
diff --git a/src/cmake/compiler-features/check-compiler-support.cmake b/src/cmake/compiler-features/check-compiler-support.cmake
new file mode 100644
index 00000000..7f5f9a3a
--- /dev/null
+++ b/src/cmake/compiler-features/check-compiler-support.cmake
@@ -0,0 +1,26 @@
+# This module checks compiler and standard library support
+#
+
+# Does the compiler support thread_local?
+try_compile(HAS_THREAD_LOCAL "${CMAKE_BINARY_DIR}/Testing/thread-local-test"
+    "${CMAKE_CURRENT_LIST_DIR}/test-thread-local.cpp"
+    CXX_STANDARD 11
+    )
+
+# Does the standard library support std::make_unique<T>>?
+try_compile(STD_MAKE_UNIQUE_FOUND "${CMAKE_BINARY_DIR}/boost-fallback-compile-tests"
+    "${CMAKE_CURRENT_LIST_DIR}/test-make-unique.cpp")
+if( ${STD_MAKE_UNIQUE_FOUND} )
+    set(STD_MAKE_UNIQUE_IMPL "std::make_unique")
+    set(STD_MAKE_UNIQUE_FOUND 1)
+else()
+    set(STD_MAKE_UNIQUE_IMPL "log4cxx std::make_unique")
+    set(STD_MAKE_UNIQUE_FOUND 0)
+endif()
+
+
+# Does the standard library support std::basic_string<UniChar> and std::basic_ostream<UniChar>?
+try_compile(STD_LIB_HAS_UNICODE_STRING "${CMAKE_BINARY_DIR}/Testing/unicode-test"
+    "${CMAKE_CURRENT_LIST_DIR}/test-unicode.cpp"
+    )
+
diff --git a/src/cmake/boost-fallback/makeunique.h.cmake b/src/cmake/compiler-features/makeunique.h.cmake
similarity index 100%
rename from src/cmake/boost-fallback/makeunique.h.cmake
rename to src/cmake/compiler-features/makeunique.h.cmake
diff --git a/src/cmake/boost-fallback/test-make-unique.cpp b/src/cmake/compiler-features/test-make-unique.cpp
similarity index 100%
rename from src/cmake/boost-fallback/test-make-unique.cpp
rename to src/cmake/compiler-features/test-make-unique.cpp
diff --git a/src/cmake/test-thread-local.cpp b/src/cmake/compiler-features/test-thread-local.cpp
similarity index 100%
rename from src/cmake/test-thread-local.cpp
rename to src/cmake/compiler-features/test-thread-local.cpp
diff --git a/src/cmake/compiler-features/test-unicode.cpp b/src/cmake/compiler-features/test-unicode.cpp
new file mode 100644
index 00000000..8abb2c88
--- /dev/null
+++ b/src/cmake/compiler-features/test-unicode.cpp
@@ -0,0 +1,17 @@
+/* Prevent error C2491: 'std::numpunct<_Elem>::id': definition of dllimport static data member not allowed */
+#if defined(_MSC_VER)
+#define __FORCE_INSTANCE
+#endif
+#include <string>
+#include <sstream>
+
+using UniChar = unsigned short;
+using StringType = std::basic_string<UniChar>;
+using StreamType = std::basic_ostringstream<UniChar>;
+int main()
+{
+	StringType str;
+	StreamType ss;
+    ss << str;
+    return 0;
+}
diff --git a/src/main/include/CMakeLists.txt b/src/main/include/CMakeLists.txt
index 62f61bd4..205041da 100644
--- a/src/main/include/CMakeLists.txt
+++ b/src/main/include/CMakeLists.txt
@@ -16,7 +16,6 @@
 #
 
 # Configure
-
 if(WIN32)
     configure_file(${CMAKE_CURRENT_SOURCE_DIR}/log4cxx/version_info.h.in
 	           ${CMAKE_CURRENT_BINARY_DIR}/log4cxx/version_info.h
@@ -124,10 +123,6 @@ CHECK_FUNCTION_EXISTS(wcstombs HAS_WCSTOMBS)
 CHECK_FUNCTION_EXISTS(fwide HAS_FWIDE)
 CHECK_LIBRARY_EXISTS(esmtp smtp_create_session "" HAS_LIBESMTP)
 CHECK_FUNCTION_EXISTS(syslog HAS_SYSLOG)
-try_compile(HAS_THREAD_LOCAL "${CMAKE_BINARY_DIR}/thread-local-test"
-    "${LOG4CXX_SOURCE_DIR}/src/cmake/test-thread-local.cpp"
-    CXX_STANDARD 11
-    )
 if(UNIX)
     set(CMAKE_REQUIRED_LIBRARIES "pthread")
     CHECK_SYMBOL_EXISTS(pthread_sigmask "signal.h" HAS_PTHREAD_SIGMASK)
@@ -170,73 +165,10 @@ foreach(varName
   endif()
 endforeach()
 
-# Check for standard headers that we need, fall back to boost if they're not found
-include(${LOG4CXX_SOURCE_DIR}/src/cmake/boost-fallback/boost-fallback.cmake)
-set(NAMESPACE_ALIAS log4cxx)
-option(PREFER_BOOST "Prefer Boost over std:: equivalents" OFF)
-
-if( ${STD_THREAD_FOUND} AND NOT ${PREFER_BOOST} )
-    set( THREAD_IMPL "std::thread" )
-elseif( ${Boost_THREAD_FOUND} )
-    set( THREAD_IMPL "boost::thread" )
-else()
-    set( THREAD_IMPL "NONE" )
-endif()
-
-if( ${STD_MUTEX_FOUND} AND NOT ${PREFER_BOOST} )
-    set( MUTEX_IMPL "std::mutex" )
-elseif( ${Boost_MUTEX_FOUND} )
-    set( MUTEX_IMPL "boost::mutex" )
-else()
-    set( MUTEX_IMPL "NONE" )
-endif()
-
-if( ${STD_SHARED_PTR_FOUND} AND NOT ${PREFER_BOOST} )
-    set( SMART_PTR_IMPL "std::shared_ptr" )
-elseif( ${Boost_SHARED_PTR_FOUND} )
-    set( SMART_PTR_IMPL "boost::shared_ptr" )
-else()
-    set( SMART_PTR_IMPL "NONE" )
-endif()
-
-if( ${STD_SHARED_MUTEX_FOUND} AND NOT ${PREFER_BOOST} )
-    set( SHARED_MUTEX_IMPL "std::shared_mutex" )
-elseif( ${Boost_SHARED_MUTEX_FOUND} )
-    set( SHARED_MUTEX_IMPL "boost::shared_mutex" )
-else()
-    set( SHARED_MUTEX_IMPL "NONE" )
-endif()
-
-if( ${STD_ATOMIC_FOUND} AND NOT ${PREFER_BOOST} )
-    set( ATOMIC_IMPL "std::atomic" )
-elseif( ${Boost_ATOMIC_FOUND} )
-    set( ATOMIC_IMPL "boost::atomic" )
-else()
-    set( ATOMIC_IMPL "NONE" )
-endif()
-
-if( ${STD_FILESYSTEM_FOUND} AND NOT ${PREFER_BOOST} )
-	set( FILESYSTEM_IMPL "std::filesystem" )
-elseif( ${STD_EXPERIMENTAL_FILESYSTEM_FOUND} AND NOT ${PREFER_BOOST} )
-	set( FILESYSTEM_IMPL "std::experimental::filesystem" )
-elseif( ${Boost_FILESYSTEM_FOUND} )
-	set( FILESYSTEM_IMPL "boost::filesystem" )
-else()
-	set( FILESYSTEM_IMPL "NONE" )
-endif()
-
-if( ${STD_MAKE_UNIQUE_FOUND} )
-    set(STD_MAKE_UNIQUE_IMPL "std::make_unique")
-    set(STD_MAKE_UNIQUE_FOUND 1)
-else()
-    set(STD_MAKE_UNIQUE_IMPL "log4cxx std::make_unique")
-    set(STD_MAKE_UNIQUE_FOUND 0)
-endif()
-configure_file(${LOG4CXX_SOURCE_DIR}/src/cmake/boost-fallback/makeunique.h.cmake
+# Configure both our private header and our public header
+configure_file(${LOG4CXX_SOURCE_DIR}/src/cmake/compiler-features/makeunique.h.cmake
                 ${CMAKE_CURRENT_BINARY_DIR}/log4cxx/helpers/makeunique.h
 )
-
-# Configure both our private header and our public header
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/log4cxx/private/log4cxx_private.h.in
                ${CMAKE_CURRENT_BINARY_DIR}/log4cxx/private/log4cxx_private.h
                @ONLY
@@ -248,7 +180,6 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/log4cxx/log4cxx.h.in
 configure_file(${LOG4CXX_SOURCE_DIR}/src/cmake/boost-fallback/boost-std-configuration.h.cmake
                 ${CMAKE_CURRENT_BINARY_DIR}/log4cxx/private/boost-std-configuration.h
 )
-
 # Provide the dependencies
 add_custom_target(configure_log4cxx
   COMMAND "${CMAKE_COMMAND}" -E echo "Checking configuration"