# CMakeLists.txt # Written by JackCarterSmith, 2024 # 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) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -march=native -mavx2 -mfma -msse4.2") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Wall") 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) include(FindPkgConfig) include(CheckIncludeFile) include(CheckCSourceCompiles) # Find libraries find_package(SFML REQUIRED) include_directories(sfml::sfml) include_directories("3rdParty") # 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}) 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" ) target_link_libraries(${PROJECT_NAME} sfml::sfml) set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME}${BUILDNAME_SUFFIX} CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON ) # targets build options if(MSVC) # msvc does not append 'lib' - do it here to have consistent name set_target_properties(${PROJECT_NAME} PROPERTIES IMPORT_PREFIX "lib") endif() 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() # 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 #)