CmakeLists.txt编写流程梳理

背景:

  每次编写cmakelists.txt不知道何处下笔,故在流程维度进行梳理,供编写时使用。开发时可进行流程裁剪。

1. 设置最低版本:

 cmake_minimum_required(VERSION 3.5)

2. 设置名称, 版本号:

  set(AF_VS_VERSION "1.0.0.0" CACHE STRING "project version")
    project(test_protobuf VERSION ${AF_VS_VERSION})

3. 设置c/c++支持版本

	 #Default to C99
    if(NOT CMAKE_C_STANDARD)
        set(CMAKE_C_STANDARD 99)
    endif()

    if(NOT CMAKE_CXX_STANDARD)
        set(CMAKE_CXX_STANDARD 11)
    endif()

4. 设置编译器参数

  if (CMAKE_COMPILER_IS_GNUCXX)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-Bsymbolic")
      # set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
      # set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -g -O2 -Wall")
      # add_compile_options(-Wall -Wextra -Wpedantic -fPIC -fvisibility=hidden)
        add_compile_options(-Wall -g -Wextra -fvisibility=hidden -Wpedantic)
        if (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64")
            #add_compile_options(-Werror) # x86机器执行编译严格模式
            #add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) # 兼容低版本ABI
        endif()
    else() # MSVC
        if(CMAKE_CL_64) # CMAKE内建变量,如果是true,说明编译器是64位,自然可以编译64bit的程序
            set(ADDRESS_MODEL 64)
            set(NODE_TARGET x64)
        else()
            set(ADDRESS_MODEL 32)
            set(NODE_TARGET x86)
        endif()
        add_definitions(-D_CRT_SECURE_NO_WARNINGS)
        add_definitions(-DUNICODE -D_UNICODE)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
        set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
        set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG:FULL /OPT:REF /OPT:ICF")
        set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG:FULL /OPT:REF /OPT:ICF")
    endif()

5. 目标文件输出目录

set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin)
 # set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH})

6. 判断平台,定义平台宏

   IF (CMAKE_SYSTEM_NAME STREQUAL "Linux")
        MESSAGE(STATUS "current platform: Linux ")
        add_definitions(-DLINUX)
    ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "Windows")
        MESSAGE(STATUS "current platform: Windows ")
        add_definitions(-DWINDOWS)
    ELSE ()
        MESSAGE(FATAL_ERROR "not support other platform: ${CMAKE_SYSTEM_NAME}")
    ENDIF()

7. 设置第三方头文件和设置链接库寻找路径

   if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
      include_directories(${PROJECT_THIRD}/include/linux/dongle)
      link_directories(${PROJECT_THIRD}/libs/linux/test)
    else ()
      include_directories(${PROJECT_THIRD}/include/windows)
      link_directories(${PROJECT_THIRD}/libs/windows)
     endif()

8. 添加自己的头文件

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)

9. 添加自己的源文件

  aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/        SRC_FILES)
  aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src     SRC_FILES)

10. 生成可执行文件

  add_executable(${PROJECT_NAME} ${SRC_FILES})

11. 添加依赖库

  if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
        if(CMAKE_BUILD_TYPE STREQUAL "Debug")
            # target_link_libraries(${PROJECT_NAME} libprotobufd.lib)
        else()
            # target_link_libraries(${PROJECT_NAME} libprotobufd.lib)
        endif()
    else()
        target_link_libraries(${PROJECT_NAME} test.so)
    endif()

12. 其他:

1. 定义Build/Release
  if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
  endif()

2. 执行脚本
  if(WIN32)
    execute_process(
      COMMAND cmd /C ${CMAKE_CURRENT_SOURCE_DIR}/../proto/run.bat  
      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../proto/
    )
  else()
    execute_process(
        COMMAND cmd /C ${CMAKE_CURRENT_SOURCE_DIR}/../proto/run.sh  
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../proto/
      )
  endif()

3. 查找所有文件
  file(GLOB_RECURSE check_src  "./*.h" "./*.cpp" "./protobuf/*.cc" "./protobuf/*.h")
  source_group_by_dir(check_src)
  list(APPEND SRC_LIST ${check_src})

4. 设置cmake中开关变量
  option(COMMONOMR_WITH_TEST "Compile commonomr test" ON)

5. 添加子文件
  add_subdirectory(src bin)

6. 预定义
  # 将文件复制到另一个位置并修改其内容。
  # 将输入文件version.h.in的内容复制到输出文件version.h中,
  # 并且输入文件中的@BUILD_TIME@ 
    #define BUILD_TIME "@BUILD_TIME@"
  
  string(TIMESTAMP BUILD_TIME "%Y/%m/%d %H:%M:%S")
  configure_file(version.h.in version.h)

猜你喜欢

转载自blog.csdn.net/qq_41546984/article/details/128675217
今日推荐