# Go language - https://golang.org/ [buildout] extends = ../findutils/buildout.cfg ../gcc/buildout.cfg ../git/buildout.cfg ../pkgconfig/buildout.cfg ../swig/buildout.cfg ../patch/buildout.cfg ./buildout.hash.cfg parts = gowork go # ---- Go builds itself ---- [golang-common] recipe = slapos.recipe.cmmi shared = true configure-command = : location = @@LOCATION@@ make-binary = # build and test Go and its standard library # clean intermediate cache before installing # contrary to build cache in gowork, build cache, that Go uses during its own build, is not reused anywhere: # https://github.com/golang/go/blob/go1.18.2-0-g8ed0e51b5e/src/cmd/dist/build.go#L239-L242 make-targets= cd src && unset GOBIN && ./all.bash && GOCACHE=`pwd`/../pkg/obj/go-build ../bin/go clean -cache && cp -alf .. ${:location} # some testdata files have an issue with slapos.extension.strip. post-install = ${findutils:location}/bin/find ${:location}/src -type d -name testdata -exec rm -rf {} \; || true environment = PATH=${swig:location}/bin:${patch:location}/bin:%(PATH)s GOROOT_FINAL=${:location} ${:environment-extra} # TestChown and TestSCMCredentials currently fail in a user-namespace # https://github.com/golang/go/issues/42525 # the patches apply to go >= 1.12 patch-options = -p1 patches = ${:_profile_base_location_}/skip-chown-tests.patch#d4e3c8ef83788fb2a5d80dd75034786f ${:_profile_base_location_}/fix-TestSCMCredentials.patch#1d8dbc97cd579e03fafd8627d48f1c59 [golang14] <= golang-common # https://golang.org/doc/install/source#bootstrapFromSource url = https://dl.google.com/go/go1.4-bootstrap-20171003.tar.gz md5sum = dbf727a4b0e365bf88d97cbfde590016 environment-extra = # build Go without testing it # NOTE go1.4 does not have build cache make-targets= cd src && unset GOBIN && ./make.bash && cp -alf .. ${:location} # skip-chown-tests.patch does not apply to go1.4, but we don't run go1.4 tests. patches = [golang1.12] <= golang-common url = https://golang.org/dl/go1.12.17.src.tar.gz md5sum = 6b607fc795391dc609ffd79ebf41f080 # go1.12 needs go1.4 to bootstrap environment-extra = GOROOT_BOOTSTRAP=${golang14:location} [golang1.16] <= golang-common url = https://golang.org/dl/go1.16.13.src.tar.gz md5sum = 1c076f952d9af57590a36fa7d36f695a # go1.16 needs go1.4 to bootstrap environment-extra = GOROOT_BOOTSTRAP=${golang14:location} [golang1.17] <= golang-common url = https://golang.org/dl/go1.17.6.src.tar.gz md5sum = dc57f93f323e9f8189e5ffc1f223e346 # go1.17 needs go1.4 to bootstrap environment-extra = GOROOT_BOOTSTRAP=${golang14:location} # ---- infrastructure to build Go workspaces / projects ---- # gowork is the top-level section that defines Go workspace. # # It specifies global settings that are used to build Go programs: # # - Go toolchain to use, e.g. # # [gowork] # golang = ${golang1.15:location} # # - For Cgo support pkg-config is made pre-available by gowork, and users # should list paths where to search for pkg-config files, e.g. this way: # # [gowork] # cpkgpath = # ${sqlite3:location}/lib/pkgconfig # ${zlib:location}/lib/pkgconfig # # - It is also possible to specify Go build flags used for compilation e.g. this way: # # [gowork] # buildflags = -race # # - If some environment variables are needed during the build, they can be # added with environment option, e.g. this way: # # [gowork] # environment = # CGO_ENABLED = 1 # FOO = bar # # Users can also add `install` field to [gowork] to request Go programs to be # automatically installed, for example: # # [gowork] # install = # lab.nexedi.com/kirr/neo/go/...@v0.0.0-20210103165133-f3effa6c535f # golang.org/x/tools/gopls@v0.4.3 # ${helloweb:location}/go:./... # # # ${go:exe} is standalone executable that runs go in activated gowork environment. [go] recipe = slapos.recipe.template exe = ${buildout:bin-directory}/go output= ${:exe} inline = #!/bin/sh -e . ${gowork:env.sh} exec go "$@" [gowork] directory = ${gowork.dir:directory} src = ${gowork.dir:src} bin = ${gowork.dir:bin} depends = ${gowork.goinstall:recipe} # go version used for the workspace (possible to override in applications) golang = ${golang1.17:location} # no special build flags by default buildflags = # empty pkg-config path by default cpkgpath = # by default don't `go install` anything install = # empty key=value environment by default environment = # everything is done by dependent parts recipe = plone.recipe.command command = : # env.sh for compiling and running go programs env.sh = ${gowork-env.sh:output} [gowork-env.sh] recipe = slapos.recipe.template url = ${:_profile_base_location_}/${:filename} output = ${gowork.dir:directory}/env.sh depends = ${gowork.dir:recipe} [gowork.dir] directory = ${buildout:directory}/go.work src = ${:directory}/src bin = ${:directory}/bin # NOTE do not use slapos.cookbook:mkdirectory here - if anything in software (not instance) # uses slapos.cookbook:* in recipe - slapos.cookbook will get compiled against system # libxml/libxslt or fail to bootstrap at all if those are not present. recipe = plone.recipe.command command = mkdir -p ${:directory} update-command = ${:command} stop-on-error = true # install go programs # clients can put program list to install to gowork:install [gowork.goinstall] recipe = plone.recipe.command command = bash -c ". ${gowork:env.sh} set -e for x in $(echo -n '${gowork:install}' |tr '\n' ' '); do case "\$x" in # external module, e.g. golang.org/x/tools/gopls@v0.4.3 *@*) echo GOMOD \$x GO111MODULE=on go install ${gowork:buildflags} -v \$x ;; # locally-cloned module source, e.g. <module-src-location>:./... *:*) echo GOMODSRC \$x dir=\"\$${x%%:*}\" arg=\"\$${x#*:}\" (cd \$dir && GO111MODULE=on go install ${gowork:buildflags} -v \$arg) ;; # non-module *) echo GOPKG \$x GO111MODULE=off go install ${gowork:buildflags} -v \$x ;; esac done " update-command = ${:command} stop-on-error = true [git-repository] recipe = slapos.recipe.build:gitclone git-executable = ${git:location}/bin/git # a go package should: # 1) <= go-git-package # 2) provide go.importpath # 3) provide repository (which is not the same as importpath in general case) # # the list of go packages for a go workspace state can be automatically # generated with the help of gowork-snapshot tool. [go-git-package] <= git-repository location = ${gowork.dir:src}/${:go.importpath}