360 lines
12 KiB
CMake
360 lines
12 KiB
CMake
cmake_minimum_required(VERSION 2.8.5)
|
|
if(NOT CMAKE_VERSION VERSION_LESS "3.0")
|
|
cmake_policy(SET CMP0048 OLD)
|
|
endif()
|
|
if(NOT CMAKE_VERSION VERSION_LESS "3.1")
|
|
cmake_policy(SET CMP0054 OLD)
|
|
endif()
|
|
if(NOT CMAKE_VERSION VERSION_LESS "3.3")
|
|
cmake_policy(SET CMP0063 NEW)
|
|
set(HONOR_VISIBILITY TRUE)
|
|
else()
|
|
set(HONOR_VISIBILITY FALSE)
|
|
endif()
|
|
|
|
#
|
|
# Project Definition
|
|
#
|
|
|
|
project(nowide CXX)
|
|
set(NOWIDE_TARGET_NAME nowide)
|
|
set(TARGET_VER 0.0.0_neph)
|
|
set(TARGET_ABI_VER 0)
|
|
set(TARGET_OUTPUT_NAME "${NOWIDE_TARGET_NAME}")
|
|
|
|
#
|
|
# CMake Modules
|
|
#
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/contrib/CMake/modules")
|
|
include(CheckCXXCompilerFlag)
|
|
include(CMakeDependentOption)
|
|
include(GNUInstallDirs)
|
|
find_package(Doxygen)
|
|
find_package(HHC)
|
|
find_package(LATEX)
|
|
find_package(Perl)
|
|
|
|
#
|
|
# Include Files
|
|
#
|
|
|
|
include_directories("${PROJECT_SOURCE_DIR}/include")
|
|
|
|
#
|
|
# Project Options
|
|
#
|
|
|
|
option(NOWIDE_BUILD_SHARED "Build Shared Library" ON)
|
|
option(NOWIDE_BUILD_STATIC "Build Static Library" ON)
|
|
cmake_dependent_option(NOWIDE_BUILD_TESTS "Build NoWide Tests" ON "NOT CMAKE_TOOLCHAIN_FILE" OFF)
|
|
cmake_dependent_option(NOWIDE_BUILD_DOC_HTML "Build NoWide Documentation - HTML" ON "DOXYGEN_FOUND" OFF)
|
|
cmake_dependent_option(NOWIDE_BUILD_DOC_CHM "Build NoWide Documentation - CHM" ON "HHC_FOUND AND NOWIDE_BUILD_DOC_HTML" OFF)
|
|
cmake_dependent_option(NOWIDE_BUILD_DOC_TEX "Build NoWide Documentation - LaTeX" ON "DOXYGEN_FOUND AND LATEX_FOUND" OFF)
|
|
|
|
set(NOWIDE_HEADERS
|
|
"${PROJECT_SOURCE_DIR}/include/nowide/config.hpp"
|
|
"${PROJECT_SOURCE_DIR}/include/nowide/convert.hpp"
|
|
"${PROJECT_SOURCE_DIR}/include/nowide/encoding_errors.hpp"
|
|
"${PROJECT_SOURCE_DIR}/include/nowide/encoding_utf.hpp"
|
|
"${PROJECT_SOURCE_DIR}/include/nowide/iostream.hpp"
|
|
"${PROJECT_SOURCE_DIR}/include/nowide/scoped_ptr.hpp"
|
|
"${PROJECT_SOURCE_DIR}/include/nowide/utf.hpp")
|
|
|
|
set(NOWIDE_SOURCE
|
|
"${PROJECT_SOURCE_DIR}/src/iostream.cpp")
|
|
|
|
#
|
|
# Require C++11 Standard
|
|
#
|
|
|
|
if(NOT MSVC)
|
|
if(NOT CMAKE_VERSION VERSION_LESS "3.1")
|
|
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
|
|
set(CMAKE_CXX_STANDARD "11")
|
|
else()
|
|
check_cxx_compiler_flag("-std=gnu++11" _COMPILER_HAS_STD_GNUPP11)
|
|
if(_COMPILER_HAS_STD_GNUPP11)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
|
|
else()
|
|
check_cxx_compiler_flag("-std=c++11" _COMPILER_HAS_STD_GNUPP0X)
|
|
if(_COMPILER_HAS_STD_GNUPP0X)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x")
|
|
else()
|
|
check_cxx_compiler_flag("-std=c++11" _COMPILER_HAS_STD_CPP11)
|
|
if(_COMPILER_HAS_STD_CPP11)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
#
|
|
# MSVC Runtime DLL
|
|
#
|
|
|
|
cmake_dependent_option(NOWIDE_USE_MSVC_RUNTIME "Use MSVC Runtime Library DLL" ON MSVC OFF)
|
|
if(MSVC AND NOT NOWIDE_USE_MSVC_RUNTIME)
|
|
foreach(flag CMAKE_C_FLAGS
|
|
CMAKE_C_FLAGS_DEBUG
|
|
CMAKE_C_FLAGS_RELEASE
|
|
CMAKE_C_FLAGS_MINSIZEREL
|
|
CMAKE_C_FLAGS_RELWITHDEBINFO)
|
|
string(REGEX REPLACE "/MDd" "/MTd" ${flag} "${${flag}}")
|
|
string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}")
|
|
endforeach()
|
|
endif()
|
|
|
|
#
|
|
# Compiler Flags
|
|
#
|
|
|
|
if(MSVC)
|
|
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
|
|
else()
|
|
check_cxx_compiler_flag("-fno-strict-aliasing" _COMPILER_HAS_NO_STRICT_ALIASING)
|
|
check_cxx_compiler_flag("-fvisibility=hidden" _COMPILER_HAS_VISIBILITY_HIDDEN)
|
|
check_cxx_compiler_flag("-Wall" _COMPILER_HAS_WARN_ALL)
|
|
check_cxx_compiler_flag("-Wextra" _COMPILER_HAS_WARN_EXTRA)
|
|
check_cxx_compiler_flag("-Wno-unused-parameter" _COMPILER_HAS_NO_WARN_UNUSED_PARAMETER)
|
|
if(_COMPILER_HAS_NO_STRICT_ALIASING)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
|
|
endif()
|
|
if(_COMPILER_HAS_WARN_ALL)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
|
|
endif()
|
|
if(_COMPILER_HAS_WARN_EXTRA)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra")
|
|
endif()
|
|
if(_COMPILER_HAS_NO_WARN_UNUSED_PARAMETER)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter")
|
|
endif()
|
|
endif()
|
|
|
|
#
|
|
# Linker Flags
|
|
#
|
|
|
|
if(NOT MSVC)
|
|
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
|
|
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
|
|
check_cxx_compiler_flag("" _LINKER_HAS_NO_UNDEFINED)
|
|
if (_LINKER_HAS_NO_UNDEFINED)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined ${CMAKE_SHARED_LINKER_FLAGS}")
|
|
endif()
|
|
|
|
if (MINGW)
|
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--nxcompat")
|
|
check_cxx_compiler_flag("" _LINKER_HAS_DEP)
|
|
if (_LINKER_HAS_DEP)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--nxcompat ${CMAKE_SHARED_LINKER_FLAGS}")
|
|
endif()
|
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--dynamicbase")
|
|
check_cxx_compiler_flag("" _LINKER_HAS_ASLR)
|
|
if (_LINKER_HAS_ASLR)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--dynamicbase ${CMAKE_SHARED_LINKER_FLAGS}")
|
|
endif()
|
|
set(CMAKE_REQUIRED_FLAGS "-Wl,--high-entropy-va")
|
|
check_cxx_compiler_flag("" _LINKER_HAS_64ASLR)
|
|
if (_LINKER_HAS_64ASLR)
|
|
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--high-entropy-va ${CMAKE_SHARED_LINKER_FLAGS}")
|
|
endif()
|
|
endif()
|
|
|
|
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
|
|
endif()
|
|
|
|
#
|
|
# Build Targets
|
|
#
|
|
|
|
set(NOWIDE_TARGET_BUILT "")
|
|
set(NOWIDE_TARGET_TYPES "")
|
|
|
|
if(NOWIDE_BUILD_SHARED)
|
|
list(APPEND NOWIDE_TARGET_TYPES "shared")
|
|
add_library("${NOWIDE_TARGET_NAME}_shared" SHARED ${NOWIDE_SOURCE} ${NOWIDE_HEADERS})
|
|
if(WIN32 OR ANDROID OR MSYS)
|
|
set_target_properties("${NOWIDE_TARGET_NAME}_shared" PROPERTIES
|
|
OUTPUT_NAME "${TARGET_OUTPUT_NAME}${TARGET_ABI_VER}")
|
|
else()
|
|
set_target_properties("${NOWIDE_TARGET_NAME}_shared" PROPERTIES
|
|
OUTPUT_NAME "${TARGET_OUTPUT_NAME}")
|
|
endif()
|
|
if(NOT ANDROID)
|
|
set_target_properties("${NOWIDE_TARGET_NAME}_shared" PROPERTIES
|
|
VERSION "${TARGET_VER}"
|
|
SOVERSION "${TARGET_ABI_VER}")
|
|
endif()
|
|
set_target_properties("${NOWIDE_TARGET_NAME}_shared" PROPERTIES
|
|
COMPILE_DEFINITIONS "NOWIDE_DLL")
|
|
endif()
|
|
|
|
if(NOWIDE_BUILD_STATIC)
|
|
list(APPEND NOWIDE_TARGET_TYPES "static")
|
|
add_library("${NOWIDE_TARGET_NAME}_static" STATIC ${NOWIDE_SOURCE} ${NOWIDE_HEADERS})
|
|
if(MSVC)
|
|
set_target_properties("${NOWIDE_TARGET_NAME}_static" PROPERTIES
|
|
OUTPUT_NAME "${TARGET_OUTPUT_NAME}${TARGET_ABI_VER}_static")
|
|
else()
|
|
set_target_properties("${NOWIDE_TARGET_NAME}_static" PROPERTIES
|
|
OUTPUT_NAME "${TARGET_OUTPUT_NAME}${TARGET_ABI_VER}")
|
|
endif()
|
|
endif()
|
|
|
|
foreach(NOWIDE_TARGET_TYPE ${NOWIDE_TARGET_TYPES})
|
|
list(APPEND NOWIDE_TARGET_BUILT "${NOWIDE_TARGET_NAME}_${NOWIDE_TARGET_TYPE}")
|
|
if(NOT MSYS)
|
|
target_link_libraries("${NOWIDE_TARGET_NAME}_${NOWIDE_TARGET_TYPE}" ${CMAKE_DL_LIBS})
|
|
endif()
|
|
if(HONOR_VISILIBITY)
|
|
set_target_properties("${NOWIDE_TARGET_NAME}_${NOWIDE_TARGET_TYPE}" PROPERTIES
|
|
C_VISIBILITY_PRESET hidden)
|
|
elseif(_COMPILER_HAS_VISIBILITY_HIDDEN)
|
|
set_target_properties("${NOWIDE_TARGET_NAME}_${NOWIDE_TARGET_TYPE}" PROPERTIES
|
|
COMPILE_FLAGS "-fvisibility=hidden")
|
|
endif()
|
|
set_target_properties("${NOWIDE_TARGET_NAME}_${NOWIDE_TARGET_TYPE}" PROPERTIES
|
|
POSITION_INDEPENDENT_CODE ON)
|
|
endforeach()
|
|
|
|
#
|
|
# Documentation
|
|
#
|
|
|
|
if(NOWIDE_BUILD_DOC_HTML)
|
|
set(NOWIDE_DOXYGEN_HTML YES)
|
|
else()
|
|
set(NOWIDE_DOXYGEN_HTML NO)
|
|
endif()
|
|
|
|
if(NOWIDE_BUILD_DOC_CHM)
|
|
set(NOWIDE_DOXYGEN_HTMLHELP YES)
|
|
else()
|
|
set(NOWIDE_DOXYGEN_HTMLHELP NO)
|
|
endif()
|
|
|
|
if(NOWIDE_BUILD_DOC_TEX)
|
|
set(NOWIDE_DOXYGEN_LATEX YES)
|
|
else()
|
|
set(NOWIDE_DOXYGEN_LATEX NO)
|
|
endif()
|
|
|
|
if(NOWIDE_BUILD_DOC_HTML AND NOT LATEX_FOUND)
|
|
set(NOWIDE_DOXYGEN_MATHJAX YES)
|
|
else()
|
|
set(NOWIDE_DOXYGEN_MATHJAX NO)
|
|
endif()
|
|
|
|
if(DOXYGEN_DOT_FOUND)
|
|
set(NOWIDE_DOXYGEN_DOT YES)
|
|
else()
|
|
set(NOWIDE_DOXYGEN_DOT NO)
|
|
endif()
|
|
|
|
if(NOWIDE_BUILD_DOC_HTML OR NOWIDE_BUILD_DOC_TEX)
|
|
configure_file("Doxyfile.in" "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile" @ONLY)
|
|
add_custom_target(doc "${DOXYGEN_EXECUTABLE}" Doxyfile
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
COMMENT "Generating API Documentation" VERBATIM)
|
|
endif()
|
|
|
|
#
|
|
# Tests
|
|
#
|
|
|
|
if(NOWIDE_BUILD_TESTS)
|
|
enable_testing()
|
|
foreach(NOWIDE_TARGET_TYPE ${NOWIDE_TARGET_TYPES})
|
|
add_executable(test_${NOWIDE_TARGET_TYPE}_convert test/test_convert.cpp)
|
|
target_link_libraries(test_${NOWIDE_TARGET_TYPE}_convert ${NOWIDE_TARGET_NAME}_${NOWIDE_TARGET_TYPE})
|
|
add_test(test_${NOWIDE_TARGET_TYPE}_convert test_${NOWIDE_TARGET_TYPE}_convert)
|
|
if("${NOWIDE_TARGET_TYPE}" STREQUAL "shared")
|
|
set_target_properties(test_${NOWIDE_TARGET_TYPE}_convert PROPERTIES COMPILE_DEFINITIONS "NOWIDE_DLL")
|
|
endif()
|
|
|
|
add_executable(test_${NOWIDE_TARGET_TYPE}_stdio test/test_stdio.cpp)
|
|
target_link_libraries(test_${NOWIDE_TARGET_TYPE}_stdio ${NOWIDE_TARGET_NAME}_${NOWIDE_TARGET_TYPE})
|
|
add_test(test_${NOWIDE_TARGET_TYPE}_stdio test_${NOWIDE_TARGET_TYPE}_stdio)
|
|
if("${NOWIDE_TARGET_TYPE}" STREQUAL "shared")
|
|
set_target_properties(test_${NOWIDE_TARGET_TYPE}_stdio PROPERTIES COMPILE_DEFINITIONS "NOWIDE_DLL")
|
|
endif()
|
|
|
|
if(NOT APPLE)
|
|
# OSX fstream is bugged?
|
|
add_executable(test_${NOWIDE_TARGET_TYPE}_fstream test/test_fstream.cpp)
|
|
target_link_libraries(test_${NOWIDE_TARGET_TYPE}_fstream ${NOWIDE_TARGET_NAME}_${NOWIDE_TARGET_TYPE})
|
|
add_test(test_${NOWIDE_TARGET_TYPE}_fstream test_${NOWIDE_TARGET_TYPE}_fstream)
|
|
if("${NOWIDE_TARGET_TYPE}" STREQUAL "shared")
|
|
set_target_properties(test_${NOWIDE_TARGET_TYPE}_fstream PROPERTIES COMPILE_DEFINITIONS "NOWIDE_DLL")
|
|
endif()
|
|
endif()
|
|
|
|
add_executable(test_${NOWIDE_TARGET_TYPE}_iostream test/test_iostream.cpp)
|
|
target_link_libraries(test_${NOWIDE_TARGET_TYPE}_iostream ${NOWIDE_TARGET_NAME}_${NOWIDE_TARGET_TYPE})
|
|
add_test(test_${NOWIDE_TARGET_TYPE}_iostream test_${NOWIDE_TARGET_TYPE}_iostream)
|
|
if("${NOWIDE_TARGET_TYPE}" STREQUAL "shared")
|
|
set_target_properties(test_${NOWIDE_TARGET_TYPE}_iostream PROPERTIES COMPILE_DEFINITIONS "NOWIDE_DLL")
|
|
endif()
|
|
|
|
add_executable(test_${NOWIDE_TARGET_TYPE}_env_proto test/test_env.cpp)
|
|
target_link_libraries(test_${NOWIDE_TARGET_TYPE}_env_proto ${NOWIDE_TARGET_NAME}_${NOWIDE_TARGET_TYPE})
|
|
add_test(test_${NOWIDE_TARGET_TYPE}_env_proto test_${NOWIDE_TARGET_TYPE}_env_proto)
|
|
if("${NOWIDE_TARGET_TYPE}" STREQUAL "shared")
|
|
set_target_properties(test_${NOWIDE_TARGET_TYPE}_env_proto PROPERTIES COMPILE_DEFINITIONS "NOWIDE_DLL")
|
|
endif()
|
|
|
|
if(WIN32 OR MSYS)
|
|
add_executable(test_${NOWIDE_TARGET_TYPE}_env_win test/test_env.cpp)
|
|
target_link_libraries(test_${NOWIDE_TARGET_TYPE}_env_win ${NOWIDE_TARGET_NAME}_${NOWIDE_TARGET_TYPE})
|
|
add_test(test_${NOWIDE_TARGET_TYPE}_env_win test_${NOWIDE_TARGET_TYPE}_env_win)
|
|
if("${NOWIDE_TARGET_TYPE}" STREQUAL "shared")
|
|
set_target_properties(test_${NOWIDE_TARGET_TYPE}_env_win PROPERTIES
|
|
COMPILE_DEFINITIONS "NOWIDE_DLL;NOWIDE_USE_WINDOWS_H")
|
|
else()
|
|
set_target_properties(test_${NOWIDE_TARGET_TYPE}_env_win PROPERTIES
|
|
COMPILE_DEFINITIONS "NOWIDE_USE_WINDOWS_H")
|
|
endif()
|
|
endif()
|
|
|
|
if(NOT MSYS)
|
|
# This test fails on MSYS2 MinTTY
|
|
add_executable(test_${NOWIDE_TARGET_TYPE}_system test/test_system.cpp)
|
|
target_link_libraries(test_${NOWIDE_TARGET_TYPE}_system ${NOWIDE_TARGET_NAME}_${NOWIDE_TARGET_TYPE})
|
|
add_test(test_${NOWIDE_TARGET_TYPE}_system_n test_${NOWIDE_TARGET_TYPE}_system "-n")
|
|
add_test(test_${NOWIDE_TARGET_TYPE}_system_w test_${NOWIDE_TARGET_TYPE}_system "-w")
|
|
if("${NOWIDE_TARGET_TYPE}" STREQUAL "shared")
|
|
set_target_properties(test_${NOWIDE_TARGET_TYPE}_system PROPERTIES COMPILE_DEFINITIONS "NOWIDE_DLL")
|
|
endif()
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
|
|
#
|
|
# Install
|
|
#
|
|
|
|
install(TARGETS ${NOWIDE_TARGET_BUILT}
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
install(DIRECTORY "${PROJECT_SOURCE_DIR}/include/nowide" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
|
if(MSVC)
|
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/Debug/${TARGET_OUTPUT_NAME}${TARGET_ABI_VER}.pdb" DESTINATION ${CMAKE_INSTALL_BINDIR} CONFIGURATIONS Debug)
|
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/${TARGET_OUTPUT_NAME}${TARGET_ABI_VER}.pdb" DESTINATION ${CMAKE_INSTALL_BINDIR} CONFIGURATIONS RelWithDebInfo)
|
|
endif()
|
|
install(FILES "${PROJECT_SOURCE_DIR}/COPYING" DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
|
install(FILES "${PROJECT_SOURCE_DIR}/README.md" DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
|
if(NOWIDE_BUILD_DOC_HTML)
|
|
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html" DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
|
endif()
|
|
if(NOWIDE_BUILD_DOC_TEX)
|
|
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/latex" DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
|
endif()
|
|
if(NOWIDE_BUILD_DOC_CHM)
|
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${NOWIDE_TARGET_NAME}.chm" DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
|
endif()
|