注:带星号的为非重要部分
基础配置
cmake_minimum_required (VERSION 3.5)
project(whisper.cpp VERSION 1.5.0)
# Add path to modules
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
# 在\cmake文件夹下还有BuildTypes.cmake,DefaultTargetOptions.cmake,GitVars.cmake几个文件
# CMAKE_MODULE_PATH是供搜索第三方库用的路径变量,因此可在项目中引用自定义模块:
#include(BuildTypes) 在第13行
#include(DefaultTargetOptions) 在第425和478行,为指定的目标设置一些默认的编译特性和属性,以确保项目在编译和安装时的一致性和可靠性。
#include(GitVars) 在第12行
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) # 设置CMAKE_CURRENT_SOURCE_DIR变量,应该是可执行文件的输出目录
# 如果当前的源目录等于根源目录
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
set(WHISPER_STANDALONE ON) # 标志 WHISPER_STANDALONE 设置为 ON
include(GitVars) # 引用 GitVars 模块
include(BuildTypes) # 引用 BuildTypes 模块
# 配置封装到其他语言的项目版本相关,详见Note1
if (EXISTS "${CMAKE_SOURCE_DIR}/bindings/ios/Makefile-tmpl")
configure_file(${CMAKE_SOURCE_DIR}/bindings/ios/Makefile-tmpl ${CMAKE_SOURCE_DIR}/bindings/ios/Makefile @ONLY)
endif()
configure_file(${CMAKE_SOURCE_DIR}/bindings/javascript/package-tmpl.json ${CMAKE_SOURCE_DIR}/bindings/javascript/package.json @ONLY)
else() # 如果当前源目录不是根源目录
set(WHISPER_STANDALONE OFF) # 则将 WHISPER_STANDALONE 标志设置为 OFF
endif()
DefaultTargetOptions
# Set the default compile features and properties for a target.
if (NOT TARGET)
message(FATAL_ERROR "TARGET not set before including DefaultTargetOptions")
endif()
target_compile_features(${
TARGET}
PRIVATE
cxx_std_11
)
set_target_properties(${
TARGET}
PROPERTIES
EXPORT_COMPILE_COMMANDS ON
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib"
)
GIT*
find_package(Git)
# the commit's SHA1
execute_process(COMMAND
"${GIT_EXECUTABLE}" describe --match=NeVeRmAtCh --always --abbrev=8
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE GIT_SHA1
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
# the date of the commit
execute_process(COMMAND
"${GIT_EXECUTABLE}" log -1 --format=%ad --date=local
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE GIT_DATE
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
# the subject of the commit
execute_process(COMMAND
"${GIT_EXECUTABLE}" log -1 --format=%s
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE GIT_COMMIT_SUBJECT
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
BuildTypes*
# Add new build types
# ReleaseGG - Release with enabled asserts
SET(CMAKE_CXX_FLAGS_RELEASEGG
"-O3"
CACHE STRING "Flags used by the c++ compiler during release builds with enabled asserts."
FORCE )
SET(CMAKE_C_FLAGS_RELEASEGG
"-O3"
CACHE STRING "Flags used by the compiler during release builds with enabled asserts."
FORCE )
SET(CMAKE_EXE_LINKER_FLAGS_RELEASEGG
""
CACHE STRING "Flags used for linking binaries during release builds with enabled asserts."
FORCE )
SET(CMAKE_SHARED_LINKER_FLAGS_RELEASEGG
""
CACHE STRING "Flags used by the shared libraries linker during release builds with enabled asserts."
FORCE )
MARK_AS_ADVANCED(
CMAKE_CXX_FLAGS_RELEASEGG
CMAKE_C_FLAGS_RELEASEGG
CMAKE_EXE_LINKER_FLAGS_RELEASEGG
CMAKE_SHARED_LINKER_FLAGS_RELEASEGG )
# RelWithDebInfoGG - RelWithDebInfo with enabled asserts
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFOGG
"-O2 -g"
CACHE STRING "Flags used by the c++ compiler during release builds with debug symbols and enabled asserts."
FORCE )
SET(CMAKE_C_FLAGS_RELWITHDEBINFOGG
"-O2 -g"
CACHE STRING "Flags used by the compiler during release builds with debug symbols and enabled asserts."
FORCE )
SET(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFOGG
""
CACHE STRING "Flags used for linking binaries during release builds with debug symbols and enabled asserts."
FORCE )
SET(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFOGG
""
CACHE STRING "Flags used by the shared libraries linker during release builds with debug symbols and enabled asserts."
FORCE )
MARK_AS_ADVANCED(
CMAKE_CXX_FLAGS_RELWITHDEBINFOGG
CMAKE_C_FLAGS_RELWITHDEBINFOGG
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFOGG
CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFOGG )
if (NOT XCODE AND NOT MSVC AND NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo" "ReleaseGG" "RelWithDebInfoGG")
endif()
WASM配置*
# 检查是否使用 Emscripten 工具链进行交叉编译
if (EMSCRIPTEN)
# 如果是 Emscripten,设置默认值为不构建共享库
set(BUILD_SHARED_LIBS_DEFAULT OFF)
# 添加选项,用于指定是否将 WASM 嵌入到生成的 whisper.js 文件中
option(WHISPER_WASM_SINGLE_FILE "whisper: embed WASM inside the generated whisper.js" ON)
else()
# 如果不是 Emscripten,进一步检查是否使用 MinGW 工具链
if (MINGW)
# 如果是 MinGW,设置默认值为不构建共享库
set(BUILD_SHARED_LIBS_DEFAULT OFF)
else()
# 如果不是 Emscripten 且不是 MinGW,设置默认值为构建共享库
set(BUILD_SHARED_LIBS_DEFAULT ON)
endif()
endif()
options编译选项
# 如果目标平台是苹果 (Apple)
if (APPLE)
set(WHISPER_METAL_DEFAULT ON) # 设置 WHISPER_METAL_DEFAULT 为 ON,Metal是苹果发布的一套操作GPU的编程API
else()
set(WHISPER_METAL_DEFAULT OFF)# 否则设置 WHISPER_METAL_DEFAULT 为 OFF
endif()
# 定义构建共享库的选项,并设置默认值为 BUILD_SHARED_LIBS_DEFAULT
option(BUILD_SHARED_LIBS "whisper: build shared libs" ${BUILD_SHARED_LIBS_DEFAULT})
# 编译器选项
# 编译器警告的选项
option(WHISPER_ALL_WARNINGS "whisper: enable all compiler warnings" ON)# 定义启用所有编译器警告的选项
option(WHISPER_ALL_WARNINGS_3RD_PARTY "whisper: enable all compiler warnings in 3rd party libs" OFF)# 定义启用所有第三方库中编译器警告的选项
# 编译器自带的调试工具sanitizers选项:
option(WHISPER_SANITIZE_THREAD "whisper: enable thread sanitizer" OFF)# 定义启用线程 Sanitizer 的选项
option(WHISPER_SANITIZE_ADDRESS "whisper: enable address sanitizer" OFF)# 定义启用地址 Sanitizer 的选项 ASan 是一种结合编译器插桩和运行时的一种快速内存检测工具,主要用于检测代码中的部分 内存安全 问题
option(WHISPER_SANITIZE_UNDEFINED "whisper: enable undefined sanitizer" OFF)# 定义启用未定义行为 Sanitizer 的选项
# 是否构建示例和测试
option(WHISPER_BUILD_TESTS "whisper: build tests" ${WHISPER_STANDALONE})# 定义构建测试的选项
option(WHISPER_BUILD_EXAMPLES "whisper: build examples" ${WHISPER_STANDALONE})# 定义构建示例的选项
# 定义支持 libSDL2 的选项,Simple DirectMedia Layer是一个跨平台开发库,旨在通过OpenGL和Direct3D提供对音频、键盘、鼠标、操纵杆和图形硬件的低级别访问。https://github.com/libsdl-org/SDL
option(WHISPER_SDL2 "whisper: support for libSDL2" OFF)
# 定义禁用 AVX 指令集的选项
option(WHISPER_NO_AVX "whisper: disable AVX" OFF)
# 定义禁用 AVX2 指令集的选项
option(WHISPER_NO_AVX2 "whisper: disable AVX2" OFF)
# 定义禁用 FMA 指令集的选项, FMA指令集是128位元和256位元的流式單指令流多資料流擴充集( SSE )指令集
option(WHISPER_NO_FMA "whisper: disable FMA" OFF)
# 定义禁用 F16c 指令集的选项,F16C指令就是AMD的CVT16指令,Intel换了一个名称,随后AMD也接收了这一称呼。Intel 首次在 2012 年的 Ivy Bridge 微架构处理器上使用。
option(WHISPER_NO_F16C "whisper: disable F16c" OFF)
# 定义支持 OpenVINO 的选项
option(WHISPER_OPENVINO "whisper: support for OpenVINO" OFF)
# 如果目标平台是苹果 (Apple)
if (APPLE)
# 定义禁用 Accelerate framework 的选项
option(WHISPER_NO_ACCELERATE "whisper: disable Accelerate framework" OFF)
# 定义使用 Metal 的选项,并设置默认值为 WHISPER_METAL_DEFAULT
option(WHISPER_METAL "whisper: use Metal" ${WHISPER_METAL_DEFAULT})
# 定义禁用 Metal 调试的选项
option(WHISPER_METAL_NDEBUG "whisper: disable Metal debugging" OFF)
# 定义启用 Core ML framework 的选项
option(WHISPER_COREML "whisper: enable Core ML framework" OFF)
# 定义允许使用非-CoreML的回退的选项
option(WHISPER_COREML_ALLOW_FALLBACK "whisper: allow non-CoreML fallback" OFF)
else()
# 如果不是苹果,则定义使用 BLAS 库的选项
option(WHISPER_BLAS "whisper: use BLAS libraries" OFF)
# 定义 BLAS 库的供应商选项
option(WHISPER_BLAS_VENDOR "whisper: BLAS library vendor" Generic)
# 定义优先使用 OpenBLAS 的选项
option(WHISPER_OPENBLAS "whisper: prefer OpenBLAS" OFF)
# 定义支持 cuBLAS 的选项
option(WHISPER_CUBLAS "whisper: support for cuBLAS" OFF)
# 定义支持 hipBLAS 的选项
option(WHISPER_HIPBLAS "whisper: support for hipBLAS" OFF)
# 定义使用 CLBlast 的选项
option(WHISPER_CLBLAST "whisper: use CLBlast" OFF)
endif()
# 定义启用性能分析的选项
option(WHISPER_PERF "whisper: enable perf timings" OFF)
# sanitizers
# 如果不是使用 MSVC 编译器
if (NOT MSVC)
# 如果启用 Thread Sanitizer
if (WHISPER_SANITIZE_THREAD)
# 添加线程 Sanitizer 的编译选项
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread")
endif()
# 如果启用 Address Sanitizer
if (WHISPER_SANITIZE_ADDRESS)
# 添加地址 Sanitizer 的编译选项,并保留函数调用栈信息
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
endif()
# 如果启用 Undefined Behavior Sanitizer
if (WHISPER_SANITIZE_UNDEFINED)
# 添加未定义行为 Sanitizer 的编译选项
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
endif()
endif()
# 以下两行是注释掉的代码,未启用
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffast-math")
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native")