编写 CMakeLists 文件掌握 CMake

上传人:云*** 文档编号:358434177 上传时间:2023-08-23 格式:DOCX 页数:6 大小:21.53KB
返回 下载 相关 举报
编写 CMakeLists 文件掌握 CMake_第1页
第1页 / 共6页
编写 CMakeLists 文件掌握 CMake_第2页
第2页 / 共6页
编写 CMakeLists 文件掌握 CMake_第3页
第3页 / 共6页
编写 CMakeLists 文件掌握 CMake_第4页
第4页 / 共6页
编写 CMakeLists 文件掌握 CMake_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《编写 CMakeLists 文件掌握 CMake》由会员分享,可在线阅读,更多相关《编写 CMakeLists 文件掌握 CMake(6页珍藏版)》请在金锄头文库上搜索。

1、编辑CMakeList文件CMakeLists文件几乎可以在任何文本编辑器中进行编辑。一些编辑器,如记事本+,带有CMake语法突出显示和内置缩进支持。对于像Emacs或Vim这样的编辑器,CMake包括缩进和语法突出显示模式。这些可以找到在源发行版的目录中,或从CMake下载页面。Auxiliary在任何受支持的生成器(Makefiles、VisualStudio等)中,如果您编辑CMakeLists文件并重建,有些规则会自动调用CMake以更新生成的文件(例如生成文件或项目文件),根据需要。这有助于确保您生成的文件是始终与您的CMakeList文件同步。清宗语言CMake语言由注释、命令和

2、变量组成。评论注释从行尾开始并一直运行到行尾。有关更多详细信息,请参阅手册。#变量CMakeLists文件使用变量与任何编程语言非常相似。清明变量名称区分大小写,只能包含字母数字字符和下划线。许多有用的变量由CMake自动定义,它们是手册中讨论过。这些变量以开头。避免此命名约定(并且,理想情况下,建立自己的)用于特定于项目的变量。CMAKE_所有CMake变量在内部存储为字符串,尽管它们可能有时被解释为其他类型的。使用该命令设置变量值。在最简单的形式中,第一个参数是变量的名称和其余参数是值。打包了多个值参数到以分号分隔的列表中并存储在变量作为字符串。例如:set(Foo)#1quotedarg

3、-valueisset(Fooa)#1unquotedarg-valueisaset(Fooabc)#1quotedarg-valueisabcset(Fooabc)#3unquotedargs-valueisa;b;c可以使用语法在命令参数中引用变量,其中是变量名称。如果命名变量未定义,引用将替换为空字符串;否则,它将替换为变量的值。更换是在扩展未带引号的参数之前执行,因此可变包含分号的值被拆分为零个或多个参数原始未引用论点的位置。例如:$VARVARset(Fooabc)#3unquotedargs-valueisa;b;ccommand($Foo)#unquotedargreplaced

4、bya;b;c#andexpandstothreeargumentscommand($Foo)#quotedargvalueisa;b;cset(Foo)#1quotedarg-valueisemptystringcommand($Foo)#unquotedargreplacedbyemptystring#andexpandstozeroargumentscommand($Foo)#quotedargvalueisemptystring系统环境变量和Windows注册表值可以是直接在CMake中访问。要访问系统环境变量,使用语法。CMake还可以引用注册表许多命令中的条目使用形式的语法,其中路

5、径从注册表树和注册表项生成。$ENVVARHKEY_CURRENT_USERSoftwarepath1path2;key可变范围CMake中的变量的作用域与大多数变量略有不同语言。设置变量时,该变量对当前可见CMakeLists文件或函数以及任何子目录的CMakeLists文件,调用的任何函数或宏,以及包含使用命令。当新的子目录被处理(或调用函数),创建一个新的变量范围,并且使用调用中所有变量的当前值初始化范围。在子作用域中创建的任何新变量或所做的更改对现有变量,不会影响父范围。考虑以下示例:function(foo)message($test)#testis1hereset(test2)me

6、ssage($test)#testis2here,butonlyinthisscopeendfunction()set(test1)foo()message($test)#testwillstillbe1here在某些情况下,您可能希望函数或子目录设置变量在其父级的作用域中。有一种方法可以让CMake返回一个值,可以通过使用带有命令的选项来完成。我们可以修改前面的示例,以便函数更改测试的值在其父级的范围内,如下所示:PARENT_SCOPEfoofunction(foo)message($test)#testis1hereset(test2PARENT_SCOPE)message($test)

7、#teststill1inthisscopeendfunction()set(test1)foo()message($test)#testwillnowbe2hereCMake中的变量按命令执行的顺序定义。请考虑以下示例:#FOOisundefinedset(FOO1)#FOOisnowsetto1set(FOO0)#FOOisnowsetto0要了解变量的范围,请考虑以下示例:set(foo1)#processthedir1subdirectoryadd_subdirectory(dir1)#includeandprocessthecommandsinfile1.cmakeinclude(f

