From 11eef5dfbc243e2c172c0ed0a38f65c0c756486d Mon Sep 17 00:00:00 2001 From: Tianon Gravi Date: Fri, 19 Jun 2020 17:38:34 -0700 Subject: [PATCH] Build from source when upstream binaries are not available Concretely, this results in the addition of arm32v5 and mips64le as supported architectures for the Debian-based variants. --- .architectures-lib | 2 +- 1.13/buster/Dockerfile | 46 +++++++++++++++---- 1.13/stretch/Dockerfile | 46 +++++++++++++++---- 1.14/buster/Dockerfile | 46 +++++++++++++++---- 1.14/release-architectures | 9 ---- 1.14/stretch/Dockerfile | 46 +++++++++++++++---- 1.15-rc/buster/Dockerfile | 46 +++++++++++++++---- 1.15-rc/release-architectures | 9 ---- Dockerfile-debian.template | 46 +++++++++++++++---- generate-stackbrew-library.sh | 11 ++++- ...ase-architectures => release-architectures | 0 11 files changed, 232 insertions(+), 75 deletions(-) delete mode 100644 1.14/release-architectures delete mode 100644 1.15-rc/release-architectures rename 1.13/release-architectures => release-architectures (100%) diff --git a/.architectures-lib b/.architectures-lib index df2fd1b6..d3efd55c 100644 --- a/.architectures-lib +++ b/.architectures-lib @@ -3,7 +3,7 @@ _awkArch() { local version="$1"; shift local awkExpr="$1"; shift - awk "$@" "/^#|^\$/ { next } $awkExpr" "$version/release-architectures" + awk "$@" "/^#|^\$/ { next } $awkExpr" release-architectures } dpkgArches() { diff --git a/1.13/buster/Dockerfile b/1.13/buster/Dockerfile index ac469f5d..1cb2450a 100644 --- a/1.13/buster/Dockerfile +++ b/1.13/buster/Dockerfile @@ -9,6 +9,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config \ && rm -rf /var/lib/apt/lists/* +ENV PATH /usr/local/go/bin:$PATH + ENV GOLANG_VERSION 1.13.12 RUN set -eux; \ @@ -27,24 +29,50 @@ RUN set -eux; \ esac; \ \ url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \ - wget -O go.tgz "$url"; \ + wget -O go.tgz "$url" --progress=dot:giga; \ echo "${goRelSha256} *go.tgz" | sha256sum -c -; \ tar -C /usr/local -xzf go.tgz; \ rm go.tgz; \ \ +# https://github.com/golang/go/issues/38536#issuecomment-616897960 if [ "$goRelArch" = 'src' ]; then \ - echo >&2; \ - echo >&2 'error: UNIMPLEMENTED'; \ - echo >&2 'TODO install golang-any from jessie-backports for GOROOT_BOOTSTRAP (and uninstall after build)'; \ - echo >&2; \ - exit 1; \ + savedAptMark="$(apt-mark showmanual)"; \ + apt-get update; \ + apt-get install -y --no-install-recommends golang-go; \ + \ + goEnv="$(go env | sed -rn -e '/^GO(OS|ARCH|ARM|386)=/s//export \0/p')"; \ + eval "$goEnv"; \ + [ -n "$GOOS" ]; \ + [ -n "$GOARCH" ]; \ + ( \ + cd /usr/local/go/src; \ + ./make.bash; \ + ); \ + \ + apt-mark auto '.*' > /dev/null; \ + apt-mark manual $savedAptMark > /dev/null; \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + rm -rf /var/lib/apt/lists/*; \ + \ +# pre-compile the standard library, just like the official binary release tarballs do + go install std; \ +# go install: -race is only supported on linux/amd64, linux/ppc64le, linux/arm64, freebsd/amd64, netbsd/amd64, darwin/amd64 and windows/amd64 +# go install -race std; \ + \ +# remove a few intermediate / bootstrapping files the official binary release tarballs do not contain + rm -rf \ + /usr/local/go/pkg/*/cmd \ + /usr/local/go/pkg/bootstrap \ + /usr/local/go/pkg/obj \ + /usr/local/go/pkg/tool/*/api \ + /usr/local/go/pkg/tool/*/go_bootstrap \ + /usr/local/go/src/cmd/dist/dist \ + ; \ fi; \ \ - export PATH="/usr/local/go/bin:$PATH"; \ go version ENV GOPATH /go -ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH - +ENV PATH $GOPATH/bin:$PATH RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" WORKDIR $GOPATH diff --git a/1.13/stretch/Dockerfile b/1.13/stretch/Dockerfile index 56ff801e..091eaa2c 100644 --- a/1.13/stretch/Dockerfile +++ b/1.13/stretch/Dockerfile @@ -9,6 +9,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config \ && rm -rf /var/lib/apt/lists/* +ENV PATH /usr/local/go/bin:$PATH + ENV GOLANG_VERSION 1.13.12 RUN set -eux; \ @@ -27,24 +29,50 @@ RUN set -eux; \ esac; \ \ url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \ - wget -O go.tgz "$url"; \ + wget -O go.tgz "$url" --progress=dot:giga; \ echo "${goRelSha256} *go.tgz" | sha256sum -c -; \ tar -C /usr/local -xzf go.tgz; \ rm go.tgz; \ \ +# https://github.com/golang/go/issues/38536#issuecomment-616897960 if [ "$goRelArch" = 'src' ]; then \ - echo >&2; \ - echo >&2 'error: UNIMPLEMENTED'; \ - echo >&2 'TODO install golang-any from jessie-backports for GOROOT_BOOTSTRAP (and uninstall after build)'; \ - echo >&2; \ - exit 1; \ + savedAptMark="$(apt-mark showmanual)"; \ + apt-get update; \ + apt-get install -y --no-install-recommends golang-go; \ + \ + goEnv="$(go env | sed -rn -e '/^GO(OS|ARCH|ARM|386)=/s//export \0/p')"; \ + eval "$goEnv"; \ + [ -n "$GOOS" ]; \ + [ -n "$GOARCH" ]; \ + ( \ + cd /usr/local/go/src; \ + ./make.bash; \ + ); \ + \ + apt-mark auto '.*' > /dev/null; \ + apt-mark manual $savedAptMark > /dev/null; \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + rm -rf /var/lib/apt/lists/*; \ + \ +# pre-compile the standard library, just like the official binary release tarballs do + go install std; \ +# go install: -race is only supported on linux/amd64, linux/ppc64le, linux/arm64, freebsd/amd64, netbsd/amd64, darwin/amd64 and windows/amd64 +# go install -race std; \ + \ +# remove a few intermediate / bootstrapping files the official binary release tarballs do not contain + rm -rf \ + /usr/local/go/pkg/*/cmd \ + /usr/local/go/pkg/bootstrap \ + /usr/local/go/pkg/obj \ + /usr/local/go/pkg/tool/*/api \ + /usr/local/go/pkg/tool/*/go_bootstrap \ + /usr/local/go/src/cmd/dist/dist \ + ; \ fi; \ \ - export PATH="/usr/local/go/bin:$PATH"; \ go version ENV GOPATH /go -ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH - +ENV PATH $GOPATH/bin:$PATH RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" WORKDIR $GOPATH diff --git a/1.14/buster/Dockerfile b/1.14/buster/Dockerfile index f001cf59..d552508b 100644 --- a/1.14/buster/Dockerfile +++ b/1.14/buster/Dockerfile @@ -9,6 +9,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config \ && rm -rf /var/lib/apt/lists/* +ENV PATH /usr/local/go/bin:$PATH + ENV GOLANG_VERSION 1.14.4 RUN set -eux; \ @@ -27,24 +29,50 @@ RUN set -eux; \ esac; \ \ url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \ - wget -O go.tgz "$url"; \ + wget -O go.tgz "$url" --progress=dot:giga; \ echo "${goRelSha256} *go.tgz" | sha256sum -c -; \ tar -C /usr/local -xzf go.tgz; \ rm go.tgz; \ \ +# https://github.com/golang/go/issues/38536#issuecomment-616897960 if [ "$goRelArch" = 'src' ]; then \ - echo >&2; \ - echo >&2 'error: UNIMPLEMENTED'; \ - echo >&2 'TODO install golang-any from jessie-backports for GOROOT_BOOTSTRAP (and uninstall after build)'; \ - echo >&2; \ - exit 1; \ + savedAptMark="$(apt-mark showmanual)"; \ + apt-get update; \ + apt-get install -y --no-install-recommends golang-go; \ + \ + goEnv="$(go env | sed -rn -e '/^GO(OS|ARCH|ARM|386)=/s//export \0/p')"; \ + eval "$goEnv"; \ + [ -n "$GOOS" ]; \ + [ -n "$GOARCH" ]; \ + ( \ + cd /usr/local/go/src; \ + ./make.bash; \ + ); \ + \ + apt-mark auto '.*' > /dev/null; \ + apt-mark manual $savedAptMark > /dev/null; \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + rm -rf /var/lib/apt/lists/*; \ + \ +# pre-compile the standard library, just like the official binary release tarballs do + go install std; \ +# go install: -race is only supported on linux/amd64, linux/ppc64le, linux/arm64, freebsd/amd64, netbsd/amd64, darwin/amd64 and windows/amd64 +# go install -race std; \ + \ +# remove a few intermediate / bootstrapping files the official binary release tarballs do not contain + rm -rf \ + /usr/local/go/pkg/*/cmd \ + /usr/local/go/pkg/bootstrap \ + /usr/local/go/pkg/obj \ + /usr/local/go/pkg/tool/*/api \ + /usr/local/go/pkg/tool/*/go_bootstrap \ + /usr/local/go/src/cmd/dist/dist \ + ; \ fi; \ \ - export PATH="/usr/local/go/bin:$PATH"; \ go version ENV GOPATH /go -ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH - +ENV PATH $GOPATH/bin:$PATH RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" WORKDIR $GOPATH diff --git a/1.14/release-architectures b/1.14/release-architectures deleted file mode 100644 index 6b7fa2c8..00000000 --- a/1.14/release-architectures +++ /dev/null @@ -1,9 +0,0 @@ -# see https://golang.org/dl/ - -# bashbrew-arch dpkg-arch golang-release-arch -amd64 amd64 amd64 -arm32v7 armhf armv6l -arm64v8 arm64 arm64 -i386 i386 386 -ppc64le ppc64el ppc64le -s390x s390x s390x diff --git a/1.14/stretch/Dockerfile b/1.14/stretch/Dockerfile index 9f1af562..528654dd 100644 --- a/1.14/stretch/Dockerfile +++ b/1.14/stretch/Dockerfile @@ -9,6 +9,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config \ && rm -rf /var/lib/apt/lists/* +ENV PATH /usr/local/go/bin:$PATH + ENV GOLANG_VERSION 1.14.4 RUN set -eux; \ @@ -27,24 +29,50 @@ RUN set -eux; \ esac; \ \ url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \ - wget -O go.tgz "$url"; \ + wget -O go.tgz "$url" --progress=dot:giga; \ echo "${goRelSha256} *go.tgz" | sha256sum -c -; \ tar -C /usr/local -xzf go.tgz; \ rm go.tgz; \ \ +# https://github.com/golang/go/issues/38536#issuecomment-616897960 if [ "$goRelArch" = 'src' ]; then \ - echo >&2; \ - echo >&2 'error: UNIMPLEMENTED'; \ - echo >&2 'TODO install golang-any from jessie-backports for GOROOT_BOOTSTRAP (and uninstall after build)'; \ - echo >&2; \ - exit 1; \ + savedAptMark="$(apt-mark showmanual)"; \ + apt-get update; \ + apt-get install -y --no-install-recommends golang-go; \ + \ + goEnv="$(go env | sed -rn -e '/^GO(OS|ARCH|ARM|386)=/s//export \0/p')"; \ + eval "$goEnv"; \ + [ -n "$GOOS" ]; \ + [ -n "$GOARCH" ]; \ + ( \ + cd /usr/local/go/src; \ + ./make.bash; \ + ); \ + \ + apt-mark auto '.*' > /dev/null; \ + apt-mark manual $savedAptMark > /dev/null; \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + rm -rf /var/lib/apt/lists/*; \ + \ +# pre-compile the standard library, just like the official binary release tarballs do + go install std; \ +# go install: -race is only supported on linux/amd64, linux/ppc64le, linux/arm64, freebsd/amd64, netbsd/amd64, darwin/amd64 and windows/amd64 +# go install -race std; \ + \ +# remove a few intermediate / bootstrapping files the official binary release tarballs do not contain + rm -rf \ + /usr/local/go/pkg/*/cmd \ + /usr/local/go/pkg/bootstrap \ + /usr/local/go/pkg/obj \ + /usr/local/go/pkg/tool/*/api \ + /usr/local/go/pkg/tool/*/go_bootstrap \ + /usr/local/go/src/cmd/dist/dist \ + ; \ fi; \ \ - export PATH="/usr/local/go/bin:$PATH"; \ go version ENV GOPATH /go -ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH - +ENV PATH $GOPATH/bin:$PATH RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" WORKDIR $GOPATH diff --git a/1.15-rc/buster/Dockerfile b/1.15-rc/buster/Dockerfile index 41ca425f..a93240ae 100644 --- a/1.15-rc/buster/Dockerfile +++ b/1.15-rc/buster/Dockerfile @@ -9,6 +9,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config \ && rm -rf /var/lib/apt/lists/* +ENV PATH /usr/local/go/bin:$PATH + ENV GOLANG_VERSION 1.15beta1 RUN set -eux; \ @@ -27,24 +29,50 @@ RUN set -eux; \ esac; \ \ url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \ - wget -O go.tgz "$url"; \ + wget -O go.tgz "$url" --progress=dot:giga; \ echo "${goRelSha256} *go.tgz" | sha256sum -c -; \ tar -C /usr/local -xzf go.tgz; \ rm go.tgz; \ \ +# https://github.com/golang/go/issues/38536#issuecomment-616897960 if [ "$goRelArch" = 'src' ]; then \ - echo >&2; \ - echo >&2 'error: UNIMPLEMENTED'; \ - echo >&2 'TODO install golang-any from jessie-backports for GOROOT_BOOTSTRAP (and uninstall after build)'; \ - echo >&2; \ - exit 1; \ + savedAptMark="$(apt-mark showmanual)"; \ + apt-get update; \ + apt-get install -y --no-install-recommends golang-go; \ + \ + goEnv="$(go env | sed -rn -e '/^GO(OS|ARCH|ARM|386)=/s//export \0/p')"; \ + eval "$goEnv"; \ + [ -n "$GOOS" ]; \ + [ -n "$GOARCH" ]; \ + ( \ + cd /usr/local/go/src; \ + ./make.bash; \ + ); \ + \ + apt-mark auto '.*' > /dev/null; \ + apt-mark manual $savedAptMark > /dev/null; \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + rm -rf /var/lib/apt/lists/*; \ + \ +# pre-compile the standard library, just like the official binary release tarballs do + go install std; \ +# go install: -race is only supported on linux/amd64, linux/ppc64le, linux/arm64, freebsd/amd64, netbsd/amd64, darwin/amd64 and windows/amd64 +# go install -race std; \ + \ +# remove a few intermediate / bootstrapping files the official binary release tarballs do not contain + rm -rf \ + /usr/local/go/pkg/*/cmd \ + /usr/local/go/pkg/bootstrap \ + /usr/local/go/pkg/obj \ + /usr/local/go/pkg/tool/*/api \ + /usr/local/go/pkg/tool/*/go_bootstrap \ + /usr/local/go/src/cmd/dist/dist \ + ; \ fi; \ \ - export PATH="/usr/local/go/bin:$PATH"; \ go version ENV GOPATH /go -ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH - +ENV PATH $GOPATH/bin:$PATH RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" WORKDIR $GOPATH diff --git a/1.15-rc/release-architectures b/1.15-rc/release-architectures deleted file mode 100644 index 6b7fa2c8..00000000 --- a/1.15-rc/release-architectures +++ /dev/null @@ -1,9 +0,0 @@ -# see https://golang.org/dl/ - -# bashbrew-arch dpkg-arch golang-release-arch -amd64 amd64 amd64 -arm32v7 armhf armv6l -arm64v8 arm64 arm64 -i386 i386 386 -ppc64le ppc64el ppc64le -s390x s390x s390x diff --git a/Dockerfile-debian.template b/Dockerfile-debian.template index d2f9c0f4..397c5ba6 100644 --- a/Dockerfile-debian.template +++ b/Dockerfile-debian.template @@ -9,6 +9,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config \ && rm -rf /var/lib/apt/lists/* +ENV PATH /usr/local/go/bin:$PATH + ENV GOLANG_VERSION %%VERSION%% RUN set -eux; \ @@ -17,24 +19,50 @@ RUN set -eux; \ %%ARCH-CASE%%; \ \ url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \ - wget -O go.tgz "$url"; \ + wget -O go.tgz "$url" --progress=dot:giga; \ echo "${goRelSha256} *go.tgz" | sha256sum -c -; \ tar -C /usr/local -xzf go.tgz; \ rm go.tgz; \ \ +# https://github.com/golang/go/issues/38536#issuecomment-616897960 if [ "$goRelArch" = 'src' ]; then \ - echo >&2; \ - echo >&2 'error: UNIMPLEMENTED'; \ - echo >&2 'TODO install golang-any from jessie-backports for GOROOT_BOOTSTRAP (and uninstall after build)'; \ - echo >&2; \ - exit 1; \ + savedAptMark="$(apt-mark showmanual)"; \ + apt-get update; \ + apt-get install -y --no-install-recommends golang-go; \ + \ + goEnv="$(go env | sed -rn -e '/^GO(OS|ARCH|ARM|386)=/s//export \0/p')"; \ + eval "$goEnv"; \ + [ -n "$GOOS" ]; \ + [ -n "$GOARCH" ]; \ + ( \ + cd /usr/local/go/src; \ + ./make.bash; \ + ); \ + \ + apt-mark auto '.*' > /dev/null; \ + apt-mark manual $savedAptMark > /dev/null; \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + rm -rf /var/lib/apt/lists/*; \ + \ +# pre-compile the standard library, just like the official binary release tarballs do + go install std; \ +# go install: -race is only supported on linux/amd64, linux/ppc64le, linux/arm64, freebsd/amd64, netbsd/amd64, darwin/amd64 and windows/amd64 +# go install -race std; \ + \ +# remove a few intermediate / bootstrapping files the official binary release tarballs do not contain + rm -rf \ + /usr/local/go/pkg/*/cmd \ + /usr/local/go/pkg/bootstrap \ + /usr/local/go/pkg/obj \ + /usr/local/go/pkg/tool/*/api \ + /usr/local/go/pkg/tool/*/go_bootstrap \ + /usr/local/go/src/cmd/dist/dist \ + ; \ fi; \ \ - export PATH="/usr/local/go/bin:$PATH"; \ go version ENV GOPATH /go -ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH - +ENV PATH $GOPATH/bin:$PATH RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" WORKDIR $GOPATH diff --git a/generate-stackbrew-library.sh b/generate-stackbrew-library.sh index 9caca288..c157db24 100755 --- a/generate-stackbrew-library.sh +++ b/generate-stackbrew-library.sh @@ -107,9 +107,16 @@ for version in "${versions[@]}"; do fi case "$v" in - alpine*) variantArches="$(parentArches "$version" "$v")" ;; windows/*) variantArches='windows-amd64' ;; - *) variantArches="$(variantArches "$version" "$v")" ;; + + # stretch's "golang-go" package doesn't include GOARM for arm32v5 and "gccgo" in stretch can't build mips64le + stretch) + variantArches="$(variantArches "$version" "$v")" + ;; + + *) + variantArches="$(parentArches "$version" "$v")" + ;; esac sharedTags=() diff --git a/1.13/release-architectures b/release-architectures similarity index 100% rename from 1.13/release-architectures rename to release-architectures