diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e31ba7..152b8df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 - $<$:/GL>) +function(give_options target) + if(MSVC) + # close enough i say + target_compile_options(${target} PRIVATE + /W4 + $<$:/GL>) - target_link_options(${PROJECT_NAME} PRIVATE - $<$:/LTCG>) + target_link_options(${target} PRIVATE + $<$:/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 - $<$:-Wcast-align=strict> - $<$:${WARNING_FLAGS_CLANG}>) + set(WARNING_FLAGS + -Wall + -Wextra + -Wpedantic + -Wshadow + -Wdouble-promotion + -Wconversion -Wno-sign-conversion + -Werror=vla + $<$:-Wcast-align=strict> + $<$:${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 - $<$:-fallow-store-data-races>) + set(BUILD_FLAGS_RELEASE + -O3 + -flto + -mavx -mavx2 + -Wl,--gc-sections + -fdata-sections + -ffunction-sections + -funroll-loops + -fomit-frame-pointer + $<$:-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} - $<$:${BUILD_FLAGS_RELEASE}> - $<$:${BUILD_FLAGS_DEBUG}>) + target_compile_options(${target} PRIVATE + ${WARNING_FLAGS} + ${BUILD_FLAGS} + $<$:${BUILD_FLAGS_RELEASE}> + $<$:${BUILD_FLAGS_DEBUG}>) - target_link_options(${PROJECT_NAME} PRIVATE - ${BUILD_FLAGS} - $<$:${BUILD_FLAGS_RELEASE}> - $<$:${BUILD_FLAGS_DEBUG}>) - -endif() + target_link_options(${target} PRIVATE + ${BUILD_FLAGS} + $<$:${BUILD_FLAGS_RELEASE}> + $<$:${BUILD_FLAGS_DEBUG}>) + + 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 $ - $ - 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 $ + $ + 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