




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编辑CMakeList文件CMakeLists文件几乎可以在任何文本编辑器中进行编辑。一些编辑器,如记事本++,带有CMake语法突出显示和内置缩进支持。对于像Emacs或Vim这样的编辑器,CMake包括缩进和语法突出显示模式。这些可以找到在源发行版的目录中,或从CMake下载页面。Auxiliary在任何受支持的生成器(Makefiles、VisualStudio等)中,如果您编辑CMakeLists文件并重建,有些规则会自动调用CMake以更新生成的文件(例如生成文件或项目文件),根据需要。这有助于确保您生成的文件是始终与您的CMakeList文件同步。清宗语言CMake语言由注释、命令和变量组成。评论注释从行尾开始并一直运行到行尾。有关更多详细信息,请参阅手册。#变量CMakeLists文件使用变量与任何编程语言非常相似。清明变量名称区分大小写,只能包含字母数字字符和下划线。许多有用的变量由CMake自动定义,它们是手册中讨论过。这些变量以开头。避免此命名约定(并且,理想情况下,建立自己的)用于特定于项目的变量。CMAKE_所有CMake变量在内部存储为字符串,尽管它们可能有时被解释为其他类型的。使用该命令设置变量值。在最简单的形式中,第一个参数是变量的名称和其余参数是值。打包了多个值参数到以分号分隔的列表中并存储在变量作为字符串。例如:set(Foo"")#1quotedarg->valueis""set(Fooa)#1unquotedarg->valueis"a"set(Foo"abc")#1quotedarg->valueis"abc"set(Fooabc)#3unquotedargs->valueis"a;b;c"可以使用语法在命令参数中引用变量,其中是变量名称。如果命名变量未定义,引用将替换为空字符串;否则,它将替换为变量的值。更换是在扩展未带引号的参数之前执行,因此可变包含分号的值被拆分为零个或多个参数原始未引用论点的位置。例如:${VAR}VARset(Fooabc)#3unquotedargs->valueis"a;b;c"command(${Foo})#unquotedargreplacedbya;b;c#andexpandstothreeargumentscommand("${Foo}")#quotedargvalueis"a;b;c"set(Foo"")#1quotedarg->valueisemptystringcommand(${Foo})#unquotedargreplacedbyemptystring#andexpandstozeroargumentscommand("${Foo}")#quotedargvalueisemptystring系统环境变量和Windows注册表值可以是直接在CMake中访问。要访问系统环境变量,使用语法。CMake还可以引用注册表许多命令中的条目使用形式的语法,其中路径从注册表树和注册表项生成。$ENV{VAR}[HKEY_CURRENT_USER\Software\path1\path2;key]可变范围CMake中的变量的作用域与大多数变量略有不同语言。设置变量时,该变量对当前可见CMakeLists文件或函数以及任何子目录的CMakeLists文件,调用的任何函数或宏,以及包含使用命令。当新的子目录被处理(或调用函数),创建一个新的变量范围,并且使用调用中所有变量的当前值初始化范围。在子作用域中创建的任何新变量或所做的更改对现有变量,不会影响父范围。考虑以下示例:function(foo)message(${test})#testis1hereset(test2)message(${test})#testis2here,butonlyinthisscopeendfunction()set(test1)foo()message(${test})#testwillstillbe1here在某些情况下,您可能希望函数或子目录设置变量在其父级的作用域中。有一种方法可以让CMake返回一个值,可以通过使用带有命令的选项来完成。我们可以修改前面的示例,以便函数更改测试的值在其父级的范围内,如下所示:PARENT_SCOPEfoofunction(foo)message(${test})#testis1hereset(test2PARENT_SCOPE)message(${test})#teststill1inthisscopeendfunction()set(test1)foo()message(${test})#testwillnowbe2hereCMake中的变量按命令执行的顺序定义。请考虑以下示例:#FOOisundefinedset(FOO1)#FOOisnowsetto1set(FOO0)#FOOisnowsetto0要了解变量的范围,请考虑以下示例:set(foo1)#processthedir1subdirectoryadd_subdirectory(dir1)#includeandprocessthecommandsinfile1.cmakeinclude(file1.cmake)set(bar2)#processthedir2subdirectoryadd_subdirectory(dir2)#includeandprocessthecommandsinfile2.cmakeinclude(file2.cmake)在此示例中,由于变量是在首先,它将在处理DIR1和DIR2时定义。在相反,仅在处理DIR2时定义。同样,将在处理file1.cmake和file2.cmake,而只会在处理时定义文件2.cmake.foobarfoobar命令命令由命令名称、左括号、空格组成分隔的参数和右括号。每个命令在它在CMakeLists文件中的显示顺序。有关完整列表,请参阅手册CMake命令。CMake不再区分大小写,因此在你看到的地方,你可以使用or代替。它被认为是使用小写命令的最佳做法。所有空格(空格、换行符、制表符)被忽略,但分隔参数除外。因此,命令可能跨越多行,只要命令名称和左括号在同一行。commandCOMMANDCommandCMake命令参数以空格分隔且区分大小写。命令参数可以是引用的,也可以是未引用的。引用的参数开始和结束在双引号(“)中,并且始终只表示一个参数。任意双倍值中包含的引号必须使用反斜杠进行转义。考虑对需要转义的参数使用括号参数,请参阅手册。一个没有引用的论点以双引号以外的任何字符开头(后面的双引号是文字),并通过以下方式自动扩展为零个或多个参数在值内的分号上分隔。例如:command("")#1quotedargumentcommand("abc")#1quotedargumentcommand("a;b;c")#1quotedargumentcommand("a""b""c")#3quotedargumentscommand(abc)#3unquotedargumentscommand(a;b;c)#1unquotedargumentexpandsto3基本命令正如我们之前看到的,和命令显式设置或取消设置变量。、和命令提供字符串和列表的基本操作。和命令是主要的用于定义要构建的可执行文件和库的命令,以及哪些源文件组成它们。对于VisualStudio项目,源文件将照常显示在IDE中,但任何头文件都显示在项目使用不会。要显示头文件,只需将它们添加到可执行文件或库的源文件列表中;这可以为所有发电机完成。任何不使用的生成器头文件直接(例如基于Makefile的生成器)将干脆忽略它们。流控制CMake语言提供了三种流控制结构来帮助组织您的CMakeList文件并保持它们可维护。条件语句(例如)循环构造(例如和)程序定义(例如)条件语句首先,我们将考虑该命令。在许多方面,CMake中的命令就像任何其他语言。它计算其表达式并使用它来执行代码在其正文中或子句中的代码(可选)。为例:if(FOO)#dosomethinghereelse()#dosomethingelseendif()CMake还支持帮助顺序测试多个条件。例如:if(MSVC80)#dosomethinghereelseif(MSVC90)#dosomethingelseelseif(APPLE)#dosomethingelseendif()该命令记录了它可以测试的许多条件。循环构造和命令允许您处理按顺序发生的重复性任务。命令中断在正常情况下脱离OR循环结束。该命令使您能够执行组的CMake命令在列表成员上重复执行。考虑以下示例改编自VTKforeach(tfileTestAnisotropicDiffusion2DTestButterworthLowPassTestButterworthHighPassTestCityBlockDistanceTestConvolve)add_test(${tfile}-image${VTK_EXECUTABLE}${VTK_SOURCE_DIR}/Tests/rtImageTest.tcl${VTK_SOURCE_DIR}/Tests/${tfile}.tcl-D${VTK_DATA_ROOT}-VBaseline/Imaging/${tfile}.png-A${VTK_SOURCE_DIR}/Wrapping/Tcl)endforeach()命令的第一个参数是变量,每次迭代时将采用不同的值循环;其余参数是要在其上执行的值列表圈。在此示例中,循环的主体只是一个CMake命令,.在的正文中,每个引用循环变量(在本例中)的时间将替换为列表中的当前值。在第一个迭代,出现的将替换为。在下一次迭代中,将替换为。循环将继续循环,直到处理完所有参数。tfile${tfile}TestAnisotropicDiffusion2D${tfile}TestButterworthLowPass值得一提的是,循环可以嵌套,并且循环变量在任何其他变量之前被替换扩张。这意味着在循环的主体中,您可以使用循环变量构造变量名称。在下面的代码中,循环变量展开,然后与连接。然后扩展并测试新变量名称看看它是否匹配.tfile_TEST_RESULTFAILEDif(${${tfile}_TEST_RESULT}MATCHESFAILED)message("Test${tfile}failed.")endif()该命令根据测试条件提供循环。这命令中测试表达式的格式与它适用于命令,如前所述。考虑以下示例,由CTest使用。请注意,CTest在内部更新的值。CTEST_ELAPSED_TIME######################################################runparaviewandctesttestdashboardsfor6hours#while(${CTEST_ELAPSED_TIME}LESS36000)set(START_TIME${CTEST_ELAPSED_TIME})ctest_run_script("dash1_ParaView_vs71continuous.cmake")ctest_run_script("dash1_cmake_vs71continuous.cmake")endwhile()过程定义和命令支持重复性任务可能分散在您的CMakeLists文件中。一旦宏或函数被定义,它可以被任何CMakeList文件使用后处理它的定义。CMake中的函数非常类似于C或C++中的函数。您可以将参数传递到其中,它们成为功能。同样,一些标准变量,如、、、和、等。是定义。函数调用具有动态作用域。在一个函数中,你在新的变量范围内;这就像你如何掉进一个使用该命令的子目录,并且位于新的变量范围。函数时定义的所有变量被称为保持定义,但对变量的任何更改或新的变量仅存在于函数中。当函数返回时,这些变量将消失。更简单地说:当你调用函数,推送一个新的变量范围;当它返回时,弹出变量范围。ARGCARGVARGNARGV0ARGV1该命令定义一个新函数。第一个参数是要定义的函数的名称;所有其他参数均为函数的形式参数。function(DetermineTime_time)#passtheresultuptowhateverinvokedthisset(${_time}"1:23:45"PARENT_SCOPE)endfunction()#nowusethefunctionwejustdefinedDetermineTime(current_time)if(DEFINEDcurrent_time)message(STATUS"Thetimeisnow:${current_time}")endif()请注意,在此示例中,用于传递返回变量。调用该命令时,其值为,该值为。最后,该命令使用该选项在调用方的作用域,而不是本地作用域。_time_timecurrent_timePARENT_SCOPE宏的定义和调用方式与函数相同。这主要区别在于宏不会推送和弹出新变量范围,并且宏的参数不被视为变量而是在执行之前替换字符串。这很像宏与C或C++中的函数之间的差异。第一个参数是要创建的宏的名称;所有其他参数是宏的形式参数。#defineasimplemacromacro(assertTESTCOMMENT)if(NOT${TEST})message("Assertionfailed:${COMMENT}")endif()endmacro()#usethemacrofind_library(FOO_LIBfoo/usr/local/lib)assert(${FOO_LIB}"Unabletofindlibraryfoo")上面的简单示例创建了一个名为的宏。宏定义为两个参数;第一个是要测试的值和第二个是如果测试失败,要打印出的注释。身体的宏是带有命令的简单命令里面。当命令为发现。只需使用宏的名称即可调用宏,就好像它是命令。在上面的例子中,如果未找到,则将显示消息,指示错误条件。assertFOO_LIB该命令还支持定义采用变量的宏参数列表。如果要定义一个宏,这会很有用具有可选参数或多个签名。变量参数可以改为使用and、、等进行引用的形式参数。表示第一个参数宏;表示下一个,依此类推。你也可以混合使用正式参数和变量参数,如下面的示例。ARGCARGV0ARGV1ARGV0ARGV1#defineamacrothattakesatleasttwoarguments#(theformalarguments)plusanoptionalthirdargumentmacro(assertTESTCOMMENT)if(NOT${TEST})message("Assertionfailed:${COMMENT}")#ifcalledwiththreeargumentsthenalsowritethe#messagetoafilespecifiedasthethirdargumentif(${ARGC}MATCHES3)file(APPEND${ARGV2}"Assertionfailed:${COMMENT}")endif()endif()endmacro()#usethemacrofind_library(FOO_LIBfoo/usr/local/lib)assert(${FOO_LIB}"Unabletofindlibraryfoo")在此示例中,两个必需的参数是和。这些必需的参数可以按名称引用,如它们在本例中,或
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB31/T 1146.1-2019智能电网储能系统性能测试技术规范第1部分:削峰填谷应用
- DB31/T 1039-2017上海主要花坛花卉产品质量等级
- DB31/T 1036-2017悬铃木方翅网蝽防治技术规范
- DB31/T 1017-2016工作场所空气中甲苯二异氰酸酯的测定浸渍滤膜采集-高效液相色谱法
- DB31/ 565-2011中小学课业簿册安全卫生与质量要求
- 服装批发市场个性化定制与服务考核试卷
- 期货市场风险管理的数学模型考核试卷
- 2024年发动机曲轴项目资金申请报告代可行性研究报告
- 2024年真空管太阳集热器项目资金筹措计划书代可行性研究报告
- 影视剧主题曲版权翻唱及收益分成比例调整补充协议
- 不同物种的细胞色素c分子异同比较分析
- 游泳馆卫生许可证申请书
- 工序报验申请表
- 物质安全数据表(MSDS)84消毒液
- 物业监控室视频图像点信息采集表
- 三相异步电动机的正反转
- hec教程用户手册中文版
- 救护车急诊出诊转运风险相关事项告知书
- 六辊轧机轧辊装置的设计
- 初中学生综合素质表现评价档案
- 常用音乐术语大全含详细速度值
评论
0/150
提交评论