269 lines
8.1 KiB
CMake
269 lines
8.1 KiB
CMake
# Copyright 2020, 2021 Peter Dimov
|
|
# Distributed under the Boost Software License, Version 1.0.
|
|
# https://www.boost.org/LICENSE_1_0.txt
|
|
|
|
cmake_minimum_required(VERSION 3.11...3.20)
|
|
|
|
project(boost_locale VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
|
|
|
|
# Using glob here is ok as it is only for headers
|
|
file(GLOB_RECURSE headers include/*.hpp)
|
|
|
|
add_library(boost_locale
|
|
src/boost/locale/encoding/codepage.cpp
|
|
src/boost/locale/encoding/conv.hpp
|
|
src/boost/locale/encoding/iconv_codepage.ipp
|
|
src/boost/locale/encoding/uconv_codepage.ipp
|
|
src/boost/locale/encoding/wconv_codepage.ipp
|
|
src/boost/locale/shared/date_time.cpp
|
|
src/boost/locale/shared/format.cpp
|
|
src/boost/locale/shared/formatting.cpp
|
|
src/boost/locale/shared/generator.cpp
|
|
src/boost/locale/shared/iconv_codecvt.cpp
|
|
src/boost/locale/shared/iconv_codecvt.hpp
|
|
src/boost/locale/shared/ids.cpp
|
|
src/boost/locale/shared/localization_backend.cpp
|
|
src/boost/locale/shared/message.cpp
|
|
src/boost/locale/shared/mo_lambda.cpp
|
|
src/boost/locale/util/codecvt_converter.cpp
|
|
src/boost/locale/util/default_locale.cpp
|
|
src/boost/locale/util/encoding.cpp
|
|
src/boost/locale/util/encoding.hpp
|
|
src/boost/locale/util/info.cpp
|
|
src/boost/locale/util/locale_data.cpp
|
|
src/boost/locale/util/numeric.hpp
|
|
src/boost/locale/util/timezone.hpp
|
|
${headers}
|
|
)
|
|
|
|
add_library(Boost::locale ALIAS boost_locale)
|
|
|
|
target_include_directories(boost_locale PUBLIC include PRIVATE src)
|
|
target_compile_features(boost_locale PUBLIC cxx_std_11)
|
|
|
|
target_link_libraries(boost_locale
|
|
PUBLIC
|
|
Boost::assert
|
|
Boost::config
|
|
Boost::iterator
|
|
PRIVATE
|
|
Boost::core
|
|
Boost::predef
|
|
Boost::thread
|
|
)
|
|
|
|
target_compile_definitions(boost_locale
|
|
PUBLIC
|
|
BOOST_LOCALE_NO_LIB
|
|
PRIVATE
|
|
BOOST_LOCALE_SOURCE
|
|
_CRT_SECURE_NO_WARNINGS
|
|
_SCL_SECURE_NO_WARNINGS
|
|
)
|
|
|
|
if(BUILD_SHARED_LIBS)
|
|
target_compile_definitions(boost_locale PUBLIC BOOST_LOCALE_DYN_LINK)
|
|
else()
|
|
target_compile_definitions(boost_locale PUBLIC BOOST_LOCALE_STATIC_LINK)
|
|
endif()
|
|
|
|
# Build Options
|
|
|
|
find_package(ICU COMPONENTS data i18n uc QUIET)
|
|
option(BOOST_LOCALE_ENABLE_ICU "Boost.Locale: enable ICU backend" ${ICU_FOUND})
|
|
|
|
# Workaround for an issue e.g. on FreeBSD where including ICU may change the used libiconv
|
|
if(UNIX AND NOT DEFINED Iconv_INCLUDE_DIR AND BOOST_LOCALE_ENABLE_ICU AND EXISTS "${ICU_INCLUDE_DIRS}/iconv.h")
|
|
set(Iconv_INCLUDE_DIR "${ICU_INCLUDE_DIRS}" CACHE PATH "Path to iconv headers")
|
|
find_package(Iconv QUIET)
|
|
if(NOT Iconv_FOUND)
|
|
# Unset and retry below
|
|
unset(Iconv_INCLUDE_DIR CACHE)
|
|
unset(Iconv_LIBRARY CACHE)
|
|
unset(Iconv_IS_BUILT_IN CACHE)
|
|
unset(Iconv_IS_BUILT_IN)
|
|
endif()
|
|
endif()
|
|
|
|
find_package(Iconv QUIET)
|
|
option(BOOST_LOCALE_ENABLE_ICONV "Boost.Locale: enable iconv backend" ${Iconv_FOUND})
|
|
|
|
if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin")
|
|
set(_default_posix ON)
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
|
|
include (CheckIncludeFileCXX)
|
|
check_include_file_cxx ("xlocale.h" HAVE_XLOCALE_H)
|
|
set(_default_posix ${HAVE_XLOCALE_H})
|
|
else()
|
|
set(_default_posix OFF)
|
|
endif()
|
|
|
|
option(BOOST_LOCALE_ENABLE_POSIX "Boost.Locale: enable POSIX backend" ${_default_posix})
|
|
unset(_default_posix)
|
|
|
|
option(BOOST_LOCALE_ENABLE_STD "Boost.Locale: enable std::locale backend" ON)
|
|
option(BOOST_LOCALE_ENABLE_WINAPI "Boost.Locale: enable Windows API backend" ${WIN32})
|
|
|
|
|
|
if(BOOST_LOCALE_ENABLE_ICONV)
|
|
|
|
find_package(Iconv REQUIRED)
|
|
|
|
target_compile_definitions(boost_locale PRIVATE BOOST_LOCALE_WITH_ICONV=1)
|
|
target_link_libraries(boost_locale PRIVATE Iconv::Iconv)
|
|
|
|
target_sources(boost_locale PRIVATE
|
|
src/boost/locale/util/iconv.hpp
|
|
)
|
|
endif()
|
|
|
|
if(BOOST_LOCALE_ENABLE_ICU)
|
|
|
|
find_package(ICU COMPONENTS data i18n uc REQUIRED)
|
|
|
|
target_compile_definitions(boost_locale PRIVATE BOOST_LOCALE_WITH_ICU=1)
|
|
target_link_libraries(boost_locale PRIVATE ICU::data ICU::i18n ICU::uc)
|
|
|
|
target_sources(boost_locale PRIVATE
|
|
src/boost/locale/icu/all_generator.hpp
|
|
src/boost/locale/icu/boundary.cpp
|
|
src/boost/locale/icu/cdata.hpp
|
|
src/boost/locale/icu/codecvt.cpp
|
|
src/boost/locale/icu/codecvt.hpp
|
|
src/boost/locale/icu/collator.cpp
|
|
src/boost/locale/icu/conversion.cpp
|
|
src/boost/locale/icu/date_time.cpp
|
|
src/boost/locale/icu/formatter.cpp
|
|
src/boost/locale/icu/formatter.hpp
|
|
src/boost/locale/icu/formatters_cache.cpp
|
|
src/boost/locale/icu/formatters_cache.hpp
|
|
src/boost/locale/icu/icu_backend.cpp
|
|
src/boost/locale/icu/icu_backend.hpp
|
|
src/boost/locale/icu/icu_util.hpp
|
|
src/boost/locale/icu/numeric.cpp
|
|
src/boost/locale/icu/time_zone.cpp
|
|
src/boost/locale/icu/time_zone.hpp
|
|
src/boost/locale/icu/uconv.hpp
|
|
)
|
|
|
|
endif()
|
|
|
|
if(BOOST_LOCALE_ENABLE_STD)
|
|
|
|
target_sources(boost_locale PRIVATE
|
|
src/boost/locale/std/all_generator.hpp
|
|
src/boost/locale/std/codecvt.cpp
|
|
src/boost/locale/std/collate.cpp
|
|
src/boost/locale/std/converter.cpp
|
|
src/boost/locale/std/numeric.cpp
|
|
src/boost/locale/std/std_backend.cpp
|
|
src/boost/locale/std/std_backend.hpp
|
|
)
|
|
|
|
else()
|
|
|
|
target_compile_definitions(boost_locale PRIVATE BOOST_LOCALE_NO_STD_BACKEND=1)
|
|
|
|
endif()
|
|
|
|
if(BOOST_LOCALE_ENABLE_WINAPI)
|
|
|
|
target_sources(boost_locale PRIVATE
|
|
src/boost/locale/win32/all_generator.hpp
|
|
src/boost/locale/win32/api.hpp
|
|
src/boost/locale/win32/collate.cpp
|
|
src/boost/locale/win32/converter.cpp
|
|
src/boost/locale/win32/numeric.cpp
|
|
src/boost/locale/win32/win_backend.cpp
|
|
src/boost/locale/win32/win_backend.hpp
|
|
)
|
|
|
|
else()
|
|
|
|
target_compile_definitions(boost_locale PRIVATE BOOST_LOCALE_NO_WINAPI_BACKEND=1)
|
|
|
|
endif()
|
|
|
|
if(BOOST_LOCALE_ENABLE_WINAPI OR (BOOST_LOCALE_ENABLE_STD AND WIN32))
|
|
|
|
target_sources(boost_locale PRIVATE
|
|
src/boost/locale/win32/lcid.cpp
|
|
src/boost/locale/win32/lcid.hpp
|
|
)
|
|
|
|
endif()
|
|
|
|
if(BOOST_LOCALE_ENABLE_POSIX)
|
|
|
|
target_sources(boost_locale PRIVATE
|
|
src/boost/locale/posix/all_generator.hpp
|
|
src/boost/locale/posix/codecvt.cpp
|
|
src/boost/locale/posix/collate.cpp
|
|
src/boost/locale/posix/converter.cpp
|
|
src/boost/locale/posix/numeric.cpp
|
|
src/boost/locale/posix/posix_backend.cpp
|
|
src/boost/locale/posix/posix_backend.hpp
|
|
)
|
|
|
|
else()
|
|
|
|
target_compile_definitions(boost_locale PRIVATE BOOST_LOCALE_NO_POSIX_BACKEND=1)
|
|
|
|
endif()
|
|
|
|
if(BOOST_LOCALE_ENABLE_WINAPI OR BOOST_LOCALE_ENABLE_STD OR BOOST_LOCALE_ENABLE_POSIX)
|
|
|
|
target_sources(boost_locale PRIVATE
|
|
src/boost/locale/util/gregorian.cpp
|
|
src/boost/locale/util/gregorian.hpp
|
|
)
|
|
|
|
endif()
|
|
|
|
get_target_property(sources boost_locale SOURCES)
|
|
set(sources_src ${sources})
|
|
list(FILTER sources_src INCLUDE REGEX "^src/")
|
|
set(sources_inc ${sources})
|
|
list(FILTER sources_inc EXCLUDE REGEX "^src/")
|
|
source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}/src/boost/locale" PREFIX "sources" FILES ${sources_src})
|
|
source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}/include/boost/locale" PREFIX "headers" FILES ${sources_inc})
|
|
source_group("headers" FILES "include/boost/locale.hpp")
|
|
|
|
message(STATUS "Boost.Locale: "
|
|
"iconv ${BOOST_LOCALE_ENABLE_ICONV}, "
|
|
"ICU ${BOOST_LOCALE_ENABLE_ICU}, "
|
|
"POSIX ${BOOST_LOCALE_ENABLE_POSIX}, "
|
|
"std ${BOOST_LOCALE_ENABLE_STD}, "
|
|
"winapi ${BOOST_LOCALE_ENABLE_WINAPI}"
|
|
)
|
|
|
|
option(BOOST_LOCALE_WERROR "Treat warnings as errors in Boost.Locale" ${BOOST_LOCALE_WERROR})
|
|
if(MSVC)
|
|
set(BOOST_LOCALE_WARNING_OPTIONS /W4)
|
|
if(BOOST_LOCALE_WERROR)
|
|
list(APPEND BOOST_LOCALE_WARNING_OPTIONS /WX)
|
|
endif()
|
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
set(BOOST_LOCALE_WARNING_OPTIONS -Wall -Wextra -Wno-error=deprecated-declarations)
|
|
if(BOOST_LOCALE_WERROR)
|
|
list(APPEND BOOST_LOCALE_WARNING_OPTIONS -Werror)
|
|
endif()
|
|
elseif(NOT DEFINED BOOST_LOCALE_WARNING_OPTIONS)
|
|
set(BOOST_LOCALE_WARNING_OPTIONS "")
|
|
endif()
|
|
target_compile_options(boost_locale PRIVATE ${BOOST_LOCALE_WARNING_OPTIONS})
|
|
|
|
option(BOOST_LOCALE_ENABLE_CXX11_CHAR_TYPES "Enable C++11 char16/char32 type support (experimental)" OFF)
|
|
if(BOOST_LOCALE_ENABLE_CXX11_CHAR_TYPES)
|
|
target_compile_definitions(boost_locale PUBLIC BOOST_LOCALE_ENABLE_CHAR16_T BOOST_LOCALE_ENABLE_CHAR32_T)
|
|
endif()
|
|
|
|
# Testing
|
|
|
|
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
|
|
|
|
add_subdirectory(test)
|
|
add_subdirectory(examples)
|
|
|
|
endif()
|