cmake_minimum_required(VERSION 3.1) project(engine VERSION "0.0.1") set(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE STRING "Root dir") set(SCRIPTS_CMAKE_DIR ${PROJECT_SOURCE_DIR}/cmake) include(${SCRIPTS_CMAKE_DIR}/common.cmake) include(${SCRIPTS_CMAKE_DIR}/macros.cmake) include(${SCRIPTS_CMAKE_DIR}/pack.cmake) include(CPack) option(UNITTESTS "Builds with tests" ON) option(VISUALTESTS "Builds with visual tests" ON) option(SANITIZER_THREADS "Builds with thread sanitizer" OFF) option(UNITTESTS_SANITIZER_THREADS "Builds tests with thread sanitizer" OFF) option(UNITTESTS_SANITIZER_UNDEFINED "Builds tests with undefined behaviour sanitizer" OFF) option(UNITTESTS_SANITIZER_LEAK "Builds tests with leak sanitizer" OFF) option(UNITTESTS_SANITIZER_ADDRESS "Builds tests with address sanitizer" OFF) option(TOOLS "Builds with tools" ON) option(RCON "Builds with rcon tool - also needs TOOLS to be active" ON) option(SERVER "Builds with server" ON) option(USE_CCACHE "Use ccache" ON) option(USE_GPROF "Use gprof - will become slow" OFF) option(USE_GCOV "Use gcov - will become slow" OFF) option(USE_DOXYGEN_CHECK "Use -Wdocumentation if available" OFF) set(SERVER_HOST "localhost" CACHE STRING "Host where the server is running on") set(SERVER_PORT "11337" CACHE STRING "Port where the server is listening on") if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") set(WINDOWS 1) elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Android") set(LINUX 1) elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") set(DARWIN 1) elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(LINUX 1) elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten") set(EMSCRIPTEN 1) else() message(WARNING "Unknown host system: ${CMAKE_SYSTEM_NAME}. Default to linux") set(LINUX 1) endif() if (NOT CMAKE_TOOLCHAIN_FILE) if (MSVC) include(${SCRIPTS_CMAKE_DIR}/toolchains/msvc-toolchain.cmake) elseif (WINDOWS) include(${SCRIPTS_CMAKE_DIR}/toolchains/windows-toolchain.cmake) elseif (DARWIN) include(${SCRIPTS_CMAKE_DIR}/toolchains/darwin-toolchain.cmake) else() include(${SCRIPTS_CMAKE_DIR}/toolchains/linux-toolchain.cmake) endif() endif() if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Compile Type" FORCE) endif() set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release MinSizeRel RelWithDebInfo Profile) if (${CMAKE_BUILD_TYPE} MATCHES "Debug") set(RELEASE False) else() set(RELEASE True) endif() message(STATUS "Place binaries in ${CMAKE_BINARY_DIR}") # First for the generic no-config case (e.g. with mingw) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/lib) # Second, for multi-config builds (e.g. msvc) foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/lib) endforeach() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${SCRIPTS_CMAKE_DIR}) set(CMAKE_VERBOSE_MAKEFILE ${VERBOSE}) SET(CMAKE_COLOR_MAKEFILE ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) if (${CMAKE_GENERATOR} MATCHES "Eclipse CDT4") message(STATUS "Generate eclipse projects") set(CMAKE_ECLIPSE_GENERATE_LINKED_RESOURCES OFF) set(CMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT ON) set(CMAKE_ECLIPSE_VERSION "4.3" CACHE STRING "Eclipse version") set(CMAKE_CXX_COMPILER_ARG1 "-std=c++14" CACHE STRING "C++ version for Eclipse") endif() find_host_program(CCACHE "ccache") if (CCACHE) if (USE_CCACHE) message(STATUS "Using ccache") set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) endif() else() message(STATUS "ccache not found") endif() configure_file(src/engine-config.h.in engine-config.h @ONLY) message(STATUS "Generate config.h in ${CMAKE_CURRENT_BINARY_DIR}") include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(src/modules) add_subdirectory(contrib/libs) if (UNITTESTS) enable_testing() gtest_suite_begin(tests TEMPLATE src/modules/core/tests/main.cpp.in) endif() add_subdirectory(src) if (UNITTESTS) gtest_suite_end(tests) generate_compute_shaders(tests test) if (UNITTESTS_SANITIZER_THREADS) set_target_properties(tests PROPERTIES COMPILE_FLAGS "${SANITIZE_THREAD_FLAG}") set_target_properties(tests PROPERTIES LINK_FLAGS "${SANITIZE_THREAD_FLAG}") endif() if (UNITTESTS_SANITIZER_UNDEFINED) set_target_properties(tests PROPERTIES COMPILE_FLAGS "${SANITIZE_UNDEFINED_FLAG}") set_target_properties(tests PROPERTIES LINK_FLAGS "${SANITIZE_UNDEFINED_FLAG}") endif() if (UNITTESTS_SANITIZER_LEAK) set_target_properties(tests PROPERTIES COMPILE_FLAGS "${SANITIZE_LEAK_FLAG}") set_target_properties(tests PROPERTIES LINK_FLAGS "${SANITIZE_LEAK_FLAG}") endif() if (UNITTESTS_SANITIZER_ADDRESS) set_target_properties(tests PROPERTIES COMPILE_FLAGS "${SANITIZE_ADDRESS_FLAG}") set_target_properties(tests PROPERTIES LINK_FLAGS "${SANITIZE_ADDRESS_FLAG}") endif() endif() find_package(Doxygen) if (DOXYGEN_FOUND) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) add_custom_target(doc ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Generating API documentation with Doxygen" VERBATIM ) endif(DOXYGEN_FOUND) copy_data_files(shared)