CMake Tips - 在Visual Studio中按目录结构自动创建Filters(Source Groups)
来源:互联网 发布:经典网络科幻小说 编辑:程序博客网 时间:2024/06/06 09:31
CMake作为构建系统可以轻松生成Visual Studio工程,这让我们的新项目可以不必维护一组专门的Visual Studio工程文件和sln文件了。但是CMake默认生成的工程文件中,只是笼统区分了头文件和其他源文件。对于大型项目,要在众多的源文件中找到想要的那个是很恼火的事情。对此,Visual Studio提供了filter机制来分类显示源文件。对于手工维护工程文件的项目,我们可以自己添加filter,然后提交到代码库,并与其他成员共享。
但是,在使用CMake后,手工维护filter是不现实的。CMake也提供了可以生成filter的机制,就是source_group()命令。结合source_group(), file(), string()等命令,我们可以让实现CMake自动按目录结构生成filter。
方法很简单,代码如下:
macro(source_group_by_dir source_files)
if(MSVC)
set(sgbd_cur_dir ${CMAKE_CURRENT_SOURCE_DIR})
foreach(sgbd_file ${${source_files}})
string(REGEX REPLACE ${sgbd_cur_dir}/\(.*\) \\1 sgbd_fpath ${sgbd_file})
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)
set(sgbd_group_name "\\")
endif(sgbd_nogroup)
source_group(${sgbd_group_name} FILES ${sgbd_file})
endforeach(sgbd_file)
endif(MSVC)
endmacro(source_group_by_dir)
使用的时候,先在比较顶层的CMakeLists.txt中定义该宏。然后在添加工程(add_library或者add_executable)的CMakeLists.txt文件中调用该宏:
source_group_by_dir(all_files)
其中all_files是保存了所有文件名的变量。注意,这里用的是变量名,而没有引用其值。
一般这个文件列表可以用file()或者aux_source_directory()来得到。例如对于C++工程,通常是这样的:
file(GLOB_RECURSE project_headers *.h)
file(GLOB_RECURSE project_cpps *.cpp)
set(all_files ${project_headers} ${project_cpps})
source_group_by_dir(all_files)
但是,在使用CMake后,手工维护filter是不现实的。CMake也提供了可以生成filter的机制,就是source_group()命令。结合source_group(), file(), string()等命令,我们可以让实现CMake自动按目录结构生成filter。
方法很简单,代码如下:
macro(source_group_by_dir source_files)
if(MSVC)
set(sgbd_cur_dir ${CMAKE_CURRENT_SOURCE_DIR})
foreach(sgbd_file ${${source_files}})
string(REGEX REPLACE ${sgbd_cur_dir}/\(.*\) \\1 sgbd_fpath ${sgbd_file})
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)
set(sgbd_group_name "\\")
endif(sgbd_nogroup)
source_group(${sgbd_group_name} FILES ${sgbd_file})
endforeach(sgbd_file)
endif(MSVC)
endmacro(source_group_by_dir)
使用的时候,先在比较顶层的CMakeLists.txt中定义该宏。然后在添加工程(add_library或者add_executable)的CMakeLists.txt文件中调用该宏:
source_group_by_dir(all_files)
其中all_files是保存了所有文件名的变量。注意,这里用的是变量名,而没有引用其值。
一般这个文件列表可以用file()或者aux_source_directory()来得到。例如对于C++工程,通常是这样的:
file(GLOB_RECURSE project_headers *.h)
file(GLOB_RECURSE project_cpps *.cpp)
set(all_files ${project_headers} ${project_cpps})
source_group_by_dir(all_files)
- CMake Tips - 在Visual Studio中按目录结构自动创建Filters(Source Groups)
- 在Android studio中创建assets目录
- 在Visual Studio 2010中配置VC++目录
- 在Visual Studio 2010中配置VC++目录
- 在Visual Studio 2010中配置VC++目录
- 在Visual Studio 2010中配置VC++目录
- 在Visual Studio 2010中配置VC++目录
- 在Visual Studio 2010中配置VC++目录
- 在Visual Studio 2010中配置VC++目录
- 在Visual Studio 2010中自动登录Team Foundation
- 在Visual Studio Team Foundation Server中配置自动Build
- web developer tips (39):在Visual Studio 2008中取消远程web操作
- web developer tips (44):如何在Visual Studio中查看项目文件
- Visual Studio Tips 中文版
- visual studio tips
- 在 Visual Studio 中创建主/详细信息网页
- 在 Visual Studio 中创建主/详细信息网页
- 在 Visual Studio 2010 中创建 ASP.Net Web Service
- 堆和栈的不同点总结
- 2011/7/4 早上
- 【祝贺改版】iBook阅读星-android版开发tips分享
- 细数Java十宗罪
- 什么是PDM(二)
- CMake Tips - 在Visual Studio中按目录结构自动创建Filters(Source Groups)
- 保护你的在线图片被他人copy的方法
- IPMsg飞鸽传书网络协议解析手记
- 修改Linux内核版本(已编译多内核的情况下)
- 对proxy的理解
- 什么是PDM(三)
- C# 装箱和拆箱[整理]
- 数据库Index对效率的影响
- 15个值得推荐的个人提升方法