ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CMake 常用宏分享

2020-09-13 07:01:41  阅读:208  来源: 互联网

标签:FILES files 常用 CMake sgbd MODULE GROUP group 分享


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化。

 



标签:FILES,files,常用,CMake,sgbd,MODULE,GROUP,group,分享
来源: https://www.cnblogs.com/zhoug2020/p/13659941.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有