a="mypath"b="$a/foo.cc"#b-"mypath/foo.cc"c="foo${a}bar.cc"#c-"foomypathbar.cc"4.列表(任何其他类型)列表支持追加(将列表追加到另一个列表,是追加第二个列表中的项目,而不是将列表追加为嵌套成员。):
a=["first"]a+=["second"]#["first","second"]a+=["third","fourth"]#["first","second","third","fourth"]b=a+["fifth"]#["first","second","third","fourth","fifth"]列表中删除项目(列表中的-运算符搜索匹配项并删除所有匹配的项目。从另一个列表中减去一个列表将删除第二个列表中的每个项目):
a=["first","second","third","first"]b=a-["first"]#["second","third"]a-=["second"]#["first","third","fourth"]列表支持从零开始的下标以提取值:
a=["first","second","third"]b=a[1]#-"second"[]运算符是只读的,不能用来改变列表。这个主要的用例是当一个外部脚本返回几个已知的值,并且你想提取它们。在某些情况下,如果您要添加到列表中,则很容易覆盖列表。为了帮助理解这种情况,将非空列表分配给包含现有非空列表的变量是错误的。如果您想避开此限制,请首先将目标变量分配给空列表。
a=[“one”]a=[“two”]#错误:用非空列表覆盖非空列表。a=[]#OKa=[“two”]#OK5.条件语句条件判断看起像C语法:
if(is_linux
(is_wintarget_cpu==“x86”)){sources-=["something.cc"]}elseif(...){...}else{...}6.循环你可以使用foreach迭代一个列表。这是不鼓励的。构建应该做的大部分事情通常都可以在不做这件事情的情况下表达出来,如果你觉得有必要的话,这可能表明你在元构建中做了太多工作。
foreach(i,mylist){print(i)#Note:iisacopyofeachelement,notareferencetoit.}7.函数调用简单的函数调用看起来像大多数其他语言,这些功能是内置的,用户不能定义新的功能。
print("hello,world")assert(is_win,"ThisshouldonlybeexecutedonWindows")一些函数在它们下面接受一个由{}组成的代码块:
static_library(“mylibrary”){sources=[“a.cc”]}8.作用域和执行文件和函数调用后面跟着{}块引入新的作用域。作用域是嵌套的。当您读取一个变量时,将会以相反的顺序搜索包含的作用域,直到找到匹配的名称。变量写入总是进入最内层的作用域。除了最内层的作用域以外,没有办法修改任何封闭作用域。这意味着当你定义一个目标时,例如,你在块内部做的任何事情都不会泄露到文件的其余部分。if/else/foreach语句,即使他们使用{},不会引入新的范围,所以更改将持续在语句之外。gn命名事物文件和目录名称:文件和目录名称是字符串,并被解释为相对于当前构建文件的目录。有三种可能的形式:1.相对名称:
"foo.cc""src/foo.cc""../src/foo.cc"2.源代码树绝对名称:
“//net/foo.cc”“//base/test/foo.cc”3.系统绝对名称(罕见,通常用于包含目录):
"/usr/local/include/""/C:/ProgramFiles/WindowsKits/Include"gn构建配置1.目标目标是构建图中的一个节点。它通常代表将要生成的某种类型的可执行文件或库文件。目标取决于其他目标。内置的目标类型(请参阅gnhelp以获取更多帮助)是:类型说明action运行一个脚本来生成一个文件action_foreach为每个源文件运行一次脚本bundle_data声明数据加入到Mac/iOS包create_bundle创建一个Mac/iOS包executable生成一个可执行文件group引用一个或多个其他目标的虚拟依赖关系节点shared_library.dll或.soloadable_module.dll或.so只能在运行时加载source_set个轻量级的虚拟静态库(通常比真正的静态库更可取,因为它的构建速度会更快)static_library.lib或.a文件(通常你会想要一个source_set)