golang: add versioned package for 1.25

Add versioned package for 1.25 to enable having multiple host go
versions side by side.

Set default version to 1.25 in golang-values.mk

Add unversioned dummy package to allow go-based packages to continue
using the default go host version. Packages can use it by specifying:

PKG_BUILD_DEPENDS:=golang/host

or use a specific version out of the ones that are available in that
branch by specifying:

PKG_BUILD_DEPENDS:=golang1.25/host

Host go is exposed to each package through PATH set in
GO_PKG_BUILD_CONFIG_VARS and GO_PKG_VARS.

Target go is installed through alternatives with the default version
having higher priority.

Newer versions can reuse older ones as bootstraps by setting
GO_BOOTSTRAP_VERSION package variable to older version, e.g.:

GO_BOOTSTRAP_VERSION:=1.24

All subpackages provide suffix-less names, e.g. golang, golang-src, etc.
Default versions are marked as default variants.

Link: https://github.com/openwrt/packages/pull/28309
Signed-off-by: George Sapkin <george@sapk.in>
This commit is contained in:
George Sapkin
2026-01-22 02:55:19 +02:00
parent 662972a252
commit ca501ee61e
8 changed files with 380 additions and 325 deletions

View File

@@ -1,4 +1,4 @@
#!/bin/sh
#!/bin/bash
#
# Copyright (C) 2018, 2020 Jeffery To
#
@@ -8,7 +8,6 @@ me=go-gcc-helper
name="${0##*/}"
log() {
# shellcheck disable=SC2039
local IFS=" "
printf '%s\n' "$me: $*"
}

View File

