|
| 1 | +cmake_minimum_required(VERSION 3.15) |
| 2 | +project(tidalpp) |
| 3 | + |
| 4 | +option(STATIC "Build the game to work as a single binary" OFF) |
| 5 | + |
| 6 | +if (CMAKE_SYSTEM_NAME STREQUAL "Emscripten") |
| 7 | + set(STATIC ON) |
| 8 | +endif() |
| 9 | + |
| 10 | +message(STATUS "Static build: ${STATIC}") |
| 11 | +message(STATUS "Platform: ${CMAKE_SYSTEM_NAME}") |
| 12 | + |
| 13 | +if (STATIC) |
| 14 | + set(BUILD_SHARED_LIBS OFF) |
| 15 | + set(BUILD_STATIC_LIBS ON) |
| 16 | + set(BUILD_SHARED OFF CACHE BOOL "Don't build chipmunk shared") |
| 17 | + set(BUILD_STATIC ON CACHE BOOL "Build chipmunk static") |
| 18 | + set(LUA_ENABLE_SHARED OFF CACHE BOOL "Don't build Lua shared") |
| 19 | + if (CMAKE_SYSTEM_NAME STREQUAL "Windows") |
| 20 | + set(CMAKE_EXE_LINKER_FLAGS "-static") |
| 21 | + endif() |
| 22 | +else() |
| 23 | + set(BUILD_SHARED_LIBS ON) |
| 24 | + set(BUILD_STATIC_LIBS OFF) |
| 25 | + set(BUILD_SHARED ON CACHE BOOL "Build chipmunk shared") |
| 26 | + set(BUILD_STATIC OFF CACHE BOOL "Don't build chipmunk static") |
| 27 | + set(LUA_ENABLE_SHARED ON CACHE BOOL "Build Lua shared") |
| 28 | +endif() |
| 29 | + |
| 30 | +add_executable(tidalpp) |
| 31 | + |
| 32 | +target_sources(tidalpp PRIVATE src/actions.c src/assets.c src/common.c src/engine.c src/filesystem.c src/fonts.c src/instance.c src/main.c src/zpl.c) |
| 33 | + |
| 34 | +message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") |
| 35 | +set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Wall") |
| 36 | + |
| 37 | +include(FetchContent) |
| 38 | + |
| 39 | +# Math dependency |
| 40 | +if (CMAKE_SYSTEM_NAME STREQUAL "Linux") |
| 41 | + target_link_libraries(tidalpp PRIVATE m) |
| 42 | +endif() |
| 43 | + |
| 44 | +# SDL2 dependency |
| 45 | +if (CMAKE_SYSTEM_NAME STREQUAL "Emscripten") |
| 46 | + target_link_options(tidalpp PRIVATE "-sUSE_SDL=2") |
| 47 | + target_link_options(tidalpp PRIVATE "-sALLOW_MEMORY_GROWTH") |
| 48 | + #target_link_libraries(tidalpp PRIVATE SDL2) |
| 49 | + set_target_properties(tidalpp PROPERTIES SUFFIX ".html") # remove later |
| 50 | +else() |
| 51 | + find_path( |
| 52 | + SDL_INCLUDE_DIR |
| 53 | + NAMES "SDL.h" |
| 54 | + PATHS "/usr/include/SDL2" |
| 55 | + ) |
| 56 | + message(STATUS "${SDL_INCLUDE_DIR}") |
| 57 | + find_library(SDL_LIB "SDL2" "/usr/lib") |
| 58 | + message(STATUS "${SDL_LIB}") |
| 59 | + if (SDL_INCLUDE_DIR AND SDL_LIB AND (NOT STATIC)) |
| 60 | + message(STATUS "Using system SDL2 lib") |
| 61 | + target_link_libraries(tidalpp PRIVATE SDL2 SDL2main) |
| 62 | + else() |
| 63 | + FetchContent_Declare( |
| 64 | + SDL |
| 65 | + GIT_REPOSITORY https://github.com/libsdl-org/SDL |
| 66 | + GIT_TAG 8a5ba43d00252c6c8b33c9aa4f1048222955ab4d # 2.28.3 |
| 67 | + ) |
| 68 | + FetchContent_GetProperties(SDL) |
| 69 | + if(NOT SDL_POPULATED) |
| 70 | + FetchContent_Populate(SDL) |
| 71 | + file(READ "${sdl_SOURCE_DIR}/src/video/x11/SDL_x11xinput2.h" TEXT) |
| 72 | + string(REPLACE "typedef struct XGenericEventCookie XGenericEventCookie;" "" TEXT "${TEXT}") |
| 73 | + file(WRITE "${sdl_SOURCE_DIR}/src/video/x11/SDL_x11xinput2.h" "${TEXT}") |
| 74 | + set(SDL_TEST OFF CACHE BOOL "Don't build test") |
| 75 | + add_subdirectory(${sdl_SOURCE_DIR} ${sdl_BINARY_DIR} EXCLUDE_FROM_ALL) |
| 76 | + if (STATIC) |
| 77 | + set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2") |
| 78 | + else() |
| 79 | + set_target_properties(SDL2 PROPERTIES OUTPUT_NAME "SDL2") |
| 80 | + endif() |
| 81 | + add_dependencies(tidalpp SDL2::SDL2) |
| 82 | + add_dependencies(tidalpp SDL2::SDL2main) |
| 83 | + target_include_directories(tidalpp PRIVATE "${sdl_BINARY_DIR}/include") |
| 84 | + target_include_directories(tidalpp PRIVATE "${sdl_BINARY_DIR}/include-config-release/SDL2") |
| 85 | + target_include_directories(tidalpp PRIVATE "${sdl_BINARY_DIR}/include-config-debug/SDL2") |
| 86 | + target_include_directories(tidalpp PRIVATE "${sdl_SOURCE_DIR}/include") |
| 87 | + target_link_directories(tidalpp PRIVATE ${sdl_BINARY_DIR}) |
| 88 | + endif() |
| 89 | + if (CMAKE_BUILD_TYPE STREQUAL "Debug") |
| 90 | + target_link_libraries(tidalpp PRIVATE SDL2d SDL2maind) |
| 91 | + else() |
| 92 | + target_link_libraries(tidalpp PRIVATE SDL2 SDL2main) |
| 93 | + endif() |
| 94 | + endif() |
| 95 | +endif() |
| 96 | + |
| 97 | +# Chipmunk2D dependency |
| 98 | +find_path( |
| 99 | + CHIPMUNK_INCLUDE_DIR |
| 100 | + NAMES "chipmunk.h" |
| 101 | + PATHS "/usr/include/chipmunk" |
| 102 | +) |
| 103 | +message(STATUS "${CHIPMUNK_INCLUDE_DIR}") |
| 104 | +find_library(CHIPMUNK_LIB "chipmunk" "/usr/lib") |
| 105 | +message(STATUS "${CHIPMUNK_LIB}") |
| 106 | +if (CHIPMUNK_INCLUDE_DIR AND CHIPMUNK_LIB AND (NOT STATIC)) |
| 107 | + message(STATUS "Using system chipmunk lib") |
| 108 | +else() |
| 109 | + FetchContent_Declare( |
| 110 | + chipmunk |
| 111 | + GIT_REPOSITORY https://github.com/slembcke/Chipmunk2D |
| 112 | + GIT_TAG 87340c216bf97554dc552371bbdecf283f7c540e # 7.0.3 |
| 113 | + ) |
| 114 | + FetchContent_GetProperties(chipmunk) |
| 115 | + if(NOT chipmunk_POPULATED) |
| 116 | + FetchContent_Populate(chipmunk) |
| 117 | + file(READ "${chipmunk_SOURCE_DIR}/src/cpHastySpace.c" TEXT) |
| 118 | + string(REPLACE "#include <sys/sysctl.h>" "" TEXT "${TEXT}") |
| 119 | + file(WRITE "${chipmunk_SOURCE_DIR}/src/cpHastySpace.c" "${TEXT}") |
| 120 | + set(BUILD_DEMOS OFF CACHE BOOL "Don't build demos") |
| 121 | + add_subdirectory(${chipmunk_SOURCE_DIR} ${chipmunk_BINARY_DIR} EXCLUDE_FROM_ALL) |
| 122 | + if (STATIC) |
| 123 | + add_dependencies(tidalpp chipmunk_static) |
| 124 | + else() |
| 125 | + add_dependencies(tidalpp chipmunk) |
| 126 | + endif() |
| 127 | + target_include_directories(tidalpp PRIVATE "${chipmunk_SOURCE_DIR}/include") |
| 128 | + target_link_directories(tidalpp PRIVATE "${chipmunk_BINARY_DIR}/src") |
| 129 | + endif() |
| 130 | +endif() |
| 131 | +target_link_libraries(tidalpp PRIVATE chipmunk) |
| 132 | + |
| 133 | +# Stb dependency |
| 134 | +find_path( |
| 135 | + STB_INCLUDE_DIR |
| 136 | + NAMES "stb_image.h" |
| 137 | + PATHS "/usr/include/stb" |
| 138 | +) |
| 139 | +message(STATUS "${STB_INCLUDE_DIR}") |
| 140 | +if (STB_INCLUDE_DIR) |
| 141 | + target_include_directories(tidalpp PRIVATE ${STB_INCLUDE_DIR}) |
| 142 | +else() |
| 143 | + FetchContent_Declare( |
| 144 | + stb |
| 145 | + GIT_REPOSITORY https://github.com/nothings/stb |
| 146 | + GIT_TAG 5736b15f7ea0ffb08dd38af21067c314d6a3aae9 # Commit Jan 29 2023 |
| 147 | + ) |
| 148 | + FetchContent_GetProperties(stb) |
| 149 | + if(NOT stb_POPULATED) |
| 150 | + FetchContent_Populate(stb) |
| 151 | + target_include_directories(tidalpp PRIVATE ${stb_SOURCE_DIR}) |
| 152 | + endif() |
| 153 | +endif() |
| 154 | + |
| 155 | +# nanoSVG dependency |
| 156 | +find_path( |
| 157 | + NANOSVG_INCLUDE_DIR |
| 158 | + NAMES "nanosvgrast.h" |
| 159 | + PATHS "/usr/include/nanosvg" |
| 160 | +) |
| 161 | +message(STATUS "${NANOSVG_INCLUDE_DIR}") |
| 162 | +if (NANOSVG_INCLUDE_DIR) |
| 163 | + target_include_directories(tidalpp PRIVATE ${NANOSVG_INCLUDE_DIR}) |
| 164 | +else() |
| 165 | + FetchContent_Declare( |
| 166 | + nanosvg |
| 167 | + GIT_REPOSITORY https://github.com/memononen/nanosvg |
| 168 | + GIT_TAG 9da543e8329fdd81b64eb48742d8ccb09377aed1 # Commit Dec 4 2022 |
| 169 | + ) |
| 170 | + FetchContent_GetProperties(nanosvg) |
| 171 | + if(NOT nanosvg_POPULATED) |
| 172 | + FetchContent_Populate(nanosvg) |
| 173 | + target_include_directories(tidalpp PRIVATE "${nanosvg_SOURCE_DIR}/src") |
| 174 | + endif() |
| 175 | +endif() |
| 176 | + |
| 177 | +# Lua dependency |
| 178 | +find_path( |
| 179 | + LUA_INCLUDE_DIR |
| 180 | + NAMES "lua.h" |
| 181 | + PATHS "/usr/include" |
| 182 | +) |
| 183 | +message(STATUS "${LUA_INCLUDE_DIR}") |
| 184 | +find_library(LUA_LIB "lua" "/usr/lib") |
| 185 | +message(STATUS "${LUA_LIB}") |
| 186 | +if (LUA_INCLUDE_DIR AND LUA_LIB AND (NOT STATIC)) |
| 187 | + message(STATUS "Using system Lua lib") |
| 188 | +else() |
| 189 | + FetchContent_Declare( |
| 190 | + lua |
| 191 | + GIT_REPOSITORY https://github.com/walterschell/Lua |
| 192 | + GIT_TAG 88246d621abf7b6fba9332f49229d507f020e450 # Commit Aug 8 2023 |
| 193 | + ) |
| 194 | + FetchContent_GetProperties(lua) |
| 195 | + if(NOT lua_POPULATED) |
| 196 | + FetchContent_Populate(lua) |
| 197 | + add_subdirectory(${lua_SOURCE_DIR} ${lua_BINARY_DIR} EXCLUDE_FROM_ALL) |
| 198 | + if (STATIC) |
| 199 | + set_target_properties(lua_static PROPERTIES OUTPUT_NAME "lua") |
| 200 | + else() |
| 201 | + set_target_properties(lua_shared PROPERTIES OUTPUT_NAME "lua") |
| 202 | + endif() |
| 203 | + add_dependencies(tidalpp Lua::Library) |
| 204 | + target_include_directories(tidalpp PRIVATE "${lua_SOURCE_DIR}/lua-5.4.6/include") |
| 205 | + target_link_directories(tidalpp PRIVATE "${lua_BINARY_DIR}/lua-5.4.6") |
| 206 | + endif() |
| 207 | +endif() |
| 208 | +target_link_libraries(tidalpp PRIVATE lua) |
| 209 | + |
| 210 | +install(TARGETS tidalpp DESTINATION bin) |
0 commit comments