Robert,
Thank you,  this is very helpful, so I guess the questions I have is if I'm
reading your email correctly

1. Is for now we need to deal with the vendor directory, but should start
working to packaging some of the go-lang dependencies as rpms?

2. With the bundled vendor directory we have a "functional" build of the
rpm that should work in theory?


On Sun, Aug 13, 2023, 5:24 AM Robert-André Mauchin <zebo...@gmail.com>
wrote:

> On 8/10/23 15:43, Andrew Heath wrote:
> > All,
> > My name is Andrew, and I have been working with the Fedora Infra team
> and we are trying to
> > create some RPMs for some projects that we are working on, one of the
> RPMs we need to create
> > is for the Ansible receptor[1 <https://github.com/ansible/receptor>]. I
> have a copy of the
> > spec file from downstream Red Hat that gives some guidance but where its
> a mix of python and
> > go-lang I was wondering if I could have some guidance from more
> experienced packers on how
> > to package up the application correctly so that we can get the package
> in use for the Fedora
> > Infra.
> >
> > Links:
> > [1]: https://github.com/ansible/receptor <
> https://github.com/ansible/receptor>
> >
> > --
> > Sincerely,
> > Andrew Heath
> > aheath1...@gmail.com <mailto:aheath1...@gmail.com>
> >
>
> Ok, let's roll, you will end up with a Frankstein SPEC, be warned. Here is
> the process:
>
> Let's start with:
>
> $ go2rpm github.com/ansible/receptor --name receptor
>
>
> We clean up a bit the description, the docs and we got:
>
> # receptor.spec
> # Generated by go2rpm 1.9.0
> %bcond_without check
>
> # https://github.com/ansible/receptor
> %global goipath         github.com/ansible/receptor
> Version:                1.4.1
>
> %gometa -f
>
> %global goname receptor
>
> %global common_description %{expand:
> Receptor is an overlay network intended to ease the distribution of work
> across
> a large and dispersed collection of workers. Receptor nodes establish
> peer-to-peer connections with each other via existing networks. Once
> connected,
> the Receptor mesh provides datagram (UDP-like) and stream (TCP-like)
> capabilities to applications, as well as robust unit-of-work handling with
> resiliency against transient network failures.
>
> See the readthedocs page for Receptor at:
>
> https://receptor.readthedocs.io/en/latest}
>
> %global golicenses      LICENSE.md
> %global godocs          docs tools README.md
>
> Name:           %{goname}
> Release:        %autorelease
> Summary:        Multi-service relayer with remote execution and
> orchestration capabilities
>
> License:        Apache-2.0
> URL:            %{gourl}
> Source:         %{gosource}
>
> %description %{common_description}
>
> %gopkg
>
> %prep
> %goprep
> %autopatch -p1
> mv receptor-python-worker/README.md README-receptor-python-worker.md
> mv receptorctl/README.md README-receptorctl.md
>
>
> %generate_buildrequires
> %go_generate_buildrequires
>
> %build
> %gobuild -o %{gobuilddir}/bin/receptor %{goipath}/cmd/receptor-cl
>
> %install
> %gopkginstall
> install -m 0755 -vd                     %{buildroot}%{_bindir}
> install -m 0755 -vp %{gobuilddir}/bin/* %{buildroot}%{_bindir}/
>
> %if %{with check}
> %check
> %gocheck
> %endif
>
> %files
> %license LICENSE.md
> %doc docs tools README.md
> %{_bindir}/receptor
>
> %gopkgfiles
>
> %changelog
> %autochangelog
>
>
> Let's do a mockbuild on this and see what deps are needed for the Go
> binary:
>
> $ spectool -g *.spec
> $ fedpkg --release f40 mockbuild --mock-config
> /home/bob/packaging/mock2.cfg -N
>
>
> Ok I had to make a small detour and send a patch upstream to work with Go
> 1.21 with is in F40:
>
> # https://github.com/ansible/receptor/pull/816
> Patch:          0001-Bump-quic-go-to-0.37.4.patch
>
>
> Ok now we have our missing dependencies:
>
> No matching package to install: 'golang(github.com/ghjm/cmdline)'
> No matching package to install: 'golang(
> github.com/jupp0r/go-priority-queue)'
> No matching package to install: 'golang(github.com/pbnjay/memory)'
> No matching package to install: 'golang(github.com/prep/socketpair)'
>
> rpmname.py github.com/ghjm/cmdline \
>             github.com/jupp0r/go-priority-queue \
>             github.com/pbnjay/memory \
>             github.com/prep/socketpair
>
> We thus need to package these new packages:
>
> golang-github-ghjm-cmdline
> golang-github-jupp0r-priority-queue
> golang-github-pbnjay-memory
> golang-github-prep-socketpair
>
> You need to run go2rpm for each package. I've build them, there is no
> dependency hell, they
> scratch build ok against Rawhide.
>
> So now, we hit a snag during the build:
>
> # github.com/ansible/receptor/pkg/workceptor
> _build/src/github.com/ansible/receptor/pkg/workceptor/kubernetes.go:682:16:
>
> exec.StreamWithContext undefined (type "
> k8s.io/client-go/tools/remotecommand".Executor has
> no field or method StreamWithContext)
>
>
> Our Kubernetes in Fedora is outdated. So we'll need to update it before
> being able to build
> receptor.
>
> For now we'll take the bundled route, we add a bundled condition, add an
> archive with
> vendored deps and stuff.
>
> # Generated by go2rpm 1.9.0
> %bcond_without check
> %bcond_without bundled
> %if %{defined rhel}
> %bcond_without bundled
> %endif
>
> # https://github.com/ansible/receptor
> %global goipath         github.com/ansible/receptor
> Version:                1.4.1
>
> %gometa -f
>
> %global goname receptor
>
> %global common_description %{expand:
> Receptor is an overlay network intended to ease the distribution of work
> across
> a large and dispersed collection of workers. Receptor nodes establish
> peer-to-peer connections with each other via existing networks. Once
> connected,
> the Receptor mesh provides datagram (UDP-like) and stream (TCP-like)
> capabilities to applications, as well as robust unit-of-work handling with
> resiliency against transient network failures.
>
> See the readthedocs page for Receptor at:
>
> https://receptor.readthedocs.io/en/latest}
>
> %global golicenses      LICENSE.md %{?with_bundled:vendor/modules.txt}
> %global godocs          docs tools README.md
>
> Name:           %{goname}
> Release:        %autorelease
> Summary:        Multi-service relayer with remote execution and
> orchestration capabilities
>
> # License for github.com/ansible/receptor: Apache-2.0
> # License for github.com/creack/pty: MIT
> # License for github.com/davecgh/go-spew: ISC
> # License for github.com/emicklei/go-restful/v3: MIT
> # License for github.com/fortytw2/leaktest: BSD-3-Clause
> # License for github.com/fsnotify/fsnotify: BSD-3-Clause
> # License for github.com/ghjm/cmdline: Apache-2.0
> # License for github.com/go-logr/logr: Apache-2.0
> # License for github.com/go-openapi/jsonpointer: Apache-2.0
> # License for github.com/go-openapi/jsonreference: Apache-2.0
> # License for github.com/go-openapi/swag: Apache-2.0
> # License for github.com/go-task/slim-sprig: MIT
> # License for github.com/gogo/protobuf: BSD-3-Clause
> # License for github.com/golang-jwt/jwt/v4: MIT
> # License for github.com/golang/mock: Apache-2.0
> # License for github.com/golang/protobuf: BSD-3-Clause
> # License for github.com/google/gnostic: Apache-2.0
> # License for github.com/google/go-cmp: BSD-3-Clause
> # License for github.com/google/gofuzz: Apache-2.0
> # License for github.com/google/pprof: Apache-2.0
> # License for github.com/google/shlex: Apache-2.0
> # License for github.com/google/uuid: BSD-3-Clause
> # License for github.com/gorilla/websocket: BSD-2-Clause
> # License for github.com/imdario/mergo: BSD-3-Clause
> # License for github.com/josharian/intern: MIT
> # License for github.com/json-iterator/go: MIT
> # License for github.com/jupp0r/go-priority-queue: MIT
> # License for github.com/mailru/easyjson: MIT
> # License for github.com/minio/highwayhash: Apache-2.0
> # License for github.com/moby/spdystream: Apache-2.0
> # License for github.com/modern-go/concurrent: Apache-2.0
> # License for github.com/modern-go/reflect2: Apache-2.0
> # License for github.com/munnerz/goautoneg: BSD-3-Clause
> # License for github.com/onsi/ginkgo/v2: MIT
> # License for github.com/pbnjay/memory: BSD-3-Clause
> # License for github.com/pmezard/go-difflib: BSD-3-Clause
> # License for github.com/prep/socketpair: BSD-3-Clause
> # License for github.com/quic-go/qtls-go1-19: BSD-3-Clause
> # License for github.com/quic-go/qtls-go1-20: BSD-3-Clause
> # License for github.com/quic-go/quic-go: MIT
> # License for github.com/rogpeppe/go-internal: BSD-3-Clause
> # License for github.com/songgao/water: BSD-3-Clause
> # License for github.com/spf13/pflag: BSD-3-Clause
> # License for github.com/stretchr/testify: MIT
> # License for github.com/vishvananda/netlink: Apache-2.0
> # License for github.com/vishvananda/netns: Apache-2.0
> # License for golang.org/x/crypto: BSD-3-Clause
> # License for golang.org/x/exp: BSD-3-Clause
> # License for golang.org/x/mod: BSD-3-Clause
> # License for golang.org/x/net: BSD-3-Clause
> # License for golang.org/x/oauth2: BSD-3-Clause
> # License for golang.org/x/sys: BSD-3-Clause
> # License for golang.org/x/term: BSD-3-Clause
> # License for golang.org/x/text: BSD-3-Clause
> # License for golang.org/x/time: BSD-3-Clause
> # License for golang.org/x/tools: BSD-3-Clause
> # License for google.golang.org/appengine: Apache-2.0
> # License for google.golang.org/protobuf: BSD-3-Clause
> # License for gopkg.in/inf.v0: BSD-3-Clause
> # License for gopkg.in/yaml.v2: Apache-2.0 AND MIT
> # License for gopkg.in/yaml.v3: MIT AND Apache-2.0
> # License for k8s.io/api: Apache-2.0
> # License for k8s.io/apimachinery: Apache-2.0
> # License for k8s.io/client-go: Apache-2.0
> # License for k8s.io/klog/v2: Apache-2.0
> # License for k8s.io/kube-openapi: Apache-2.0
> # License for k8s.io/utils: Apache-2.0
> # License for sigs.k8s.io/json: Apache-2.0 AND BSD-3-Clause
> # License for sigs.k8s.io/structured-merge-diff/v4: Apache-2.0
> # License for sigs.k8s.io/yaml: MIT AND BSD-3-Clause
> License:        Apache-2.0 AND ISC AND MIT AND BSD-3-Clause AND
> BSD-2-Clause
> URL:            %{gourl}
> Source:         %{gosource}
> Source:         vendor-%{version}.tar.gz
> Source:         bundle_go_deps_for_rpm.sh
> # https://github.com/ansible/receptor/pull/816
> Patch:          0001-Bump-quic-go-to-0.37.4.patch
>
> %if %{with bundled}
> Provides:       bundled(golang(github.com/ansible/receptor) = 1.4.1
> Provides:       bundled(golang(github.com/creack/pty) = 1.1.18
> Provides:       bundled(golang(github.com/davecgh/go-spew) = 1.1.1
> Provides:       bundled(golang(github.com/emicklei/go-restful/v3) = 3.10.2
> Provides:       bundled(golang(github.com/fortytw2/leaktest) = 1.3.0
> Provides:       bundled(golang(github.com/fsnotify/fsnotify) = 1.6.0
> Provides:       bundled(golang(github.com/ghjm/cmdline) = 0.1.2
> Provides:       bundled(golang(github.com/go-logr/logr) = 1.2.4
> Provides:       bundled(golang(github.com/go-openapi/jsonpointer) = 0.19.6
> Provides:       bundled(golang(github.com/go-openapi/jsonreference) =
> 0.20.2
> Provides:       bundled(golang(github.com/go-openapi/swag) = 0.22.3
> Provides:       bundled(golang(github.com/go-task/slim-sprig) =
> 0.0.0-20230315git52ccab3
> Provides:       bundled(golang(github.com/gogo/protobuf) = 1.3.2
> Provides:       bundled(golang(github.com/golang-jwt/jwt/v4) = 4.5.0
> Provides:       bundled(golang(github.com/golang/mock) = 1.6.0
> Provides:       bundled(golang(github.com/golang/protobuf) = 1.5.3
> Provides:       bundled(golang(github.com/google/gnostic) = 0.6.9
> Provides:       bundled(golang(github.com/google/go-cmp) = 0.5.9
> Provides:       bundled(golang(github.com/google/gofuzz) = 1.2.0
> Provides:       bundled(golang(github.com/google/pprof) =
> 0.0.0-20230502git255e3b9
> Provides:       bundled(golang(github.com/google/shlex) =
> 0.0.0-20191202gite7afc7f
> Provides:       bundled(golang(github.com/google/uuid) = 1.3.0
> Provides:       bundled(golang(github.com/gorilla/websocket) = 1.5.0
> Provides:       bundled(golang(github.com/imdario/mergo) = 0.3.15
> Provides:       bundled(golang(github.com/josharian/intern) = 1.0.0
> Provides:       bundled(golang(github.com/json-iterator/go) = 1.1.12
> Provides:       bundled(golang(github.com/jupp0r/go-priority-queue) =
> 0.0.0-20160601gitab10738
> Provides:       bundled(golang(github.com/mailru/easyjson) = 0.7.7
> Provides:       bundled(golang(github.com/minio/highwayhash) = 1.0.2
> Provides:       bundled(golang(github.com/moby/spdystream) = 0.2.0
> Provides:       bundled(golang(github.com/modern-go/concurrent) =
> 0.0.0-20180306gitbacd9c7
> Provides:       bundled(golang(github.com/modern-go/reflect2) = 1.0.2
> Provides:       bundled(golang(github.com/munnerz/goautoneg) =
> 0.0.0-20191010gita7dc8b6
> Provides:       bundled(golang(github.com/onsi/ginkgo/v2) = 2.9.4
> Provides:       bundled(golang(github.com/pbnjay/memory) =
> 0.0.0-20210728git7b4eea6
> Provides:       bundled(golang(github.com/pmezard/go-difflib) = 1.0.0
> Provides:       bundled(golang(github.com/prep/socketpair) =
> 0.0.0-20171228gitc2c6a7f
> Provides:       bundled(golang(github.com/quic-go/qtls-go1-19) = 0.3.2
> Provides:       bundled(golang(github.com/quic-go/qtls-go1-20) = 0.2.2
> Provides:       bundled(golang(github.com/quic-go/quic-go) = 0.34.0
> Provides:       bundled(golang(github.com/rogpeppe/go-internal) = 1.10.0
> Provides:       bundled(golang(github.com/songgao/water) =
> 0.0.0-20200317git2b4b6d7
> Provides:       bundled(golang(github.com/spf13/pflag) = 1.0.5
> Provides:       bundled(golang(github.com/stretchr/testify) = 1.8.1
> Provides:       bundled(golang(github.com/vishvananda/netlink) = 1.1.0
> Provides:       bundled(golang(github.com/vishvananda/netns) = 0.0.4
> Provides:       bundled(golang(golang.org/x/crypto) = 0.8.0
> Provides:       bundled(golang(golang.org/x/exp) =
> 0.0.0-20230425git47ecfdc
> Provides:       bundled(golang(golang.org/x/mod) = 0.10.0
> Provides:       bundled(golang(golang.org/x/net) = 0.9.0
> Provides:       bundled(golang(golang.org/x/oauth2) = 0.7.0
> Provides:       bundled(golang(golang.org/x/sys) = 0.8.0
> Provides:       bundled(golang(golang.org/x/term) = 0.8.0
> Provides:       bundled(golang(golang.org/x/text) = 0.9.0
> Provides:       bundled(golang(golang.org/x/time) = 0.3.0
> Provides:       bundled(golang(golang.org/x/tools) = 0.8.0
> Provides:       bundled(golang(google.golang.org/appengine) = 1.6.7
> Provides:       bundled(golang(google.golang.org/protobuf) = 1.30.0
> Provides:       bundled(golang(gopkg.in/inf.v0) = 0.9.1
> Provides:       bundled(golang(gopkg.in/yaml.v2) = 2.4.0
> Provides:       bundled(golang(gopkg.in/yaml.v3) = 3.0.1
> Provides:       bundled(golang(k8s.io/api) = 0.27.1
> Provides:       bundled(golang(k8s.io/apimachinery) = 0.27.1
> Provides:       bundled(golang(k8s.io/client-go) = 0.27.1
> Provides:       bundled(golang(k8s.io/klog/v2) = 2.100.1
> Provides:       bundled(golang(k8s.io/kube-openapi) =
> 0.0.0-20230501git8b0f38b
> Provides:       bundled(golang(k8s.io/utils) = 0.0.0-20230505git9f67429
> Provides:       bundled(golang(sigs.k8s.io/json) =
> 0.0.0-20221116gitbc3834c
> Provides:       bundled(golang(sigs.k8s.io/structured-merge-diff/v4) =
> 4.2.3
> Provides:       bundled(golang(sigs.k8s.io/yaml) = 1.3.0
> %endif
>
> %description %{common_description}
>
> %gopkg
>
> %prep
> %if %{with bundled}
> %goprep -k
> # unpack vendored dependencies
> %setup -q -T -D -a 1 -n %{name}-%{version}
> %else
> %goprep
> %endif
> %autopatch -p1
> mv receptor-python-worker/README.md README-receptor-python-worker.md
> mv receptorctl/README.md README-receptorctl.md
>
>
> %if %{without bundled}
> %generate_buildrequires
> %go_generate_buildrequires
> %endif
>
> %build
> %if %{with bundled}
> export GO111MODULE=on
> export GOFLAGS=-mod=vendor
> %endif
> export LDFLAGS="-X '
> github.com/ansible/receptor/internal/version.Version=%{VERSION}' "
> %gobuild -o %{gobuilddir}/bin/receptor %{goipath}/cmd/receptor-cl
>
> %install
> %gopkginstall
> install -m 0755 -vd                     %{buildroot}%{_bindir}
> install -m 0755 -vp %{gobuilddir}/bin/* %{buildroot}%{_bindir}/
>
> %if %{with check}
> %check
> export PATH="%{gobuilddir}/bin:$PATH"
> # Disable various test relying on Kube and network
> %gocheck -t tests/functional/mesh
> %endif
>
> %files
> %license LICENSE.md %{?with_bundled:vendor/modules.txt}
> %doc docs tools README.md
> %{_bindir}/receptor
>
> %gopkgfiles
>
> %changelog
> %autochangelog
>
>
> Ok, it works:
>
> INFO: Done(/home/bob/packaging/receptor/receptor-1.4.1-1.fc40.src.rpm)
> Config(mock-golang5)
> 46 minutes 59 seconds
> INFO: Results and/or logs in:
> /home/bob/packaging/receptor/results_receptor/1.4.1/1.fc40
> Finish: run
>
>
> Now we need to add the Python parts. This is actually way more tricky
> because the Python
> macros are not designed
> to work with multiple packages inside one repo. It can handles "extra"
> packages but not
> independent packages.
>
> So we have to rewrite the macros slightly, yay:
>
> %define pyproject_install() %{expand:\\\
> specifier=$(ls %{_pyproject_wheeldir}/*.whl | xargs basename --multiple |
> sed -E
> 's/([^-]+)-([^-]+)-.+\\\.whl/\\\1==\\\2/')
> TMPDIR="%{_pyproject_builddir}" %{__python3} -m pip install --root
> %{buildroot} --prefix
> %{_prefix} --no-deps --disable-pip-version-check --progress-bar off
> --verbose
> --ignore-installed --no-warn-script-location --no-index --no-cache-dir
> --find-links
> %{_pyproject_wheeldir} $specifier
> if [ -d %{buildroot}%{_bindir} ]; then
>    %py3_shebang_fix %{buildroot}%{_bindir}/*
>    rm -rfv %{buildroot}%{_bindir}/__pycache__
> fi
> rm -f %{_pyproject_ghost_distinfo}
> site_dirs=()
> # Process %%{python3_sitelib} if exists
> if [ -d %{buildroot}%{python3_sitelib} ]; then
>    site_dirs+=( "%{python3_sitelib}" )
> fi
> # Process %%{python3_sitearch} if exists and does not equal to
> %%{python3_sitelib}
> if [ %{buildroot}%{python3_sitearch} != %{buildroot}%{python3_sitelib} ]
> && [ -d
> %{buildroot}%{python3_sitearch} ]; then
>    site_dirs+=( "%{python3_sitearch}" )
> fi
> # Process all *.dist-info dirs in sitelib/sitearch
> for site_dir in ${site_dirs[@]}; do
>    for distinfo in %{buildroot}$site_dir/*.dist-info; do
>      project_name=$(basename "$distinfo" | cut -d'-' -f1)
>      %global _pyproject_record
> %{_builddir}/%{_pyproject_files_prefix}-${project_name}-pyproject-record
>      sed -i 's/pip/rpm/' ${distinfo}/INSTALLER
>      PYTHONPATH=%{_rpmconfigdir}/redhat \\
>        %{__python3} -B
> %{_rpmconfigdir}/redhat/pyproject_preprocess_record.py \\
>        --buildroot %{buildroot} --record ${distinfo}/RECORD --output
> %{_pyproject_record}
>      rm -fv ${distinfo}/RECORD
>      rm -fv ${distinfo}/REQUESTED
>    done
> done
> }
>
> %define pyproject_save_files() %{expand:\\\
> %global _pyproject_record
> %{_builddir}/%{_pyproject_files_prefix}-%{*}-pyproject-record
> %global pyproject_files
> %{_builddir}/%{_pyproject_files_prefix}-%{*}-pyproject-files
> %{expr:0%{?fedora} >= 39 || 0%{?rhel} >= 10 ? "RPM_PERCENTAGES_COUNT=2" :
> "RPM_PERCENTAGES_COUNT=8" } \\
> %{__python3} %{_rpmconfigdir}/redhat/pyproject_save_files.py \\
>    --output-files "%{pyproject_files}" \\
>    --output-modules "%{_pyproject_modules}" \\
>    --buildroot "%{buildroot}" \\
>    --sitelib "%{python3_sitelib}" \\
>    --sitearch "%{python3_sitearch}" \\
>    --python-version "%{python3_version}" \\
>    --pyproject-record "%{_pyproject_record}" \\
>    --prefix "%{_prefix}" \\
>    %{*}
> }
>
> We have added some logic to handle separate record files for each package.
>
>
> In the end with a few tweaks, we get:
>
> # Generated by go2rpm 1.9.0
> %bcond_without check
> %bcond_without bundled
> %bcond_without golang_library
> %if %{defined rhel}
> %bcond_without bundled
> %endif
> %if %{with bundled}
> %bcond_with golang_library
> %endif
>
> %define pyproject_install() %{expand:\\\
> specifier=$(ls %{_pyproject_wheeldir}/*.whl | xargs basename --multiple |
> sed -E
> 's/([^-]+)-([^-]+)-.+\\\.whl/\\\1==\\\2/')
> TMPDIR="%{_pyproject_builddir}" %{__python3} -m pip install --root
> %{buildroot} --prefix
> %{_prefix} --no-deps --disable-pip-version-check --progress-bar off
> --verbose
> --ignore-installed --no-warn-script-location --no-index --no-cache-dir
> --find-links
> %{_pyproject_wheeldir} $specifier
> if [ -d %{buildroot}%{_bindir} ]; then
>    %py3_shebang_fix %{buildroot}%{_bindir}/*
>    rm -rfv %{buildroot}%{_bindir}/__pycache__
> fi
> rm -f %{_pyproject_ghost_distinfo}
> site_dirs=()
> # Process %%{python3_sitelib} if exists
> if [ -d %{buildroot}%{python3_sitelib} ]; then
>    site_dirs+=( "%{python3_sitelib}" )
> fi
> # Process %%{python3_sitearch} if exists and does not equal to
> %%{python3_sitelib}
> if [ %{buildroot}%{python3_sitearch} != %{buildroot}%{python3_sitelib} ]
> && [ -d
> %{buildroot}%{python3_sitearch} ]; then
>    site_dirs+=( "%{python3_sitearch}" )
> fi
> # Process all *.dist-info dirs in sitelib/sitearch
> for site_dir in ${site_dirs[@]}; do
>    for distinfo in %{buildroot}$site_dir/*.dist-info; do
>      project_name=$(basename "$distinfo" | cut -d'-' -f1)
>      %global _pyproject_record
> %{_builddir}/%{_pyproject_files_prefix}-${project_name}-pyproject-record
>      sed -i 's/pip/rpm/' ${distinfo}/INSTALLER
>      PYTHONPATH=%{_rpmconfigdir}/redhat \\
>        %{__python3} -B
> %{_rpmconfigdir}/redhat/pyproject_preprocess_record.py \\
>        --buildroot %{buildroot} --record ${distinfo}/RECORD --output
> %{_pyproject_record}
>      rm -fv ${distinfo}/RECORD
>      rm -fv ${distinfo}/REQUESTED
>    done
> done
> }
>
> %define pyproject_save_files() %{expand:\\\
> %global _pyproject_record
> %{_builddir}/%{_pyproject_files_prefix}-%{*}-pyproject-record
> %global pyproject_files
> %{_builddir}/%{_pyproject_files_prefix}-%{*}-pyproject-files
> %{expr:0%{?fedora} >= 39 || 0%{?rhel} >= 10 ? "RPM_PERCENTAGES_COUNT=2" :
> "RPM_PERCENTAGES_COUNT=8" } \\
> %{__python3} %{_rpmconfigdir}/redhat/pyproject_save_files.py \\
>    --output-files "%{pyproject_files}" \\
>    --output-modules "%{_pyproject_modules}" \\
>    --buildroot "%{buildroot}" \\
>    --sitelib "%{python3_sitelib}" \\
>    --sitearch "%{python3_sitearch}" \\
>    --python-version "%{python3_version}" \\
>    --pyproject-record "%{_pyproject_record}" \\
>    --prefix "%{_prefix}" \\
>    %{*}
> }
>
> # https://github.com/ansible/receptor
> %global goipath         github.com/ansible/receptor
> Version:                1.4.1
>
> %gometa -f
>
> %global goname receptor
>
> %global common_description %{expand:
> Receptor is an overlay network intended to ease the distribution of work
> across
> a large and dispersed collection of workers. Receptor nodes establish
> peer-to-peer connections with each other via existing networks. Once
> connected,
> the Receptor mesh provides datagram (UDP-like) and stream (TCP-like)
> capabilities to applications, as well as robust unit-of-work handling with
> resiliency against transient network failures.
>
> See the readthedocs page for Receptor at:
>
> https://receptor.readthedocs.io/en/latest}
>
> %global golicenses      LICENSE.md %{?with_bundled:vendor/modules.txt}
> %global godocs          docs tools README.md
>
> Name:           %{goname}
> Release:        %autorelease
> Summary:        Multi-service relayer with remote execution and
> orchestration capabilities
>
> # License for github.com/ansible/receptor: Apache-2.0
> # License for github.com/creack/pty: MIT
> # License for github.com/davecgh/go-spew: ISC
> # License for github.com/emicklei/go-restful/v3: MIT
> # License for github.com/fortytw2/leaktest: BSD-3-Clause
> # License for github.com/fsnotify/fsnotify: BSD-3-Clause
> # License for github.com/ghjm/cmdline: Apache-2.0
> # License for github.com/go-logr/logr: Apache-2.0
> # License for github.com/go-openapi/jsonpointer: Apache-2.0
> # License for github.com/go-openapi/jsonreference: Apache-2.0
> # License for github.com/go-openapi/swag: Apache-2.0
> # License for github.com/go-task/slim-sprig: MIT
> # License for github.com/gogo/protobuf: BSD-3-Clause
> # License for github.com/golang-jwt/jwt/v4: MIT
> # License for github.com/golang/mock: Apache-2.0
> # License for github.com/golang/protobuf: BSD-3-Clause
> # License for github.com/google/gnostic: Apache-2.0
> # License for github.com/google/go-cmp: BSD-3-Clause
> # License for github.com/google/gofuzz: Apache-2.0
> # License for github.com/google/pprof: Apache-2.0
> # License for github.com/google/shlex: Apache-2.0
> # License for github.com/google/uuid: BSD-3-Clause
> # License for github.com/gorilla/websocket: BSD-2-Clause
> # License for github.com/imdario/mergo: BSD-3-Clause
> # License for github.com/josharian/intern: MIT
> # License for github.com/json-iterator/go: MIT
> # License for github.com/jupp0r/go-priority-queue: MIT
> # License for github.com/mailru/easyjson: MIT
> # License for github.com/minio/highwayhash: Apache-2.0
> # License for github.com/moby/spdystream: Apache-2.0
> # License for github.com/modern-go/concurrent: Apache-2.0
> # License for github.com/modern-go/reflect2: Apache-2.0
> # License for github.com/munnerz/goautoneg: BSD-3-Clause
> # License for github.com/onsi/ginkgo/v2: MIT
> # License for github.com/pbnjay/memory: BSD-3-Clause
> # License for github.com/pmezard/go-difflib: BSD-3-Clause
> # License for github.com/prep/socketpair: BSD-3-Clause
> # License for github.com/quic-go/qtls-go1-19: BSD-3-Clause
> # License for github.com/quic-go/qtls-go1-20: BSD-3-Clause
> # License for github.com/quic-go/quic-go: MIT
> # License for github.com/rogpeppe/go-internal: BSD-3-Clause
> # License for github.com/songgao/water: BSD-3-Clause
> # License for github.com/spf13/pflag: BSD-3-Clause
> # License for github.com/stretchr/testify: MIT
> # License for github.com/vishvananda/netlink: Apache-2.0
> # License for github.com/vishvananda/netns: Apache-2.0
> # License for golang.org/x/crypto: BSD-3-Clause
> # License for golang.org/x/exp: BSD-3-Clause
> # License for golang.org/x/mod: BSD-3-Clause
> # License for golang.org/x/net: BSD-3-Clause
> # License for golang.org/x/oauth2: BSD-3-Clause
> # License for golang.org/x/sys: BSD-3-Clause
> # License for golang.org/x/term: BSD-3-Clause
> # License for golang.org/x/text: BSD-3-Clause
> # License for golang.org/x/time: BSD-3-Clause
> # License for golang.org/x/tools: BSD-3-Clause
> # License for google.golang.org/appengine: Apache-2.0
> # License for google.golang.org/protobuf: BSD-3-Clause
> # License for gopkg.in/inf.v0: BSD-3-Clause
> # License for gopkg.in/yaml.v2: Apache-2.0 AND MIT
> # License for gopkg.in/yaml.v3: MIT AND Apache-2.0
> # License for k8s.io/api: Apache-2.0
> # License for k8s.io/apimachinery: Apache-2.0
> # License for k8s.io/client-go: Apache-2.0
> # License for k8s.io/klog/v2: Apache-2.0
> # License for k8s.io/kube-openapi: Apache-2.0
> # License for k8s.io/utils: Apache-2.0
> # License for sigs.k8s.io/json: Apache-2.0 AND BSD-3-Clause
> # License for sigs.k8s.io/structured-merge-diff/v4: Apache-2.0
> # License for sigs.k8s.io/yaml: MIT AND BSD-3-Clause
> License:        Apache-2.0 AND ISC AND MIT AND BSD-3-Clause AND
> BSD-2-Clause
> URL:            %{gourl}
> Source:         %{gosource}
> Source:         vendor-%{version}.tar.gz
> Source:         bundle_go_deps_for_rpm.sh
> # https://github.com/ansible/receptor/pull/816
> Patch:          0001-Bump-quic-go-to-0.37.4.patch
>
> %if %{with bundled}
> Provides:       bundled(golang(github.com/ansible/receptor) = 1.4.1
> Provides:       bundled(golang(github.com/creack/pty) = 1.1.18
> Provides:       bundled(golang(github.com/davecgh/go-spew) = 1.1.1
> Provides:       bundled(golang(github.com/emicklei/go-restful/v3) = 3.10.2
> Provides:       bundled(golang(github.com/fortytw2/leaktest) = 1.3.0
> Provides:       bundled(golang(github.com/fsnotify/fsnotify) = 1.6.0
> Provides:       bundled(golang(github.com/ghjm/cmdline) = 0.1.2
> Provides:       bundled(golang(github.com/go-logr/logr) = 1.2.4
> Provides:       bundled(golang(github.com/go-openapi/jsonpointer) = 0.19.6
> Provides:       bundled(golang(github.com/go-openapi/jsonreference) =
> 0.20.2
> Provides:       bundled(golang(github.com/go-openapi/swag) = 0.22.3
> Provides:       bundled(golang(github.com/go-task/slim-sprig) =
> 0.0.0-20230315git52ccab3
> Provides:       bundled(golang(github.com/gogo/protobuf) = 1.3.2
> Provides:       bundled(golang(github.com/golang-jwt/jwt/v4) = 4.5.0
> Provides:       bundled(golang(github.com/golang/mock) = 1.6.0
> Provides:       bundled(golang(github.com/golang/protobuf) = 1.5.3
> Provides:       bundled(golang(github.com/google/gnostic) = 0.6.9
> Provides:       bundled(golang(github.com/google/go-cmp) = 0.5.9
> Provides:       bundled(golang(github.com/google/gofuzz) = 1.2.0
> Provides:       bundled(golang(github.com/google/pprof) =
> 0.0.0-20230502git255e3b9
> Provides:       bundled(golang(github.com/google/shlex) =
> 0.0.0-20191202gite7afc7f
> Provides:       bundled(golang(github.com/google/uuid) = 1.3.0
> Provides:       bundled(golang(github.com/gorilla/websocket) = 1.5.0
> Provides:       bundled(golang(github.com/imdario/mergo) = 0.3.15
> Provides:       bundled(golang(github.com/josharian/intern) = 1.0.0
> Provides:       bundled(golang(github.com/json-iterator/go) = 1.1.12
> Provides:       bundled(golang(github.com/jupp0r/go-priority-queue) =
> 0.0.0-20160601gitab10738
> Provides:       bundled(golang(github.com/mailru/easyjson) = 0.7.7
> Provides:       bundled(golang(github.com/minio/highwayhash) = 1.0.2
> Provides:       bundled(golang(github.com/moby/spdystream) = 0.2.0
> Provides:       bundled(golang(github.com/modern-go/concurrent) =
> 0.0.0-20180306gitbacd9c7
> Provides:       bundled(golang(github.com/modern-go/reflect2) = 1.0.2
> Provides:       bundled(golang(github.com/munnerz/goautoneg) =
> 0.0.0-20191010gita7dc8b6
> Provides:       bundled(golang(github.com/onsi/ginkgo/v2) = 2.9.4
> Provides:       bundled(golang(github.com/pbnjay/memory) =
> 0.0.0-20210728git7b4eea6
> Provides:       bundled(golang(github.com/pmezard/go-difflib) = 1.0.0
> Provides:       bundled(golang(github.com/prep/socketpair) =
> 0.0.0-20171228gitc2c6a7f
> Provides:       bundled(golang(github.com/quic-go/qtls-go1-19) = 0.3.2
> Provides:       bundled(golang(github.com/quic-go/qtls-go1-20) = 0.2.2
> Provides:       bundled(golang(github.com/quic-go/quic-go) = 0.34.0
> Provides:       bundled(golang(github.com/rogpeppe/go-internal) = 1.10.0
> Provides:       bundled(golang(github.com/songgao/water) =
> 0.0.0-20200317git2b4b6d7
> Provides:       bundled(golang(github.com/spf13/pflag) = 1.0.5
> Provides:       bundled(golang(github.com/stretchr/testify) = 1.8.1
> Provides:       bundled(golang(github.com/vishvananda/netlink) = 1.1.0
> Provides:       bundled(golang(github.com/vishvananda/netns) = 0.0.4
> Provides:       bundled(golang(golang.org/x/crypto) = 0.8.0
> Provides:       bundled(golang(golang.org/x/exp) =
> 0.0.0-20230425git47ecfdc
> Provides:       bundled(golang(golang.org/x/mod) = 0.10.0
> Provides:       bundled(golang(golang.org/x/net) = 0.9.0
> Provides:       bundled(golang(golang.org/x/oauth2) = 0.7.0
> Provides:       bundled(golang(golang.org/x/sys) = 0.8.0
> Provides:       bundled(golang(golang.org/x/term) = 0.8.0
> Provides:       bundled(golang(golang.org/x/text) = 0.9.0
> Provides:       bundled(golang(golang.org/x/time) = 0.3.0
> Provides:       bundled(golang(golang.org/x/tools) = 0.8.0
> Provides:       bundled(golang(google.golang.org/appengine) = 1.6.7
> Provides:       bundled(golang(google.golang.org/protobuf) = 1.30.0
> Provides:       bundled(golang(gopkg.in/inf.v0) = 0.9.1
> Provides:       bundled(golang(gopkg.in/yaml.v2) = 2.4.0
> Provides:       bundled(golang(gopkg.in/yaml.v3) = 3.0.1
> Provides:       bundled(golang(k8s.io/api) = 0.27.1
> Provides:       bundled(golang(k8s.io/apimachinery) = 0.27.1
> Provides:       bundled(golang(k8s.io/client-go) = 0.27.1
> Provides:       bundled(golang(k8s.io/klog/v2) = 2.100.1
> Provides:       bundled(golang(k8s.io/kube-openapi) =
> 0.0.0-20230501git8b0f38b
> Provides:       bundled(golang(k8s.io/utils) = 0.0.0-20230505git9f67429
> Provides:       bundled(golang(sigs.k8s.io/json) =
> 0.0.0-20221116gitbc3834c
> Provides:       bundled(golang(sigs.k8s.io/structured-merge-diff/v4) =
> 4.2.3
> Provides:       bundled(golang(sigs.k8s.io/yaml) = 1.3.0
> %endif
>
> BuildRequires:  python3-devel
> # For Python tests
> BuildRequires:  psmisc
> BuildRequires:  openssh
>
> %description %{common_description}
>
> %package -n python3-receptorctl
> Summary:        Front-end CLI and importable Python library that interacts
> with Receptor
>
> %description -n python3-receptorctl
> Receptorctl is a front-end CLI and importable Python library that interacts
> with Receptor over its control socket interface.
>
> %package -n python3-receptor-python-worker
> Summary:        Python plugin called by Receptor
>
> %description -n python3-receptor-python-worker
> The receptor-python-worker command is called by Receptor to supervise the
> operation of a Python worker plugin."
>
> %if %{without golang_library}
> %gopkg
> %endif
>
> %prep
> %if %{with bundled}
> %goprep -k
> # unpack vendored dependencies
> %setup -q -T -D -a 1 -n %{name}-%{version}
> %else
> %goprep
> %endif
> %autopatch -p1
> echo "%{version}" > receptor-python-worker/.VERSION
> echo "%{version}" > receptorctl/.VERSION
> mv receptor-python-worker/README.md README-receptor-python-worker.md
> mv receptorctl/README.md README-receptorctl.md
>
> %generate_buildrequires
> %if %{without bundled}
> %go_generate_buildrequires
> %endif
> cd receptorctl
> %pyproject_buildrequires -t
> cd ../receptor-python-worker
> %pyproject_buildrequires -t
>
> %build
> %if %{with bundled}
> export GO111MODULE=on
> export GOFLAGS=-mod=vendor
> %endif
> export LDFLAGS="-X '
> github.com/ansible/receptor/internal/version.Version=%{VERSION}' "
> %gobuild -o %{gobuilddir}/bin/receptor %{goipath}/cmd/receptor-cl
> pushd receptorctl
> %pyproject_wheel
> popd
> pushd receptor-python-worker
> %pyproject_wheel
> popd
>
>
> %install
> %if %{without golang_library}
> %gopkginstall
> %endif
> install -m 0755 -vd                     %{buildroot}%{_bindir}
> install -m 0755 -vp %{gobuilddir}/bin/* %{buildroot}%{_bindir}/
> %pyproject_install
> %pyproject_save_files receptorctl
> %pyproject_save_files receptor_python_worker
> %global receptorctl_pyproject_files
> %{_builddir}/%{_pyproject_files_prefix}-receptorctl-pyproject-files
> %global receptor_python_worker_pyproject_files
>
> %{_builddir}/%{_pyproject_files_prefix}-receptor_python_worker-pyproject-files
>
> %if %{with check}
> %check
> export PATH="%{gobuilddir}/bin:$PATH"
> # Disable various test relying on Kube and network
> %gocheck -t tests/functional/mesh
> pushd receptorctl
> rm -rfv tests/test_mesh.py
> %tox
> popd
> %endif
>
>
> %files
> %license LICENSE.md %{?with_bundled:vendor/modules.txt}
> %doc docs tools README.md
> %{_bindir}/receptor
>
> %files -n python3-receptorctl -f %{receptorctl_pyproject_files}
> %doc README-receptorctl.md
> %{_bindir}/receptorctl
>
> %files -n python3-receptor-python-worker -f
> %{receptor_python_worker_pyproject_files}
> %doc README-receptor-python-worker.md
> %{_bindir}/receptor-python-worker
>
> %if %{without golang_library}
> %gopkgfiles
> %endif
>
> %changelog
> %autochangelog
>
>
> I added a condition to not build the golang library when bundled. If you
> do build it it
> won't be installable because
> it will be looking at the dependencies we have bundled in Fedora repo. We
> could bypass that
> by adding the vendor
> directory in the library package, but generally we end up in dependency
> hell for the project
> that would depend on it,
> because of conflicting versions.
>
>
> All the relevant files are here:
>
> https://eclipseo.fedorapeople.org/receptor/
>
> You have the SPEC, the sources, the patch, the BASH for/and the vendor tar
> gz, and the SPEC
> and sources of the missing dependencies.
>
>
> Robert-André
>
> FAS: eclipseo
> _______________________________________________
> devel mailing list -- devel@lists.fedoraproject.org
> To unsubscribe send an email to devel-le...@lists.fedoraproject.org
> Fedora Code of Conduct:
> https://docs.fedoraproject.org/en-US/project/code-of-conduct/
> List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
> List Archives:
> https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org
> Do not reply to spam, report it:
> https://pagure.io/fedora-infrastructure/new_issue
>
_______________________________________________
devel mailing list -- devel@lists.fedoraproject.org
To unsubscribe send an email to devel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org
Do not reply to spam, report it: 
https://pagure.io/fedora-infrastructure/new_issue

Reply via email to