396 lines
16 KiB
CMake
396 lines
16 KiB
CMake
cmake_minimum_required (VERSION 3.5)
|
||
|
||
# 使MT设置生效
|
||
if (POLICY CMP0091)
|
||
cmake_policy(SET CMP0091 NEW)
|
||
endif (POLICY CMP0091)
|
||
# LTO链接时优化
|
||
if(POLICY CMP0069)
|
||
cmake_policy(SET CMP0069 NEW)
|
||
endif()
|
||
|
||
project ("dlx")
|
||
|
||
|
||
set(LIBTYPE STATIC)
|
||
message("生成目标平台:${CMAKE_SYSTEM}")
|
||
|
||
message("------------------dl option------------------")
|
||
set(DL_VULKAN_DIR AUTO)
|
||
#set(DL_VULKAN_DIR D:/VulkanSDK/1.3.268.0)
|
||
#set(DL_VULKAN_DIR D:/VulkanSDK/1.3.250.0)
|
||
message("------------------dl option------------------")
|
||
|
||
# 传递 DL_EASY 禁用绘图
|
||
#set(DL_EASY false)
|
||
if(NOT DEFINED DL_EASY)
|
||
set(DL_EASY false)
|
||
endif()
|
||
|
||
if(DL_EASY)
|
||
set(DL_DISABLE_RENDER true)
|
||
set(DL_DISABLE_AUDIO true)
|
||
set(DL_USE_MT true)
|
||
#set(DL_USE_MT false)
|
||
else()
|
||
set(DL_DISABLE_RENDER false)
|
||
set(DL_DISABLE_AUDIO false)
|
||
set(DL_USE_MT true)
|
||
endif()
|
||
|
||
if(DL_USE_MT)
|
||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||
endif()
|
||
|
||
# 输出使clangd可以智能提示的 compile_commands.json
|
||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||
endif()
|
||
|
||
if(MSVC)
|
||
# 关闭 /showIncludes
|
||
# string(REPLACE "/showIncludes" "" CMAKE_DEPFILE_FLAGS_C "${CMAKE_DEPFILE_FLAGS_C}")
|
||
# string(REPLACE "/showIncludes" "" CMAKE_DEPFILE_FLAGS_CXX "${CMAKE_DEPFILE_FLAGS_CXX}")
|
||
endif()
|
||
|
||
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
|
||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Zi")
|
||
# release生成pdb
|
||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
|
||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
|
||
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
|
||
endif()
|
||
|
||
# 使用C++最新标准
|
||
set(CMAKE_CXX_STANDARD 23)
|
||
if (APPLE)
|
||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -lc++abi")
|
||
endif()
|
||
|
||
# JoltPhysic 安卓编译需要
|
||
set(CPP_RTTI_ENABLED ON)
|
||
# 预编译Jolt需要此定义
|
||
set(CPP_EXCEPTIONS_ENABLED ON)
|
||
set(CMAKE_DISABLE_PRECOMPILE_HEADERS ON)
|
||
# Jolt在linux使用了LTO,需要全局开启
|
||
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON)
|
||
|
||
# 暂时不太清楚以下哪个变量导致jolt安卓异常
|
||
set(USE_SSE4_1 OFF CACHE BOOL "" FORCE)
|
||
set(USE_SSE4_2 OFF CACHE BOOL "" FORCE)
|
||
set(USE_AVX OFF CACHE BOOL "" FORCE)
|
||
set(USE_AVX2 OFF CACHE BOOL "" FORCE)
|
||
set(USE_AVX512 OFF CACHE BOOL "" FORCE)
|
||
set(USE_LZCNT OFF CACHE BOOL "" FORCE)
|
||
set(USE_TZCNT OFF CACHE BOOL "" FORCE)
|
||
set(USE_F16C OFF CACHE BOOL "" FORCE)
|
||
set(USE_FMADD OFF CACHE BOOL "" FORCE)
|
||
|
||
#set(FLOATING_POINT_EXCEPTIONS_ENABLED OFF CACHE BOOL "" FORCE)
|
||
|
||
#set(CROSS_COMPILE_ARM OFF CACHE BOOL "" FORCE)
|
||
|
||
message("------------------第三方库option------------------")
|
||
option(BUILD_DOCS "关闭第三方库的文档生成" OFF)
|
||
option(INSTALL_MANPAGES "解决flac报错" OFF)
|
||
|
||
if (CMAKE_SYSTEM_NAME MATCHES "Android")
|
||
option(ALSOFT_INSTALL "解决安卓openal报错" OFF)
|
||
endif()
|
||
option(FT_DISABLE_ZLIB "freetype禁用内部zlib" ON)
|
||
option(FT_REQUIRE_ZLIB "freetype查找外部zlib" ON)
|
||
option(CURL_USE_LIBPSL "不使用libpsl" OFF)
|
||
option(CURL_USE_OPENSSL "使用openssl" ON)
|
||
|
||
# 关闭第三方库的额外生成
|
||
option(ALSOFT_UTILS "Build utility programs" OFF)
|
||
option(ALSOFT_NO_CONFIG_UTIL "Disable building the alsoft-config utility" ON)
|
||
option(ALSOFT_EXAMPLES "Build example programs" OFF)
|
||
|
||
option(RTMIDI_BUILD_TESTING "Build test programs" OFF)
|
||
|
||
option(WEBP_BUILD_ANIM_UTILS "Build animation utilities." OFF)
|
||
option(WEBP_BUILD_CWEBP "Build the cwebp command line tool." OFF)
|
||
option(WEBP_BUILD_DWEBP "Build the dwebp command line tool." OFF)
|
||
option(WEBP_BUILD_GIF2WEBP "Build the gif2webp conversion tool." OFF)
|
||
option(WEBP_BUILD_IMG2WEBP "Build the img2webp animation tool." OFF)
|
||
option(WEBP_BUILD_VWEBP "Build the vwebp viewer tool." OFF)
|
||
option(WEBP_BUILD_WEBPINFO "Build the webpinfo command line tool." OFF)
|
||
option(WEBP_BUILD_LIBWEBPMUX "Build the libwebpmux library." OFF)
|
||
option(WEBP_BUILD_WEBPMUX "Build the webpmux command line tool." OFF)
|
||
option(WEBP_BUILD_EXTRAS "Build extras." OFF)
|
||
option(WEBP_BUILD_WEBP_JS "Emscripten build of webp.js." OFF)
|
||
|
||
option(BUILD_PROGRAMS "Build and install programs" OFF)
|
||
option(BUILD_EXAMPLES "Build and install examples" OFF)
|
||
option(BUILD_TESTING "Build tests" OFF)
|
||
option(BUILD_DOCS "Build and install doxygen documents" OFF)
|
||
option(INSTALL_MANPAGES "Install MAN pages" OFF)
|
||
option(INSTALL_PKGCONFIG_MODULES "Install PkgConfig modules" OFF)
|
||
option(INSTALL_CMAKE_CONFIG_MODULE "Install CMake package-config module" OFF)
|
||
|
||
option(INFOWARE_EXAMPLES "Add infoware examples to the build." OFF)
|
||
option(INFOWARE_TESTS "Input tests for infoware." OFF)
|
||
|
||
option(ZLIB_BUILD_EXAMPLES "Enable Zlib Examples" OFF)
|
||
|
||
option(TINYGLTF_BUILD_LOADER_EXAMPLE "Build loader_example(load glTF and dump infos)" OFF)
|
||
option(TINYGLTF_BUILD_GL_EXAMPLES "Build GL exampels(requires glfw, OpenGL, etc)" OFF)
|
||
option(TINYGLTF_BUILD_TESTS "Build unit tests" OFF)
|
||
option(TINYGLTF_INSTALL "Install tinygltf files during install step. Usually set to OFF if you include tinygltf through add_subdirectory()" ON)
|
||
option(TINYGLTF_INSTALL_VENDOR "Install vendored nlohmann/json and nothings/stb headers" OFF)
|
||
|
||
option(LUNASVG_BUILD_EXAMPLES "Build examples" OFF)
|
||
|
||
option(BUILD_CURL_EXE "Build curl executable" OFF)
|
||
option(CURL_DISABLE_INSTALL "Disable installation targets" OFF)
|
||
|
||
# mimalloc 只使用静态库;强制关闭共享库/重定向,避免生成 mimalloc-debug.dll 与 mimalloc-redirect.lib
|
||
set(MI_BUILD_SHARED OFF CACHE BOOL "Build shared library" FORCE)
|
||
set(MI_BUILD_STATIC ON CACHE BOOL "Build static library" FORCE)
|
||
set(MI_BUILD_OBJECT OFF CACHE BOOL "Build object library" FORCE)
|
||
set(MI_BUILD_TESTS OFF CACHE BOOL "Build test executables" FORCE)
|
||
set(MI_WIN_REDIRECT OFF CACHE BOOL "Use redirection module on Windows" FORCE)
|
||
|
||
message("------------------解析第三方库------------------")
|
||
message("------------------lz4 压缩库-------------------")
|
||
add_subdirectory ("third/lz4")
|
||
message("------------------zlib 压缩库---------")
|
||
add_subdirectory ("third/zlib")
|
||
message("------------------fmt 文本格式化库--------------")
|
||
option(FMT_INSTALL "开启fmt的安装" ON)
|
||
add_subdirectory ("third/fmt")
|
||
|
||
message("------------------lunasvg svg格式库-----------")
|
||
add_subdirectory ("third/lunasvg")
|
||
message("------------------libwebp webp格式库-----------")
|
||
add_subdirectory ("third/libwebp")
|
||
message("------------------OpenXLSX xlsx格式库-----------")
|
||
add_subdirectory ("third/OpenXLSX")
|
||
|
||
if (NOT CMAKE_SYSTEM_NAME MATCHES "Android"
|
||
AND NOT DL_DISABLE_RENDER)
|
||
message("------------------glfw 窗口库------------------")
|
||
add_subdirectory ("third/glfw")
|
||
endif()
|
||
|
||
if(NOT DL_DISABLE_RENDER)
|
||
message("------------------freetype 字体解析库-----------")
|
||
add_subdirectory ("third/freetype")
|
||
message("------------------tinygltf gltf格式库-----------")
|
||
add_subdirectory ("third/tinygltf")
|
||
endif()
|
||
|
||
message("------------------ogg vorbis 音频格式库-----------")
|
||
add_subdirectory ("third/ogg")
|
||
set (OGG_LIBRARY "third/ogg")
|
||
set (OGG_INCLUDE_DIR "third/ogg")
|
||
add_subdirectory ("third/vorbis")
|
||
message("------------------flac 音频格式库-----------")
|
||
add_subdirectory ("third/flac")
|
||
message("------------------openal-soft 音频库-----------")
|
||
if (NOT CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||
# Mac系统(Darwin)下,先修复openal-soft的dl依赖问题
|
||
if (CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
||
# 定义CMAKE_DL_LIBS(Mac下指向系统dl库),避免openal-soft找不到dl目标
|
||
set(CMAKE_DL_LIBS "-ldl")
|
||
# 强制跳过openal-soft的export/install(核心报错点)
|
||
set(OPENAL_BUILD_INSTALL OFF CACHE BOOL "Disable OpenAL install" FORCE)
|
||
set(OPENAL_BUILD_EXAMPLES OFF CACHE BOOL "Disable OpenAL examples" FORCE)
|
||
endif()
|
||
# 再添加openal-soft子目录
|
||
add_subdirectory ("third/openal-soft")
|
||
endif()
|
||
message("------------------rtmidi midi库-----------")
|
||
if (NOT CMAKE_SYSTEM_NAME MATCHES "Android")
|
||
add_subdirectory ("third/rtmidi")
|
||
endif()
|
||
|
||
if (NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
|
||
message("------------------iconv 文本编码转换库-----------")
|
||
#add_subdirectory ("third/libiconv")
|
||
endif()
|
||
message("------------------angelscript 脚本语言库-----------")
|
||
add_subdirectory ("third/angelscript/angelscript/projects/cmake")
|
||
message("------------------lua 脚本语言库-----------")
|
||
add_subdirectory ("third/lua")
|
||
add_subdirectory ("third/LuaBridge3")
|
||
message("------------------infoware 硬件信息库-----------")
|
||
if (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "AMD64")
|
||
set(INFOWARE_PCI_IDS_PATH ${CMAKE_SOURCE_DIR}/third/infoware/pci.ids CACHE FILEPATH "使用本地piiids" FORCE)
|
||
add_subdirectory ("third/infoware")
|
||
endif()
|
||
|
||
message("------------------wcwidth 字符宽度检测-----------")
|
||
add_subdirectory ("third/wcwidth")
|
||
message("------------------simde 向量化计算-----------")
|
||
add_subdirectory ("third/simde")
|
||
message("------------------magic_enum 枚举静态反射-----------")
|
||
add_subdirectory ("third/magic_enum")
|
||
message("------------------cpp-subprocess 进程库-----------")
|
||
add_subdirectory ("third/cpp-subprocess")
|
||
message("------------------ktx ktx格式库-----------")
|
||
add_subdirectory ("third/ktx")
|
||
message("------------------JoltPhysics 物理引擎-----------")
|
||
add_subdirectory ("third/JoltPhysics/Build")
|
||
message("------------------mimalloc 内存分配-----------")
|
||
add_subdirectory ("third/mimalloc")
|
||
message("------------------GoogleTest 单元测试库-----------")
|
||
add_subdirectory ("third/googletest")
|
||
message("------------------curl http协议库-----------")
|
||
set(OPENSSL_ROOT_DIR ${CMAKE_SOURCE_DIR}/third/openssl)
|
||
|
||
# 先锁死 libcurl 编译选项
|
||
set(CURL_USE_OPENSSL ON CACHE BOOL "" FORCE)
|
||
set(CURL_USE_SCHANNEL OFF CACHE BOOL "" FORCE)
|
||
set(CURL_USE_LIBPSL OFF CACHE BOOL "" FORCE)
|
||
set(CURL_USE_LIBSSH2 OFF CACHE BOOL "" FORCE)
|
||
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
|
||
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
||
|
||
if(WIN32)
|
||
# 1. 自动判断架构 x64/x86
|
||
if(CMAKE_CL_64)
|
||
set(ARCH x64)
|
||
else()
|
||
set(ARCH x86)
|
||
endif()
|
||
|
||
# 2. 自动判断运行库 MT/MD
|
||
if(DL_USE_MT)
|
||
set(RT MT)
|
||
else()
|
||
set(RT MD)
|
||
endif()
|
||
|
||
# 3. 自动路径
|
||
set(OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT_DIR}/include)
|
||
set(OPENSSL_LIB_DIR ${OPENSSL_ROOT_DIR}/${ARCH}/${RT})
|
||
|
||
# 4. 精确 lib 文件
|
||
set(OPENSSL_SSL_LIBRARY ${OPENSSL_LIB_DIR}/libssl_static.lib)
|
||
set(OPENSSL_CRYPTO_LIBRARY ${OPENSSL_LIB_DIR}/libcrypto_static.lib)
|
||
|
||
# ==============================
|
||
# 关键:创建 OpenSSL::SSL OpenSSL::Crypto 目标
|
||
# ==============================
|
||
if(NOT TARGET OpenSSL::SSL)
|
||
add_library(OpenSSL::SSL UNKNOWN IMPORTED)
|
||
set_target_properties(OpenSSL::SSL PROPERTIES
|
||
IMPORTED_LOCATION ${OPENSSL_SSL_LIBRARY}
|
||
INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR})
|
||
endif()
|
||
|
||
if(NOT TARGET OpenSSL::Crypto)
|
||
add_library(OpenSSL::Crypto UNKNOWN IMPORTED)
|
||
set_target_properties(OpenSSL::Crypto PROPERTIES
|
||
IMPORTED_LOCATION ${OPENSSL_CRYPTO_LIBRARY}
|
||
INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR})
|
||
endif()
|
||
|
||
# 强制写入缓存
|
||
set(OPENSSL_FOUND TRUE CACHE BOOL "" FORCE)
|
||
set(OPENSSL_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR} CACHE PATH "" FORCE)
|
||
set(OPENSSL_SSL_LIBRARY ${OPENSSL_SSL_LIBRARY} CACHE FILEPATH "" FORCE)
|
||
set(OPENSSL_CRYPTO_LIBRARY ${OPENSSL_CRYPTO_LIBRARY} CACHE FILEPATH "" FORCE)
|
||
|
||
include_directories(${OPENSSL_INCLUDE_DIR})
|
||
link_directories(${OPENSSL_LIB_DIR})
|
||
endif()
|
||
|
||
# Linux / Mac
|
||
if(UNIX AND NOT APPLE AND NOT ANDROID)
|
||
find_package(OpenSSL REQUIRED)
|
||
endif()
|
||
|
||
if(APPLE)
|
||
set(OPENSSL_ROOT_DIR "/opt/homebrew/opt/openssl@3")
|
||
find_package(OpenSSL REQUIRED)
|
||
endif()
|
||
|
||
# Android
|
||
if(ANDROID)
|
||
set(OPENSSL_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/third/openssl/android/${ANDROID_ABI}/include)
|
||
set(OPENSSL_SSL_LIBRARY ${CMAKE_SOURCE_DIR}/third/openssl/android/${ANDROID_ABI}/lib/libssl.a)
|
||
set(OPENSSL_CRYPTO_LIBRARY ${CMAKE_SOURCE_DIR}/third/openssl/android/${ANDROID_ABI}/lib/libcrypto.a)
|
||
add_library(OpenSSL::SSL UNKNOWN IMPORTED)
|
||
set_target_properties(OpenSSL::SSL PROPERTIES IMPORTED_LOCATION ${OPENSSL_SSL_LIBRARY} INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR})
|
||
add_library(OpenSSL::Crypto UNKNOWN IMPORTED)
|
||
set_target_properties(OpenSSL::Crypto PROPERTIES IMPORTED_LOCATION ${OPENSSL_CRYPTO_LIBRARY} INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR})
|
||
endif()
|
||
|
||
# 最后编译 libcurl
|
||
add_subdirectory(third/libcurl)
|
||
|
||
message("------------------其余库以其他形式链接----------")
|
||
message("------------------nlohmann-json json库---------")
|
||
message("------------------stb_image 图像解析库----------")
|
||
message("------------------qrcodegen 二维码生成库-----------")
|
||
message("------------------vld 内存泄漏检测库----------")
|
||
message("------------------asio 网络库-----------")
|
||
message("------------------tinyxml2 xml格式库-----------")
|
||
message("------------------openssl 库-----------")
|
||
message("------------------curl 库-----------")
|
||
message("------------------sqlite 数据库-----------")
|
||
message("------------------tinyobjloader obj格式库-----------")
|
||
message("------------------mp3 音频格式库-----------")
|
||
message("------------------ktx 解析库-----------")
|
||
message("------------------CrashRpt 崩溃采集库-----------")
|
||
|
||
|
||
message("------------------解析dl-----------------------")
|
||
add_subdirectory ("dl")
|
||
if(NOT DL_DISABLE_RENDER)
|
||
message("------------------解析dl_test-----------------------")
|
||
add_subdirectory ("project/dl_test")
|
||
|
||
message("------------------解析dl_unit_test(此项目由ai生成)-----------")
|
||
add_subdirectory ("project/dl_unit_test")
|
||
|
||
if(NOT CMAKE_SYSTEM_NAME MATCHES "Android")
|
||
message("------------------解析dl_console-----------------------")
|
||
add_subdirectory ("project/dl_console")
|
||
endif()
|
||
|
||
if(EXISTS ${CMAKE_SOURCE_DIR}/project/dl_editor/CMakeLists.txt)
|
||
message("------------------解析dl_editor-----------------------")
|
||
add_subdirectory ("project/dl_editor")
|
||
endif()
|
||
if(EXISTS ${CMAKE_SOURCE_DIR}/project/dl_midi/CMakeLists.txt)
|
||
message("------------------解析dl_midi-----------------------")
|
||
add_subdirectory ("project/dl_midi")
|
||
endif()
|
||
if(EXISTS ${CMAKE_SOURCE_DIR}/project/dl_chess/CMakeLists.txt)
|
||
message("------------------解析dl_chess-----------------------")
|
||
add_subdirectory ("project/dl_chess")
|
||
endif()
|
||
if(EXISTS ${CMAKE_SOURCE_DIR}/project/dl_snake/CMakeLists.txt)
|
||
message("------------------解析dl_snake-----------------------")
|
||
add_subdirectory ("project/dl_snake")
|
||
endif()
|
||
if(EXISTS ${CMAKE_SOURCE_DIR}/project/hs/CMakeLists.txt)
|
||
message("------------------解析HistorySim-----------------------")
|
||
add_subdirectory ("project/hs")
|
||
endif()
|
||
if(EXISTS ${CMAKE_SOURCE_DIR}/project/ds/CMakeLists.txt)
|
||
message("------------------解析DreamSandbox-----------------------")
|
||
add_subdirectory ("project/ds")
|
||
endif()
|
||
endif()
|
||
|
||
# 无界面程序
|
||
|
||
if(EXISTS ${CMAKE_SOURCE_DIR}/project/dl_config/CMakeLists.txt AND
|
||
NOT CMAKE_SYSTEM_NAME MATCHES "Android")
|
||
message("------------------解析dl_config-----------------------")
|
||
add_subdirectory ("project/dl_config")
|
||
endif()
|
||
|
||
if(EXISTS ${CMAKE_SOURCE_DIR}/project/dl_chess_server/CMakeLists.txt)
|
||
message("------------------解析dl_chess_server-----------------------")
|
||
add_subdirectory ("project/dl_chess_server")
|
||
endif()
|
||
|
||
message("若解析Cmake失败,有以下几个常见原因:")
|
||
message("1.未安装VulkanSDK")
|
||
message("CMake生成完成后,可选择dl_test项目调试") |