GN语法设计理念编写构建文件不应该是一个创造性的努力。理想情况下,两个人应该产生相同的构建文件来实现相同的需求。除非绝对需要,否则不应有任何灵活性。做越多的事情越可能产生致命的错误。定义应该比代码更像代码。我不想编写或调试Prolog。但是我们团队的每个人都可以编写和调试C++和Python。构建语言应该被视为构建应该如何工作。表达任意事物不一定容易甚至不可能。我们应该改变源代码和工具,使构建变得更简单,而不是把所有事情都变得更复杂以符合外部要求(在合理的范围内)。在有意义的时候就像Blaze一样(见下面的“与Blaze的区别和相似之处”)gn是动态类型语言gn类型1.布尔(true,false)2.64位有符号整数3.字符串字符串用双引号括起来,并使用反斜杠作为转义字符。唯一支持的转义序列是:\"(用于直接应用)\$(字面上的美元符号)\\(用于文字反斜杠)任何其他反斜杠的使用都被视为文字反斜杠。所以,例如,\b在模式中使用不需要转义,大多数Windows路径"C:\foo\bar.h"也不需要。使用$支持简单的变量替换,其中美元符号后的单词被替换为变量的值。如果没有非变量名字符来终止变量名称,可以选择{}包围名称。更复杂的表达式不被支持,仅支持变量名称替换。
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)