From ca501ee61ebedecd722fb107fddac75e1c45f61e Mon Sep 17 00:00:00 2001 From: George Sapkin Date: Thu, 22 Jan 2026 02:55:19 +0200 Subject: [PATCH] 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 --- lang/golang/go-gcc-helper | 3 +- lang/golang/golang-build.sh | 9 +- lang/golang/golang-compiler.mk | 11 +- lang/golang/golang-package.mk | 15 +- lang/golang/golang-values.mk | 6 + lang/golang/golang/Makefile | 315 +------------------ lang/golang/golang1.25/Makefile | 342 +++++++++++++++++++++ lang/golang/{golang => golang1.25}/test.sh | 4 +- 8 files changed, 380 insertions(+), 325 deletions(-) create mode 100644 lang/golang/golang1.25/Makefile rename lang/golang/{golang => golang1.25}/test.sh (65%) diff --git a/lang/golang/go-gcc-helper b/lang/golang/go-gcc-helper index 061955181a..d76e45aecf 100644 --- a/lang/golang/go-gcc-helper +++ b/lang/golang/go-gcc-helper @@ -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: $*" } diff --git a/lang/golang/golang-build.sh b/lang/golang/golang-build.sh index 1eff8f63f2..d145b34b5e 100644 --- a/lang/golang/golang-build.sh +++ b/lang/golang/golang-build.sh @@ -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/" diff --git a/lang/golang/golang-compiler.mk b/lang/golang/golang-compiler.mk index 000a9ba6c8..f683c1e34e 100644 --- a/lang/golang/golang-compiler.mk +++ b/lang/golang/golang-compiler.mk @@ -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 diff --git a/lang/golang/golang-package.mk b/lang/golang/golang-package.mk index 9762af7fbf..daebec9141 100644 --- a/lang/golang/golang-package.mk +++ b/lang/golang/golang-package.mk @@ -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 diff --git a/lang/golang/golang-values.mk b/lang/golang/golang-values.mk index a1c420f88c..e47e1323b9 100644 --- a/lang/golang/golang-values.mk +++ b/lang/golang/golang-values.mk @@ -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 \ diff --git a/lang/golang/golang/Makefile b/lang/golang/golang/Makefile index 86b9d87744..0a3b5c472e 100644 --- a/lang/golang/golang/Makefile +++ b/lang/golang/golang/Makefile @@ -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 -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 index 0000000000..b796be20db --- /dev/null +++ b/lang/golang/golang1.25/Makefile @@ -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 +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)) diff --git a/lang/golang/golang/test.sh b/lang/golang/golang1.25/test.sh similarity index 65% rename from lang/golang/golang/test.sh rename to lang/golang/golang1.25/test.sh index 7fa3852bf9..e7c4a8122e 100644 --- a/lang/golang/golang/test.sh +++ b/lang/golang/golang1.25/test.sh @@ -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 "