# # Copyright (c) 2010 Artyom Beilis (Tonkikh) # # Distributed under the Boost Software License, Version 1.0. (See # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) # cmake_minimum_required(VERSION 2.6) project(booster) include(CheckFunctionExists) include(CheckCXXSourceCompiles) include(CheckLibraryExists) enable_testing() # # Most important includes # include_directories(${CMAKE_BINARY_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(.) include_directories(lib/test) if(WIN32 OR CYGWIN) set(IS_WINDOWS TRUE) else() set(IS_WINDOWS FALSE) endif() if(WIN32 AND NOT CYGWIN) set(WINDOWS_NATIVE TRUE) else() set(WINDOWS_NATIVE FALSE) endif() if(CYGWIN) set(IS_CYGWIN TRUE) else() set(IS_CYGWIN FALSE) endif() # Options if(NOT LIBDIR) set(LIBDIR lib CACHE STRING "Library installation directory" FORCE) endif() option(USE_STLPORT "Build with STLPort library" OFF) option(USE_LIBCXX "Build with CXX library" OFF) option(USE_PTHREAD "Use pthreads API on windows" OFF) option(DISABLE_SHARED "Disable shared libraries build" OFF) option(DISABLE_STATIC "Disable static libraries build" OFF) option(DISABLE_ICU_LOCALE "Disable icu locale backend" OFF) if(CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") option(DISABLE_STD_LOCALE "Disable std locale backend" ON) else() option(DISABLE_STD_LOCALE "Disable std locale backend" OFF) endif() option(USE_WINDOWS6_API "Use Windows 6 API (Vista, 7)" ON) check_function_exists(newlocale BOOSTER_HAS_XLOCALE) if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") set(ENABLE_POSIX_LOCALE ON) elseif(APPLE) set(ENABLE_POSIX_LOCALE ON) elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD") if(BOOSTER_HAS_XLOCALE) set(ENABLE_POSIX_LOCALE ON) endif() else() set(ENABLE_POSIX_LOCALE OFF) endif() if(ENABLE_POSIX_LOCALE) option(DISABLE_POSIX_LOCALE "Disable POSIX locale backend" OFF) else() option(DISABLE_POSIX_LOCALE "Disable POSIX locale backend" ON) endif() if(IS_WINDOWS) option(DISABLE_WINAPI_LOCALE "Disable Win32API locale backend" OFF) else() option(DISABLE_WINAPI_LOCALE "Disable Win32API locale backend" ON) endif() if(WINDOWS_NATIVE) option(DISABLE_ICONV "Disable iconv library (default On on Windows)" ON) else() if(CMAKE_SYSTEM_NAME STREQUAL "SunOS") option(DISABLE_ICONV "Disable iconv library (default On on Windows)" ON) else() option(DISABLE_ICONV "Disable iconv library (default On on Windows)" OFF) endif() endif() if(USE_LIBCXX) find_path(STLPORT_INCLUDE iostream) find_library(STLPORT_LIB c++) if(NOT STLPORT_INCLUDE OR NOT STLPORT_LIB) message(FATAL_ERROR "Can't find stlport include or library") else() include_directories(${STLPORT_INCLUDE}) endif() endif() if(USE_STLPORT) find_path(STLPORT_INCLUDE stlport/iostream) find_library(STLPORT_LIB stlport) if(NOT STLPORT_INCLUDE OR NOT STLPORT_LIB) message(FATAL_ERROR "Can't find stlport include or library") else() include_directories(${STLPORT_INCLUDE}/stlport) endif() endif() # Fixing options if libraries are not found if(NOT DISABLE_ICU_LOCALE) message("-- Looking for ICU libraries") if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") if(MSVC) set(ICU_SUFFIX "d") endif() endif() find_library(ICU_UC icuuc${ICU_SUFFIX}) find_library(ICU_DATA NAMES icudt${ICU_SUFFIX} icudata) find_library(ICU_I18N NAMES icuin${ICU_SUFFIX} icui18n${ICU_SUFFIX}) find_path(ICU_INCLUDE_DIR unicode/unistr.h) if(ICU_UC AND ICU_DATA AND ICU_I18N AND ICU_INCLUDE_DIR) message("-- ICU Found, building booster locale") include_directories(${ICU_INCLUDE_DIR}) else() message("-- ICU not found, disabling ICU localization backend") set(DISABLE_ICU_LOCALE ON) endif() endif() if(NOT DISABLE_ICU_LOCALE) add_definitions(-DBOOSTER_LOCALE_WITH_ICU) endif() # Checking for iconv if(NOT DISABLE_ICONV) check_cxx_source_compiles( "#include int main() { iconv_t v=iconv_open((char *)0,(char *)0); }" LIBC_ICONV) if(NOT LIBC_ICONV) find_path(ICONV_INCLUDE_DIR iconv.h) find_library(ICONV_LIB iconv) if(ICONV_LIB AND ICONV_INCLUDE_DIR) set(BOOSTER_LOCALE_HAVE_ICONV 1) include_directories(${ICONV_INCLUDE_DIR}) endif() else() set(BOOSTER_LOCALE_HAVE_ICONV 1) endif() if(BOOSTER_LOCALE_HAVE_ICONV) add_definitions(-DBOOSTER_LOCALE_WITH_ICONV) else() add_definitions(-DBOOSTER_LOCALE_NO_ICONV) endif() else() add_definitions(-DBOOSTER_LOCALE_NO_ICONV) endif(NOT DISABLE_ICONV) if(DISABLE_STD_LOCALE) add_definitions(-DBOOSTER_LOCALE_NO_STD_BACKEND) endif() if(DISABLE_POSIX_LOCALE) add_definitions(-DBOOSTER_LOCALE_NO_POSIX_BACKEND) endif() if(DISABLE_WINAPI_LOCALE) add_definitions(-DBOOSTER_LOCALE_NO_WINAPI_BACKEND) endif() ############################################################################# # # Setup various build flags for different supported compilers and systems # ############################################################################# if(CMAKE_COMPILER_IS_GNUCXX) check_cxx_source_compiles( "#if __GNUC__ < 4 #error #endif int main() {}" GCC_IS_GCC4) set(CXX_FLAGS "-Wall -Wextra") if(CMAKE_SYSTEM_NAME STREQUAL "SunOS") set(CXX_FLAGS "${CXX_FLAGS} -pthreads") endif() if(NOT GCC_IS_GCC4) # Uninitalized checks are bogous under gcc-3.4 set(CXX_FLAGS "${CXX_FLAGS} -Wno-uninitialized") endif() if(IS_WINDOWS) if(GCC_IS_GCC4) # Very important, otherwise process would not start under cygwin set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,--enable-auto-import") else() # gcc-3 does not have shared library for libstdc++ -- cause dll faitures with locale set(DISABLE_SHARED ON) endif() endif() elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(CXX_FLAGS "-Wall") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(CXX_FLAGS "-Wall -Wextra") elseif(MSVC) set(CXX_FLAGS "/EHsc /W3") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") # # We use STL port under Sun Studio, standard library is broken # set(CXX_FLAGS "-library=stlport4 -xannotate=no") if(CMAKE_SYSTEM_NAME STREQUAL "SunOS") set(CXX_FLAGS "${CXX_FLAGS} -mt") endif() endif() if(NOT IS_WINDOWS) check_function_exists(dlopen BOOSTER_HAVE_DLOPEN) if(NOT BOOSTER_HAVE_DLOPEN) find_library(BOOSTER_LIB_DL dl) endif() endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS}") ############################################################################# # # Set default RelWithDebInfo build # ############################################################################# if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE) endif(NOT CMAKE_BUILD_TYPE) if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") if(MSVC) set(ICU_SUFFIX "d") set(PCRE_SUFFIX "d") if(NOT BOOSTER_SUFFIX) set(BOOSTER_SUFFIX "-d") else() set(BOOSTER_SUFFIX "${BOOSTER_SUFFIX}d") endif() endif() endif() if(IS_WINDOWS) set(WS2_32 ws2_32) else() check_function_exists(socket HAVE_SOCKET) if(NOT HAVE_SOCKET) check_library_exists(socket socket "" HAVE_LIB_SOCKET) if(NOT HAVE_LIB_SOCKET) message(FATAL " No library with socket found") else(NOT HAVE_LIB_SOCKET) find_library(LIB_SOCKET socket) endif(NOT HAVE_LIB_SOCKET) endif(NOT HAVE_SOCKET) check_function_exists(gethostbyname HAVE_GETHOSTBYNAME) if(NOT HAVE_GETHOSTBYNAME) check_library_exists(socket gethostbyname "" LIB_SOCKGETHOSTBYNAME) if(NOT LIB_SOCKGETHOSTBYNAME) check_library_exists(nsl gethostbyname "" HAVE_LIB_NSL) if(NOT HAVE_LIB_NSL) message(FATAL " No library with gethostbyname found") else(NOT HAVE_LIB_NSL) find_library(LIB_NSL nsl) endif(NOT HAVE_LIB_NSL) endif(NOT LIB_SOCKGETHOSTBYNAME) endif(NOT HAVE_GETHOSTBYNAME) endif() check_cxx_source_compiles( "int main() { volatile int v=0; return __sync_bool_compare_and_swap(&v,0,1); }" BOOSTER_HAS_GCC_SYNC) check_cxx_source_compiles( "#include using __gnu_cxx::__exchange_and_add; int main(){ volatile int x=0; return __exchange_and_add(&x,1);}" BOOSTER_HAVE_GCC_BITS_EXCHANGE_AND_ADD) check_cxx_source_compiles( "#include using __gnu_cxx::__exchange_and_add; int main(){ volatile int x=0; return __exchange_and_add(&x,1);}" BOOSTER_HAVE_GCC_EXT_EXCHANGE_AND_ADD) check_cxx_source_compiles( "#include #include int main() { volatile unsigned v=0; return atomic_cmpset_int(&v,1,0); }" BOOSTER_HAVE_FREEBSD_ATOMIC) check_cxx_source_compiles( "#include int main() { backtrace(0,0); }" BOOSTER_HAVE_EXECINFO) check_cxx_source_compiles( "#include #include #include #include #include #include #include #ifdef __GNUC__ #include #endif extern \"C\" { extern void* _Unwind_GetIP (void *); extern int _Unwind_Backtrace(int (*)(void *,void *),void *); } int main() { _Unwind_Backtrace(0,0); _Unwind_GetIP(0); }" BOOSTER_HAVE_UNWIND_BACKTRACE) check_cxx_source_compiles( "#include #include #include #include #include #include #include #ifdef __GNUC__ #include #endif extern \"C\" { extern int _Unwind_Backtrace(int (*)(void *,void *),void *); } int main() { _Unwind_Backtrace(0,0); _Unwind_GetIP((_Unwind_Context *)0); }" BOOSTER_HAVE_UNWIND_BACKTRACE_BUILTIN) Check_cxx_source_compiles( "#include int main() { volatile unsigned v=0; return atomic_add_int_nv(&v,1); }" BOOSTER_HAVE_SOLARIS_ATOMIC) check_cxx_source_compiles( "#include int main() { int32_t v=0; return OSAtomicAdd32(1,&v); }" BOOSTER_HAVE_MAC_OS_X_ATOMIC) check_cxx_source_compiles( "#include int main() { int64_t x=10; return 0; }" BOOSTER_HAVE_STDINT_H) check_cxx_source_compiles( "#include int main() { int64_t x=10; return 0; }" BOOSTER_HAVE_INTTYPES_H) if(IS_WINDOWS) set(CMAKE_REQUIRED_LIBRARIES ${WS2_32}) check_cxx_source_compiles( "#include #include #include int main() { struct sockaddr_in6 in6; struct in6_addr in6addr; ::inet_pton(AF_INET6,\"::1\",&in6addr); return 0; }" BOOSTER_AIO_HAVE_PF_INET6) else() set(CMAKE_REQUIRED_LIBRARIES ${LIB_SOCKGETHOSTBYNAME} ${LIB_SOCKET} ${LIB_NSL}) check_cxx_source_compiles( "#include #include #include #include int main() { struct sockaddr_in6 in6; struct in6_addr in6addr; ::inet_pton(AF_INET6,\"::1\",&in6addr); return 0; }" BOOSTER_AIO_HAVE_PF_INET6) endif() set(BOOSTER_SRC lib/ptime/src/posix_time.cpp lib/ptime/src/ctime.cpp lib/regex/src/pcre_regex.cpp lib/system/src/posix_error.cpp lib/system/src/windows_error.cpp lib/aio/src/aio_category.cpp lib/aio/src/deadline_timer.cpp lib/aio/src/endpoint.cpp lib/aio/src/io_service.cpp lib/aio/src/reactor.cpp lib/aio/src/select_iterrupter.cpp lib/aio/src/basic_io_device.cpp lib/aio/src/basic_socket.cpp lib/aio/src/acceptor.cpp lib/aio/src/stream_socket.cpp lib/smart_ptr/src/sp_counted_base.cpp lib/smart_ptr/src/atomic_counter.cpp lib/shared_object/src/shared_object.cpp lib/log/src/log.cpp lib/iostreams/src/streambuf.cpp lib/nowide/src/convert.cpp lib/backtrace/src/backtrace.cpp lib/locale/src/encoding/codepage.cpp lib/locale/src/shared/date_time.cpp lib/locale/src/shared/format.cpp lib/locale/src/shared/formatting.cpp lib/locale/src/shared/generator.cpp lib/locale/src/shared/ids.cpp lib/locale/src/shared/localization_backend.cpp lib/locale/src/shared/message.cpp lib/locale/src/shared/mo_lambda.cpp lib/locale/src/util/codecvt_converter.cpp lib/locale/src/util/default_locale.cpp lib/locale/src/util/info.cpp lib/locale/src/util/locale_data.cpp ) if(NOT DISABLE_ICU_LOCALE) set(BOOSTER_SRC ${BOOSTER_SRC} lib/locale/src/icu/boundary.cpp lib/locale/src/icu/codecvt.cpp lib/locale/src/icu/collator.cpp lib/locale/src/icu/conversion.cpp lib/locale/src/icu/date_time.cpp lib/locale/src/icu/formatter.cpp lib/locale/src/icu/icu_backend.cpp lib/locale/src/icu/numeric.cpp lib/locale/src/icu/time_zone.cpp ) endif() if(NOT DISABLE_POSIX_LOCALE) set(BOOSTER_SRC ${BOOSTER_SRC} lib/locale/src/posix/codecvt.cpp lib/locale/src/posix/collate.cpp lib/locale/src/posix/converter.cpp lib/locale/src/posix/numeric.cpp lib/locale/src/posix/posix_backend.cpp ) endif() if(NOT DISABLE_WINAPI_LOCALE) set(BOOSTER_SRC ${BOOSTER_SRC} lib/locale/src/win32/collate.cpp lib/locale/src/win32/converter.cpp lib/locale/src/win32/lcid.cpp lib/locale/src/win32/numeric.cpp lib/locale/src/win32/win_backend.cpp ) endif() if(NOT DISABLE_STD_LOCALE) set(BOOSTER_SRC ${BOOSTER_SRC} lib/locale/src/std/codecvt.cpp lib/locale/src/std/collate.cpp lib/locale/src/std/converter.cpp lib/locale/src/std/numeric.cpp lib/locale/src/std/std_backend.cpp ) endif() if(NOT DISABLE_WINAPI_LOCALE OR NOT DISABLE_STD_LOCALE OR NOT DISABLE_POSIX_LOCALE) set(BOOSTER_SRC ${BOOSTER_SRC} lib/locale/src/util/gregorian.cpp) endif() if(USE_WINDOWS6_API) check_cxx_source_compiles( " #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x600 #endif #include int main(){ SRWLOCK l; InitializeSRWLock(&l); }" HAVE_WINDOWS6_API ) endif() if(USE_WINDOWS6_API AND HAVE_WINDOWS6_API) set(BOOSTER_SRC ${BOOSTER_SRC} lib/thread/src/thread_winapi.cpp lib/thread/src/thread_win6.cpp) elseif(WINDOWS_NATIVE AND NOT USE_PTHREAD) set(BOOSTER_SRC ${BOOSTER_SRC} lib/thread/src/thread_winapi.cpp lib/thread/src/thread_win5.cpp) else() find_path(PTHREAD_INC pthread.h) include_directories(${PTHREAD_INC}) if(MSVC) find_library(LIB_PTHREAD pthreadVC2) else() find_library(LIB_PTHREAD NAMES pthread thr kse pthreadGC2) endif() set(BOOSTER_SRC ${BOOSTER_SRC} lib/thread/src/pthread.cpp) endif() find_path(PCRE_INCLUDE pcre.h) if(PCRE_INCLUDE) include_directories(${PCRE_INCLUDE}) endif() if(NOT PCRE_INCLUDE) find_path(PCRE_INCLUDE2 pcre/pcre.h) include_directories(${PCRE_INCLUDE2}/pcre) if(NOT PCRE_INCLUDE2) message(FATAL_ERROR "Can't find PCRE include directory") endif() endif() find_library(PCRE_LIB NAMES pcre${PCRE_SUFFIX} pcre) if(NOT PCRE_LIB) message(FATAL_ERROR "Can't find PCRE library") endif() set(LINK_LIBS ) if(NOT DISABLE_SHARED) add_library(booster SHARED ${BOOSTER_SRC}) set(LINK_LIBS ${LINK_LIBS} booster) if(IS_WINDOWS) set(BOOSTER_SHARED_DEFS ${BOOSTER_SHARED_DEFS} DLL_EXPORT) endif() set_target_properties(booster PROPERTIES COMPILE_DEFINITIONS "${BOOSTER_SHARED_DEFS}") set_target_properties(booster PROPERTIES CLEAN_DIRECT_OUTPUT 1) set_target_properties(booster PROPERTIES OUTPUT_NAME "booster${BOOSTER_SUFFIX}") endif(NOT DISABLE_SHARED) if(NOT DISABLE_STATIC) add_library(booster-static STATIC ${BOOSTER_SRC}) set(LINK_LIBS ${LINK_LIBS} booster-static) set_target_properties(booster-static PROPERTIES COMPILE_DEFINITIONS "${BOOST_STATIC_DEFS}") set_target_properties(booster-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) set_target_properties(booster-static PROPERTIES OUTPUT_NAME "booster${BOOSTER_SUFFIX}") endif(NOT DISABLE_STATIC) install(DIRECTORY booster DESTINATION include PATTERN ".svn" EXCLUDE) foreach(ALIB ${LINK_LIBS}) if(LIB_SOCKGETHOSTBYNAME) target_link_libraries(${ALIB} ${LIB_SOCKGETHOSTBYNAME}) endif(LIB_SOCKGETHOSTBYNAME) if(LIB_NSL) target_link_libraries(${ALIB} ${LIB_NSL}) endif(LIB_NSL) if(LIB_SOCKET) target_link_libraries(${ALIB} ${LIB_SOCKET}) endif(LIB_SOCKET) if(LIB_PTHREAD) target_link_libraries(${ALIB} ${LIB_PTHREAD}) endif(LIB_PTHREAD) if(WS2_32) target_link_libraries(${ALIB} ${WS2_32}) endif() target_link_libraries(${ALIB} ${PCRE_LIB}) if(NOT DISABLE_ICU_LOCALE) target_link_libraries(${ALIB} ${ICU_UC}) target_link_libraries(${ALIB} ${ICU_I18N}) target_link_libraries(${ALIB} ${ICU_DATA}) endif() if(BOOSTER_LIB_DL) target_link_libraries(${ALIB} ${BOOSTER_LIB_DL}) endif() if(ICONV_LIB) target_link_libraries(${ALIB} ${ICONV_LIB}) endif() if(MSVC) target_link_libraries(${ALIB} dbghelp) endif() if(IS_WINDOWS) target_link_libraries(${ALIB} psapi) endif() if(STLPORT_LIB) target_link_libraries(${ALIB} ${STLPORT_LIB} supc++) endif() if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.6) set_target_properties(${ALIB} PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_BINARY_DIR}/booster/build_config.h") else() set_target_properties(${ALIB} PROPERTIES PUBLIC_HEADER "${CMAKE_BINARY_DIR}/booster/build_config.h") endif() if(IS_WINDOWS) set_target_properties(${ALIB} PROPERTIES VERSION ${BOOSTER_SOVERSION} SOVERSION ${BOOSTER_SOVERSION}) else() set_target_properties(${ALIB} PROPERTIES VERSION ${BOOSTER_VERSION} SOVERSION ${BOOSTER_SOVERSION}) endif() endforeach() if(MSVC AND NOT DISABLE_STATIC) set_target_properties(booster-static PROPERTIES PREFIX "lib") endif(MSVC AND NOT DISABLE_STATIC) set(EXE_COM_DEFS "") if(NOT DISABLE_SHARED) set(BOOSTER_LIB booster) if(IS_WINDOWS) set(EXE_COM_DEFS "${EXE_COM_DEFS}" "DLL_EXPORT") endif() else() set(BOOSTER_LIB booster-static) endif() macro(add_booster_param_test MODULE TEST PARAMETER) set(TEST_SRC "lib/${MODULE}/test/test_${TEST}.cpp") set(TEST_NAME "test_${MODULE}_${TEST}") add_executable(${TEST_NAME} ${TEST_SRC}) target_link_libraries(${TEST_NAME} ${BOOSTER_LIB}) set_target_properties(${TEST_NAME} PROPERTIES COMPILE_DEFINITIONS "${EXE_COM_DEFS}") add_test(${TEST_NAME} ${TEST_NAME} ${PARAMETER}) set_tests_properties(${TEST_NAME} PROPERTIES TIMEOUT 20) endmacro() macro(add_booster_test MODULE TEST) add_booster_param_test(${MODULE} ${TEST} "") endmacro() add_booster_test(function function) add_booster_test(function callback) add_booster_test(ptime posix_time) add_booster_test(thread thread) if(UNIX) add_booster_test(thread fork) endif() add_booster_test(smart_ptr shared_ptr) add_booster_test(smart_ptr atomic_counter) add_booster_test(smart_ptr sp_counter) add_booster_test(log log) add_booster_test(nowide nowide) add_booster_test(iostreams streambuf) add_booster_test(regex regex) add_booster_test(aio reactor) add_booster_test(aio timer) add_booster_test(aio event_loop) add_booster_test(aio socket) add_booster_test(aio endpoint) add_booster_test(backtrace backtrace) if(NOT IS_WINDOWS) add_booster_test(aio prefork) endif() add_booster_test(locale codepage) add_booster_param_test(locale message "${CMAKE_CURRENT_SOURCE_DIR}/lib/locale/test") add_booster_test(locale ios_prop) add_booster_test(locale codepage_converter) add_booster_test(locale date_time) add_booster_test(locale generator) add_booster_test(locale config) add_booster_test(locale utf) add_booster_test(locale codecvt) if(NOT DISABLE_ICU_LOCALE) add_booster_test(locale collate) add_booster_test(locale convert) add_booster_test(locale boundary) add_booster_test(locale formatting) add_booster_test(locale icu_vs_os_timezone) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set_target_properties(test_locale_formatting PROPERTIES COMPILE_FLAGS "-O0") endif() endif() if(NOT DISABLE_STD_LOCALE) add_booster_test(locale std_convert) add_booster_test(locale std_formatting) add_booster_test(locale std_collate) endif() if(NOT DISABLE_POSIX_LOCALE) add_booster_test(locale posix_collate) add_booster_test(locale posix_convert) add_booster_test(locale posix_formatting) endif() if(NOT DISABLE_WINAPI_LOCALE) add_booster_test(locale winapi_formatting) add_booster_test(locale winapi_collate) add_booster_test(locale winapi_convert) endif() set(BOOSTER_LIBRARY_PREFIX ${CMAKE_SHARED_LIBRARY_PREFIX}) set(BOOSTER_LIBRARY_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX}) configure_file(lib/booster_build_config.cmake.h booster/build_config.h) install(TARGETS ${LINK_LIBS} RUNTIME DESTINATION bin LIBRARY DESTINATION ${LIBDIR} ARCHIVE DESTINATION ${LIBDIR} PUBLIC_HEADER DESTINATION include/booster)