2017-10-27 06:19:01 +02:00
|
|
|
add_library(rw_interface INTERFACE)
|
|
|
|
add_library(openrw::interface ALIAS rw_interface)
|
|
|
|
|
|
|
|
# target_compile_features(rw_interface INTERFACE cxx_std_14) is not supported by CMake 3.2
|
|
|
|
set(CMAKE_CXX_STANDARD 14)
|
|
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
|
2018-02-10 02:07:35 +01:00
|
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
2017-11-03 19:59:17 +01:00
|
|
|
target_compile_options(rw_interface
|
|
|
|
INTERFACE
|
|
|
|
"-Wall"
|
|
|
|
"-Wextra"
|
|
|
|
"-Wdouble-promotion"
|
|
|
|
"-Wpedantic"
|
|
|
|
"-pthread"
|
|
|
|
)
|
|
|
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
|
|
|
target_compile_definitions(rw_interface
|
|
|
|
INTERFACE
|
|
|
|
"_SCL_SECURE_NO_WARNINGS"
|
|
|
|
"_CRT_SECURE_NO_WARNINGS"
|
|
|
|
)
|
|
|
|
else()
|
|
|
|
message(FATAL_ERROR "Unknown compiler ID: '${CMAKE_CXX_COMPILER_ID}'")
|
|
|
|
endif()
|
|
|
|
|
2018-02-10 02:07:35 +01:00
|
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL Clang OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
2017-11-03 19:59:17 +01:00
|
|
|
target_compile_options(rw_interface
|
|
|
|
INTERFACE
|
|
|
|
"-Wno-gnu-array-member-paren-init"
|
|
|
|
)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(MINGW)
|
|
|
|
target_compile_options(rw_interface
|
|
|
|
INTERFACE
|
|
|
|
"-fpermissive"
|
|
|
|
)
|
|
|
|
endif()
|
|
|
|
|
2017-10-27 06:19:01 +02:00
|
|
|
target_compile_definitions(rw_interface
|
|
|
|
INTERFACE
|
|
|
|
"$<$<CONFIG:Debug>:RW_DEBUG=1>"
|
|
|
|
"GLM_FORCE_RADIANS"
|
2018-02-10 16:31:28 +01:00
|
|
|
"GLM_ENABLE_EXPERIMENTAL"
|
2017-10-27 06:19:01 +02:00
|
|
|
"RW_VERBOSE_DEBUG_MESSAGES=$<BOOL:${RW_VERBOSE_DEBUG_MESSAGES}>"
|
2017-11-03 19:59:17 +01:00
|
|
|
"RENDER_PROFILER=0"
|
|
|
|
"RW_PROFILER=$<BOOL:${ENABLE_PROFILING}>"
|
2017-10-27 06:19:01 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
|
|
target_compile_definitions(rw_interface INTERFACE "RW_LINUX")
|
|
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
|
|
|
target_compile_definitions(rw_interface INTERFACE "RW_OSX")
|
|
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
|
|
|
|
target_compile_definitions(rw_interface INTERFACE "RW_FREEBSD")
|
|
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "NetBSD")
|
|
|
|
target_compile_definitions(rw_interface INTERFACE "RW_NETBSD")
|
|
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
|
|
|
|
target_compile_definitions(rw_interface INTERFACE "RW_OPENBSD")
|
|
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
|
|
|
target_compile_definitions(rw_interface INTERFACE "RW_WINDOWS")
|
|
|
|
else()
|
|
|
|
message(FATAL_ERROR "Unknown platform \"${CMAKE_SYSTEM_NAME}\". please update CMakeLists.txt.")
|
|
|
|
endif()
|
|
|
|
|
2017-10-29 23:50:59 +01:00
|
|
|
if(FILESYSTEM_LIBRARY STREQUAL "CXX17")
|
|
|
|
target_compile_definitions(rw_interface INTERFACE "RW_FS_LIBRARY=0")
|
|
|
|
elseif(FILESYSTEM_LIBRARY STREQUAL "CXXTS")
|
|
|
|
target_compile_definitions(rw_interface INTERFACE "RW_FS_LIBRARY=1")
|
|
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
|
|
|
target_link_libraries(rw_interface INTERFACE "stdc++fs")
|
|
|
|
endif()
|
|
|
|
elseif(FILESYSTEM_LIBRARY STREQUAL "BOOST")
|
|
|
|
target_compile_definitions(rw_interface INTERFACE "RW_FS_LIBRARY=2")
|
|
|
|
target_include_directories(rw_interface INTERFACE ${Boost_INCLUDE_DIRS})
|
|
|
|
target_link_libraries(rw_interface INTERFACE
|
|
|
|
${Boost_FILESYSTEM_LIBRARY}
|
|
|
|
${Boost_SYSTEM_LIBRARY}
|
|
|
|
)
|
|
|
|
else()
|
|
|
|
message(FATAL_ERROR "Illegal FILESYSTEM_LIBRARY option. (was '${FILESYSTEM_LIBRARY}')")
|
|
|
|
endif()
|
|
|
|
|
2017-10-27 06:19:01 +02:00
|
|
|
if(ENABLE_SCRIPT_DEBUG)
|
|
|
|
target_compile_definitions(rw_interface
|
|
|
|
INTERFACE
|
|
|
|
"RW_SCRIPT_DEBUG"
|
|
|
|
)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(FAILED_CHECK_ACTION STREQUAL "IGNORE")
|
|
|
|
target_compile_definitions(rw_interface INTERFACE "RW_FAILED_CHECK_ACTION=0")
|
|
|
|
elseif(FAILED_CHECK_ACTION STREQUAL "ABORT")
|
|
|
|
target_compile_definitions(rw_interface INTERFACE "RW_FAILED_CHECK_ACTION=1")
|
|
|
|
elseif(FAILED_CHECK_ACTION STREQUAL "BREAKPOINT")
|
|
|
|
target_compile_definitions(rw_interface INTERFACE "RW_FAILED_CHECK_ACTION=2")
|
|
|
|
else()
|
|
|
|
message(FATAL_ERROR "Illegal FAILED_CHECK_ACTION option. (was '${FAILED_CHECK_ACTION}')")
|
|
|
|
endif()
|
2017-10-28 08:15:34 +02:00
|
|
|
|
|
|
|
if(TEST_COVERAGE)
|
|
|
|
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
2017-04-24 17:39:58 +02:00
|
|
|
message("TEST_COVERAGE enabled. Setting CMAKE_BUILD_TYPE to Debug.")
|
2017-10-28 08:15:34 +02:00
|
|
|
set(CMAKE_BUILD_TYPE "Debug")
|
|
|
|
endif()
|
|
|
|
if(NOT BUILD_TESTS)
|
2017-04-24 17:39:58 +02:00
|
|
|
message("TEST_COVERAGE enabled. Enabling BUILD_TESTS.")
|
2017-10-28 08:15:34 +02:00
|
|
|
set(BUILD_TESTS "ON")
|
|
|
|
endif()
|
|
|
|
target_compile_options(rw_interface
|
|
|
|
INTERFACE
|
|
|
|
"-O0"
|
|
|
|
"-fprofile-arcs"
|
|
|
|
"-ftest-coverage"
|
|
|
|
)
|
2017-11-04 00:10:33 +01:00
|
|
|
target_link_libraries(rw_interface
|
|
|
|
INTERFACE
|
|
|
|
gcov
|
|
|
|
)
|
2017-10-28 08:15:34 +02:00
|
|
|
endif()
|
2017-10-29 07:37:18 +01:00
|
|
|
|
2018-02-14 00:42:39 +01:00
|
|
|
foreach(SAN ${ENABLE_SANITIZERS})
|
2018-06-08 10:18:05 +02:00
|
|
|
if(SAN STREQUAL "address")
|
2018-02-14 00:42:39 +01:00
|
|
|
message(STATUS "Address sanitizer enabled.")
|
|
|
|
target_compile_options(rw_interface INTERFACE "-fsanitize=address")
|
|
|
|
target_link_libraries(rw_interface INTERFACE "-fsanitize=address")
|
2018-06-08 10:18:05 +02:00
|
|
|
elseif(SAN STREQUAL "leak")
|
2018-02-14 00:42:39 +01:00
|
|
|
message(STATUS "Leak sanitizer enabled.")
|
|
|
|
target_compile_options(rw_interface INTERFACE "-fsanitize=leak")
|
|
|
|
target_link_libraries(rw_interface INTERFACE "-fsanitize=leak")
|
2018-06-08 10:18:05 +02:00
|
|
|
elseif(SAN STREQUAL "thread")
|
2018-02-14 00:42:39 +01:00
|
|
|
message(STATUS "Thread sanitizer enabled.")
|
|
|
|
target_compile_options(rw_interface INTERFACE "-fsanitize=thread")
|
|
|
|
target_link_libraries(rw_interface INTERFACE "-fsanitize=thread")
|
2018-06-08 10:18:05 +02:00
|
|
|
elseif(SAN STREQUAL "undefined")
|
2018-02-14 00:42:39 +01:00
|
|
|
message(STATUS "Undefined behaviour sanitizer enabled.")
|
|
|
|
target_compile_options(rw_interface INTERFACE "-fsanitize=undefined")
|
|
|
|
target_link_libraries(rw_interface INTERFACE "-fsanitize=undefined")
|
2018-06-08 10:18:05 +02:00
|
|
|
else()
|
|
|
|
message(FATAL_ERROR "Illegal sanitizer: ${SAN}")
|
2018-02-14 00:42:39 +01:00
|
|
|
endif()
|
|
|
|
endforeach()
|
|
|
|
|
2017-10-29 07:37:18 +01:00
|
|
|
include(CMakeParseArguments)
|
|
|
|
|
|
|
|
function(openrw_target_apply_options)
|
2017-10-30 23:44:40 +01:00
|
|
|
set(IWYU_MAPPING "${PROJECT_SOURCE_DIR}/openrw_iwyu.imp")
|
2017-10-29 07:37:18 +01:00
|
|
|
cmake_parse_arguments("OPENRW_APPLY" "" "TARGET" "" ${ARGN})
|
2018-03-06 00:49:11 +01:00
|
|
|
if(CHECK_IWYU)
|
2017-10-29 07:37:18 +01:00
|
|
|
iwyu_check(TARGET "${OPENRW_APPLY_TARGET}"
|
|
|
|
EXTRA_OPTS
|
2017-10-30 23:44:40 +01:00
|
|
|
"--mapping_file=${IWYU_MAPPING}"
|
2017-10-29 07:37:18 +01:00
|
|
|
)
|
|
|
|
endif()
|
2018-03-06 00:49:11 +01:00
|
|
|
|
|
|
|
if(CHECK_CLANGTIDY)
|
2018-04-16 22:23:42 +02:00
|
|
|
clang_tidy_check_target(
|
|
|
|
TARGET "${OPENRW_APPLY_TARGET}"
|
|
|
|
FORMAT_STYLE "file"
|
|
|
|
FIX "${CHECK_CLANGTIDY_FIX}"
|
|
|
|
CHECK_ALL
|
2018-03-06 00:49:11 +01:00
|
|
|
)
|
|
|
|
endif()
|
2017-10-29 07:37:18 +01:00
|
|
|
endfunction()
|