您的位置:首页 > 其它

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以下代码:
#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网站itemviews-ngclone上创建一个cmake分支。你可以看看,看看如何解释上面的代码的行为。

附:原文及原文地址:
http://cabledogs.org/abinader/2009/12/09/how-cmake-simplifies-the-build-process-part-2-advanced-build-system/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