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 每一個子項目都有本身的依賴,這樣管理方便一些