引言
CMake简介
CMake(Cross-Platform Make)是一种跨平台的构建系统生成器,用于管理和自动化软件的构建过程。它通过编写配置文件(通常是 CMakeLists.txt
)来定义项目的构建规则,支持多种编译器和操作系统,能够生成本地化的构建文件(如 Makefile、Visual Studio 解决方案等)。
CMake 广泛应用于以下场景:
-
跨平台项目:需要在多种操作系统上构建和部署的项目。
-
大型项目:包含多个模块和依赖的复杂项目。
-
团队开发:需要统一构建流程和配置的团队开发环境。
核心CMakeLists.txt
本文将对 duckdb 项目 src 目录下的 CMakeLists.txt 进行详细解析,代码内容基于最新 2025.01.20 日的提交版本( commit id:8e68a3e34aa526a342ae91e1b14b764bb3075a12)
add_definitions(-DDUCKDB)
if(${DISABLE_THREADS})
add_definitions(-DDUCKDB_NO_THREADS)
endif()
add_extension_definitions()
if(NOT MSVC)
set(CMAKE_CXX_FLAGS_DEBUG
"${CMAKE_CXX_FLAGS_DEBUG} -Wextra -Wno-unused-parameter -Wno-redundant-move"
)
if(CMAKE_COMPILER_IS_GNUCC)
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6)
set(CMAKE_CXX_FLAGS_DEBUG
"${CMAKE_CXX_FLAGS_DEBUG} -Wimplicit-fallthrough")
endif()
else()
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wimplicit-fallthrough")
endif()
endif()
set(EXIT_TIME_DESTRUCTORS_WARNING FALSE)
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}"
STREQUAL "AppleClang")
set(EXIT_TIME_DESTRUCTORS_WARNING TRUE)
set(CMAKE_CXX_FLAGS_DEBUG
"${CMAKE_CXX_FLAGS_DEBUG} -Wexit-time-destructors -Wimplicit-int-conversion -Wshorten-64-to-32 -Wnarrowing -Wsign-conversion -Wsign-compare -Wconversion"
)
endif()
set(DUCKDB_SYSTEM_LIBS ${CMAKE_DL_LIBS})
if(MSVC OR MINGW)
set(DUCKDB_SYSTEM_LIBS ${DUCKDB_SYSTEM_LIBS} ws2_32 rstrtmgr)
endif()
if(MSVC)
set(DUCKDB_SYSTEM_LIBS ${DUCKDB_SYSTEM_LIBS} bcrypt)
endif()
if(MSVC)
add_compile_options("/bigobj")
endif()
function(ensure_variable_is_number INPUT_VERSION OUT_RESULT)
if(NOT "${${INPUT_VERSION}}" MATCHES "^[0-9]+$")
message(
WARNING
"VERSION PARAMETER ${INPUT_VERSION} \"${${INPUT_VERSION}}\" IS NOT A NUMBER - SETTING TO 0"
)
set(${OUT_RESULT}
0
PARENT_SCOPE)
else()
set(${OUT_RESULT}
${${INPUT_VERSION}}
PARENT_SCOPE)
endif()
endfunction()
if(AMALGAMATION_BUILD)
add_library(duckdb SHARED "${PROJECT_SOURCE_DIR}/src/amalgamation/duckdb.cpp")
target_link_libraries(duckdb ${DUCKDB_SYSTEM_LIBS})
link_threads(duckdb)
link_extension_libraries(duckdb)
add_library(duckdb_static STATIC
"${PROJECT_SOURCE_DIR}/src/amalgamation/duckdb.cpp")
target_link_libraries(duckdb_static ${DUCKDB_SYSTEM_LIBS})
link_threads(duckdb_static)
link_extension_libraries(duckdb_static)
install(FILES "${PROJECT_SOURCE_DIR}/src/amalgamation/duckdb.hpp"
"${PROJECT_SOURCE_DIR}/src/include/duckdb.h"
DESTINATION "${INSTALL_INCLUDE_DIR}")
install(FILES "${PROJECT_SOURCE_DIR}/src/include/duckdb/common/winapi.hpp"
DESTINATION "${INSTALL_INCLUDE_DIR}/duckdb/common")
else()
add_definitions(-DDUCKDB_MAIN_LIBRARY)
add_subdirectory(optimizer)
add_subdirectory(planner)
add_subdirectory(parser)
add_subdirectory(function)
add_subdirectory(catalog)
add_subdirectory(common)
add_subdirectory(logging)
add_subdirectory(execution)
add_subdirectory(main)
add_subdirectory(parallel)