ProtoTank/CMakeLists.txt
2025-02-04 13:43:33 +01:00

133 lines
4.2 KiB
CMake

# 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
"$<$<COMPILE_LANGUAGE:CXX>:<string$<ANGLE-R>>"
"$<$<COMPILE_LANGUAGE:CXX>:<stdexcept$<ANGLE-R>>"
"$<$<COMPILE_LANGUAGE:CXX>:<vector$<ANGLE-R>>"
"$<$<COMPILE_LANGUAGE:CXX>:<memory$<ANGLE-R>>"
#"$<$<COMPILE_LANGUAGE:CXX>:<fmt/core.h$<ANGLE-R>>"
"$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/3rdParty/tiny_obj_loader.h>"
"$<$<COMPILE_LANGUAGE:CXX>:${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
#)