• Go按照条件编译


    Go 支持按照条件编译,具体来说它是通过 go/build包 里定义的tags和命名约定来让Go的包可以管理不同平台的代码 。

    我们这里以下面这个开源项目为例,来看Go的按条件编译, 这个开源项目是把Go的os包进行了扩展。

    https://bitbucket.org/kardianos/osext/src 

     

    osext 是获得当前执行程序的执行目录和文件信息。

    image

    执行情况如下:

    image

     

    查看编译文件

    我们用go list来查看在当前平台下 os/exec包里有哪些文件将会被编译

    image

    看当前项目下,有哪些文件会被编译,命令如下:

    image

    这里的 {{.GoFiles}} 是text/template里的模板代码

     

    go list 命令的信息如下:
    查看包名、路径、依赖项等等信息。
    参数:
    -json: 使用 json 格式输出包的相关信息,包括下面的依赖和导⼊。
    -f{{.Deps}}: 查看依赖包,包括直接或间接依赖。
    -f{{.Imports}}: 查看导入的包。

     

    D:mycodesgolangsrcitbucket.orgkardianososext>go list -f
    flag needs an argument: -f
    usage: list [-e] [-f format] [-json] [build flags] [packages]

    List lists the packages named by the import paths, one per line.

    The default output shows the package import path:

        code.google.com/p/google-api-go-client/books/v1
        code.google.com/p/goauth2/oauth
        code.google.com/p/sqlite

    The -f flag specifies an alternate format for the list, using the
    syntax of package template.  The default output is equivalent to -f
    '{{.ImportPath}}'. The struct being passed to the template is:

        type Package struct {
            Dir           string // directory containing package sources
            ImportPath    string // import path of package in dir
            ImportComment string // path in import comment on package statement
            Name          string // package name
            Doc           string // package documentation string
            Target        string // install path
            Goroot        bool   // is this package in the Go root?
            Standard      bool   // is this package part of the standard Go library?

            Stale         bool   // would 'go install' do anything for this package?

            Root          string // Go root or Go path dir containing this package

            // Source files
            GoFiles        []string // .go source files (excluding CgoFiles, TestGoF
    iles, XTestGoFiles)
            CgoFiles       []string // .go sources files that import "C"
            IgnoredGoFiles []string // .go sources ignored due to build constraints
            CFiles         []string // .c source files
            CXXFiles       []string // .cc, .cxx and .cpp source files
            MFiles         []string // .m source files
            HFiles         []string // .h, .hh, .hpp and .hxx source files
            SFiles         []string // .s source files
            SwigFiles      []string // .swig files
            SwigCXXFiles   []string // .swigcxx files
            SysoFiles      []string // .syso object files to add to archive

            // Cgo directives
            CgoCFLAGS    []string // cgo: flags for C compiler
            CgoCPPFLAGS  []string // cgo: flags for C preprocessor
            CgoCXXFLAGS  []string // cgo: flags for C++ compiler
            CgoLDFLAGS   []string // cgo: flags for linker
            CgoPkgConfig []string // cgo: pkg-config names

            // Dependency information
            Imports []string // import paths used by this package
            Deps    []string // all (recursively) imported dependencies

            // Error information
            Incomplete bool            // this package or a dependency has an error
            Error      *PackageError   // error loading package
            DepsErrors []*PackageError // errors loading dependencies

            TestGoFiles  []string // _test.go files in package
            TestImports  []string // imports from TestGoFiles
            XTestGoFiles []string // _test.go files outside package
            XTestImports []string // imports from XTestGoFiles
        }

    The template function "join" calls strings.Join.

    The template function "context" returns the build context, defined as:

            type Context struct {
                    GOARCH        string   // target architecture
                    GOOS          string   // target operating system
                    GOROOT        string   // Go root
                    GOPATH        string   // Go path
                    CgoEnabled    bool     // whether cgo can be used
                    UseAllFiles   bool     // use files regardless of +build lines,
    file names
                    Compiler      string   // compiler to assume when computing targ
    et paths
                    BuildTags     []string // build constraints to match in +build l
    ines
                    ReleaseTags   []string // releases the current release is compat
    ible with
                    InstallSuffix string   // suffix to use in the name of the insta
    ll dir
            }

    For more information about the meaning of these fields see the documentation
    for the go/build package's Context type.

    The -json flag causes the package data to be printed in JSON format
    instead of using the template format.

    The -e flag changes the handling of erroneous packages, those that
    cannot be found or are malformed.  By default, the list command
    prints an error to standard error for each erroneous package and
    omits the packages from consideration during the usual printing.
    With the -e flag, the list command never prints errors to standard
    error and instead processes the erroneous packages with the usual
    printing.  Erroneous packages will have a non-empty ImportPath and
    a non-nil Error field; other information may or may not be missing
    (zeroed).

    For more about build flags, see 'go help build'.

    For more about specifying packages, see 'go help packages'.

     

    编译标签

     

    在源代码里添加标注,通常称之为编译标签( build tag) ,编译标签是在尽量靠近源代码文件顶部的地方用注释的方式添加
    go build在构建一个包的时候会读取这个包里的每个源文件并且分析编译便签,这些标签决定了这个源文件是否参与本次编译

    编译标签添加的规则(附上原文):

    1. a build tag is evaluated as the OR of space-separated options
    2. each option evaluates as the AND of its comma-separated terms
    3. each term is an alphanumeric word or, preceded by !, its negation
    • 编译标签由空格分隔的编译选项(options)以"或"的逻辑关系组成
    • 每个编译选项由逗号分隔的条件项以逻辑"与"的关系组成
    • 每个条件项的名字用字母+数字表示,在前面加!表示否定的意思

    比如  https://bitbucket.org/kardianos/osext/src   这里的 osext_procfs.go 文件头上的 +build 部分就是。

    image

    这里标示 linux netbsd openbsd solaris 这些操作系统下会编译这个文件。

    更复杂的编译标签 可以参考: http://blog.csdn.net/varding/article/details/12675971 

     

     

     

    文件后缀

    这个方法通过改变文件名的后缀来提供条件编译,这种方案比编译标签要简单,go/build可以在不读取源文件的情况下就可以决定哪些文件不需要参与编译

    文件命名约定可以在go/build 包里找到详细的说明,简单来说如果你的源文件包含后缀:_$GOOS.go,那么这个源文件只会在这个平台下编译,_$GOARCH.go也是如此。这两个后缀可以结合在一起使用,但是要注意顺序:_$GOOS_$GOARCH.go,    不能反过来用:_$GOARCH_$GOOS.go

    比如  https://bitbucket.org/kardianos/osext/src 这里的文件就是这个规则

    osext_plan9.go        只会在 plan9 中编译。

    osext_windows.go   只会在windows下编译。

     

    更多请参考: http://blog.csdn.net/varding/article/details/12675971 

     

    参考资料:

    使用go build 进行条件编译
    http://blog.csdn.net/varding/article/details/12675971

  • 相关阅读:
    Kali安装输入法
    各类16进制文件头
    KALI搭建DVWA
    [LeetCode]子串的最大出现次数(字符串)
    [LeetCode]415. 字符串相加、43. 字符串相乘
    [LeetCode]1249. 移除无效的括号(字符串,栈)
    [Leetcode]585. 2016年的投资(MySQL)
    [LeetCode]678. 有效的括号字符串、20. 有效的括号(栈)
    [LeetCode]1071. 字符串的最大公因子(gcd)
    [LeetCode]Sql系列4
  • 原文地址:https://www.cnblogs.com/ghj1976/p/4203919.html
Copyright © 2020-2023  润新知