cmake 自動add_subdirectory

cmake 自動add_subdirectory
開始學習c++已經有一段時間了,練習用的代碼很零碎,須要不少個main,一直使用cmake管理,可是每新建一個學習子項,都須要去修改cmakelists,很麻煩。c++

恰好開了個新的學習項目,因此寫了個基本不用改的cmakelists學習

文件路徑以下:ui

├── CMakeLists.txt
├── common
│ ├── boost_log_template_main
│ │ ├── CMakeLists.txt
│ │ └── main.cpp
│ ├── common_include
│ │ ├── boost_log_init.cpp
│ │ ├── boost_log_init.h
│ │ ├── common_configure.h.in
│ │ ├── common_funcs.cpp
│ │ ├── common_funcs.h
│ │ └── common_includes.h
│ └── properties
│ ├── boost_log_settings.ini
│ └── log4cplus_root.properties
├── README.md
└── stl_study
├── changeable_var
│ ├── CMakeLists.txt
│ └── main.cpp
├── stl_common_tools
│ ├── CMakeLists.txt
│ ├── main.cpp
│ ├── std_chrono_study.cpp
│ └── std_chrono_study.h
└── stl_container
├── CMakeLists.txt
└── main.cpp.net

每次要新建子項目是隻須要拷貝./common/boost_log_template_main到./stl_study下,而後修改:一、文件夾名;二、子項目名debug

這樣就方便多了
貼cmakelist:
根目錄的cmakelist不用再改,會循環添加stl_study下的文件夾爲子項目:blog

cmake_minimum_required(VERSION 3.12)
project(CPP_STL_studys)get

set(CMAKE_CXX_STANDARD 14)string

### 設置編譯flags
message("cmake env flags ${CMAKE_BUILD_TYPE}")it

set(CMAKE_CXX_FLAGS "-fPIC ${CMAKE_CXX_FLAGS}")io

if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
    message("build type debug!")
    set(CMAKE_CXX_FLAGS "-Wall -O0  -g -ggdb ${CMAKE_CXX_FLAGS}")
elseif ("${CMAKE_BUILD_TYPE}}" STREQUAL "Release")
    message("build type release!")
    set(CAKE_CXX_FLAGS "-O3 -Wall ${CMAKE_CXX_FLAGS}")
else ()
    message("unknow type:${CMAKE_BUILD_TYPE}")
endif ()
message("cmake cxx build flags:${CMAKE_CXX_FLAGS}")

#設置版本號
set(VERSION_MAJOR 1.1)
set(VERSION_MINOR 0)
#配置版本號的映射文件,方便代碼中使用
configure_file(
        "${PROJECT_SOURCE_DIR}/common/common_include/common_configure.h.in"
        "${PROJECT_BINARY_DIR}/convent/common_configure.h"
)
#通用頭文件
include_directories(${PROJECT_SOURCE_DIR}/common/common_include)
include_directories(${PROJECT_BINARY_DIR}/convent)

#### add execuable from sub dir

set(auto_analisis_dir ${PROJECT_SOURCE_DIR}/stl_study/)
execute_process(
        COMMAND ls ${auto_analisis_dir}
        OUTPUT_VARIABLE dirs)

message("find files : \n${dirs}")
string(REPLACE "\n" ";" RPLACE_LIST ${dirs})

foreach (f ${RPLACE_LIST})
    message("add :${f}")
    add_subdirectory(${auto_analisis_dir}${f})
endforeach (f ${RPLACE_LIST})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
子項目中的cmakelist:

#子項目名 替換template_name爲子項目名
set(build_temp template_name)

message("\n###############################\nstart cmake ${build_temp}")
aux_source_directory(./ ${build_temp}cpps)
include_directories(./)
message("${build_temp}cpps find cpps : ${${build_temp}cpps}")
add_executable(${build_temp} ${${build_temp}cpps}

        #如下爲common_funcs 的cpp文件
        ${PROJECT_SOURCE_DIR}/common/common_include/common_funcs.cpp
        ${PROJECT_SOURCE_DIR}/common/common_include/boost_log_init.cpp

        #IDE不識別aux到的cpp文件,不進行符號表處理,只能手動變一遍
        #若是發佈,刪除如下內容

        )
#拷貝配置文件
add_custom_command(
        TARGET ${build_temp}
        COMMAND echo copying files:
        COMMAND cp -v ${PROJECT_SOURCE_DIR}/common/properties/boost_log_settings.ini `pwd`/
        COMMAND echo copying files is finished.
)
add_definitions(-DBOOST_LOG_DYN_LINK)

target_link_libraries(${build_temp} gtest pthread boost_log boost_log_setup boost_thread boost_system)

message("${build_temp} cmake finish\n###############################\n") 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 每一個子項目都有本身的依賴,這樣管理方便一些

相關文章
相關標籤/搜索