cmake_minimum_required(VERSION 3.21) project(townengine LANGUAGES C) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # dependencies find_package(SDL2 REQUIRED) find_package(SDL2_image REQUIRED) find_package(SDL2_ttf REQUIRED) if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug) endif () set(PHYSFS_BUILD_SHARED FALSE) set(PHYSFS_DISABLE_INSTALL TRUE) set(PHYSFS_TARGETNAME_UNINSTALL "physfs_uninstall") add_subdirectory(third-party/physfs) add_subdirectory(third-party/libxm) if(UNIX) set(SYSTEM_SOURCE_FILES src/system/linux/elf.c ) else() set(SYSTEM_SOURCE_FILES) endif() set(SOURCE_FILES third-party/physfs/extras/physfsrwops.c third-party/stb/stb_vorbis.c third-party/glad/src/glad.c src/config.h src/context.h src/context.c src/main.c src/audio.c src/util.c src/util.h src/rendering.c src/rendering.h src/textures.c src/textures.h src/input.c src/input.h src/text.c src/text.h src/game_api.h src/game/game.c src/game/game.h src/game/state.h src/game/player.c src/game/player.h src/game/world.c src/game/world.h 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}) set_target_properties(${PROJECT_NAME} PROPERTIES C_STANDARD 11 C_STANDARD_REQUIRED ON C_EXTENSIONS ON) # extensions are required by stb_ds.h # distribution definitions set(ORGANIZATION_NAME "wanp" CACHE STRING "App developer/publisher's identifier") set(APP_NAME "townengine" CACHE STRING "App identifier") 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>) target_link_options(${PROJECT_NAME} PRIVATE $<$:/LTCG>) 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(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_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_link_options(${PROJECT_NAME} 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}") # 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() # third-party libraries target_link_libraries(${PROJECT_NAME} PUBLIC SDL2::SDL2 SDL2::SDL2main SDL2_image::SDL2_image SDL2_ttf::SDL2_ttf physfs-static xms ) # copy dlls for baby windows add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy -t $ $ COMMAND_EXPAND_LISTS ) # zip up assets # currently, you must run cmake from the project root dir for this to work correctly #file(ARCHIVE_CREATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/data.${PACKAGE_EXTENSION} # PATHS ${PROJECT_SOURCE_DIR}/assets # FORMAT zip #)