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) set(SYSTEM_SOURCE_FILES)
endif() endif()
set(SOURCE_FILES set(TOWNENGINE_SOURCE_FILES
third-party/physfs/extras/physfsrwops.c third-party/physfs/extras/physfsrwops.c
third-party/stb/stb_vorbis.c third-party/stb/stb_vorbis.c
third-party/glad/src/glad.c third-party/glad/src/glad.c
@ -46,6 +46,11 @@ set(SOURCE_FILES
src/input.c src/input.h src/input.c src/input.h
src/text.c src/text.h src/text.c src/text.h
src/camera.c src/camera.h src/camera.c src/camera.h
${SYSTEM_SOURCE_FILES}
)
set(GAME_SOURCE_FILES
src/game_api.h src/game_api.h
src/game/game.c src/game/game.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/scene.c src/game/scenes/scene.h
src/game/scenes/title.c src/game/scenes/title.h src/game/scenes/title.c src/game/scenes/title.h
src/game/scenes/ingame.c src/game/scenes/ingame.h src/game/scenes/ingame.c src/game/scenes/ingame.h
${SYSTEM_SOURCE_FILES}
) )
# target # base engine code, reused for games and tools
add_executable(${PROJECT_NAME} ${SOURCE_FILES}) add_library(${PROJECT_NAME} ${TOWNENGINE_SOURCE_FILES})
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCE_FILES}) source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${TOWNENGINE_SOURCE_FILES})
set_target_properties(${PROJECT_NAME} PROPERTIES set_target_properties(${PROJECT_NAME} PROPERTIES
C_STANDARD 11 C_STANDARD 11
@ -78,15 +81,14 @@ set(APP_NAME "townengine" CACHE STRING
set(PACKAGE_EXTENSION "btw" CACHE STRING set(PACKAGE_EXTENSION "btw" CACHE STRING
"File extension used to look for data archives") "File extension used to look for data archives")
# build options function(give_options target)
# LTO will be used on release builds
if(MSVC) if(MSVC)
# close enough i say # close enough i say
target_compile_options(${PROJECT_NAME} PRIVATE target_compile_options(${target} PRIVATE
/W4 /W4
$<$<CONFIG:Release>:/GL>) $<$<CONFIG:Release>:/GL>)
target_link_options(${PROJECT_NAME} PRIVATE target_link_options(${target} PRIVATE
$<$<CONFIG:Release>:/LTCG>) $<$<CONFIG:Release>:/LTCG>)
else() else()
@ -136,27 +138,30 @@ else()
-fsanitize=undefined -fsanitize=undefined
-fsanitize=address) -fsanitize=address)
target_compile_options(${PROJECT_NAME} PRIVATE target_compile_options(${target} PRIVATE
${WARNING_FLAGS} ${WARNING_FLAGS}
${BUILD_FLAGS} ${BUILD_FLAGS}
$<$<CONFIG:Release>:${BUILD_FLAGS_RELEASE}> $<$<CONFIG:Release>:${BUILD_FLAGS_RELEASE}>
$<$<CONFIG:Debug>:${BUILD_FLAGS_DEBUG}>) $<$<CONFIG:Debug>:${BUILD_FLAGS_DEBUG}>)
target_link_options(${PROJECT_NAME} PRIVATE target_link_options(${target} PRIVATE
${BUILD_FLAGS} ${BUILD_FLAGS}
$<$<CONFIG:Release>:${BUILD_FLAGS_RELEASE}> $<$<CONFIG:Release>:${BUILD_FLAGS_RELEASE}>
$<$<CONFIG:Debug>:${BUILD_FLAGS_DEBUG}>) $<$<CONFIG:Debug>:${BUILD_FLAGS_DEBUG}>)
endif() endif()
target_compile_definitions(${PROJECT_NAME} PRIVATE target_compile_definitions(${target} PRIVATE
ORGANIZATION_NAME="${ORGANIZATION_NAME}" ORGANIZATION_NAME="${ORGANIZATION_NAME}"
APP_NAME="${APP_NAME}" APP_NAME="${APP_NAME}"
PACKAGE_EXTENSION="${PACKAGE_EXTENSION}") PACKAGE_EXTENSION="${PACKAGE_EXTENSION}")
endfunction()
function(link_and_include_deps target)
# header-only libraries should be marked as "system includes" # header-only libraries should be marked as "system includes"
# to suppress compiler warnings in their code (it's not my problem after all) # to suppress compiler warnings in their code (it's not my problem after all)
target_include_directories(${PROJECT_NAME} target_include_directories(${target}
SYSTEM SYSTEM
PRIVATE PRIVATE
third-party/physfs/src third-party/physfs/src
@ -166,14 +171,30 @@ target_include_directories(${PROJECT_NAME}
third-party/stb third-party/stb
) )
target_link_libraries(${target} PUBLIC
SDL2::SDL2
SDL2::SDL2main
SDL2_image::SDL2_image
SDL2_ttf::SDL2_ttf
physfs-static
xms
)
endfunction()
function(use_townengine target)
# system libraries # system libraries
find_library(MATH_LIBRARY m) find_library(MATH_LIBRARY m)
if(MATH_LIBRARY) if(MATH_LIBRARY)
target_link_libraries(${PROJECT_NAME} PUBLIC ${MATH_LIBRARY}) target_link_libraries(${target} PUBLIC ${MATH_LIBRARY})
endif() endif()
give_options(${target})
link_and_include_deps(${target})
# third-party libraries # third-party libraries
target_link_libraries(${PROJECT_NAME} PUBLIC target_link_libraries(${target} PUBLIC
${PROJECT_NAME}
SDL2::SDL2 SDL2::SDL2
SDL2::SDL2main SDL2::SDL2main
SDL2_image::SDL2_image SDL2_image::SDL2_image
@ -183,11 +204,18 @@ target_link_libraries(${PROJECT_NAME} PUBLIC
) )
# copy dlls for baby windows # copy dlls for baby windows
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD add_custom_command(TARGET ${target} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${PROJECT_NAME}> COMMAND ${CMAKE_COMMAND} -E copy -t $<TARGET_FILE_DIR:${target}>
$<TARGET_RUNTIME_DLLS:${PROJECT_NAME}> $<TARGET_RUNTIME_DLLS:${target}>
COMMAND_EXPAND_LISTS 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 # zip up assets
# currently, you must run cmake from the project root dir for this to work correctly # currently, you must run cmake from the project root dir for this to work correctly