8、ile1.cmake)set(bar2)#processthedir2subdirectoryadd_subdirectory(dir2)#includeandprocessthecommandsinfile2.cmakeinclude(file2.cmake)在此示例中,由于变量是在首先,它将在处理DIR1和DIR2时定义。在相反,仅在处理DIR2时定义。同样,将在处理file1.cmake和file2.cmake,而只会在处理时定义文件2.cmake.foobarfoobar命令命令由命令名称、左括号、空格组成分隔的参数和右括号。每个命令在它在CMakeLists文件中的显示顺序。有关完整

9、列表,请参阅手册CMake命令。CMake不再区分大小写,因此在你看到的地方,你可以使用or代替。它被认为是使用小写命令的最佳做法。所有空格(空格、换行符、制表符)被忽略,但分隔参数除外。因此,命令可能跨越多行,只要命令名称和左括号在同一行。commandCOMMANDCommandCMake命令参数以空格分隔且区分大小写。命令参数可以是引用的,也可以是未引用的。引用的参数开始和结束在双引号(“)中,并且始终只表示一个参数。任意双倍值中包含的引号必须使用反斜杠进行转义。考虑对需要转义的参数使用括号参数,请参阅手册。一个没有引用的论点以双引号以外的任何字符开头(后面的双引号是文字),并通过以下方

10、式自动扩展为零个或多个参数在值内的分号上分隔。例如:command()#1quotedargumentcommand(abc)#1quotedargumentcommand(a;b;c)#1quotedargumentcommand(abc)#3quotedargumentscommand(abc)#3unquotedargumentscommand(a;b;c)#1unquotedargumentexpandsto3基本命令正如我们之前看到的,和命令显式设置或取消设置变量。、和命令提供字符串和列表的基本操作。和命令是主要的用于定义要构建的可执行文件和库的命令,以及哪些源文件组成它们。对于Vi

11、sualStudio项目,源文件将照常显示在IDE中,但任何头文件都显示在项目使用不会。要显示头文件,只需将它们添加到可执行文件或库的源文件列表中;这可以为所有发电机完成。任何不使用的生成器头文件直接(例如基于Makefile的生成器)将干脆忽略它们。流控制CMake语言提供了三种流控制结构来帮助组织您的CMakeList文件并保持它们可维护。 条件语句(例如) 循环构造(例如和) 程序定义(例如)条件语句首先,我们将考虑该命令。在许多方面,CMake中的命令就像任何其他语言。它计算其表达式并使用它来执行代码在其正文中或子句中的代码(可选)。为例:if(FOO)#dosomethinghere

12、else()#dosomethingelseendif()CMake还支持帮助顺序测试多个条件。例如:if(MSVC80)#dosomethinghereelseif(MSVC90)#dosomethingelseelseif(APPLE)#dosomethingelseendif()该命令记录了它可以测试的许多条件。循环构造和命令允许您处理按顺序发生的重复性任务。命令中断在正常情况下脱离OR循环结束。该命令使您能够执行组的CMake命令在列表成员上重复执行。考虑以下示例改编自VTKforeach(tfileTestAnisotropicDiffusion2DTestButterworthLo

13、wPassTestButterworthHighPassTestCityBlockDistanceTestConvolve)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()命令的第一个参数是变量,每次迭代时将采用不同的值循环;其余参数是要在其上执行的值列表圈。在

14、此示例中,循环的主体只是一个CMake命令,.在的正文中,每个引用循环变量(在本例中)的时间将替换为列表中的当前值。在第一个迭代,出现的将替换为。在下一次迭代中,将替换为。循环将继续循环,直到处理完所有参数。tfile$tfileTestAnisotropicDiffusion2D$tfileTestButterworthLowPass值得一提的是,循环可以嵌套,并且循环变量在任何其他变量之前被替换扩张。这意味着在循环的主体中,您可以使用循环变量构造变量名称。在下面的代码中,循环变量展开,然后与连接。然后扩展并测试新变量名称看看它是否匹配.tfile_TEST_RESULTFAILEDif($

15、tfile_TEST_RESULTMATCHESFAILED)message(Test$tfilefailed.)endif()该命令根据测试条件提供循环。这命令中测试表达式的格式与它适用于命令,如前所述。考虑以下示例,由CTest使用。请注意,CTest在内部更新的值。CTEST_ELAPSED_TIME#runparaviewandctesttestdashboardsfor6hours#while($CTEST_ELAPSED_TIMELESS36000)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+中的函数。您可以将参数传递到其中,它们成为功能。同样,一些标准变量,如、和、等。是定义。函数调用具有

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > Python

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号