From 1bb33d3f34984c47a1feb98f2931642029030c82 Mon Sep 17 00:00:00 2001 From: veclavtalica Date: Tue, 27 Aug 2024 13:05:10 +0300 Subject: [PATCH] update cmake to work with linux, plus some cleanup --- CMakeLists.txt | 183 ++++++++++++++++++++++++------------------------- 1 file changed, 90 insertions(+), 93 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d83e9c..c92d173 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,18 +2,22 @@ cmake_minimum_required(VERSION 3.21) project(townengine LANGUAGES C) -# dependencies +# SDL dependencies find_package(SDL2 REQUIRED GLOBAL) find_package(SDL2_image REQUIRED GLOBAL) find_package(SDL2_ttf REQUIRED GLOBAL) -if (NOT CMAKE_BUILD_TYPE) +# CMake actually has no default configuration and it's toolchain file dependent, set debug if not specified +if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug) -endif () +endif() + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(TWN_TARGET townengine CACHE INTERNAL "") set(TWN_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "") +# feature configuration, set them with -DFEATURE=ON/OFF in cli option(TWN_FEATURE_DYNLIB_GAME "Enable dynamic library loading support" ON) option(TWN_ARCHIVE_DATA "Enable archival of assets" OFF) @@ -31,8 +35,8 @@ set(PHYSFS_ARCHIVE_QPAK OFF) set(PHYSFS_ARCHIVE_SLB OFF) set(PHYSFS_ARCHIVE_ISO9660 OFF) set(PHYSFS_ARCHIVE_VDF OFF) -add_subdirectory(third-party/physfs) -add_subdirectory(third-party/libxm) +add_subdirectory(third-party/physfs SYSTEM) +add_subdirectory(third-party/libxm SYSTEM) if(UNIX) @@ -65,11 +69,11 @@ set(TWN_SOURCE_FILES list(TRANSFORM TWN_SOURCE_FILES PREPEND ${TWN_ROOT_DIR}/) # base engine code, reused for games and tools -if (TWN_FEATURE_DYNLIB_GAME) +if(TWN_FEATURE_DYNLIB_GAME) add_library(${TWN_TARGET} SHARED ${TWN_SOURCE_FILES}) -else () +else() add_library(${TWN_TARGET} STATIC ${TWN_SOURCE_FILES}) -endif () +endif() source_group(TREE ${TWN_ROOT_DIR} FILES ${TWN_SOURCE_FILES}) @@ -78,11 +82,12 @@ set_target_properties(${TWN_TARGET} PROPERTIES C_STANDARD_REQUIRED ON C_EXTENSIONS ON) # extensions are required by stb_ds.h +# precompile commonly used not-so-small headers target_precompile_headers(${TWN_TARGET} PRIVATE third-party/glad/include/glad/glad.h third-party/stb/stb_ds.h) -# distribution definitions +# distribution definitions, set them with -DX=X in cli set(ORGANIZATION_NAME "wanp" CACHE STRING "App developer/publisher's identifier") set(APP_NAME "townengine" CACHE STRING @@ -90,75 +95,64 @@ set(APP_NAME "townengine" CACHE STRING set(PACKAGE_EXTENSION "btw" CACHE STRING "File extension used to look for data archives") + function(give_options target) - if(MSVC) - # close enough i say - target_compile_options(${target} PRIVATE - /W4 - $<$:/GL>) + set(WARNING_FLAGS_CLANG + -Weverything + -Wno-padded + -Wno-declaration-after-statement + -Wno-unsafe-buffer-usage + -Wno-unused-command-line-argument) - target_link_options(${target} PRIVATE - $<$:/LTCG>) + set(WARNING_FLAGS + -Wall + -Wextra + -Wpedantic + -Wshadow + -Wdouble-promotion + -Wconversion -Wno-sign-conversion + -Werror=vla + $<$:-Wcast-align=strict> + $<$:${WARNING_FLAGS_CLANG}>) - else() - set(WARNING_FLAGS_CLANG - -Weverything - -Wno-padded - -Wno-declaration-after-statement - -Wno-unsafe-buffer-usage - -Wno-unused-command-line-argument) + set(BUILD_FLAGS + # these SHOULDN'T break anything... + -fno-math-errno + -ffp-contract=fast + -fno-signed-zeros + -fno-trapping-math + -freciprocal-math) - set(WARNING_FLAGS - -Wall - -Wextra - -Wpedantic - -Wshadow - -Wdouble-promotion - -Wconversion -Wno-sign-conversion - -Werror=vla - $<$:-Wcast-align=strict> - $<$:${WARNING_FLAGS_CLANG}>) + 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 - # these SHOULDN'T break anything... - -fno-math-errno - -ffp-contract=fast - -fno-signed-zeros - -fno-trapping-math - -freciprocal-math) + set(BUILD_FLAGS_DEBUG + -O0 + -g3 + -gdwarf + -fno-omit-frame-pointer + -fstack-protector-all + -fsanitize=undefined + -fsanitize=address) - set(BUILD_FLAGS_RELEASE - -O3 - -flto - -mavx -mavx2 - -Wl,--gc-sections - -fdata-sections - -ffunction-sections - -funroll-loops - -fomit-frame-pointer - $<$:-fallow-store-data-races>) + target_compile_options(${target} PRIVATE + ${WARNING_FLAGS} + ${BUILD_FLAGS} + $<$:${BUILD_FLAGS_RELEASE}> + $<$:${BUILD_FLAGS_DEBUG}>) - set(BUILD_FLAGS_DEBUG - -O0 - -g3 - -gdwarf - -fno-omit-frame-pointer - -fstack-protector-all - -fsanitize=undefined - -fsanitize=address) - - target_compile_options(${target} PRIVATE - ${WARNING_FLAGS} - ${BUILD_FLAGS} - $<$:${BUILD_FLAGS_RELEASE}> - $<$:${BUILD_FLAGS_DEBUG}>) - - target_link_options(${target} PRIVATE - ${BUILD_FLAGS} - $<$:${BUILD_FLAGS_RELEASE}> - $<$:${BUILD_FLAGS_DEBUG}>) - - endif() + target_link_options(${target} PRIVATE + ${BUILD_FLAGS} + $<$:${BUILD_FLAGS_RELEASE}> + $<$:${BUILD_FLAGS_DEBUG}>) target_compile_definitions(${target} PRIVATE ORGANIZATION_NAME="${ORGANIZATION_NAME}" @@ -198,7 +192,7 @@ endfunction() function(use_townengine target sources output_directory data_dir) - if (TWN_FEATURE_DYNLIB_GAME) + if(TWN_FEATURE_DYNLIB_GAME) # game shared library, for reloading add_library(${target}_game SHARED ${sources}) give_options(${target}_game) @@ -216,9 +210,10 @@ function(use_townengine target sources output_directory data_dir) # put libtownengine.so alongside the binary set_target_properties(${TWN_TARGET} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${output_directory}) - else () + else() + # build and link all statically add_executable(${target}_app ${sources}) - endif () + endif() set_target_properties(${target}_app PROPERTIES OUTPUT_NAME launcher @@ -228,7 +223,7 @@ function(use_townengine target sources output_directory data_dir) find_library(MATH_LIBRARY m) if (MATH_LIBRARY) target_link_libraries(${target}_app PUBLIC ${MATH_LIBRARY}) - endif () + endif() give_options(${target}_app) include_deps(${target}_app) @@ -237,12 +232,15 @@ function(use_townengine target sources output_directory data_dir) set_target_properties(${target}_app PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${output_directory}) - # copy dlls for baby windows - add_custom_command(TARGET ${target}_app POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different $ - $ - COMMAND_EXPAND_LISTS) + if(WIN32) + # copy dlls for baby windows + add_custom_command(TARGET ${target}_app POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different $ + $ + COMMAND_EXPAND_LISTS) + endif() + # bootstrapping scripts are used to setup the expected state for an application set(TWN_BOOTSTRAP_EXEC_ARGS "$,--data-dir ./data.${PACKAGE_EXTENSION},--data-dir ${data_dir}>") @@ -256,7 +254,7 @@ function(use_townengine target sources output_directory data_dir) CONTENT "${TWN_BOOTSTRAP_SH}" FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ) - if (WIN32) + if(WIN32) string(JOIN "\n" TWN_BOOTSTRAP_BAT "pushd \"%~dp0\"" "launcher ${TWN_BOOTSTRAP_EXEC_ARGS}" @@ -265,14 +263,14 @@ function(use_townengine target sources output_directory data_dir) FILE(GENERATE OUTPUT ${output_directory}/${target}.bat CONTENT "${TWN_BOOTSTRAP_BAT}" FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ) - endif () + endif() if (TWN_ARCHIVE_DATA) # zip up assets - add_custom_command(TARGET ${target}_app POST_BUILD - COMMAND cd ${data_dir} && ${CMAKE_COMMAND} -E tar "cf" ${output_directory}/data.${PACKAGE_EXTENSION} --format=zip ./ - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - endif () + add_custom_target(archive-data ALL + COMMAND cd ${data_dir} && ${CMAKE_COMMAND} -E tar "cf" ${output_directory}/data.${PACKAGE_EXTENSION} --format=zip ./ + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + endif() endfunction() give_options(${TWN_TARGET}) @@ -280,12 +278,11 @@ include_deps(${TWN_TARGET}) link_deps(${TWN_TARGET}) # build the testgame if this cmake list is built directly -if (${CMAKE_PROJECT_NAME} MATCHES townengine) +if(${CMAKE_PROJECT_NAME} MATCHES townengine) add_subdirectory(apps/testgame) -endif () +endif() -# move compie_commands.json into root directory so that it plays nicer with editors -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -add_custom_command(TARGET ${TWN_TARGET} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/compile_commands.json - ${TWN_ROOT_DIR}) +# move compie_commands.json into root directory so that it plays nicer with code editors without any configuration +add_custom_target(copy-compile-commands ALL + ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/compile_commands.json + ${TWN_ROOT_DIR})