如何在go构建工具中使用条件编译

当开发依赖底层平台或处理器特定特性的围棋包时,通常需要提供专门的实现。

Go没有预处理器、宏系统或#定义声明来控制平台特定代码的包含。取而代之的是标签和命名约定系统定义在去/建包裹并得到了去工具允许Go包为它们正在编译的特定平台定制自己。

如何在go构建工具中使用条件编译

这篇文章解释了条件编译是如何实现的,并向您展示了如何在项目中使用它。

但首先,列出清单

在我们讨论条件编译之前,我们需要了解一点go列表命令。go列表允许您访问为构建过程提供动力的内部数据结构。

go列表接受大多数与去建吧,试验,和安装但是不执行任何编译。使用-f,格式标志,我们可以提供文本/模板在包含去/建。包裹结构。

使用格式标志,我们可以询问go列表告诉我们将要编译的文件的名字。

% go列表-f“{ 0 }”。“操作系统/执行[执行。运行lp_unix。运行]

在上面的例子中,我在os/exec将在此基础上编译的包linux/arm系统。结果是两个文件,exec.go它包含所有平台共享的公共代码,并且lp_unix.go同时包含的实现高管。LookPath适用于unix类系统。

如果我在一个视窗系统上运行相同的命令,结果会是

C:\go%3E go列表-f '{。“操作系统/执行[执行。运行lp_windows。运行] 

这个简短的示例演示了Go条件编译系统的两个部分,称为构建约束,我们现在将对此进行更详细的探讨。

构建标签

条件编译的第一种方法是通过源代码中的注释,通常称为构建标记。

构建标记被实现为注释,并且应该尽可能靠近文件的顶部。

当...的时候去建吧它将分析包中的每个源文件,寻找构建标签。这些标签控制是否去建吧将文件传递给编译器。

构建标签遵循这三个规则

  1. 构建标记被评估为空格分隔选项的“或”
  2. 每个选项评估为逗号分隔术语的“与”
  3. 每个术语都是字母数字单词,或者,前面是!,它的否定

例如,源文件顶部的构建标记

//+构建达尔文freebsd netbsd openbsd 

会将该文件限制为仅建立在支持kqueue。

一个文件可能有多个构建标记。总体约束是单个约束的逻辑与。例如

//+构建linux达尔文//+构建386

将构建限制为linux/386或者达尔文/386仅限平台。

关于评论的注释

当人们第一次试图让构建标签发挥作用时,有一件事通常会引起人们的注意,那就是

//+构建!linuxpackage mypkg //错误

在这个例子中,没有换行来分隔构建标记和包声明。因此,构建标记作为描述包的注释与包声明相关联,因此被忽略。

//+构建!linuxpackage mypkg //正确

这是正确的形式,带有尾随换行符的注释是独立的,与任何声明和去看兽医将检测丢失的新行。

% go vet mypkgmypkg . go:1:+生成注释在文件退出状态1中出现太晚

当此功能添加到去看兽医它在标准库和sub repos中发现了几个错误,所以如果你第一次做错了,不要难过。

作为参考,这里有一个示例,显示了一个许可证前导、一个构建标签和一个包声明

% head head pin . go//版权所有2013出路企业。保留所有权利。//此源代码的使用受BSD样式// license的控制,该许可证可以在license文件中找到。//+建造一些人,另一些人,第三!amd64//包装大头针工具计算的数字太大//它们会让你头晕。包装大头针

文件后缀

提供条件编译的第二个选项是源文件本身的名称。这个方案比构建标记简单,并且允许去/建包来排除文件,而不必处理文件。

的文档中描述了命名约定去/建包裹。简单地说,如果源文件包含后缀,_$GOOS.go那么它只会建立在那个平台上。所有其他平台的行为就像文件不存在一样。这同样适用于_$GOARCH.go。这两者可以结合为_$GOOS_$GOARCH.go,但是不 _$GOARCH_$GOOS.go。

文件后缀的一些例子是,

mypkg_freebsd_arm.go //仅构建于freebsd/arm系统mypkg_plan9.go //仅构建于plan9

您的源文件仍然需要名称,例如后缀是不够的

_linux.go_freebsd_386.go 

将被忽略,即使在linux或freebsd系统上,因为去/建包忽略任何以句点或下划线开头的文件。

在构建标签和文件后缀之间进行选择

构建标签和文件后缀在功能上重叠。例如,一个名为mypkg_linux.go包含构建标记的//+构建linux是多余的。

通常,当在构建标记或文件后缀之间进行选择时,当平台或体系结构与您想要包含的文件完全匹配时,您应该选择文件后缀。例如,

mypkg_linux.go //仅构建于linux系统mypkg_windows_amd64.go //仅构建于windows 64位平台

相反,如果您的文件适用于多个平台或架构,或者您需要排除应该使用特定的平台、构建标签。例如,

% grep '+build ' $ HOME/go/src/pkg/OS/exec/LP _ UNIX . go//+build Darwin dragonfly FreeBSD Linux netbsd open BSD

构建在所有unix平台上。

% grep '+build ' $ HOME/go/src/pkg/OS/type _ not win . go//+build!窗子

建立在除视窗以外的所有平台上。

包扎

虽然这篇文章只关注Go源文件,但是构建标记和文件后缀可以用于去工具可以构建。这包括。c和。s文件。围棋标准库,特别是运行时间,syscall,os和网包包含了很好的例子,我建议研究它们。

测试文件也支持构建标签和文件后缀,并以与Go源文件相同的方式运行,有条件地包括基于每个平台的测试用例。同样,标准库包含许多很好的例子。

最后,虽然本文的标题讨论了去工具,条件编译功能不仅限于该工具。您可以构建自己的工具来使用和分析具有相同文件后缀的围棋代码,并使用去/建包裹。

看go语言,关注VX公众号:studytogo

声明:转载此文是出于网络的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。


分享到:


相關文章: