CMake 遍历⽬录下⽂件为每⼀个cpp ⽂件⽣成target
遍历⽬录下⽂件 为每⼀个cpp ⽂件⽣成target
cmake基础⽤法请⾃⾏搜索
Talk is cheap, show me the code.
很多时候,我们在写很多⼩例⼦的时候(⽐如博客测试代码、作业练习)。
我们常常要为每⼀个main.写构建脚本,这显得有点low了。假设我们想为类似./src/*/*.cpp ⽬录结构的每⼀个cpp⽂件⽣成target,可以这么做:再举个可能更常⽤的例⼦,假如当前⽂件夹是tests ,⾥⾯有很多测试⽂件(.cpp),每⼀个都包含main函数(也就是可作为⼀个target),可以这么做:
当然了,只适⽤于特殊场景,你可以添加更详细的规则。
题外话
诸如Python的pip,Java的Gradle、Maven,对包管理和构建提供了⾮常⽅便的⽀持。
C++包管理是⼀个痛点,这是由于平台、操作系统、硬件、abi、编译参数、各种多样性造成的,因为每⼀
种排列组合编译出来的⼆进制⽂件都基本不相兼容。
连构建⼯具都乏善可陈。
CMake还是⼀个⽐较好的⼯具,毕竟是⽬前C++主流且使⽤最⼴泛的构建⼯具,没有之⼀!# all cpp files file(GLOB_RECURSE CPP_SRC_LIST ${CMAKE_CURRENT_LIST_DIR}/src/*/*.cpp)# generate target for every cpp file foreach(v ${CPP_SRC_LIST}) # file relative path from src/ string(REGEX MATCH "src/.*" relative_path ${v}) # delete string "src/" string(REGEX REPLACE "src/" "" target_name ${relative_path}) # rename '/' and '.' to '_' string(REGEX REPLACE "/|\\." "_" target_name ${target_name}) add_executable(${target_name}_cpp ${v})endforeach()
1
2
3
4
56
7
8
9为什么现在都用cmake
10
11
12
13file(GLOB_RECURSE CPP_SRC_LIST *.cpp)foreach(v ${CPP_SRC_LIST}) string(REGEX MATCH "tests/.*" relative_path ${v}) string(REGEX REPLACE "tests/" "" target_name ${relative_path}) string(REGEX REPLACE ".cpp" "" target_name ${target_name}) add_executable(my_test_${target_name} ${v})endforeach()
1
2
3
4
5
6
7
8
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论