目录
背景:
每次编写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)