CMake如何简化生成过程:第2部分(高级编译系统)
2010-12-23 15:20
337 查看
我以前的帖子解释Cmake是如何管理一个简单的项目(只包含一个定义和实现文件)。现在,我们可以在一个复杂的项目看,含有一个共同的共享库,示例和单元测试。在这种情况下,而不是一个愚蠢的HelloWorld项目,我选择了Itemviews-NG的项目,这是一个实验性项目,由Qt实验室主办,并且目前使用qmake作为构建系统。该项目本身包含以下内容:
n共享库包含一个共同的基类;
n库的每一个类实例的集合;
n库的每一个类单元测试集合;
注意:文档将不被创建了-Itemview-NG使用qdoc生成文档,AFAIK还没有很好地和CMake整合呢。这儿有另外一个替代,在Cmake中使用doxygen,连同lcov封面和gcovHTML输出相结合。
作为一个起点,该项目本身包含了需要由MOC处理各种文件。为了简化这个过程中,可以使用CMake的工具,它会使用automoc工具自动找到所需的文件进行预处理,并包含它们在目标编译中。Qt库和包含文件也提供了的Qt4cmake的包(内置)。要使用的Qt4加automocCMake的软件包,你可以包括在项目上的根目录下的CMakeFiles.txt以下代码:
现在让我们看看src目录CMakeFiles.txt的变化
现在,该项目使用的每一个例子或测试可以使用目标itemviews-ng作为联系的依赖。由于每个例子和测试是在一个类似的方法编译,我们可以使用函数从而简化编译过程。以下是这些函数的例子:
上述功能可以插入到.cmake文件中(如:InternalMacros.cmake)。这就需要cmake的/modules目录中去找。要加载它,在根目录的CMakeLists.txt加上以下行:
现在,你创建的每一个例子的CmakeLists.txt像这样:
这同样适用于测试:
我已经在我的个人gitorious网站itemviews-ngclone上创建一个cmake分支。你可以看看,看看如何解释上面的代码的行为。
附:原文及原文地址:
http://cabledogs.org/abinader/2009/12/09/how-cmake-simplifies-the-build-process-part-2-advanced-build-system/
n共享库包含一个共同的基类;
n库的每一个类实例的集合;
n库的每一个类单元测试集合;
注意:文档将不被创建了-Itemview-NG使用qdoc生成文档,AFAIK还没有很好地和CMake整合呢。这儿有另外一个替代,在Cmake中使用doxygen,连同lcov封面和gcovHTML输出相结合。
作为一个起点,该项目本身包含了需要由MOC处理各种文件。为了简化这个过程中,可以使用CMake的工具,它会使用automoc工具自动找到所需的文件进行预处理,并包含它们在目标编译中。Qt库和包含文件也提供了的Qt4cmake的包(内置)。要使用的Qt4加automocCMake的软件包,你可以包括在项目上的根目录下的CMakeFiles.txt以下代码:
#Qt4packageismandatory
find_package(Qt4REQUIRED)
include(${QT_USE_FILE})
#Automoc4isalsomandatory
find_package(Automoc4REQUIRED)
现在让我们看看src目录CMakeFiles.txt的变化
set(CMAKE_INCLUDE_CURRENT_DIRON)
#Createavariablecontainingalistofallimplementationfiles
file(GLOBitemviews-ng_SOURCES*.cpp)
#ThesameappliesforheaderswhichgeneratesMOCfiles(excludingprivateimplementationones)
file(GLOBitemviews-ngHEADERS*[^_p].h)
#Nowthemagichappens:ThefunctionbelowisresponsibleforgeneratingtheMOCfiles)
automoc4_moc_headers(itemviews-ng${itemviews-ng_HEADERS})
#Createsatargetitemviews-ngwhichcreatesashardlibrarywiththegivensources
automoc4_add_library(itemviews-ngSHARED${itemviews-ng_SOURCES})
#TellsthesharedlibrarytobelinkedagainstQtones
target_link_libraries(itemviews-ng${QT_LIBRARIES})
#Installstheheaderfilesintothe{build_dir}/include/itemviews-ngdirectory
install(FILES${itemviews-ng_HEADERS}DESTINATIONinclude/itemviews-ng)
#Installsthetargetfile(libitemviews-ng.so)intothe{build_dir}/libdirectory
install(TARGETSitemviews-ngLIBRARYDESTINATIONlib)
现在,该项目使用的每一个例子或测试可以使用目标itemviews-ng作为联系的依赖。由于每个例子和测试是在一个类似的方法编译,我们可以使用函数从而简化编译过程。以下是这些函数的例子:
function(exampleexample_NAMEexample_SOURCESexample_HEADERS)
automoc4_moc_headers(${example_NAME}_example${examples_HEADERS})
#Thethirdargument(resourcefiles)isoptional:
set(example_RESOURCES${ARGV3})
if(example_RESOURCES)
automoc4_add_executable(${example_NAME}_example
${example_SOURCES}{example_RESOURCES})
else(example_RESOURCES)
automoc4_add_executable(${example_NAME}_example
${example_SOURCES})endif(example_RESOURCES)
target_link_libraries(${example_NAME}_exampleitemviews-ng
{QT_LIBRARIES})
endfunction(example)
function(testtest_NAMEtest_SOURCES)
set(test_RESOURCES${ARGV2})
if(test_RESOURCES)
automoc4_add_executable(${test_NAME}_test
{test_SOURCES}${test_RESOURCES})
else(test_RESOURCES)
automoc4_add_executable(${test_NAME}_test
${test_SOURCES})endif(test_RESOURCES)
target_link_libraries(${test_NAME}_testitemviews-ng
${QT_LIBRARIES})
include_directories(${itemviews-ng_BINARY_DIR}/tests/${test_NAME})
add_test(${test_NAME}${test_NAME}_test)
add_dependencies(check${test_NAME}_test)
endfunction(test)
上述功能可以插入到.cmake文件中(如:InternalMacros.cmake)。这就需要cmake的/modules目录中去找。要加载它,在根目录的CMakeLists.txt加上以下行:
include(InternalMacros)
现在,你创建的每一个例子的CmakeLists.txt像这样:
set(mycustomexample_SOURCESmycustomexample.cppmain.cpp)
set(mycustomexample_HEADERSmycustomexample.h)
example(mycustomexample"${mycustomexample_SOURCES}""${mycustomexample_HEADERS}")
这同样适用于测试:
test(mycustomtest"${mycustomtest_SOURCES}")
我已经在我的个人gitorious网站
附:原文及原文地址:
相关文章推荐
- Cmake如何简化生成过程:第1部分(基本编译系统)
- 如何使用FastReport.Net在SAP NetWeaver中生成报表-第2部分:输出信息(打印文档)
- Analytics(分析)训练第2部分 - 如何查找在业务分析过程
- 10个重要部分,讲述从程序员到高级系统架构师该如何进阶?
- 计算机是如何工作的———高级语言转变为机器语言的过程(20135304 刘世鹏)
- Ubuntu16:cmake生成Makefile编译caffe过程(OpenBLAS/CPU+GPU)塈解决nvcc warning:The 'compute_20', 'sm_20'
- 如何使用Box2D和Cocos2D制作一款像Fruit Ninja一样的游戏-第2部分
- [技术分享 - RMS 篇] 如何在企业域环境内简化 RMS 认证过程
- 多平台工程生成工具CMAKE如何创建VS工程组——folder属性
- OpenCV300 CMake生成工程项目过程中的问题
- 如何实现iOS图书动画-第2部分(下)
- 如何查看存储过程中动态生成的sql
- OpenCV300 CMake生成工程项目过程中的问题
- 如何在Windows下使用CMake 2.8.2生成Ogre 1.7.1工程文件
- 10个重要部分,讲述从程序员到高级系统架构师该如何进阶?
- spark中生成stage的过程中,是如何得知某个rdd的缓存情况。
- WebSphere Application Server V7高级安全性加强,第2部分
- 考虑下列生成二进制的过程,编译器被用来生成单个单元的目标代码,链接器被用来将多个目标单元合并成一个程序二进制,链接器如何改变指令和数据到内存地址的绑定?需要什么信息从编译器传递给链接器,以协助完成链接
- 分析cocos2d-x在Android上的编译过程(1):cocco2d-x是如何生成的Android的目录结构
- git: 如何用git-am来合并git format-patch生成的一系列的patch(我增加了patch部分的内容)