cmake学习

1、一个简单的cmakelist:

project(LeetCode)
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -lgcov")

file(GLOB_RECURSE SRC_FILES
${CMAKE_CURRENT_LIST_DIR}/lib/*/*.c
${CMAKE_CURRENT_LIST_DIR}/lib/*/*.cc
${CMAKE_CURRENT_LIST_DIR}/lib/*/*.cpp
${CMAKE_CURRENT_LIST_DIR}/lib/*/*.h

${CMAKE_CURRENT_LIST_DIR}/lib/src/*.c
${CMAKE_CURRENT_LIST_DIR}/lib/src/*.cc
${CMAKE_CURRENT_LIST_DIR}/lib/src/*.cpp
${CMAKE_CURRENT_LIST_DIR}/lib/include/*.h
)

#添加头文件搜索路径,包头文件时方便
include_directories(
${CMAKE_CURRENT_LIST_DIR}/lib/include/
)

#生成库文件
add_library(static_${PROJECT_NAME} ${SRC_FILES} )


file(GLOB_RECURSE EXE_SRC_FILES
${CMAKE_CURRENT_LIST_DIR}/exe/src/*.c
${CMAKE_CURRENT_LIST_DIR}/exe/src/*.cc
${CMAKE_CURRENT_LIST_DIR}/exe/src/*.cpp
${CMAKE_CURRENT_LIST_DIR}/exe/include/*.h
)
#生成可执行文件
add_executable(${PROJECT_NAME} ${EXE_SRC_FILES})
#规定生成的依赖关系
add_dependencies(${PROJECT_NAME} static_${PROJECT_NAME})
#链接库文件,link_libraries用在add_executable之前,target_link_libraries用在add_executable之后
target_link_libraries(${PROJECT_NAME} static_${PROJECT_NAME})
if(UNIX)
target_link_libraries(${PROJECT_NAME} pthread)
endif()

set(PKG_GTEST gtest)
#获取完整的文件名
get_filename_component(PKG_GTEST_DIR "${CMAKE_CURRENT_LIST_DIR}/3rdparty/gtest-1.7.0" ABSOLUTE CACHE)
get_filename_component(PKG_GTEST_INCLUDE_DIR "${PKG_GTEST_DIR}/include" ABSOLUTE CACHE)
#把一个项目分割成几个范围有限的CMakeLists.txt文件,这些文件将使用add_subdirectory命令进行处理。分模块处理!!
add_subdirectory(${PKG_GTEST_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${PKG_GTEST})

file(GLOB_RECURSE TEST_SRC_FILES
${CMAKE_CURRENT_LIST_DIR}/test/ft/*.c
${CMAKE_CURRENT_LIST_DIR}/test/ft/*.cc
${CMAKE_CURRENT_LIST_DIR}/test/ft/*.cpp
${CMAKE_CURRENT_LIST_DIR}/test/ft/*.h

${CMAKE_CURRENT_LIST_DIR}/test/src/*.c
${CMAKE_CURRENT_LIST_DIR}/test/src/*.cc
${CMAKE_CURRENT_LIST_DIR}/test/src/*.cpp
${CMAKE_CURRENT_LIST_DIR}/test/include/*.h
)

include_directories(
${CMAKE_CURRENT_LIST_DIR}/test/*/
${PKG_GTEST_INCLUDE_DIR}
)

add_executable(test_${PROJECT_NAME} ${TEST_SRC_FILES})
add_dependencies(test_${PROJECT_NAME} static_${PROJECT_NAME} ${PKG_GTEST})
target_link_libraries(test_${PROJECT_NAME} static_${PROJECT_NAME} ${PKG_GTEST})
if(UNIX)
target_link_libraries(test_${PROJECT_NAME} pthread)
endif()

#为当前及其下级目录打开测试功能??不懂具体含义
enable_testing()
add_custom_target(build_and_test
${CMAKE_CTEST_COMMAND} -V -C Debug
)
add_test(NAME ${PROJECT_NAME}
COMMAND test_${PROJECT_NAME}
)
add_dependencies(build_and_test test_${PROJECT_NAME} ${PROJECT_NAME})
 
 
2、目录架构:

 

 3、

 

 

 
# Glob all sources file inside directory ${DIRECTORY} file(GLOB_RECURSE TMP_FILES ${DIRECTORY}/*.h ${DIRECTORY}/*.cpp ${DIRECTORY}/*.c ) foreach(f ${TMP_FILES}) # Get the path of the file relative to ${DIRECTORY},# then alter it (not compulsory) file(RELATIVE_PATH SRCGR ${DIRECTORY}${f}) set(SRCGR "Something/${SRCGR}") # Extract the folder, ie remove the filename part string(REGEX REPLACE "(.*)(/[^/]*)$""\\1" SRCGR ${SRCGR}) # Source_group expects \\ (double antislash), not / (slash) string(REPLACE / \\ SRCGR ${SRCGR}) source_group("${SRCGR}" FILES ${f}) endforeach()
posted @ 2022-03-19 16:02  日常向的生活  阅读(113)  评论(0)    收藏  举报