116 lines
4.3 KiB
CMake
116 lines
4.3 KiB
CMake
cmake_minimum_required(VERSION 3.20)
|
|
project(CapySR CXX C)
|
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_C_STANDARD 11)
|
|
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
|
|
endif()
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
|
|
|
if(MSVC)
|
|
add_compile_options(/W4 /permissive- /Zc:preprocessor /utf-8 /bigobj /wd4100 /wd4267 /wd4244 /wd4065)
|
|
add_compile_definitions(_CRT_SECURE_NO_WARNINGS NOMINMAX WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0601)
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
else()
|
|
add_compile_options(-Wall -Wextra -Wno-unused-parameter)
|
|
add_compile_definitions(NOMINMAX WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0601)
|
|
endif()
|
|
|
|
find_package(Python3 COMPONENTS Interpreter REQUIRED)
|
|
find_program(PROTOC_EXECUTABLE protoc REQUIRED)
|
|
|
|
# ---------------------------------------------------------------- codegen ----
|
|
set(PROTO_DIR ${CMAKE_SOURCE_DIR}/proto)
|
|
set(PROTO_GEN_DIR ${CMAKE_SOURCE_DIR}/src/proto/gen)
|
|
set(PROTO_SHARDS 8)
|
|
|
|
file(GLOB PROTO_FILES CONFIGURE_DEPENDS ${PROTO_DIR}/*.proto)
|
|
|
|
set(PROTO_GEN_SOURCES ${PROTO_GEN_DIR}/protos.h)
|
|
math(EXPR LAST_SHARD "${PROTO_SHARDS} - 1")
|
|
foreach(i RANGE ${LAST_SHARD})
|
|
list(APPEND PROTO_GEN_SOURCES ${PROTO_GEN_DIR}/protos_${i}.cpp)
|
|
endforeach()
|
|
|
|
add_custom_command(
|
|
OUTPUT ${PROTO_GEN_SOURCES}
|
|
COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/gen_proto.py
|
|
--proto-dir ${PROTO_DIR}
|
|
--seeds ${PROTO_DIR}/seeds.txt
|
|
--out-dir ${PROTO_GEN_DIR}
|
|
--protoc ${PROTOC_EXECUTABLE}
|
|
--shards ${PROTO_SHARDS}
|
|
DEPENDS ${CMAKE_SOURCE_DIR}/tools/gen_proto.py ${PROTO_DIR}/seeds.txt ${PROTO_FILES}
|
|
COMMENT "Generating protocol structs"
|
|
VERBATIM)
|
|
|
|
set(CMDID_GEN_SOURCES ${CMAKE_SOURCE_DIR}/src/net/cmd_ids.h ${CMAKE_SOURCE_DIR}/src/net/cmd_ids.cpp)
|
|
add_custom_command(
|
|
OUTPUT ${CMDID_GEN_SOURCES}
|
|
COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/gen_cmdids.py
|
|
--input ${PROTO_DIR}/cmdids.txt --out-dir ${CMAKE_SOURCE_DIR}/src/net
|
|
DEPENDS ${CMAKE_SOURCE_DIR}/tools/gen_cmdids.py ${PROTO_DIR}/cmdids.txt
|
|
COMMENT "Generating command ids"
|
|
VERBATIM)
|
|
|
|
# ------------------------------------------------------------ third party ----
|
|
add_library(ikcp STATIC third_party/ikcp/ikcp.c)
|
|
target_include_directories(ikcp PUBLIC third_party/ikcp)
|
|
if(MSVC)
|
|
target_compile_options(ikcp PRIVATE /W0)
|
|
else()
|
|
target_compile_options(ikcp PRIVATE -w)
|
|
endif()
|
|
|
|
# ----------------------------------------------------------------- server ----
|
|
file(GLOB_RECURSE CAPYSR_SOURCES CONFIGURE_DEPENDS
|
|
${CMAKE_SOURCE_DIR}/src/core/*.cpp
|
|
${CMAKE_SOURCE_DIR}/src/data/*.cpp
|
|
${CMAKE_SOURCE_DIR}/src/game/*.cpp
|
|
${CMAKE_SOURCE_DIR}/src/http/*.cpp
|
|
${CMAKE_SOURCE_DIR}/src/net/*.cpp
|
|
${CMAKE_SOURCE_DIR}/src/sdk/*.cpp)
|
|
list(REMOVE_ITEM CAPYSR_SOURCES ${CMAKE_SOURCE_DIR}/src/net/cmd_ids.cpp)
|
|
|
|
# The generated headers are included by anything that touches the protocol, so every
|
|
# target has to wait for codegen -- not just the one that lists it as a source.
|
|
add_custom_target(capysr_codegen DEPENDS ${PROTO_GEN_SOURCES} ${CMDID_GEN_SOURCES})
|
|
|
|
add_library(capysr_core STATIC
|
|
${CAPYSR_SOURCES}
|
|
${PROTO_GEN_SOURCES}
|
|
${CMDID_GEN_SOURCES})
|
|
add_dependencies(capysr_core capysr_codegen)
|
|
|
|
target_include_directories(capysr_core PUBLIC
|
|
${CMAKE_SOURCE_DIR}/src
|
|
${CMAKE_SOURCE_DIR}/third_party
|
|
${CMAKE_SOURCE_DIR}/third_party/json)
|
|
|
|
target_link_libraries(capysr_core PUBLIC ikcp)
|
|
if(WIN32)
|
|
target_link_libraries(capysr_core PUBLIC ws2_32 mswsock)
|
|
else()
|
|
find_package(Threads REQUIRED)
|
|
target_link_libraries(capysr_core PUBLIC Threads::Threads)
|
|
endif()
|
|
|
|
add_executable(capysr src/main.cpp)
|
|
add_dependencies(capysr capysr_codegen)
|
|
target_link_libraries(capysr PRIVATE capysr_core)
|
|
|
|
# ------------------------------------------------------------------ tests ----
|
|
file(GLOB TEST_SOURCES CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/tests/*.cpp)
|
|
if(TEST_SOURCES)
|
|
add_executable(capysr_tests ${TEST_SOURCES})
|
|
add_dependencies(capysr_tests capysr_codegen)
|
|
target_include_directories(capysr_tests PRIVATE ${CMAKE_SOURCE_DIR})
|
|
target_link_libraries(capysr_tests PRIVATE capysr_core)
|
|
enable_testing()
|
|
add_test(NAME capysr_tests COMMAND capysr_tests)
|
|
endif()
|