From 4566d01c8fc6032c846bf0ae1219ed16c18ad383 Mon Sep 17 00:00:00 2001 From: Roman Siromakha Date: Sat, 21 Apr 2018 01:16:52 +0300 Subject: [PATCH] Support build by CMake (#310) --- .gitignore | 4 + .travis.yml | 13 +- CMakeLists.txt | 27 ++++ DebugUtils/CMakeLists.txt | 26 ++++ Detour/CMakeLists.txt | 23 +++ DetourCrowd/CMakeLists.txt | 24 +++ DetourTileCache/CMakeLists.txt | 25 ++++ Recast/CMakeLists.txt | 23 +++ RecastDemo/CMakeLists.txt | 27 ++++ RecastDemo/cmake/FindSDL2.cmake | 249 ++++++++++++++++++++++++++++++++ Tests/CMakeLists.txt | 10 ++ 11 files changed, 447 insertions(+), 4 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 DebugUtils/CMakeLists.txt create mode 100644 Detour/CMakeLists.txt create mode 100644 DetourCrowd/CMakeLists.txt create mode 100644 DetourTileCache/CMakeLists.txt create mode 100644 Recast/CMakeLists.txt create mode 100644 RecastDemo/CMakeLists.txt create mode 100644 RecastDemo/cmake/FindSDL2.cmake create mode 100644 Tests/CMakeLists.txt diff --git a/.gitignore b/.gitignore index c4a9ba0..98f17e4 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,7 @@ RecastDemo/Contrib/SDL/* ## Generated doc files Docs/html + +## IDE files +.idea/ +cmake-build-*/ diff --git a/.travis.yml b/.travis.yml index 6b504e3..17ec14a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,8 +10,10 @@ compiler: # Build both debug and release configurations, through use of an environment variable in the build matrix. env: - - CONFIGURATION=debug - - CONFIGURATION=release + - CONFIGURATION: debug + CMAKE_BUILD_TYPE: Debug + - CONFIGURATION: release + CMAKE_BUILD_TYPE: Release install: # Download and build SDL2 from source. @@ -23,7 +25,7 @@ install: - tar -xzf SDL2.tar.gz - cd SDL2-2.0.4 - ./configure --prefix=$PREFIX - - make -j5 + - make -j$(nproc) - make install - cd .. # Download and build premake5 from source; the Travis environment doesn't have the right version of glibc6 for the prebuilt binaries to work. @@ -38,8 +40,11 @@ install: # Have to cd into directory and back out since premake5 doesn't appear to accept a directory argument. before_script: - cd RecastDemo && ../premake5 gmake && cd .. + - mkdir build && cd build && cmake -DRECASTNAVIGATION_STATIC=TRUE -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} .. && cd .. # Run make in the directory containing generated makefiles, on the configuration specified by the environment variable. script: - - make -C RecastDemo/Build/gmake config=$CONFIGURATION + - make -C RecastDemo/Build/gmake -j$(nproc) config=$CONFIGURATION - RecastDemo/Bin/Tests + - make -C build -j$(nproc) + - cd build && ctest diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d4fff42 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.0) + +project(RecastNavigation) + +# lib versions +SET(SOVERSION 1) +SET(VERSION 1.0.0) + +option(RECASTNAVIGATION_DEMO "Build demo" ON) +option(RECASTNAVIGATION_TESTS "Build tests" ON) +option(RECASTNAVIGATION_EXAMPLES "Build examples" ON) +option(RECASTNAVIGATION_STATIC "Build static libraries" OFF) + +add_subdirectory(DebugUtils) +add_subdirectory(Detour) +add_subdirectory(DetourCrowd) +add_subdirectory(DetourTileCache) +add_subdirectory(Recast) + +if (RECASTNAVIGATION_DEMO) + add_subdirectory(RecastDemo) +endif () + +if (RECASTNAVIGATION_TESTS) + enable_testing() + add_subdirectory(Tests) +endif () diff --git a/DebugUtils/CMakeLists.txt b/DebugUtils/CMakeLists.txt new file mode 100644 index 0000000..36ebc0d --- /dev/null +++ b/DebugUtils/CMakeLists.txt @@ -0,0 +1,26 @@ +file(GLOB SOURCES Source/*.cpp) + +include_directories(../Recast/Include) +include_directories(../Detour/Include) +include_directories(../DetourTileCache/Include) +include_directories(Include) + +if (RECASTNAVIGATION_STATIC) + add_library(DebugUtils STATIC ${SOURCES}) +else() + add_library(DebugUtils SHARED ${SOURCES}) +endif() + +set_target_properties(DebugUtils PROPERTIES + SOVERSION ${SOVERSION} + VERSION ${VERSION} + ) + +install(TARGETS DebugUtils + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + COMPONENT library + ) + +file(GLOB INCLUDES Include/*.h) +install(FILES ${INCLUDES} DESTINATION include) diff --git a/Detour/CMakeLists.txt b/Detour/CMakeLists.txt new file mode 100644 index 0000000..eb6dd18 --- /dev/null +++ b/Detour/CMakeLists.txt @@ -0,0 +1,23 @@ +file(GLOB SOURCES Source/*.cpp) + +include_directories(Include) + +if(RECASTNAVIGATION_STATIC) + add_library(Detour STATIC ${SOURCES}) +else() + add_library(Detour SHARED ${SOURCES}) +endif() + +set_target_properties(Detour PROPERTIES + SOVERSION ${SOVERSION} + VERSION ${VERSION} + ) + +install(TARGETS Detour + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + COMPONENT library + ) + +file(GLOB INCLUDES Include/*.h) +install(FILES ${INCLUDES} DESTINATION include) diff --git a/DetourCrowd/CMakeLists.txt b/DetourCrowd/CMakeLists.txt new file mode 100644 index 0000000..1931460 --- /dev/null +++ b/DetourCrowd/CMakeLists.txt @@ -0,0 +1,24 @@ +file(GLOB SOURCES Source/*.cpp) + +include_directories(../Detour/Include) +include_directories(Include) + +if (RECASTNAVIGATION_STATIC) + add_library(DetourCrowd STATIC ${SOURCES}) +else () + add_library(DetourCrowd SHARED ${SOURCES}) +endif () + +set_target_properties(DetourCrowd PROPERTIES + SOVERSION ${SOVERSION} + VERSION ${VERSION} + ) + +install(TARGETS DetourCrowd + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + COMPONENT library + ) + +file(GLOB INCLUDES Include/*.h) +install(FILES ${INCLUDES} DESTINATION include) diff --git a/DetourTileCache/CMakeLists.txt b/DetourTileCache/CMakeLists.txt new file mode 100644 index 0000000..a8d68af --- /dev/null +++ b/DetourTileCache/CMakeLists.txt @@ -0,0 +1,25 @@ +file(GLOB SOURCES Source/*.cpp) + +include_directories(../Detour/Include) +include_directories(Include) + +if (RECASTNAVIGATION_STATIC) + add_library(DetourTileCache STATIC ${SOURCES}) +else () + add_library(DetourTileCache SHARED ${SOURCES}) +endif () + +set_target_properties(DetourTileCache PROPERTIES + SOVERSION ${SOVERSION} + VERSION ${VERSION} + ) + + +install(TARGETS DetourTileCache + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + COMPONENT library + ) + +file(GLOB INCLUDES Include/*.h) +install(FILES ${INCLUDES} DESTINATION include) diff --git a/Recast/CMakeLists.txt b/Recast/CMakeLists.txt new file mode 100644 index 0000000..94da596 --- /dev/null +++ b/Recast/CMakeLists.txt @@ -0,0 +1,23 @@ +file(GLOB SOURCES Source/*.cpp) + +include_directories(Include) + +if (RECASTNAVIGATION_STATIC) + add_library(Recast STATIC ${SOURCES}) +else () + add_library(Recast SHARED ${SOURCES}) +endif () + +set_target_properties(Recast PROPERTIES + SOVERSION ${SOVERSION} + VERSION ${VERSION} + ) + +install(TARGETS Recast + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + COMPONENT library + ) + +file(GLOB INCLUDES Include/*.h) +install(FILES ${INCLUDES} DESTINATION include) diff --git a/RecastDemo/CMakeLists.txt b/RecastDemo/CMakeLists.txt new file mode 100644 index 0000000..d3208d2 --- /dev/null +++ b/RecastDemo/CMakeLists.txt @@ -0,0 +1,27 @@ +file(GLOB SOURCES Source/*.cpp Contrib/fastlz/fastlz.c) + +include(cmake/FindSDL2.cmake) + +find_package(OpenGL REQUIRED) +find_package(SDL2 REQUIRED) + +include_directories(SYSTEM ${OPENGL_INCLUDE_DIR}) +include_directories(SYSTEM ${SDL2_INCLUDE_DIRS}) +include_directories(SYSTEM Contrib/fastlz) +include_directories(SYSTEM Contrib) +include_directories(../DebugUtils/Include) +include_directories(../Detour/Include) +include_directories(../DetourCrowd/Include) +include_directories(../DetourTileCache/Include) +include_directories(../Recast/Include) +include_directories(Include) + +add_executable(RecastDemo ${SOURCES}) +file(COPY Bin/Meshes DESTINATION ${CMAKE_BINARY_DIR}/RecastDemo) +file(COPY Bin/TestCases DESTINATION ${CMAKE_BINARY_DIR}/RecastDemo) +file(COPY Bin/DroidSans.ttf DESTINATION ${CMAKE_BINARY_DIR}/RecastDemo) + +add_dependencies(RecastDemo DebugUtils Detour DetourCrowd DetourTileCache Recast) +target_link_libraries(RecastDemo ${OPENGL_LIBRARIES} ${SDL2_LIBRARY} DebugUtils Detour DetourCrowd DetourTileCache Recast) + +install(TARGETS RecastDemo RUNTIME DESTINATION bin) diff --git a/RecastDemo/cmake/FindSDL2.cmake b/RecastDemo/cmake/FindSDL2.cmake new file mode 100644 index 0000000..f69c68a --- /dev/null +++ b/RecastDemo/cmake/FindSDL2.cmake @@ -0,0 +1,249 @@ +# - Find SDL2 +# Find the SDL2 headers and libraries +# +# SDL2::SDL2 - Imported target to use for building a library +# SDL2::SDL2main - Imported interface target to use if you want SDL and SDLmain. +# SDL2_FOUND - True if SDL2 was found. +# SDL2_DYNAMIC - If we found a DLL version of SDL (meaning you might want to copy a DLL from SDL2::SDL2) +# +# Original Author: +# 2015 Ryan Pavlik +# +# Copyright Sensics, Inc. 2015. +# 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) + +# Set up architectures (for windows) and prefixes (for mingw builds) +if(WIN32) + if(MINGW) + include(MinGWSearchPathExtras OPTIONAL) + if(MINGWSEARCH_TARGET_TRIPLE) + set(SDL2_PREFIX ${MINGWSEARCH_TARGET_TRIPLE}) + endif() + endif() + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(SDL2_LIB_PATH_SUFFIX lib/x64) + if(NOT MSVC AND NOT SDL2_PREFIX) + set(SDL2_PREFIX x86_64-w64-mingw32) + endif() + else() + set(SDL2_LIB_PATH_SUFFIX lib/x86) + if(NOT MSVC AND NOT SDL2_PREFIX) + set(SDL2_PREFIX i686-w64-mingw32) + endif() + endif() +endif() + +if(SDL2_PREFIX) + set(SDL2_ORIGPREFIXPATH ${CMAKE_PREFIX_PATH}) + if(SDL2_ROOT_DIR) + list(APPEND CMAKE_PREFIX_PATH "${SDL2_ROOT_DIR}") + endif() + if(CMAKE_PREFIX_PATH) + foreach(_prefix ${CMAKE_PREFIX_PATH}) + list(APPEND CMAKE_PREFIX_PATH "${_prefix}/${SDL2_PREFIX}") + endforeach() + endif() + if(MINGWSEARCH_PREFIXES) + list(APPEND CMAKE_PREFIX_PATH ${MINGWSEARCH_PREFIXES}) + endif() +endif() + +# Invoke pkgconfig for hints +find_package(PkgConfig QUIET) +set(SDL2_INCLUDE_HINTS) +set(SDL2_LIB_HINTS) +if(PKG_CONFIG_FOUND) + pkg_search_module(SDL2PC QUIET sdl2) + if(SDL2PC_INCLUDE_DIRS) + set(SDL2_INCLUDE_HINTS ${SDL2PC_INCLUDE_DIRS}) + endif() + if(SDL2PC_LIBRARY_DIRS) + set(SDL2_LIB_HINTS ${SDL2PC_LIBRARY_DIRS}) + endif() +endif() + +include(FindPackageHandleStandardArgs) + +find_library(SDL2_LIBRARY + NAMES + SDL2 + HINTS + ${SDL2_LIB_HINTS} + PATHS + ${SDL2_ROOT_DIR} + ENV SDL2DIR + PATH_SUFFIXES lib SDL2 ${SDL2_LIB_PATH_SUFFIX}) + +set(_sdl2_framework FALSE) +# Some special-casing if we've found/been given a framework. +# Handles whether we're given the library inside the framework or the framework itself. +if(APPLE AND "${SDL2_LIBRARY}" MATCHES "(/[^/]+)*.framework(/.*)?$") + set(_sdl2_framework TRUE) + set(SDL2_FRAMEWORK "${SDL2_LIBRARY}") + # Move up in the directory tree as required to get the framework directory. + while("${SDL2_FRAMEWORK}" MATCHES "(/[^/]+)*.framework(/.*)$" AND NOT "${SDL2_FRAMEWORK}" MATCHES "(/[^/]+)*.framework$") + get_filename_component(SDL2_FRAMEWORK "${SDL2_FRAMEWORK}" DIRECTORY) + endwhile() + if("${SDL2_FRAMEWORK}" MATCHES "(/[^/]+)*.framework$") + set(SDL2_FRAMEWORK_NAME ${CMAKE_MATCH_1}) + # If we found a framework, do a search for the header ahead of time that will be more likely to get the framework header. + find_path(SDL2_INCLUDE_DIR + NAMES + SDL_haptic.h # this file was introduced with SDL2 + HINTS + "${SDL2_FRAMEWORK}/Headers/") + else() + # For some reason we couldn't get the framework directory itself. + # Shouldn't happen, but might if something is weird. + unset(SDL2_FRAMEWORK) + endif() +endif() + +find_path(SDL2_INCLUDE_DIR + NAMES + SDL_haptic.h # this file was introduced with SDL2 + HINTS + ${SDL2_INCLUDE_HINTS} + PATHS + ${SDL2_ROOT_DIR} + ENV SDL2DIR + PATH_SUFFIXES include include/sdl2 include/SDL2 SDL2) + +if(WIN32 AND SDL2_LIBRARY) + find_file(SDL2_RUNTIME_LIBRARY + NAMES + SDL2.dll + libSDL2.dll + HINTS + ${SDL2_LIB_HINTS} + PATHS + ${SDL2_ROOT_DIR} + ENV SDL2DIR + PATH_SUFFIXES bin lib ${SDL2_LIB_PATH_SUFFIX}) +endif() + + +if(WIN32 OR ANDROID OR IOS OR (APPLE AND NOT _sdl2_framework)) + set(SDL2_EXTRA_REQUIRED SDL2_SDLMAIN_LIBRARY) + find_library(SDL2_SDLMAIN_LIBRARY + NAMES + SDL2main + PATHS + ${SDL2_ROOT_DIR} + ENV SDL2DIR + PATH_SUFFIXES lib ${SDL2_LIB_PATH_SUFFIX}) +endif() + +if(MINGW AND NOT SDL2PC_FOUND) + find_library(SDL2_MINGW_LIBRARY mingw32) + find_library(SDL2_MWINDOWS_LIBRARY mwindows) +endif() + +if(SDL2_PREFIX) + # Restore things the way they used to be. + set(CMAKE_PREFIX_PATH ${SDL2_ORIGPREFIXPATH}) +endif() + +# handle the QUIETLY and REQUIRED arguments and set QUATLIB_FOUND to TRUE if +# all listed variables are TRUE +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SDL2 + DEFAULT_MSG + SDL2_LIBRARY + SDL2_INCLUDE_DIR + ${SDL2_EXTRA_REQUIRED}) + +if(SDL2_FOUND) + if(NOT TARGET SDL2::SDL2) + # Create SDL2::SDL2 + if(WIN32 AND SDL2_RUNTIME_LIBRARY) + set(SDL2_DYNAMIC TRUE) + add_library(SDL2::SDL2 SHARED IMPORTED) + set_target_properties(SDL2::SDL2 + PROPERTIES + IMPORTED_IMPLIB "${SDL2_LIBRARY}" + IMPORTED_LOCATION "${SDL2_RUNTIME_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}" + ) + else() + add_library(SDL2::SDL2 UNKNOWN IMPORTED) + if(SDL2_FRAMEWORK AND SDL2_FRAMEWORK_NAME) + # Handle the case that SDL2 is a framework and we were able to decompose it above. + set_target_properties(SDL2::SDL2 PROPERTIES + IMPORTED_LOCATION "${SDL2_FRAMEWORK}/${SDL2_FRAMEWORK_NAME}") + elseif(_sdl2_framework AND SDL2_LIBRARY MATCHES "(/[^/]+)*.framework$") + # Handle the case that SDL2 is a framework and SDL_LIBRARY is just the framework itself. + + # This takes the basename of the framework, without the extension, + # and sets it (as a child of the framework) as the imported location for the target. + # This is the library symlink inside of the framework. + set_target_properties(SDL2::SDL2 PROPERTIES + IMPORTED_LOCATION "${SDL2_LIBRARY}/${CMAKE_MATCH_1}") + else() + # Handle non-frameworks (including non-Mac), as well as the case that we're given the library inside of the framework + set_target_properties(SDL2::SDL2 PROPERTIES + IMPORTED_LOCATION "${SDL2_LIBRARY}") + endif() + set_target_properties(SDL2::SDL2 + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}" + ) + endif() + + if(APPLE) + # Need Cocoa here, is always a framework + find_library(SDL2_COCOA_LIBRARY Cocoa) + list(APPEND SDL2_EXTRA_REQUIRED SDL2_COCOA_LIBRARY) + if(SDL2_COCOA_LIBRARY) + set_target_properties(SDL2::SDL2 PROPERTIES + IMPORTED_LINK_INTERFACE_LIBRARIES ${SDL2_COCOA_LIBRARY}) + endif() + endif() + + + # Compute what to do with SDL2main + set(SDL2MAIN_LIBRARIES SDL2::SDL2) + add_library(SDL2::SDL2main INTERFACE IMPORTED) + if(SDL2_SDLMAIN_LIBRARY) + add_library(SDL2::SDL2main_real STATIC IMPORTED) + set_target_properties(SDL2::SDL2main_real + PROPERTIES + IMPORTED_LOCATION "${SDL2_SDLMAIN_LIBRARY}") + set(SDL2MAIN_LIBRARIES SDL2::SDL2main_real ${SDL2MAIN_LIBRARIES}) + endif() + if(MINGW) + # MinGW requires some additional libraries to appear earlier in the link line. + if(SDL2PC_LIBRARIES) + # Use pkgconfig-suggested extra libraries if available. + list(REMOVE_ITEM SDL2PC_LIBRARIES SDL2main SDL2) + set(SDL2MAIN_LIBRARIES ${SDL2PC_LIBRARIES} ${SDL2MAIN_LIBRARIES}) + else() + # fall back to extra libraries specified in pkg-config in + # an official binary distro of SDL2 for MinGW I downloaded + if(SDL2_MINGW_LIBRARY) + set(SDL2MAIN_LIBRARIES ${SDL2_MINGW_LIBRARY} ${SDL2MAIN_LIBRARIES}) + endif() + if(SDL2_MWINDOWS_LIBRARY) + set(SDL2MAIN_LIBRARIES ${SDL2_MWINDOWS_LIBRARY} ${SDL2MAIN_LIBRARIES}) + endif() + endif() + set_target_properties(SDL2::SDL2main + PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "main=SDL_main") + endif() + set_target_properties(SDL2::SDL2main + PROPERTIES + INTERFACE_LINK_LIBRARIES "${SDL2MAIN_LIBRARIES}") + endif() + mark_as_advanced(SDL2_ROOT_DIR) +endif() + +mark_as_advanced(SDL2_LIBRARY + SDL2_RUNTIME_LIBRARY + SDL2_INCLUDE_DIR + SDL2_SDLMAIN_LIBRARY + SDL2_COCOA_LIBRARY + SDL2_MINGW_LIBRARY + SDL2_MWINDOWS_LIBRARY) diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt new file mode 100644 index 0000000..a98ccbf --- /dev/null +++ b/Tests/CMakeLists.txt @@ -0,0 +1,10 @@ +file(GLOB TESTS_SOURCES *.cpp Detour/*.cpp Recast/*.cpp) + +include_directories(../Detour/Include) +include_directories(../Recast/Include) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) + +add_executable(Tests ${TESTS_SOURCES}) +add_dependencies(Tests Recast Detour) +target_link_libraries(Tests Recast Detour) +add_test(Tests Tests)