@@ -1,4 +1,4 @@
#!/bin/sh
#!/bin/bash
#
# Copyright (C) 2020, 2022 Jeffery To
#
@@ -8,19 +8,16 @@ nl="
"
log() {
# shellcheck disable=SC2039
local IFS=" "
printf '%s\n' "$*"
}
log_error() {
# shellcheck disable=SC2039
local IFS=" "
printf 'Error: %s\n' "$*" >&2
}
link_contents() {
# shellcheck disable=SC2039
local src="$1" dest="$2" IFS="$nl" dirs dir base
if [ -n "$(find "$src" -mindepth 1 -maxdepth 1 -name "*.go" -not -type d)" ]; then
@@ -50,7 +47,6 @@ link_contents() {
}
configure() {
# shellcheck disable=SC2039
local files code testdata gomod pattern extra IFS file dest
cd "$BUILD_DIR" || return 1
@@ -97,7 +93,6 @@ configure() {
}
build() {
# shellcheck disable=SC2039
local modargs pattern targets retval
cd "$GO_BUILD_DIR" || return 1
@@ -147,14 +142,12 @@ build() {
}
install_bin() {
# shellcheck disable=SC2039
local dest="$1"
install -d -m0755 "$dest/$GO_INSTALL_BIN_PATH"
install -m0755 "$GO_BUILD_BIN_DIR"/* "$dest/$GO_INSTALL_BIN_PATH/"
}
install_src() {
# shellcheck disable=SC2039
local dest="$1" dir="${GO_PKG%/*}"
install -d -m0755 "$dest/$GO_BUILD_DEPENDS_PATH/src/$dir"
cp -fpR "$GO_BUILD_DIR/src/$GO_PKG" "$dest/$GO_BUILD_DEPENDS_PATH/src/$dir/"

View File

@@ -81,8 +81,8 @@ endef
# $(2) go version id
define GoCompiler/Default/Install/BinLinks
$(INSTALL_DIR) "$(1)/bin"
$(LN) "../lib/go-$(2)/bin/go" "$(1)/bin/go"
$(LN) "../lib/go-$(2)/bin/gofmt" "$(1)/bin/gofmt"
$(LN) "../lib/go-$(2)/bin/go" "$(1)/bin/go$(2)"
$(LN) "../lib/go-$(2)/bin/gofmt" "$(1)/bin/gofmt$(2)"
endef
# $(1) source go root
@@ -126,9 +126,10 @@ define GoCompiler/Default/Uninstall
endef
# $(1) destination prefix
# $(2) go version id
define GoCompiler/Default/Uninstall/BinLinks
rm -f "$(1)/bin/go"
rm -f "$(1)/bin/gofmt"
rm -f "$(1)/bin/go$(2)"
rm -f "$(1)/bin/gofmt$(2)"
endef
@@ -177,7 +178,7 @@ define GoCompiler/AddProfile
# $$(1) override install prefix (optional)
define GoCompiler/$(1)/Uninstall/BinLinks
$$(call GoCompiler/Default/Uninstall/BinLinks,$$(or $$(1),$(3)))
$$(call GoCompiler/Default/Uninstall/BinLinks,$$(or $$(1),$(3)),$(4))
endef
endef

View File

@@ -177,7 +177,13 @@ define GoPackage/GoSubMenu
CATEGORY:=Languages
endef
# Some packages like docker use go directly and don't process vars like GO, so
# just add selected version to path and insert it into several used vars.
GO_PATH= \
PATH=$(STAGING_DIR_HOSTPKG)/lib/go-$(GO_HOST_VERSION)/bin:$(PATH)
GO_PKG_BUILD_CONFIG_VARS= \
$(GO_PATH) \
GO_PKG="$(strip $(GO_PKG))" \
GO_INSTALL_EXTRA="$(strip $(GO_PKG_INSTALL_EXTRA))" \
GO_INSTALL_ALL="$(strip $(GO_PKG_INSTALL_ALL))" \
@@ -218,6 +224,7 @@ GO_PKG_BUILD_VARS= \
GOTOOLCHAIN=local
GO_PKG_VARS= \
$(GO_PATH) \
$(GO_PKG_TARGET_VARS) \
$(GO_PKG_BUILD_VARS)
@@ -254,7 +261,7 @@ GO_PKG_INSTALL_ARGS= \
define GoPackage/Build/Configure
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_PKG_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh configure
$(SHELL) $(GO_INCLUDE_DIR)golang-build.sh configure
endef
# $(1) additional arguments for go command line (optional)
@@ -262,7 +269,7 @@ define GoPackage/Build/Compile
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_PKG_BUILD_CONFIG_VARS) \
$(GO_PKG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh build $(GO_PKG_INSTALL_ARGS) $(1)
$(SHELL) $(GO_INCLUDE_DIR)golang-build.sh build $(GO_PKG_INSTALL_ARGS) $(1)
endef
define GoPackage/Build/InstallDev
@@ -272,13 +279,13 @@ endef
define GoPackage/Package/Install/Bin
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_PKG_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_bin "$(1)"
$(SHELL) $(GO_INCLUDE_DIR)golang-build.sh install_bin "$(1)"
endef
define GoPackage/Package/Install/Src
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_PKG_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_src "$(1)"
$(SHELL) $(GO_INCLUDE_DIR)golang-build.sh install_src "$(1)"
endef
define GoPackage/Package/Install

View File

@@ -123,6 +123,12 @@ unexport \
GOBOOTSTRAP_TOOLEXEC
GO_DEFAULT_VERSION:=1.25
GO_HOST_VERSION:=$(patsubst golang%/host,%,$(filter golang%/host,$(PKG_BUILD_DEPENDS)))
ifeq ($(GO_HOST_VERSION),)
GO_HOST_VERSION:=$(GO_DEFAULT_VERSION)
endif
# GOOS / GOARCH
go_arch=$(subst \

View File

@@ -1,329 +1,34 @@
#
# Copyright (C) 2018-2023 Jeffery To
# This is a dummy go package that allows packages to use default go version by
# setting PKG_BUILD_DEPENDS:=golang/host, instead of specifying a concrete
# version, e.g. PKG_BUILD_DEPENDS:=golang1.25/host
#
# SPDX-License-Identifier: GPL-2.0-only
include $(TOPDIR)/rules.mk
GO_VERSION_MAJOR_MINOR:=1.25
GO_VERSION_PATCH:=6
include ../golang-values.mk
PKG_NAME:=golang
PKG_VERSION:=$(GO_VERSION_MAJOR_MINOR)$(if $(GO_VERSION_PATCH),.$(GO_VERSION_PATCH))
PKG_RELEASE:=2
GO_SOURCE_URLS:=https://go.dev/dl/ \
https://dl.google.com/go/ \
https://golang.google.cn/dl/ \
https://mirrors.nju.edu.cn/golang/ \
https://mirrors.ustc.edu.cn/golang/
PKG_SOURCE:=go$(PKG_VERSION).src.tar.gz
PKG_SOURCE_URL:=$(GO_SOURCE_URLS)
PKG_HASH:=58cbf771e44d76de6f56d19e33b77d745a1e489340922875e46585b975c2b059
PKG_VERSION:=$(GO_DEFAULT_VERSION)
PKG_RELEASE:=1
PKG_MAINTAINER:=George Sapkin <george@sapk.in>
PKG_LICENSE:=BSD-3-Clause
PKG_LICENSE_FILES:=LICENSE
PKG_CPE_ID:=cpe:/a:golang:go
PKG_BUILD_DEPENDS:=$(PKG_NAME)/host
PKG_BUILD_DIR:=$(BUILD_DIR)/go-$(PKG_VERSION)
PKG_BUILD_PARALLEL:=1
PKG_BUILD_FLAGS:=no-mips16
PKG_GO_PREFIX:=/usr
PKG_GO_VERSION_ID:=$(GO_VERSION_MAJOR_MINOR)
HOST_BUILD_DEPENDS:=golang-bootstrap/host
HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/go-$(PKG_VERSION)
HOST_BUILD_PARALLEL:=1
HOST_GO_PREFIX:=$(STAGING_DIR_HOSTPKG)
HOST_GO_VERSION_ID:=$(GO_VERSION_MAJOR_MINOR)
HOST_GO_ROOT:=$(HOST_GO_PREFIX)/lib/go-$(HOST_GO_VERSION_ID)
HOST_GO_VALID_OS_ARCH:= \
android_386 android_amd64 android_arm android_arm64 \
freebsd_386 freebsd_amd64 freebsd_arm freebsd_arm64 \
linux_386 linux_amd64 linux_arm linux_arm64 \
openbsd_386 openbsd_amd64 openbsd_arm openbsd_arm64 \
netbsd_386 netbsd_amd64 netbsd_arm netbsd_arm64 \
windows_386 windows_amd64 windows_arm windows_arm64 \
\
plan9_386 plan9_amd64 plan9_arm \
\
darwin_amd64 darwin_arm64 \
ios_amd64 ios_arm64 \
\
dragonfly_amd64 \
illumos_amd64 \
solaris_amd64 \
\
aix_ppc64 \
js_wasm \
wasip1_wasm \
\
freebsd_riscv64 \
openbsd_riscv64 \
\
linux_ppc64 linux_ppc64le \
linux_mips linux_mipsle linux_mips64 linux_mips64le \
linux_loong64 linux_riscv64 linux_s390x \
\
openbsd_mips64
BOOTSTRAP_DIR:=$(HOST_GO_PREFIX)/lib/go-bootstrap
HOST_BUILD_DEPENDS:=golang$(PKG_VERSION)/host
PKG_HOST_ONLY:=1
include $(INCLUDE_DIR)/host-build.mk
include $(INCLUDE_DIR)/package.mk
include ../golang-compiler.mk
include ../golang-package.mk
PKG_UNPACK:=$(HOST_TAR) -C "$(PKG_BUILD_DIR)" --strip-components=1 -xzf "$(DL_DIR)/$(PKG_SOURCE)"
HOST_UNPACK:=$(HOST_TAR) -C "$(HOST_BUILD_DIR)" --strip-components=1 -xzf "$(DL_DIR)/$(PKG_SOURCE)"
# don't strip ELF executables in test data
RSTRIP:=:
STRIP:=:
ifeq ($(GO_TARGET_SPECTRE_SUPPORTED),1)
PKG_CONFIG_DEPENDS+=CONFIG_GOLANG_SPECTRE
endif
define Package/golang/Default
$(call GoPackage/GoSubMenu)
TITLE:=Go programming language
URL:=https://go.dev/
DEPENDS:=$(GO_ARCH_DEPENDS)
endef
define Package/golang/Default/description
The Go programming language is an open source project to make
programmers more productive.
Go is expressive, concise, clean, and efficient. Its concurrency
mechanisms make it easy to write programs that get the most out of
multicore and networked machines, while its novel type system enables
flexible and modular program construction. Go compiles quickly to
machine code yet has the convenience of garbage collection and the power
of run-time reflection. It's a fast, statically typed, compiled language
that feels like a dynamically typed, interpreted language.
endef
# go tool requires source present:
# https://github.com/golang/go/issues/4635
define Package/golang
$(call Package/golang/Default)
TITLE+= (compiler)
DEPENDS+= +golang-src
endef
define Package/golang/description
$(call Package/golang/Default/description)
This package provides an assembler, compiler, linker, and compiled
libraries for the Go programming language.
endef
define Package/golang/config
source "$(SOURCE)/../Config.in"
endef
define Package/golang-doc
$(call Package/golang/Default)
TITLE+= (documentation)
endef
define Package/golang-doc/description
$(call Package/golang/Default/description)
This package provides the documentation for the Go programming language.
endef
define Package/golang-src
$(call Package/golang/Default)
TITLE+= (source files)
DEPENDS+= +libstdcpp +libtiff
endef
define Package/golang-src/description
$(call Package/golang/Default/description)
This package provides the Go programming language source files needed
for cross-compilation.
endef
# Host
ifeq ($(GO_HOST_PIE_SUPPORTED),1)
HOST_GO_ENABLE_PIE:=1
endif
# When using GO_LDFLAGS to set buildmode=pie, the PIE install suffix does not
# apply (we also delete the std lib during Host/Install)
$(eval $(call GoCompiler/AddProfile,Host,$(HOST_BUILD_DIR),$(HOST_GO_PREFIX),$(HOST_GO_VERSION_ID),$(GO_HOST_OS_ARCH),$(HOST_GO_INSTALL_SUFFIX)))
HOST_GO_VARS= \
GOHOSTARCH="$(GO_HOST_ARCH)" \
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
GOENV=off \
CC="$(HOSTCC_NOCACHE)" \
CXX="$(HOSTCXX_NOCACHE)"
define Host/Configure
$(call GoCompiler/Host/CheckHost,$(HOST_GO_VALID_OS_ARCH))
mkdir -p "$(GO_BUILD_CACHE_DIR)"
TITLE:=Go programming language (dummy package)
BUILDONLY:=1
endef
define Host/Compile
$(call GoCompiler/Host/Make, \
GOROOT_BOOTSTRAP="$(BOOTSTRAP_DIR)" \
$(if $(HOST_GO_ENABLE_PIE),GO_LDFLAGS="-buildmode pie") \
$(HOST_GO_VARS) \
)
endef
# If host and target OS/arch are the same, # when go compiles a program, it will
# use the host std lib, so remove it now and force go to rebuild std for target
# later
define Host/Install
$(call Host/Uninstall)
$(call GoCompiler/Host/Install/Bin)
$(call GoCompiler/Host/Install/Src)
$(call GoCompiler/Host/Install/BinLinks)
rm -rf "$(HOST_GO_ROOT)/pkg/$(GO_HOST_OS_ARCH)$(if $(HOST_GO_INSTALL_SUFFIX),_$(HOST_GO_INSTALL_SUFFIX))"
$(INSTALL_DIR) "$(HOST_GO_ROOT)/openwrt"
$(INSTALL_BIN) ../go-gcc-helper "$(HOST_GO_ROOT)/openwrt/"
$(LN) go-gcc-helper "$(HOST_GO_ROOT)/openwrt/gcc"
$(LN) go-gcc-helper "$(HOST_GO_ROOT)/openwrt/g++"
endef
define Host/Uninstall
rm -rf "$(HOST_GO_ROOT)/openwrt"
$(call GoCompiler/Host/Uninstall/BinLinks)
$(call GoCompiler/Host/Uninstall)
endef
# Target
ifeq ($(GO_PKG_ENABLE_PIE),1)
PKG_GO_INSTALL_SUFFIX:=$(GO_TARGET_PIE_INSTALL_SUFFIX)
endif
$(eval $(call GoCompiler/AddProfile,Package,$(PKG_BUILD_DIR),$(PKG_GO_PREFIX),$(PKG_GO_VERSION_ID),$(GO_OS_ARCH),$(PKG_GO_INSTALL_SUFFIX)))
PKG_GO_ZBOOTSTRAP_MODS:= \
s/defaultGO386 = `[^`]*`/defaultGO386 = `$(or $(GO_386),sse2)`/; \
s/defaultGOAMD64 = `[^`]*`/defaultGOAMD64 = `$(or $(GO_AMD64),v1)`/; \
s/defaultGOARM = `[^`]*`/defaultGOARM = `$(or $(GO_ARM),7)`/; \
s/defaultGOARM64 = `[^`]*`/defaultGOARM64 = `$(or $(GO_ARM64),v8.0)`/; \
s/defaultGOMIPS = `[^`]*`/defaultGOMIPS = `$(or $(GO_MIPS),hardfloat)`/; \
s/defaultGOMIPS64 = `[^`]*`/defaultGOMIPS64 = `$(or $(GO_MIPS64),hardfloat)`/; \
s/defaultGOPPC64 = `[^`]*`/defaultGOPPC64 = `$(or $(GO_PPC64),power8)`/;
PKG_GO_ZBOOTSTRAP_PATH:=$(PKG_BUILD_DIR)/src/internal/buildcfg/zbootstrap.go
PKG_GO_VARS= \
GOHOSTARCH="$(GO_HOST_ARCH)" \
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
GOENV=off \
GO_GCC_HELPER_PATH="$$$$PATH" \
CC=gcc \
CXX=g++ \
PKG_CONFIG=pkg-config \
PATH="$(HOST_GO_ROOT)/openwrt:$$$$PATH"
PKG_GO_GCFLAGS= \
$(if $(GO_PKG_ENABLE_SPECTRE),-spectre all)
PKG_GO_ASMFLAGS= \
$(if $(GO_PKG_ENABLE_SPECTRE),-spectre all)
PKG_GO_LDFLAGS= \
-buildid '$(SOURCE_DATE_EPOCH)' \
-linkmode external \
-extldflags '$(patsubst -z%,-Wl$(comma)-z$(comma)%,$(TARGET_LDFLAGS))' \
$(if $(CONFIG_NO_STRIP)$(CONFIG_DEBUG),,-s -w)
PKG_GO_INSTALL_ARGS= \
-buildvcs=false \
-trimpath \
-ldflags "all=$(PKG_GO_LDFLAGS)" \
$(if $(PKG_GO_GCFLAGS),-gcflags "all=$(PKG_GO_GCFLAGS)") \
$(if $(PKG_GO_ASMFLAGS),-asmflags "all=$(PKG_GO_ASMFLAGS)") \
$(if $(filter $(GO_PKG_ENABLE_PIE),1),-buildmode pie)
define Build/Configure
mkdir -p "$(GO_BUILD_CACHE_DIR)"
endef
define Build/Compile
@echo "Building target Go first stage"
$(call GoCompiler/Package/Make, \
GOROOT_BOOTSTRAP="$(HOST_GO_ROOT)" \
GO_GCC_HELPER_CC="$(HOSTCC)" \
GO_GCC_HELPER_CXX="$(HOSTCXX)" \
$(PKG_GO_VARS) \
)
$(SED) '$(PKG_GO_ZBOOTSTRAP_MODS)' "$(PKG_GO_ZBOOTSTRAP_PATH)"
( \
if echo 'int main() { return 0; }' | $(TARGET_CC) -o $(PKG_BUILD_DIR)/test-ldso -x c - > /dev/null 2>&1; then \
LDSO=$$$$( \
readelf -l $(PKG_BUILD_DIR)/test-ldso | \
sed -n -e 's/^.*interpreter: \(.*\)[]]/\1/p' \
) ; \
fi ; \
$(SED) "s,defaultGO_LDSO = \`[^\`]*\`,defaultGO_LDSO = \`$$$$LDSO\`," "$(PKG_GO_ZBOOTSTRAP_PATH)" ; \
)
@echo "Building target Go second stage"
( \
cd "$(PKG_BUILD_DIR)/bin" ; \
export $(GO_PKG_TARGET_VARS) ; \
$(CP) go go-host ; \
GO_GCC_HELPER_CC="$(TARGET_CC)" \
GO_GCC_HELPER_CXX="$(TARGET_CXX)" \
$(PKG_GO_VARS) \
./go-host install -a $(PKG_GO_INSTALL_ARGS) std cmd ; \
retval="$$$$?" ; \
rm -f go-host ; \
exit "$$$$retval" ; \
)
endef
define Package/golang/install
$(call GoCompiler/Package/Install/Bin,$(1)$(PKG_GO_PREFIX))
$(call GoCompiler/Package/Install/BinLinks,$(1)$(PKG_GO_PREFIX))
endef
define Package/golang-doc/install
$(call GoCompiler/Package/Install/Doc,$(1)$(PKG_GO_PREFIX))
endef
define Package/golang-src/install
$(call GoCompiler/Package/Install/Src,$(1)$(PKG_GO_PREFIX))
endef
# src/debug contains ELF executables as test data
# and they reference these libraries
# we need to call this in Package/$(1)/extra_provides
# to pass CheckDependencies in include/package-pack.mk
define Package/golang-src/extra_provides
echo 'libc.so.6'
endef
$(eval $(call HostBuild))
$(eval $(call BuildPackage,golang))
$(eval $(call BuildPackage,golang-doc))
$(eval $(call BuildPackage,golang-src))

View File

@@ -0,0 +1,342 @@
#
# Copyright (C) 2018-2023, Jeffery To
# Copyright (C) 2025-2026, George Sapkin
#
# SPDX-License-Identifier: GPL-2.0-only
include $(TOPDIR)/rules.mk
PKG_NAME:=golang1.25
GO_VERSION_MAJOR_MINOR:=1.25
GO_VERSION_PATCH:=6
GO_BOOTSTRAP_VERSION:=bootstrap
PKG_HASH:=58cbf771e44d76de6f56d19e33b77d745a1e489340922875e46585b975c2b059
PKG_VERSION:=$(GO_VERSION_MAJOR_MINOR)$(if $(GO_VERSION_PATCH),.$(GO_VERSION_PATCH))
PKG_RELEASE:=1
GO_SOURCE_URLS:=https://go.dev/dl/ \
https://dl.google.com/go/ \
https://golang.google.cn/dl/ \
https://mirrors.nju.edu.cn/golang/ \
https://mirrors.ustc.edu.cn/golang/
PKG_SOURCE:=go$(PKG_VERSION).src.tar.gz
PKG_SOURCE_URL:=$(GO_SOURCE_URLS)
PKG_MAINTAINER:=George Sapkin <george@sapk.in>
PKG_LICENSE:=BSD-3-Clause
PKG_LICENSE_FILES:=LICENSE
PKG_CPE_ID:=cpe:/a:golang:go
PKG_BUILD_DEPENDS:=$(PKG_NAME)/host
PKG_BUILD_DIR:=$(BUILD_DIR)/go-$(PKG_VERSION)
PKG_BUILD_PARALLEL:=1
PKG_BUILD_FLAGS:=no-mips16
PKG_GO_PREFIX:=/usr
PKG_GO_VERSION_ID:=$(GO_VERSION_MAJOR_MINOR)
HOST_BUILD_DEPENDS:=golang$(if $(filter bootstrap,$(GO_BOOTSTRAP_VERSION)),-)$(GO_BOOTSTRAP_VERSION)/host
HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/go-$(PKG_VERSION)
HOST_BUILD_PARALLEL:=1
HOST_GO_PREFIX:=$(STAGING_DIR_HOSTPKG)
HOST_GO_VERSION_ID:=$(GO_VERSION_MAJOR_MINOR)
HOST_GO_ROOT:=$(HOST_GO_PREFIX)/lib/go-$(HOST_GO_VERSION_ID)
HOST_GO_VALID_OS_ARCH:= \
android_386 android_amd64 android_arm android_arm64 \
freebsd_386 freebsd_amd64 freebsd_arm freebsd_arm64 \
linux_386 linux_amd64 linux_arm linux_arm64 \
openbsd_386 openbsd_amd64 openbsd_arm openbsd_arm64 \
netbsd_386 netbsd_amd64 netbsd_arm netbsd_arm64 \
windows_386 windows_amd64 windows_arm windows_arm64 \
\
plan9_386 plan9_amd64 plan9_arm \
\
darwin_amd64 darwin_arm64 \
ios_amd64 ios_arm64 \
\
dragonfly_amd64 \
illumos_amd64 \
solaris_amd64 \
\
aix_ppc64 \
js_wasm \
wasip1_wasm \
\
freebsd_riscv64 \
openbsd_riscv64 \
\
linux_ppc64 linux_ppc64le \
linux_mips linux_mipsle linux_mips64 linux_mips64le \
linux_loong64 linux_riscv64 linux_s390x \
\
openbsd_mips64
BOOTSTRAP_DIR:=$(HOST_GO_PREFIX)/lib/go-$(GO_BOOTSTRAP_VERSION)
include $(INCLUDE_DIR)/host-build.mk
include $(INCLUDE_DIR)/package.mk
include ../golang-compiler.mk
include ../golang-package.mk
PKG_UNPACK:=$(HOST_TAR) -C "$(PKG_BUILD_DIR)" --strip-components=1 -xzf "$(DL_DIR)/$(PKG_SOURCE)"
HOST_UNPACK:=$(HOST_TAR) -C "$(HOST_BUILD_DIR)" --strip-components=1 -xzf "$(DL_DIR)/$(PKG_SOURCE)"
# don't strip ELF executables in test data
RSTRIP:=:
STRIP:=:
ifeq ($(GO_TARGET_SPECTRE_SUPPORTED),1)
PKG_CONFIG_DEPENDS+=CONFIG_GOLANG_SPECTRE
endif
define Package/$(PKG_NAME)/Default
$(call GoPackage/GoSubMenu)
TITLE:=Go programming language
URL:=https://go.dev/
DEPENDS:=$(GO_ARCH_DEPENDS)
endef
define Package/$(PKG_NAME)/Default/description
The Go programming language is an open source project to make
programmers more productive.
Go is expressive, concise, clean, and efficient. Its concurrency
mechanisms make it easy to write programs that get the most out of
multicore and networked machines, while its novel type system enables
flexible and modular program construction. Go compiles quickly to
machine code yet has the convenience of garbage collection and the power
of run-time reflection. It's a fast, statically typed, compiled language
that feels like a dynamically typed, interpreted language.
endef
ifeq ($(GO_DEFAULT_VERSION),$(GO_VERSION_MAJOR_MINOR))
ALT_PRIORITY:=500
else
ALT_PRIORITY:=100
endif
# go tool requires source present:
# https://github.com/golang/go/issues/4635
define Package/$(PKG_NAME)
$(call Package/$(PKG_NAME)/Default)
TITLE+= (compiler)
DEPENDS+= +$(PKG_NAME)-src
EXTRA_DEPENDS:=golang$(1)-src (=$(PKG_VERSION)-r$(PKG_RELEASE))
PROVIDES:=@golang
$(if $(filter $(GO_DEFAULT_VERSION),$(GO_VERSION_MAJOR_MINOR)),DEFAULT_VARIANT:=1)
ALTERNATIVES:=\
$(ALT_PRIORITY):/usr/bin/go:/usr/lib/go-$(1)/bin/go \
$(ALT_PRIORITY):/usr/bin/gofmt:/usr/lib/go-$(1)/bin/gofmt
endef
define Package/$(PKG_NAME)/description
$(call Package/$(PKG_NAME)/Default/description)
This package provides an assembler, compiler, linker, and compiled
libraries for the Go programming language.
endef
define Package/$(PKG_NAME)/config
source "$(SOURCE)/../Config.in"
endef
define Package/$(PKG_NAME)-doc
$(call Package/$(PKG_NAME)/Default)
TITLE+= (documentation)
PROVIDES:=@golang-doc
$(if $(filter $(GO_DEFAULT_VERSION),$(GO_VERSION_MAJOR_MINOR)),DEFAULT_VARIANT:=1)
endef
define Package/$(PKG_NAME)-doc/description
$(call Package/$(PKG_NAME)/Default/description)
This package provides the documentation for the Go programming language.
endef
define Package/$(PKG_NAME)-src
$(call Package/$(PKG_NAME)/Default)
TITLE+= (source files)
DEPENDS+= +libstdcpp +libtiff
PROVIDES:=@golang-src
$(if $(filter $(GO_DEFAULT_VERSION),$(GO_VERSION_MAJOR_MINOR)),DEFAULT_VARIANT:=1)
endef
define Package/$(PKG_NAME)-src/description
$(call Package/$(PKG_NAME)/Default/description)
This package provides the Go programming language source files needed
for cross-compilation.
endef
# Host
ifeq ($(GO_HOST_PIE_SUPPORTED),1)
HOST_GO_ENABLE_PIE:=1
endif
# When using GO_LDFLAGS to set buildmode=pie, the PIE install suffix does not
# apply (we also delete the std lib during Host/Install)
$(eval $(call GoCompiler/AddProfile,Host,$(HOST_BUILD_DIR),$(HOST_GO_PREFIX),$(HOST_GO_VERSION_ID),$(GO_HOST_OS_ARCH),$(HOST_GO_INSTALL_SUFFIX)))
HOST_GO_VARS= \
GOHOSTARCH="$(GO_HOST_ARCH)" \
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
GOENV=off \
CC="$(HOSTCC_NOCACHE)" \
CXX="$(HOSTCXX_NOCACHE)"
define Host/Configure
$(call GoCompiler/Bootstrap/CheckHost,$(BOOTSTRAP_GO_VALID_OS_ARCH))
$(call GoCompiler/Host/CheckHost,$(HOST_GO_VALID_OS_ARCH))
mkdir -p "$(GO_BUILD_CACHE_DIR)"
endef
define Host/Compile
$(call GoCompiler/Host/Make, \
GOROOT_BOOTSTRAP="$(BOOTSTRAP_DIR)" \
$(if $(HOST_GO_ENABLE_PIE),GO_LDFLAGS="-buildmode pie") \
$(HOST_GO_VARS) \
)
endef
# If host and target OS/arch are the same, # when go compiles a program, it will
# use the host std lib, so remove it now and force go to rebuild std for target
# later
define Host/Install
$(call Host/Uninstall)
$(call GoCompiler/Host/Install/Bin)
$(call GoCompiler/Host/Install/Src)
$(call GoCompiler/Host/Install/BinLinks)
rm -rf "$(HOST_GO_ROOT)/pkg/$(GO_HOST_OS_ARCH)$(if $(HOST_GO_INSTALL_SUFFIX),_$(HOST_GO_INSTALL_SUFFIX))"
$(INSTALL_DIR) "$(HOST_GO_ROOT)/openwrt"
$(INSTALL_BIN) ../go-gcc-helper "$(HOST_GO_ROOT)/openwrt/"
$(LN) go-gcc-helper "$(HOST_GO_ROOT)/openwrt/gcc"
$(LN) go-gcc-helper "$(HOST_GO_ROOT)/openwrt/g++"
endef
define Host/Uninstall
rm -rf "$(HOST_GO_ROOT)/openwrt"
$(call GoCompiler/Host/Uninstall/BinLinks)
$(call GoCompiler/Host/Uninstall)
endef
# Target
ifeq ($(GO_PKG_ENABLE_PIE),1)
PKG_GO_INSTALL_SUFFIX:=$(GO_TARGET_PIE_INSTALL_SUFFIX)
endif
$(eval $(call GoCompiler/AddProfile,Package,$(PKG_BUILD_DIR),$(PKG_GO_PREFIX),$(PKG_GO_VERSION_ID),$(GO_OS_ARCH),$(PKG_GO_INSTALL_SUFFIX)))
PKG_GO_ZBOOTSTRAP_MODS:= \
s/defaultGO386 = `[^`]*`/defaultGO386 = `$(or $(GO_386),sse2)`/; \
s/defaultGOAMD64 = `[^`]*`/defaultGOAMD64 = `$(or $(GO_AMD64),v1)`/; \
s/defaultGOARM = `[^`]*`/defaultGOARM = `$(or $(GO_ARM),7)`/; \
s/defaultGOARM64 = `[^`]*`/defaultGOARM64 = `$(or $(GO_ARM64),v8.0)`/; \
s/defaultGOMIPS = `[^`]*`/defaultGOMIPS = `$(or $(GO_MIPS),hardfloat)`/; \
s/defaultGOMIPS64 = `[^`]*`/defaultGOMIPS64 = `$(or $(GO_MIPS64),hardfloat)`/; \
s/defaultGOPPC64 = `[^`]*`/defaultGOPPC64 = `$(or $(GO_PPC64),power8)`/;
PKG_GO_ZBOOTSTRAP_PATH:=$(PKG_BUILD_DIR)/src/internal/buildcfg/zbootstrap.go
PKG_GO_VARS= \
GOHOSTARCH="$(GO_HOST_ARCH)" \
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
GOENV=off \
GO_GCC_HELPER_PATH="$$$$PATH" \
CC=gcc \
CXX=g++ \
PKG_CONFIG=pkg-config \
PATH="$(HOST_GO_ROOT)/openwrt:$$$$PATH"
PKG_GO_GCFLAGS= \
$(if $(GO_PKG_ENABLE_SPECTRE),-spectre all)
PKG_GO_ASMFLAGS= \
$(if $(GO_PKG_ENABLE_SPECTRE),-spectre all)
PKG_GO_LDFLAGS= \
-buildid '$(SOURCE_DATE_EPOCH)' \
-linkmode external \
-extldflags '$(patsubst -z%,-Wl$(comma)-z$(comma)%,$(TARGET_LDFLAGS))' \
$(if $(CONFIG_NO_STRIP)$(CONFIG_DEBUG),,-s -w)
PKG_GO_INSTALL_ARGS= \
-buildvcs=false \
-trimpath \
-ldflags "all=$(PKG_GO_LDFLAGS)" \
$(if $(PKG_GO_GCFLAGS),-gcflags "all=$(PKG_GO_GCFLAGS)") \
$(if $(PKG_GO_ASMFLAGS),-asmflags "all=$(PKG_GO_ASMFLAGS)") \
$(if $(filter $(GO_PKG_ENABLE_PIE),1),-buildmode pie)
define Build/Configure
mkdir -p "$(GO_BUILD_CACHE_DIR)"
endef
define Build/Compile
@echo "Building target Go first stage"
$(call GoCompiler/Package/Make, \
GOROOT_BOOTSTRAP="$(HOST_GO_ROOT)" \
GO_GCC_HELPER_CC="$(HOSTCC)" \
GO_GCC_HELPER_CXX="$(HOSTCXX)" \
$(PKG_GO_VARS) \
)
$(SED) '$(PKG_GO_ZBOOTSTRAP_MODS)' "$(PKG_GO_ZBOOTSTRAP_PATH)"
if echo 'int main() { return 0; }' | $(TARGET_CC) -o $(PKG_BUILD_DIR)/test-ldso -x c - > /dev/null 2>&1; then \
LDSO=$$$$( \
readelf -l $(PKG_BUILD_DIR)/test-ldso | \
sed -n -e 's/^.*interpreter: \(.*\)[]]/\1/p' \
) ; \
fi ; \
$(SED) "s,defaultGO_LDSO = \`[^\`]*\`,defaultGO_LDSO = \`$$$$LDSO\`," "$(PKG_GO_ZBOOTSTRAP_PATH)"
@echo "Building target Go second stage"
cd "$(PKG_BUILD_DIR)/bin" ; \
export $(GO_PKG_TARGET_VARS) ; \
$(CP) go go-host ; \
GO_GCC_HELPER_CC="$(TARGET_CC)" \
GO_GCC_HELPER_CXX="$(TARGET_CXX)" \
$(PKG_GO_VARS) \
./go-host install -a $(PKG_GO_INSTALL_ARGS) std cmd ; \
retval="$$$$?" ; \
rm -f go-host ; \
exit "$$$$retval"
endef
define Package/$(PKG_NAME)/install
$(call GoCompiler/Package/Install/Bin,$(1)$(PKG_GO_PREFIX))
endef
define Package/$(PKG_NAME)-doc/install
$(call GoCompiler/Package/Install/Doc,$(1)$(PKG_GO_PREFIX))
endef
define Package/$(PKG_NAME)-src/install
$(call GoCompiler/Package/Install/Src,$(1)$(PKG_GO_PREFIX))
endef
# src/debug contains ELF executables as test data and they reference these
# libraries we need to call this in Package/$(1)/extra_provides to pass
# CheckDependencies in include/package-pack.mk
define Package/$(PKG_NAME)-src/extra_provides
echo 'libc.so.6'
endef
$(eval $(call HostBuild))
$(eval $(call BuildPackage,$(PKG_NAME)))
$(eval $(call BuildPackage,$(PKG_NAME)-doc))
$(eval $(call BuildPackage,$(PKG_NAME)-src))

View File

@@ -2,6 +2,8 @@
#
# SPDX-License-Identifier: GPL-2.0-only
[ "$1" = golang ] || exit 0
case "$1" in
golang*doc|golang*src) exit ;;
esac
go version | grep -F " go$PKG_VERSION "