flycast/core/deps/nowide/CMakeLists.txt

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()