# # YaPB - Counter-Strike Bot based on PODBot by Markus Klinge. # # Copyright © 2023 Velaron. # Copyright © YaPB Project Developers . # # SPDX-License-Identifier: MIT # cmake_minimum_required(VERSION 3.5) project(yapb VERSION 4.5 LANGUAGES CXX) set(CMAKE_SHARED_MODULE_PREFIX "") set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(YAPB_SRC "src/analyze.cpp" "src/botlib.cpp" "src/chatlib.cpp" "src/combat.cpp" "src/config.cpp" "src/control.cpp" "src/engine.cpp" "src/fakeping.cpp" "src/graph.cpp" "src/hooks.cpp" "src/linkage.cpp" "src/manager.cpp" "src/module.cpp" "src/message.cpp" "src/navigate.cpp" "src/planner.cpp" "src/practice.cpp" "src/sounds.cpp" "src/storage.cpp" "src/support.cpp" "src/tasks.cpp" "src/vision.cpp" "src/vistable.cpp" ) if(CMAKE_SYSTEM_NAME MATCHES "Emscripten") add_executable(${PROJECT_NAME} ${YAPB_SRC}) else () add_library(${PROJECT_NAME} SHARED ${YAPB_SRC}) endif () find_package(Git QUIET) if(GIT_FOUND) execute_process(COMMAND hostname OUTPUT_VARIABLE BUILD_MACHINE OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) execute_process(COMMAND git -C ${CMAKE_CURRENT_SOURCE_DIR} rev-parse --short HEAD OUTPUT_VARIABLE BUILD_HASH OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) execute_process(COMMAND git -C ${CMAKE_CURRENT_SOURCE_DIR} rev-list --count HEAD OUTPUT_VARIABLE BUILD_COUNT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) execute_process(COMMAND git -C ${CMAKE_CURRENT_SOURCE_DIR} log --pretty="%ae" -1 OUTPUT_VARIABLE BUILD_AUTHOR OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) set(BUILD_COMPILER ${CMAKE_CXX_COMPILER_ID}\ ${CMAKE_CXX_COMPILER_VERSION}) set(BUILD_VERSION ${PROJECT_VERSION}) string(REPLACE . , BUILD_WINVER ${PROJECT_VERSION}) configure_file(inc/version.h.in version.build.h @ONLY) target_compile_definitions(${PROJECT_NAME} PRIVATE VERSION_GENERATED) endif() if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i386|x86|x86_64|X86|amd64|AMD64)" AND NOT CMAKE_LIBRARY_ARCHITECTURE MATCHES "^(arm|aarch64|ppc)") set(BUILD_X86 true) endif() if((CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") AND NOT MSVC) target_compile_options(${PROJECT_NAME} PRIVATE -DCR_NATIVE_BUILD -flto=auto -fno-exceptions -fno-rtti -fno-threadsafe-statics -pthread) if(NOT CMAKE_SYSTEM_NAME MATCHES "Emscripten") if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "arm64") target_compile_options(${PROJECT_NAME} PRIVATE -march=armv8-a+fp+simd) elseif(BUILD_X86) target_compile_options(${PROJECT_NAME} PRIVATE -mmmx -msse -msse2 -msse3 -mfpmath=sse) endif() else () #target_compile_options(${PROJECT_NAME} PRIVATE -msse -msse2 -msse3 -msimd128 -fPIC) target_compile_definitions(${PROJECT_NAME} PRIVATE CR_DISABLE_SIMD) target_compile_options(${PROJECT_NAME} PRIVATE -fPIC -fvisibility=hidden) target_link_options(${PROJECT_NAME} PRIVATE -sSIDE_MODULE=1) set_target_properties(${PROJECT_NAME} PROPERTIES SUFFIX ".wasm") endif () if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") target_compile_options(${PROJECT_NAME} PRIVATE -funroll-loops -fomit-frame-pointer -fno-stack-protector -fvisibility=hidden -fvisibility-inlines-hidden -fno-math-errno) if(NOT WIN32 AND BUILD_X86) target_compile_options(${PROJECT_NAME} PRIVATE -fdata-sections -ffunction-sections -fcf-protection=none -fno-plt) if(NOT APPLE) target_link_options(${PROJECT_NAME} PRIVATE -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/ext/ldscripts/version.lds -Wl,--gc-sections) endif() if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") target_compile_options(${PROJECT_NAME} PRIVATE -fgraphite-identity -floop-nest-optimize) target_link_options(${PROJECT_NAME} PRIVATE -fgraphite-identity -floop-nest-optimize) endif() endif() if(NOT WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "GNU") target_link_options(${PROJECT_NAME} PRIVATE -flto-partition=none) endif() else() target_compile_options(${PROJECT_NAME} PRIVATE -g3 -ggdb -DDEBUG -D_FORTIFY_SOURCE=2) endif() if(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "GNU") target_link_options(${PROJECT_NAME} PRIVATE -Wl,--kill-at) if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "12") target_link_options(${PROJECT_NAME} PRIVATE -Xlinker --script -Xlinker ${CMAKE_CURRENT_SOURCE_DIR}/ext/ldscripts/i386pe.lds) endif() endif() if(WIN32 AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_link_options(${PROJECT_NAME} PRIVATE -static-libgcc) endif() if(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") set_property(TARGET ${PROJECT_NAME} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") endif() if(VITA) target_compile_options(${PROJECT_NAME} PRIVATE -fno-use-cxa-atexit) else() if(CMAKE_SIZEOF_VOID_P EQUAL 8 OR CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm" OR CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc") target_compile_options(${PROJECT_NAME} PRIVATE -fPIC) target_link_options(${PROJECT_NAME} PRIVATE -fPIC) endif() endif() elseif(WIN32 AND MSVC) set_property(TARGET ${PROJECT_NAME} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") target_compile_options(${PROJECT_NAME} PRIVATE /Zc:threadSafeInit- /GS- /Ob2 /Oy /Oi /Ot /fp:precise /GF /Gw /arch:SSE2 /Zi /guard:ehcont- /guard:cf- /DEBUG) target_link_options(${PROJECT_NAME} PRIVATE /OPT:REF,ICF /GUARD:NO /LTCG delayimp.lib /DELAYLOAD:user32.dll /DELAYLOAD:ws2_32.dll) if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_compile_options(${PROJECT_NAME} PRIVATE /GL) endif() endif() endif() if(WIN32 OR MINGW) target_link_libraries(${PROJECT_NAME} PRIVATE user32 ws2_32) target_sources(${PROJECT_NAME} PRIVATE "vc/yapb.rc") elseif(ANDROID) target_link_libraries(${PROJECT_NAME} PRIVATE m dl log) elseif(NOT VITA) target_link_libraries(${PROJECT_NAME} PRIVATE m dl pthread) endif() target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} "inc" "ext" "ext/crlib" "ext/linkage" ) if(COMMAND set_target_postfix) set_target_postfix(${PROJECT_NAME}) endif() install(TARGETS ${PROJECT_NAME} DESTINATION "${GAME_DIR}/${SERVER_INSTALL_DIR}/" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) if(MSVC) install(FILES $ DESTINATION "${GAME_DIR}/${SERVER_INSTALL_DIR}/" OPTIONAL) endif()