CMakeLists.txt中条件判断与正则表达式的结合
1. CMakeLists.txt中条件控制+匹配条件的写法
- IF (var MATCHES regex):
var: 变量名,也可以写成${var}
regex: 具体的正则表达式,根据想要的效果自行设计 - IF (string MATCHES regex):
string: 具体需要判断的字符串
2. 示例
例如: IF(“${file}” MATCHES “[.]h$” ) ,意味着判断file变量是否以“.h”结尾。
需要注意的是,正则表达式中,“.”是有其他含义的,详细情况可以参考正则表达式 - 菜鸟教程
下面为完整的使用情境。代码片:
cmake_minimum_required(VERSION 3.5)
project(my_project)
## SUBDIRLIST 宏定义 用于从CURRENT_DIR中获取它的子文件夹的名字,结果保存至result中
MACRO(SUBDIRLIST RESULT CURRENT_DIR)
FILE(GLOB children RELATIVE ${CURRENT_DIR} ${CURRENT_DIR}/*) ##获取子文件夹的相对路径
SET(dirlist "")
FOREACH(child ${children})
IF(IS_DIRECTORY ${curdir}/${child})
LIST(APPEND dirlist ${child})
ENDIF()
ENDFOREACH()
SET(${RESULT} ${dirlist})
ENDMACRO()
#动态库编译
add_library(algorithm SHARED my_project.cpp)
#添加动态库的依赖glog
target_link_libraries(algorithm
glog
)
#install 将动态库algorithm install 至指定的路径“${CMAKE_CURRENT_SOURCE_DIR}/../output/lib”
INSTALL(TARGETS algorithm
LIBRARY DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/../output/lib
ARCHIVE DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/../output/lib
)
#install h_files
SUBDIRLIST(DIRS ${CMAKE_CURRENT_SOURCE_DIR}) ##获取当前CMakeList.txt所在路径下的子文件夹
FOREACH(component ${DIRS}) ##依次遍历子文件夹
SUBDIRLIST(sub_component ${CMAKE_CURRENT_SOURCE_DIR}/${component}) ##尝试获取当前子文件夹是否有下一级子文件夹
## 若subcomponent中没有子文件夹,将其中的头文件install到指定目录
IF("${sub_component}" STREQUAL "")
file(GLOB_RECURSE COMPONENT_H_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${component}/*) ##获取当前文件夹下的所有文件,匹配出包含“.h”结尾的文件
FOREACH(file ${COMPONENT_H_FILES})
if ("${file}" MATCHES "[\.]h$")
INSTALL(FILES ${file} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/../output/include)
endif()
ENDFOREACH()
ENDIF()
## ...此处省略其他情况的install设计
ENDFOREACH()
文章介绍了如何在CMakeLists.txt中结合条件控制和正则表达式进行文件操作。示例展示了如何判断文件是否以.h结尾,并在满足条件时进行安装。文章还使用SUBDIRLIST宏获取子目录并遍历,检查子目录下的头文件,将它们安装到指定路径。
1550

被折叠的 条评论
为什么被折叠?



