separate game and townengine builds for reuse in tools

This commit is contained in:
veclav talica 2024-07-29 22:53:26 +03:00
parent ff077c5d0d
commit 09f2f82d27

View File

@ -31,7 +31,7 @@ else()
set(SYSTEM_SOURCE_FILES)
endif()
set(SOURCE_FILES
set(TOWNENGINE_SOURCE_FILES
third-party/physfs/extras/physfsrwops.c
third-party/stb/stb_vorbis.c
third-party/glad/src/glad.c
@ -46,6 +46,11 @@ set(SOURCE_FILES
src/input.c src/input.h
src/text.c src/text.h
src/camera.c src/camera.h
${SYSTEM_SOURCE_FILES}
)
set(GAME_SOURCE_FILES
src/game_api.h
src/game/game.c src/game/game.h
@ -57,13 +62,11 @@ set(SOURCE_FILES
src/game/scenes/scene.c src/game/scenes/scene.h
src/game/scenes/title.c src/game/scenes/title.h
src/game/scenes/ingame.c src/game/scenes/ingame.h
${SYSTEM_SOURCE_FILES}
)
# target
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCE_FILES})
# base engine code, reused for games and tools
add_library(${PROJECT_NAME} ${TOWNENGINE_SOURCE_FILES})
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${TOWNENGINE_SOURCE_FILES})
set_target_properties(${PROJECT_NAME} PROPERTIES
C_STANDARD 11
@ -78,116 +81,141 @@ set(APP_NAME "townengine" CACHE STRING
set(PACKAGE_EXTENSION "btw" CACHE STRING
"File extension used to look for data archives")
# build options
# LTO will be used on release builds
if(MSVC)
# close enough i say
target_compile_options(${PROJECT_NAME} PRIVATE
/W4
$<$<CONFIG:Release>:/GL>)
function(give_options target)
if(MSVC)
# close enough i say
target_compile_options(${target} PRIVATE
/W4
$<$<CONFIG:Release>:/GL>)
target_link_options(${PROJECT_NAME} PRIVATE
$<$<CONFIG:Release>:/LTCG>)
target_link_options(${target} PRIVATE
$<$<CONFIG:Release>:/LTCG>)
else()
set(WARNING_FLAGS_CLANG
-Weverything
-Wno-padded
-Wno-declaration-after-statement
-Wno-unsafe-buffer-usage
-Wno-unused-command-line-argument)
else()
set(WARNING_FLAGS_CLANG
-Weverything
-Wno-padded
-Wno-declaration-after-statement
-Wno-unsafe-buffer-usage
-Wno-unused-command-line-argument)
set(WARNING_FLAGS
-Wall
-Wextra
-Wpedantic
-Wshadow
-Wdouble-promotion
-Wconversion -Wno-sign-conversion
-Werror=vla
$<$<STREQUAL:${CMAKE_C_COMPILER_ID},Gnu>:-Wcast-align=strict>
$<$<STREQUAL:${CMAKE_C_COMPILER_ID},Clang>:${WARNING_FLAGS_CLANG}>)
set(WARNING_FLAGS
-Wall
-Wextra
-Wpedantic
-Wshadow
-Wdouble-promotion
-Wconversion -Wno-sign-conversion
-Werror=vla
$<$<STREQUAL:${CMAKE_C_COMPILER_ID},Gnu>:-Wcast-align=strict>
$<$<STREQUAL:${CMAKE_C_COMPILER_ID},Clang>:${WARNING_FLAGS_CLANG}>)
set(BUILD_FLAGS
# these SHOULDN'T break anything...
-fno-math-errno
-ffp-contract=fast
-fno-signed-zeros
-fno-trapping-math
-freciprocal-math)
set(BUILD_FLAGS
# these SHOULDN'T break anything...
-fno-math-errno
-ffp-contract=fast
-fno-signed-zeros
-fno-trapping-math
-freciprocal-math)
set(BUILD_FLAGS_RELEASE
-O3
-flto
-mavx -mavx2
-Wl,--gc-sections
-fdata-sections
-ffunction-sections
-funroll-loops
-fomit-frame-pointer
$<$<STREQUAL:${CMAKE_C_COMPILER_ID},Gnu>:-fallow-store-data-races>)
set(BUILD_FLAGS_RELEASE
-O3
-flto
-mavx -mavx2
-Wl,--gc-sections
-fdata-sections
-ffunction-sections
-funroll-loops
-fomit-frame-pointer
$<$<STREQUAL:${CMAKE_C_COMPILER_ID},Gnu>:-fallow-store-data-races>)
set(BUILD_FLAGS_DEBUG
-O0
-g3
-gdwarf
-fno-omit-frame-pointer
-fstack-protector-all
-fsanitize=undefined
-fsanitize=address)
set(BUILD_FLAGS_DEBUG
-O0
-g3
-gdwarf
-fno-omit-frame-pointer
-fstack-protector-all
-fsanitize=undefined
-fsanitize=address)
target_compile_options(${PROJECT_NAME} PRIVATE
${WARNING_FLAGS}
${BUILD_FLAGS}
$<$<CONFIG:Release>:${BUILD_FLAGS_RELEASE}>
$<$<CONFIG:Debug>:${BUILD_FLAGS_DEBUG}>)
target_compile_options(${target} PRIVATE
${WARNING_FLAGS}
${BUILD_FLAGS}
$<$<CONFIG:Release>:${BUILD_FLAGS_RELEASE}>
$<$<CONFIG:Debug>:${BUILD_FLAGS_DEBUG}>)
target_link_options(${PROJECT_NAME} PRIVATE
${BUILD_FLAGS}
$<$<CONFIG:Release>:${BUILD_FLAGS_RELEASE}>
$<$<CONFIG:Debug>:${BUILD_FLAGS_DEBUG}>)
target_link_options(${target} PRIVATE
${BUILD_FLAGS}
$<$<CONFIG:Release>:${BUILD_FLAGS_RELEASE}>
$<$<CONFIG:Debug>:${BUILD_FLAGS_DEBUG}>)
endif()
endif()
target_compile_definitions(${PROJECT_NAME} PRIVATE
ORGANIZATION_NAME="${ORGANIZATION_NAME}"
APP_NAME="${APP_NAME}"
PACKAGE_EXTENSION="${PACKAGE_EXTENSION}")
target_compile_definitions(${target} PRIVATE
ORGANIZATION_NAME="${ORGANIZATION_NAME}"
APP_NAME="${APP_NAME}"
PACKAGE_EXTENSION="${PACKAGE_EXTENSION}")
endfunction()
# header-only libraries should be marked as "system includes"
# to suppress compiler warnings in their code (it's not my problem after all)
target_include_directories(${PROJECT_NAME}
SYSTEM
PRIVATE
third-party/physfs/src
third-party/physfs/extras
third-party/libxm/include
third-party/glad/include
third-party/stb
)
# system libraries
find_library(MATH_LIBRARY m)
if(MATH_LIBRARY)
target_link_libraries(${PROJECT_NAME} PUBLIC ${MATH_LIBRARY})
endif()
function(link_and_include_deps target)
# header-only libraries should be marked as "system includes"
# to suppress compiler warnings in their code (it's not my problem after all)
target_include_directories(${target}
SYSTEM
PRIVATE
third-party/physfs/src
third-party/physfs/extras
third-party/libxm/include
third-party/glad/include
third-party/stb
)
# third-party libraries
target_link_libraries(${PROJECT_NAME} PUBLIC
SDL2::SDL2
SDL2::SDL2main
SDL2_image::SDL2_image
SDL2_ttf::SDL2_ttf
physfs-static
xms
)
target_link_libraries(${target} PUBLIC
SDL2::SDL2
SDL2::SDL2main
SDL2_image::SDL2_image
SDL2_ttf::SDL2_ttf
physfs-static
xms
)
endfunction()
# copy dlls for baby windows
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${PROJECT_NAME}>
$<TARGET_RUNTIME_DLLS:${PROJECT_NAME}>
COMMAND_EXPAND_LISTS
)
function(use_townengine target)
# system libraries
find_library(MATH_LIBRARY m)
if(MATH_LIBRARY)
target_link_libraries(${target} PUBLIC ${MATH_LIBRARY})
endif()
give_options(${target})
link_and_include_deps(${target})
# third-party libraries
target_link_libraries(${target} PUBLIC
${PROJECT_NAME}
SDL2::SDL2
SDL2::SDL2main
SDL2_image::SDL2_image
SDL2_ttf::SDL2_ttf
physfs-static
xms
)
# copy dlls for baby windows
add_custom_command(TARGET ${target} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${target}>
$<TARGET_RUNTIME_DLLS:${target}>
COMMAND_EXPAND_LISTS
)
endfunction()
give_options(${PROJECT_NAME})
link_and_include_deps(${PROJECT_NAME})
add_executable(game ${GAME_SOURCE_FILES})
use_townengine(game)
# zip up assets
# currently, you must run cmake from the project root dir for this to work correctly