golang: add versioned package for 1.25
authorGeorge Sapkin <redacted>
Thu, 22 Jan 2026 00:55:19 +0000 (02:55 +0200)
committerGeorge Sapkin <redacted>
Sun, 25 Jan 2026 17:23:45 +0000 (19:23 +0200)
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 <redacted>
lang/golang/go-gcc-helper
lang/golang/golang-build.sh
lang/golang/golang-compiler.mk
lang/golang/golang-package.mk
lang/golang/golang-values.mk
lang/golang/golang/Makefile
lang/golang/golang1.25/Makefile [new file with mode: 0644]
lang/golang/golang1.25/test.sh [moved from lang/golang/golang/test.sh with 65% similarity]

index 061955181a81b6043b8b97366ea0716ee01600ac..d76e45aecf2c881a03fa404505060a4ae45ce787 100644 (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: $*"
 }
index 1eff8f63f28741be43d5a6e06aeea808fab13373..d145b34b5ea5bcc89abe7d79b4aa53125247653e 100644 (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/"
index 000a9ba6c8d15bd705636fd584b7cc5cf24df3f6..f683c1e34e9e82c652bbd33c481e53a9bbad79c9 100644 (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
index 9762af7fbf660bed52190d6d23da27ad4956a155..daebec91415fcfcbe955670cb44fa53b389a9b0b 100644 (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
index a1c420f88c54d25ca6ff930f71b73057347d127a..e47e1323b9c31d3c085be91b8ae4f70bdc964510 100644 (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 \
index 86b9d877443dc8014f6b8b0d58d13a62b87d6432..0a3b5c472e0297a405bd2210a2ea2facc2d4519e 100644 (file)
-#
-# 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))
diff --git a/lang/golang/golang1.25/Makefile b/lang/golang/golang1.25/Makefile
new file mode 100644 (file)
index 0000000..b796be2
--- /dev/null
@@ -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))
similarity index 65%
rename from lang/golang/golang/test.sh
rename to lang/golang/golang1.25/test.sh
index 7fa3852bf96c64a0a186ec28fcfca447aff8ade0..e7c4a8122e045ad6088b567a9feb40f79d0fdc75 100644 (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 "
git clone https://git.99rst.org/PROJECT