cmake的简单使用

64 阅读1分钟

cmake的简单使用

cmake_minimum_required(VERSION 3.24)

project(leveldb VERSION 1.23.0 LANGUAGES C CXX)

# 设置其他cmake路径
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

# C++标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# 默认build类型
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

# 从VERSION文件中读取版本
file(READ "${CMAKE_SOURCE_DIR}/VERSION" VERSION)
string(STRIP "${VERSION}" VERSION)

# 可选,引入config
set(INSTALL_CONFIG_NAME ${PROJECT_NAME}-config)

# 除非暴露,否则隐藏符号,减少大小
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_CXX_VISIBLITY_INLINES_HIDDEN ON)

# 设置一些目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})


if(UNIX)
    # -fPIC 生成位置无关代码
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")

    if(BUILD_TESTS)
        # --coverage 开启代码覆盖率报告
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage")
    endif()
endif()

if(MSVC)
    add_compile_options(/utf-8 /wd4819)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:__cplusplus")
endif()

# 生成compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# 生成文档
if(BUILD_DOCUMENT)
    message(STATUS "gen document ...")
    set(DOC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/document)
    if(WIN32)
        execute_process(COMMAND ${DOC_DIR}/doxygen/build.bat ${DOC_DIR}/doxygen WORKING_DIRECTORY ${DOC_DIR}/doxygen)
    elseif(UNIX)
        execute_process(COMMAND ${DOC_DIR}/doxygen/build.sh ${DOC_DIR}/doxygen WORKING_DIRECTORY ${DOC_DIR}/doxygen)
        execute_process(COMMAND ${DOC_DIR}/sphinx-cn/build.sh ${DOC_DIR}/sphinx-cn WORKING_DIRECTORY ${DOC_DIR}/sphinx-cn)
    endif()
endif()