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

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM