CMake 常用宏分享
CMake 常用宏分享
介绍
在本人多年的CMake使用过程中,有两个自定义宏被广泛且频繁使用。分别是:
1. GROUP_FILES
根据项目目录结构,分组显示c++文件,实现目录结构与项目结构的对应。
# MACRO GROUP_FILES
MACRO(GROUP_FILES src_files root_path)
SET(cur_dir ${root_path})
FOREACH(group_files ${${src_files}})
STRING(REGEX REPLACE ${cur_dir}/\(.*\) \\1 sgbd_fpath ${group_files})
STRING(REGEX REPLACE "\(.*\)/.*" \\1 sgbd_group_name ${sgbd_fpath})
STRING(COMPARE EQUAL ${sgbd_fpath} ${sgbd_group_name} sgbd_nogroup)
STRING(REPLACE "/" "\\" sgbd_group_name ${sgbd_group_name})
IF(sgbd_nogroup)
SOURCE_GROUP("" FILES ${group_files})
ELSE()
INCLUDE_DIRECTORIES(${sgbd_group_name})
SOURCE_GROUP(${sgbd_group_name} FILES ${group_files})
ENDIF(sgbd_nogroup)
ENDFOREACH(group_files)
ENDMACRO(GROUP_FILES)
2. EXCLUDE_FILES
根据匹配规则移除项目中的文件,在跨平台开发中,主要用于移除其它平台相关的代码文件。
MACRO(EXCLUDE_FILES src_files rescure exclude_dir)
FILE(${rescure} excludefiles ${exclude_dir})
FOREACH(excludefile ${excludefiles})
LIST(REMOVE_ITEM ${src_files} ${excludefile})
ENDFOREACH(excludefile)
ENDMACRO(EXCLUDE_FILES)
应用
这里我们以glslang库为例
# Set Module Name
SET(MODULE_NAME glslang)
# message
MESSAGE( STATUS "Configuring module: ${MODULE_NAME} ...")
# Include Directories
INCLUDE_DIRECTORIES( ${ECHO_SRC_PATH})
INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR})
# Link Directories
LINK_DIRECTORIES(${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
# set module path
SET(MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
# Recursive get all files
FILE( GLOB_RECURSE ALL_FILES *.h *.inl *.c *.cpp *.mm)
# remove files by platform
IF(ECHO_PLATFORM_WIN32)
EXCLUDE_FILES(ALL_FILES GLOB_RECURSE ${MODULE_PATH}/glslang/OSDependent/Unix/*.*)
ELSE()
EXCLUDE_FILES(ALL_FILES GLOB_RECURSE ${MODULE_PATH}/glslang/OSDependent/Windows/*.*)
ENDIF()
# Group
GROUP_FILES(ALL_FILES ${CMAKE_CURRENT_SOURCE_DIR})
# Add library
ADD_LIBRARY(${MODULE_NAME} ${ALL_FILES} CMakeLists.txt)
# Set Folder
SET_TARGET_PROPERTIES(${MODULE_NAME} PROPERTIES FOLDER "thirdparty")
# Message
MESSAGE(STATUS "Configure ${MODULE_NAME} success!")
结论
通过对GROUP_FILES 与 EXCLUDE_FILES的使用,极端情况下只需要修改 ${MODULE_NAME},就可以实现一个c++库的CMake化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2013-09-13 sql 语言
2013-09-13 sqllite3
2013-09-13 输入法核心数据结构及算法的设计