# CMakeLists.txt # Written by JackCarterSmith, 2025 # This file is released under the ProtoTank license. cmake_minimum_required(VERSION 3.23) cmake_policy(VERSION 3.23) if(NOT DEFINED PROJECT_BINARY_DIR) set(PROJECT_BINARY_DIR ".") endif() if(NOT MSVC) add_compile_options(-Wall) else() add_compile_options(/Wall /wd4710 /wd4711) endif() set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) # define project project(ProtoTank VERSION 0.1.0 DESCRIPTION "Arcade 80s-style game with tanks" LANGUAGES C CXX) #configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/config.h @ONLY) # Compilation option option(DISABLE_CPU_OPTI "Disable CPU optimizations" OFF) option(ENABLE_PROFILER "Enable gprof integration" ON) if(NOT DISABLE_CPU_OPTI) if(NOT MSVC) #add_compile_options(-march=native -mtune=generic) add_compile_options(-march=native -mtune=native) add_compile_options(-msse2 -msse4.2 -mavx -mavx2 -mfma) else() add_compile_options(/fp:fast /arch:SSE2 /arch:SSE4.2 /arch:AVX /arch:AVX2 /GL) endif() endif() include(FindPkgConfig) include(CheckIncludeFile) include(CheckCSourceCompiles) # Find libraries find_package(fmt REQUIRED) find_package(SFML REQUIRED) include_directories(fmt::fmt) include_directories(sfml::sfml) include_directories("3rdParty") list(APPEND EXTLIBS "fmt::fmt" "sfml::sfml") # define src/headers files groups include(srcs.list) set(BUILDNAME_SUFFIX _v${PROJECT_VERSION}) if(DISABLE_CPU_OPTI) set(BUILDNAME_SUFFIX ${BUILDNAME_SUFFIX}_noSIMD) endif() # targets declarations add_executable(${PROJECT_NAME}) set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME}${BUILDNAME_SUFFIX} CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON ) target_precompile_headers(${PROJECT_NAME} PRIVATE "$<$:>" "$<$:>" "$<$:>" "$<$:>" #"$<$:>" "$<$:${CMAKE_CURRENT_SOURCE_DIR}/3rdParty/tiny_obj_loader.h>" "$<$:${CMAKE_CURRENT_SOURCE_DIR}/Engine/Utils/3DMaths.hpp>" ) target_sources(${PROJECT_NAME} PUBLIC ${MAIN_SCRS} ${UTILS_SCRS} ${MISC_SCRS} ${GAME_SCRS} ${GRAPHS_SCRS} ${SOUNDS_SCRS}) target_sources(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/3rdParty/tiny_obj_loader.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Engine/Utils/3DMaths_vec.inl" "${CMAKE_CURRENT_SOURCE_DIR}/Engine/Utils/3DMaths_mat.inl" "${CMAKE_CURRENT_SOURCE_DIR}/Engine/Utils/3DMaths_bs.inl" "${CMAKE_CURRENT_SOURCE_DIR}/Engine/Utils/3DMaths_sc.inl" ) # targets build options if(DISABLE_CPU_OPTI) target_compile_definitions(${PROJECT_NAME} PUBLIC DISABLE_INTRINSICS) else() target_compile_definitions(${PROJECT_NAME} PUBLIC FMA3_INTRINSICS) target_compile_definitions(${PROJECT_NAME} PUBLIC AVX_INTRINSICS) target_compile_definitions(${PROJECT_NAME} PUBLIC AVX2_INTRINSICS) endif() if(MSVC) if(NOT DISABLE_CPU_OPTI) list(APPEND LINKLIBS -LTCG -FORCE:MULTIPLE) endif() list(APPEND LINKLIBS -FORCE:MULTIPLE) # msvc does not append 'lib' - do it here to have consistent name set_target_properties(${PROJECT_NAME} PROPERTIES IMPORT_PREFIX "lib") else() # GCC profiler options if(ENABLE_PROFILER) list(APPEND COMPOPTS -pg -ggdb3 -no-pie) list(APPEND LINKOPTS -pg -ggdb3 -no-pie) endif() # static linking of stdlib #if(MINGW) # list(APPEND LINKLIBS -static gcc stdc++ pthread -dynamic) #else() # list(APPEND LINKLIBS -Wl,-Bstatic -lgcc -lstdc++ -lpthread -Wl,-Bdynamic) #endif() endif() list(APPEND LINKLIBS ${EXTLIBS}) target_compile_options(${PROJECT_NAME} PRIVATE ${COMPOPTS}) target_link_options(${PROJECT_NAME} PRIVATE ${LINKOPTS}) target_link_libraries(${PROJECT_NAME} ${LINKLIBS}) # Linux file format patch add_custom_target(format-patch COMMAND dos2unix `git ls-files` WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) # GPG signature custom command #add_custom_command( # OUTPUT "" # COMMAND gpg --batch --detach-sign # -o ${PROJECT_NAME}_${CI_SYS_TARGET}.gpg # ${PROJECT_NAME} # DEPENDS ${PROJECT_NAME} # VERBATIM #)