summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-05 02:16:14 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-05 02:16:14 +0000
commit079e07387f14e46377a31e1b5f1239faad6c385e (patch)
tree0d42a23b8dd859d54186c9236398cce62e804050
parent453c495bceb89952108be7452da3d072d3336eab (diff)
automatic import of go-rpm-macrosopeneuler24.03_LTS
-rw-r--r--.gitignore2
-rw-r--r--add-gobuild-and-gotest.patch34
-rw-r--r--go-rpm-macros.spec320
-rw-r--r--golist-bootstrap-cli-no-vendor.patch322
-rw-r--r--sources2
-rw-r--r--update-default-gobuild-args.patch64
6 files changed, 744 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..4755ce0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/go-rpm-macros-3.2.0.tar.gz
+/golist-0.10.1.tar.gz
diff --git a/add-gobuild-and-gotest.patch b/add-gobuild-and-gotest.patch
new file mode 100644
index 0000000..77c06b4
--- /dev/null
+++ b/add-gobuild-and-gotest.patch
@@ -0,0 +1,34 @@
+From 1001f5a99439556c5ad3efe6045923e985a52f82 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Alejandro=20S=C3=A1ez?= <asm@redhat.com>
+Date: Wed, 22 Sep 2023 12:00:00 +0100
+Subject: [PATCH] Add %gobuild and %gotest
+
+Both macros are define in rpm/macros.d/macros.go-compilers-gcc.
+CentOS Stream 9 go-srpm-macros discards that file and only installs rpm/macros.d/macros.go-srpm.
+
+This commit adds %gobuild and %gotest to rpm/macros.d/macros.go-srpm with the same options that RHEL 8 uses.
+
+This also sets the base ISA for x86_64 and Power.
+---
+ rpm/macros.d/macros.go-srpm | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/rpm/macros.d/macros.go-srpm b/rpm/macros.d/macros.go-srpm
+index a46f81f..05cd6c9 100644
+--- a/rpm/macros.d/macros.go-srpm
++++ b/rpm/macros.d/macros.go-srpm
+@@ -202,3 +202,11 @@ local processall = (rpm.expand("%{-a}") ~= "") and (rpm.expand("%{-z}") == "")
+ local verbose = (rpm.expand("%{-v}") ~= "")
+ go.files("alt", suffix, processall, verbose)
+ }
++
++# Define commands for building
++# BUILD_ID can be generated for golang build no matter of debuginfo
++%gobuild(o:) \
++GOPPC64=power9 GOAMD64=v2 CGO_CPPFLAGS="-D_FORTIFY_SOURCE=2 -fstack-protector-all" go build -compiler gc -buildmode pie '-tags=rpm_crashtraceback libtrust_openssl ' -ldflags "-linkmode=external -compressdwarf=false ${LDFLAGS:-} -B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \\n') -extldflags '%__global_ldflags'" -a -v -x %{?**};\
++
++# Define commands for testing
++%gotest() go test -compiler gc -ldflags "${LDFLAGS:-}" %{?**};
+--
+2.38.1
+
diff --git a/go-rpm-macros.spec b/go-rpm-macros.spec
new file mode 100644
index 0000000..a4f5bce
--- /dev/null
+++ b/go-rpm-macros.spec
@@ -0,0 +1,320 @@
+%global forgeurl https://pagure.io/go-rpm-macros
+Version: 3.2.0
+%forgemeta
+
+#https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/51
+%global _spectemplatedir %{_datadir}/rpmdevtools/fedora
+%global _docdir_fmt %{name}
+
+# Master definition that will be written to macro files
+%global golang_arches_future x86_64 %{arm} aarch64 ppc64le s390x
+%global golang_arches %{ix86} %{golang_arches_future}
+%global gccgo_arches %{mips}
+%if 0%{?rhel} >= 9
+%global golang_arches x86_64 aarch64 ppc64le s390x
+%endif
+# Go sources can contain arch-specific files and our macros will package the
+# correct files for each architecture. Therefore, move gopath to _libdir and
+# make Go devel packages archful
+%global gopath %{_datadir}/gocode
+
+# whether to bundle golist or require it as a dependency
+%global bundle_golist 1
+
+%if 0%{?bundle_golist}
+# do not create debuginfo packages when we add a build section
+%global debug_package %{nil}
+%global golist_version 0.10.1
+%global golist_builddir %{_builddir}/golist-%{golist_version}/_build
+%global golist_goipath pagure.io/golist
+# where to bundle the golist executable
+%global golist_execdir %{_libexecdir}/go-rpm-macros/
+# define gobuild to avoid this package requiring itself to build
+%define gobuild(o:) GO111MODULE=off go build -buildmode pie -compiler gc -tags="rpm_crashtraceback ${BUILDTAGS:-}" -ldflags "${LDFLAGS:-} -B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \\n') -extldflags '-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld '" -a -v %{?**};
+%endif
+
+ExclusiveArch: %{golang_arches} %{gccgo_arches}
+
+Name: go-rpm-macros
+Release: 3%{?dist}
+Summary: Build-stage rpm automation for Go packages
+
+License: GPLv3+
+URL: %{forgeurl}
+Source0: %{forgesource}
+%if 0%{?bundle_golist}
+Source1: https://pagure.io/golist/archive/v%{golist_version}/golist-%{golist_version}.tar.gz
+%endif
+
+Requires: go-srpm-macros = %{version}-%{release}
+Requires: go-filesystem = %{version}-%{release}
+
+%if 0%{?bundle_golist}
+BuildRequires: golang
+%else
+Requires: golist
+%endif
+
+%ifarch %{golang_arches}
+Requires: golang
+Provides: compiler(golang)
+Provides: compiler(go-compiler) = 2
+Obsoletes: go-compilers-golang-compiler < %{version}-%{release}
+%endif
+
+%ifarch %{gccgo_arches}
+Requires: gcc-go
+Provides: compiler(gcc-go)
+Provides: compiler(go-compiler) = 1
+Obsoletes: go-compilers-gcc-go-compiler < %{version}-%{release}
+%endif
+
+Patch0: update-default-gobuild-args.patch
+# Replace golang-github-urfave-cli with a minimal
+# command line parser backend to bootstrap golist
+# without dependencies.
+Patch1: golist-bootstrap-cli-no-vendor.patch
+
+# RHEL 8 only provides the macros.go-srpm file which includes gobuild and gotest.
+# C9S also only provides the macros.go-srpm file but it also follows upstream which includes gobuild and gotest in the macros.go-compilers-gcc.
+# For a simple fix, this patch ports both RHEL 8 macros to macros.go-srpm.
+# This also sets the GOAMD64 variable to v2
+# Resolves: rhbz#1965292
+# Resolves: RHEL-5529
+Patch2: add-gobuild-and-gotest.patch
+
+%description
+This package provides build-stage rpm automation to simplify the creation of Go
+language (golang) packages.
+
+It does not need to be included in the default build root: go-srpm-macros will
+pull it in for Go packages only.
+
+%package -n go-srpm-macros
+Summary: Source-stage rpm automation for Go packages
+BuildArch: noarch
+Requires: redhat-rpm-config
+
+%description -n go-srpm-macros
+This package provides SRPM-stage rpm automation to simplify the creation of Go
+language (golang) packages.
+
+It limits itself to the automation subset required to create Go SRPM packages
+and needs to be included in the default build root.
+
+The rest of the automation is provided by the go-rpm-macros package, that
+go-srpm-macros will pull in for Go packages only.
+
+%package -n go-filesystem
+Summary: Directories used by Go packages
+License: Public Domain
+
+%description -n go-filesystem
+This package contains the basic directory layout used by Go packages.
+
+%package -n go-rpm-templates
+Summary: RPM spec templates for Go packages
+License: MIT
+BuildArch: noarch
+Requires: go-rpm-macros = %{version}-%{release}
+#https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/51
+#Requires: redhat-rpm-templates
+
+%description -n go-rpm-templates
+This package contains documented rpm spec templates showcasing how to use the
+macros provided by go-rpm-macros to create Go packages.
+
+%prep
+%forgesetup
+
+%patch0 -p1
+
+%writevars -f rpm/macros.d/macros.go-srpm golang_arches golang_arches_future gccgo_arches gopath
+for template in templates/rpm/*\.spec ; do
+ target=$(echo "${template}" | sed "s|^\(.*\)\.spec$|\1-bare.spec|g")
+ grep -v '^#' "${template}" > "${target}"
+ touch -r "${template}" "${target}"
+done
+
+# unpack golist and patch
+%if 0%{?bundle_golist}
+pushd %{_builddir}
+tar -xf %{_sourcedir}/golist-%{golist_version}.tar.gz
+cd golist-%{golist_version}
+%patch1 -p1
+cp %{_builddir}/golist-%{golist_version}/LICENSE %{_builddir}/go-rpm-macros-%{version}/LICENSE-golist
+popd
+
+# create directory structure for a Go build
+if [[ ! -e %{golist_builddir}/bin ]]; then
+ install -m 0755 -vd %{golist_builddir}/bin
+ export GOPATH=%{golist_builddir}:${GOPATH:+${GOPATH}:}/usr/share/gocode
+fi
+if [[ ! -e %{golist_builddir}/src/%{golist_goipath} ]]; then
+ install -m 0755 -vd %{golist_builddir}/src/pagure.io
+ ln -sf $(dirname %{golist_builddir}) %{golist_builddir}/src/%{golist_goipath}
+
+fi
+%endif
+
+%patch2 -p1
+
+%build
+# build golist
+%if 0%{?bundle_golist}
+pushd %{golist_builddir}/src/%{golist_goipath}
+export GOPATH=%{golist_builddir}:${GOPATH:+${GOPATH}:}/usr/share/gocode
+for cmd in cmd/* ; do
+ %gobuild -o %{golist_builddir}/bin/$(basename $cmd) %{golist_goipath}/$cmd
+done
+popd
+%endif
+
+%install
+# Some of those probably do not work with gcc-go right now
+# This is not intentional, but mips is not a primary Fedora architecture
+# Patches and PRs are welcome
+
+install -m 0755 -vd %{buildroot}%{gopath}/src
+
+install -m 0755 -vd %{buildroot}%{_spectemplatedir}
+
+if ls templates/rpm/*\.spec; then
+ install -m 0644 -vp templates/rpm/*spec \
+ %{buildroot}%{_spectemplatedir}
+fi
+
+install -m 0755 -vd %{buildroot}%{_bindir}
+install -m 0755 bin/* %{buildroot}%{_bindir}
+
+install -m 0755 -vd %{buildroot}%{rpmmacrodir}
+install -m 0644 -vp rpm/macros.d/macros.go-* \
+ %{buildroot}%{rpmmacrodir}
+install -m 0755 -vd %{buildroot}%{_rpmluadir}/fedora/srpm
+install -m 0644 -vp rpm/lua/srpm/*lua \
+ %{buildroot}%{_rpmluadir}/fedora/srpm
+install -m 0755 -vd %{buildroot}%{_rpmluadir}/fedora/rpm
+install -m 0644 -vp rpm/lua/rpm/*lua \
+ %{buildroot}%{_rpmluadir}/fedora/rpm
+install -m 0755 -vd %{buildroot}%{_rpmconfigdir}/fileattrs
+install -m 0644 -vp rpm/fileattrs/*.attr \
+ %{buildroot}%{_rpmconfigdir}/fileattrs/
+install -m 0755 -vp rpm/*\.{prov,deps} \
+ %{buildroot}%{_rpmconfigdir}/
+
+%ifarch %{golang_arches}
+install -m 0644 -vp rpm/macros.d/macros.go-compilers-golang \
+ %{buildroot}%{_rpmconfigdir}/macros.d/macros.go-compiler-golang
+%endif
+
+%ifarch %{gccgo_arches}
+install -m 0644 -vp rpm/macros.d/macros.go-compilers-gcc \
+ %{buildroot}%{_rpmconfigdir}/macros.d/macros.go-compiler-gcc
+%endif
+
+# install golist
+%if 0%{?bundle_golist}
+install -m 0755 -vd %{buildroot}%{golist_execdir}
+install -m 0755 -vp %{golist_builddir}/bin/* %{buildroot}%{golist_execdir}/
+sed -i "s,golist,%{golist_execdir}/golist,g" %{buildroot}%{_bindir}/go-rpm-integration
+%endif
+
+%files
+%license LICENSE.txt LICENSE-golist
+%doc README.md
+%{_bindir}/*
+%{_rpmconfigdir}/fileattrs/*.attr
+%{_rpmconfigdir}/*.prov
+%{_rpmconfigdir}/*.deps
+%{_rpmconfigdir}/macros.d/macros.go-rpm*
+%{_rpmconfigdir}/macros.d/macros.go-compiler*
+%{_rpmluadir}/fedora/rpm/*.lua
+# package golist
+%if 0%{?bundle_golist}
+%{golist_execdir}/golist
+%endif
+
+%files -n go-srpm-macros
+%license LICENSE.txt
+%doc README.md
+%{_rpmconfigdir}/macros.d/macros.go-srpm
+%{_rpmluadir}/fedora/srpm/*.lua
+
+%files -n go-filesystem
+%dir %{gopath}
+%dir %{gopath}/src
+
+%files -n go-rpm-templates
+%license LICENSE-templates.txt
+%doc README.md
+# https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/51
+%dir %{dirname:%{_spectemplatedir}}
+%dir %{_spectemplatedir}
+%{_spectemplatedir}/*.spec
+
+%changelog
+* Fri Sep 22 2023 Alejandro Sáez <asm@redhat.com> - 3.2.0-3
+- Update add-gobuild-and-gotest.patch to add GOPPC64 and GOAMD64
+- Resolves: RHEL-5529
+
+* Fri Jul 28 2023 Alejandro Sáez <asm@redhat.com> - 3.2.0-2
+- Add golang_arches_future
+- Resolves: rhbz#2227224
+
+* Wed Nov 23 2022 Alejandro Sáez <asm@redhat.com> - 3.2.0-1
+- Update to 3.2.0
+- Add add-gobuild-and-gotest.patch
+- Resolves: rhbz#1965292
+
+* Wed Jan 26 2022 Alejandro Sáez <asm@redhat.com> - 3.0.9-10
+- Fix typos in update-default-gobuild-args.patch
+- Related: rhbz#2043107
+
+* Tue Jan 18 2022 David Benoit <dbenoit@redhat.com> 3.0.9-9
+- Delete remove-fedora-dependency-automation.patch
+- Bundle golist in /usr/libexec
+- Related: rhbz#2043107
+
+* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com>
+- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
+ Related: rhbz#1991688
+
+* Tue Aug 03 2021 David Benoit <dbenoit@redhat.com> 3.0.9-7
+- Escape quotation marks in gobuildflags
+- Resolves: rhbz#1988717
+
+* Tue Jul 27 2021 David Benoit <dbenoit@redhat.com> 3.0.9-6
+- Remove arch conditional on gocompilerflags
+- Related: rhbz#1982298
+
+* Fri Jul 23 2021 David Benoit <dbenoit@redhat.com> 3.0.9-5
+- Remove fedora-specific Go dependency automation macros
+- Remove dependency on golist
+- Temporarily remove incompatible template spec files
+- Update gobuild flags
+- Resolves: rhbz#1982298
+
+* Thu Apr 15 2021 Mohan Boddu <mboddu@redhat.com>
+- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
+
+* Thu Feb 11 2021 Jeff Law <law@redhat.com> - 3.0.9-3
+- Drop 32 bit arches in EL 9 (originally from Petr Sabata)
+
+* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 3.0.9-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
+
+* Thu Aug 13 2020 Neal Gompa <ngompa13@gmail.com> - 3.0.9-1
+- Update to 3.0.9
+
+* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.0.8-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.0.8-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
+
+* Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org> - 3.0.8-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Wed Jun 05 2019 Nicolas Mailhot <nim@fedoraproject.org>
+- 3.0.8-3
+- initial Fedora import, for golist 0.10.0 and redhat-rpm-config 130
diff --git a/golist-bootstrap-cli-no-vendor.patch b/golist-bootstrap-cli-no-vendor.patch
new file mode 100644
index 0000000..e8bc793
--- /dev/null
+++ b/golist-bootstrap-cli-no-vendor.patch
@@ -0,0 +1,322 @@
+diff --git a/cmd/golist/golist.go b/cmd/golist/golist.go
+index ee028ae..e9c038d 100644
+--- a/cmd/golist/golist.go
++++ b/cmd/golist/golist.go
+@@ -11,9 +11,8 @@ import (
+ "strings"
+ "text/template"
+
+- "github.com/urfave/cli"
+-
+ "pagure.io/golist/pkg/util"
++ "pagure.io/golist/pkg/cli"
+ )
+
+ var (
+@@ -100,7 +99,6 @@ func main() {
+ }
+
+ app.Action = func(c *cli.Context) error {
+-
+ if len(c.StringSlice("package-path")) == 0 {
+ return fmt.Errorf("--package-path is not set")
+ }
+diff --git a/pkg/cli/cli.go b/pkg/cli/cli.go
+new file mode 100644
+index 0000000..ec91056
+--- /dev/null
++++ b/pkg/cli/cli.go
+@@ -0,0 +1,293 @@
++package cli
++
++/* golist uses a very small portion of functionality
++ from github.com/urfave/cli. This module provides
++ minimal substitute API implementations for only the
++ core functionality used by golist, for the purpose of
++ bootstrapping golist without additional dependencies.
++*/
++
++import (
++ "strings"
++ "fmt"
++ "os"
++)
++
++type String string
++type StringSlice []string
++type Bool bool
++
++type Flag interface {
++ name() string
++ usage() string
++}
++
++type BoolFlag struct {
++ Name string
++ Usage string
++ Value bool
++}
++
++type StringFlag struct {
++ Name string
++ Usage string
++ Value string
++}
++
++type StringSliceFlag struct {
++ Name string
++ Usage string
++ Value *StringSlice
++}
++
++type App struct {
++ Name string
++ Usage string
++ Version string
++ Flags []Flag
++ Action func(*Context) error
++
++}
++
++func NewApp() App {
++ var a App
++ return a
++}
++
++func (a *App) Run(osArgs []string) error {
++ c, err := newContext(a.Flags, osArgs)
++ if err != nil {
++ return err
++ }
++ if c.Bool("help") {
++ a.PrintHelp()
++ os.Exit(0)
++ }
++ return a.Action(c)
++}
++
++func (a *App) PrintHelp() {
++ maxNameLen := 0
++ for _, flag := range a.Flags {
++ length := len(flag.name())
++ if length > maxNameLen {
++ maxNameLen = length
++ }
++ }
++ fmtSpec := "%-" + fmt.Sprintf("%v", maxNameLen + 6) + "s\t%s\n"
++ fmt.Printf("%s - %s\n", a.Name, a.Usage)
++ fmt.Printf("Options:\n")
++ for _, flag := range a.Flags {
++ flagNameSlice := append([]string{canonicalName(flag)}, alternateNames(flag)...)
++ for i, _ := range flagNameSlice {
++ if len(flagNameSlice[i]) > 1 {
++ flagNameSlice[i] = fmt.Sprintf("--%s", flagNameSlice[i])
++ } else {
++ flagNameSlice[i] = fmt.Sprintf("-%s", flagNameSlice[i])
++ }
++ }
++ flagNameStr := strings.Join(flagNameSlice, ", ")
++ switch flag.(type) {
++ case StringFlag:
++ flagNameStr = fmt.Sprintf(" %s value", flagNameStr)
++ case StringSliceFlag:
++ flagNameStr = fmt.Sprintf(" %s value", flagNameStr)
++ case BoolFlag:
++ flagNameStr = fmt.Sprintf(" %s", flagNameStr)
++ }
++ fmt.Printf(fmtSpec, flagNameStr, flag.usage())
++ }
++}
++
++
++type Context struct {
++ flagValues map[string]interface{}
++ flagDecls map[string]Flag
++ altFlags map[string]string
++ positionalArgs []string
++}
++
++func (c *Context) Bool(flag string) bool {
++ iface, ok := c.flagDecls[flag]
++ if !ok {
++ panic("undefined flag" + flag)
++ }
++ switch iface.(type) {
++ case BoolFlag:
++ break
++ default:
++ panic("flag type mismatch - expected BoolFlag, got: " + flag)
++ }
++ val, ok := c.flagValues[flag]
++ if !ok {
++ return iface.(BoolFlag).Value
++ }
++ return val.(bool)
++}
++
++func (c *Context) String(flag string) string {
++ iface, ok := c.flagDecls[flag]
++ if !ok {
++ panic("undefined flag" + flag)
++ }
++ switch iface.(type) {
++ case StringFlag:
++ break
++ default:
++ panic("flag type mismatch - expected StringFlag, got: " + flag)
++ }
++ val, ok:= c.flagValues[flag]
++ if !ok {
++ return iface.(StringFlag).Value
++ }
++ return val.(string)
++}
++
++func (c *Context) StringSlice(flag string) []string {
++ iface, ok := c.flagDecls[flag];
++ if !ok {
++ panic("undefined flag" + flag)
++ }
++ switch iface.(type) {
++ case StringSliceFlag:
++ break
++ default:
++ panic("flag type mismatch - expected StringSliceFlag, got: " + flag)
++ }
++ val, ok := c.flagValues[flag]
++ if !ok {
++ val = iface.(StringSliceFlag).Value
++ if val != nil {
++ return []string{}
++ }
++ }
++ return val.([]string)
++}
++
++// Create a hash mapping from flag names to declarations
++// and alt names to flag names.
++func (c *Context) setupFlags(flagDecls []Flag) error {
++ helpFlag := BoolFlag {
++ Name: "help, h",
++ Usage: "Show help message",
++ }
++ flagDecls = append(flagDecls, helpFlag)
++ for _, flag := range flagDecls {
++ flagName := canonicalName(flag)
++ if _, ok:= c.flagDecls[flagName]; ok {
++ return fmt.Errorf("cannot redeclare flag: %s", flagName)
++ }
++ c.flagDecls[flagName] = flag
++ altFlagNames := alternateNames(flag)
++ for _, altName := range altFlagNames {
++ c.altFlags[altName] = flagName
++ }
++ }
++ return nil
++}
++
++func (c *Context) parseArgs(osArgs []string) error {
++ // process command line arguments as a stream of tokens.
++ // operations consume the first token in the stream until
++ // the stream is empty.
++ argStream := osArgs
++ for len(argStream) > 0 {
++ arg := argStream[0]
++ if ! isFlag(arg) {
++ argStream = argStream[1:]
++ c.positionalArgs = append(c.positionalArgs, arg)
++
++ } else {
++ arg = trimFlag(arg)
++ if _, ok:= c.altFlags[arg]; ok {
++ arg = c.altFlags[arg]
++ }
++ iface, ok := c.flagDecls[arg]
++ if !ok {
++ return fmt.Errorf("unexpected argument: %v", arg)
++ }
++ switch flag := iface.(type) {
++ case StringFlag:
++ argStream = argStream[1:]
++ if len(argStream) == 0 {
++ return fmt.Errorf("expected value for argument: %v", arg)
++ }
++ if isFlag(argStream[0]) {
++ return fmt.Errorf("unexpected flag: %v", arg)
++ }
++ c.flagValues[arg] = argStream[0]
++ case StringSliceFlag:
++ argStream = argStream[1:]
++ if len (argStream) == 0 {
++ return fmt.Errorf("expected value for argument: %v", arg)
++ }
++ if isFlag(argStream[0]) {
++ return fmt.Errorf("unexpected flag: %v", arg)
++ }
++ c.flagValues[arg] = make([]string, 0)
++ c.flagValues[arg] = append(c.flagValues[arg].([]string), argStream[0])
++ argStream = argStream[1:]
++ for len(argStream) > 0 && ! isFlag(argStream[0]) {
++ c.flagValues[arg] = append(c.flagValues[arg].([]string), argStream[0])
++ argStream = argStream[1:]
++ }
++ case BoolFlag:
++ argStream = argStream[1:]
++ c.flagValues[canonicalName(flag)] = true
++ default:
++ return fmt.Errorf("unexpected flag: %v", arg)
++ }
++ }
++ }
++ return nil
++}
++
++func newContext(flags []Flag, osArgs []string) (*Context, error) {
++ var c Context
++ c.flagValues = make(map[string]interface{})
++ c.flagDecls = make(map[string]Flag)
++ c.altFlags = make(map[string]string)
++ c.altFlags = make(map[string]string)
++ if err := c.setupFlags(flags); err != nil {
++ return nil, err
++ }
++ if err := c.parseArgs(osArgs); err != nil {
++ return nil, err
++ }
++ return &c, nil
++}
++
++func (f StringFlag) name() string {return f.Name}
++func (f StringFlag) usage() string {return f.Usage}
++func (f BoolFlag) name() string {return f.Name}
++func (f BoolFlag) usage() string {return f.Usage}
++func (f StringSliceFlag) name() string {return f.Name}
++func (f StringSliceFlag) usage() string {return f.Usage}
++
++// takes a Flag with a comma delimited string
++// of flag names and returns the first one
++func canonicalName(flag Flag) string {
++ flagNames := strings.Split(flag.name(), ",")
++ return strings.TrimSpace(flagNames[0])
++}
++
++// takes a Flag with a comma delimited string
++// of flag names and returns them as a string slice
++// with the canonical (first) flag ommitted
++func alternateNames(flag Flag) []string {
++ flagNames := strings.Split(flag.name(), ",")
++ altNames := flagNames[1:]
++ for i, _ := range altNames {
++ altNames[i] = strings.TrimSpace(altNames[i])
++ }
++ return altNames
++}
++
++func isFlag(arg string) bool {
++ return strings.HasPrefix(arg, "-")
++}
++
++func trimFlag(arg string) string {
++ return strings.Trim(strings.Trim(arg, "-"), "-")
++}
++
diff --git a/sources b/sources
new file mode 100644
index 0000000..4e7754a
--- /dev/null
+++ b/sources
@@ -0,0 +1,2 @@
+38abc4f4cf1705b6a26cbad596533f57 go-rpm-macros-3.2.0.tar.gz
+d1f77c5684fec1c31566ede37793a847 golist-0.10.1.tar.gz
diff --git a/update-default-gobuild-args.patch b/update-default-gobuild-args.patch
new file mode 100644
index 0000000..9c5ec1c
--- /dev/null
+++ b/update-default-gobuild-args.patch
@@ -0,0 +1,64 @@
+From c05378a9d5d7ceb0fef2a915df9b88750685a3a9 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Alejandro=20S=C3=A1ez?= <asm@redhat.com>
+Date: Thu, 24 Nov 2022 15:05:06 +0100
+Subject: [PATCH] Update default gobuild args
+
+---
+ rpm/macros.d/macros.go-compilers-golang | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+diff --git a/rpm/macros.d/macros.go-compilers-golang b/rpm/macros.d/macros.go-compilers-golang
+index 74428a3..8cee8e2 100644
+--- a/rpm/macros.d/macros.go-compilers-golang
++++ b/rpm/macros.d/macros.go-compilers-golang
+@@ -20,6 +20,8 @@
+ #
+ # SPDX-License-Identifier: GPL-3.0-or-later
+
++%gocompilerflags -buildmode pie -compiler gc
++
+ # This *must* be all on one line, as it will be used in shell
+ # assignments. eg
+ #
+@@ -29,13 +31,16 @@
+ #
+ # %make GOBUILDFLAGS="%gobuildflags"
+ #
+-%gobuildflags() %{expand:%{gocompilerflags} -tags="rpm_crashtraceback ${BUILDTAGS:-}" -ldflags "${LDFLAGS:-} %{?currentgoldflags} -B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \\n') -compressdwarf=false -linkmode=external -extldflags '%{build_ldflags} %{?__golang_extldflags}'" -a -v -x}
++%gobuildflags() %{expand:%{gocompilerflags} -tags=\\"rpm_crashtraceback ${BUILDTAGS:-} libtrust_openssl\\" -ldflags \\"-linkmode=external -compressdwarf=false ${LDFLAGS:-} %{?currentgoldflags} -B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \\n') -extldflags '%__global_ldflags %{?__golang_extldflags}'\\" -a -v -x}
++%_gobuildflags_internal() %{expand:%{gocompilerflags} -tags="rpm_crashtraceback ${BUILDTAGS:-} libtrust_openssl" -ldflags "-linkmode=external -compressdwarf=false ${LDFLAGS:-} %{?currentgoldflags} -B 0x$(head -c20 /dev/urandom|od -An -tx1|tr -d ' \\n') -extldflags '%__global_ldflags %{?__golang_extldflags}'" -a -v -x}
+
+ # Turn off Go modules
+ %gomodulesmode GO111MODULE=off
+
+ # Define commands for building
+ # BUILD_ID can be generated for golang build no matter of debuginfo
++%_gobuild_cmd CGO_CPPFLAGS="-D_FORTIFY_SOURCE=2 -fstack-protector-all" go build %{_gobuildflags_internal}
++%gobuild_compat_el8(o:) %{expand:%{_gobuild_cmd} %{?**};}
+ %gobuild(o:) %{expand:
+ # https://pagure.io/go-rpm-macros/pull-request/38
+ # Most of the default LDFLAGS for Fedora are not supported so we don't want
+@@ -44,14 +49,16 @@
+ # https://bugzilla.redhat.com/show_bug.cgi?id=995136#c12
+ %global _dwz_low_mem_die_limit 0
+ %{?gobuilddir:GOPATH="%{gobuilddir}:${GOPATH:+${GOPATH}:}%{?gopath}"} %{?gomodulesmode} \\
+- go build %{gobuildflags} %{?**};
++ %{_gobuild_cmd} %{?**};
+ }
+ ${workroot}${GOPATH:+:${GOPATH}}
+
+ # Define commands for testing
+ %gotestflags %{gocompilerflags}
+ %gotestextldflags %{build_ldflags} %{?__golang_extldflags}
+-%gotest() %{expand:
+- %undefine _auto_set_build_flags
+- %{?gomodulesmode} go test %{gotestflags} -ldflags "${LDFLAGS:-} %{?currentgoldflags} -extldflags '%{gotestextldflags}'" %{?**};
++%_gotest_cmd %{?gomodulesmode} go test %{gotestflags} -ldflags "${LDFLAGS:-} %{?currentgoldflags} -extldflags '%{gotestextldflags}'"
++%gotest_compat_el8(o:) %{expand:%{_gotest_cmd} %{?**};}
++%gotest(o:) %{expand:
++ %{?gobuilddir:GOPATH="%{gobuilddir}:${GOPATH:+${GOPATH}:}%{?gopath}"} %{?gomodulesmode} \\
++ %{_gotest_cmd} %{?**};
+ }
+--
+2.38.1
+