Re: Packaging a go application

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/8/20 8:20 AM, Robin Opletal wrote:
Hi,

As I have said earlier, I am trying to package aerc, the mail client,
for Fedora. What didn't cross my mind is that internet access will be
limited during the build, thus the automatic dependency resolution
from the Makefile during the build stage of aerc doesn't work.

I was wondering what the best way would be to get this into
BuildRequires.

My current .spec - https://pastebin.com/HZsuPXds

The project uses go.mod
(https://git.sr.ht/~sircmpwn/aerc/tree/master/go.mod) with quite a few
dependencies, most of them not available in the official repositories as
packages.

As far as I understand, that gives me two options:

1) Bundle the dependencies as a package for each release of aerc based
on aerc's go.mod

2) Package a go application according to the official Go packaging
guidelines (from here:
https://docs.fedoraproject.org/en-US/packaging-guidelines/Golang/#_dependencies)

I have attempted this, generating the deps with golist as described and
adding those as BuildRequires, but the builds then failed with

error: Failed build dependencies:
        golang(github.com/creack/pty) is needed by
        aerc-0.5.2-4.fc33.x86_64

I have tried looking at the spec file of kubectl for reference, but I
am not sure which all macros are required to make BuildRequires:
golang(<package>) work.

Thanks for any pointers!
_______________________________________________
devel mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxx
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@xxxxxxxxxxxxxxxxxxxxxxx


This gonna be tricky because of the Makefile we can't use because we do not support Go modules yet. And git.sr.ht is not a supported repo home.

First you should use go2rpm to get the basic structure of your SPEC:
go2rpm --stdout git.sr.ht/~sircmpwn/aerc -f https://git.sr.ht/~sircmpwn/aerc

Here's one modified to work with Drew's Makefile while keeping Fedora's flags for the binary compilation, and the handling git.sr.ht:

# Generated by go2rpm 1.3
%bcond_without check

# https://git.sr.ht/~sircmpwn/aerc
%global goipath         git.sr.ht/~sircmpwn/aerc
%global forgeurl        https://git.sr.ht/~sircmpwn/aerc
Version:                0.5.2
%global tag             0.5.2
# /!\ Prerelease to fix compilation with go-pgpmail
%global commit          b56a688589c946ff8224f3d9e2e73de2edbc39b4
%global repo            aerc
%global archivename     %{repo}-%{commit}
%global archiveext      tar.gz
%global archiveurl      %{forgeurl}/archive/%{commit}.%{archiveext}
%global topdir          %{repo}-%{commit}
%global extractdir      %{repo}-%{commit}
%global scm             git

%gometa

%global common_description %{expand:
Aerc is an email client that runs in your terminal. It's highly
efficient and extensible, perfect for the discerning hacker.}

%global golicenses      LICENSE
%global godocs          doc README.md

Name:           aerc
Release:        1%{?dist}
Summary:        Email client for your terminal

License:        MIT
URL:            %{gourl}
Source0:        %{gosource}
# Disable building of aerc that we handle manually in the SPEC
Patch0:         aerc-fix-makefile.patch

BuildRequires:  scdoc
BuildRequires:  golang(git.sr.ht/~sircmpwn/getopt)
BuildRequires:  golang(git.sr.ht/~sircmpwn/tcell)
BuildRequires:  golang(git.sr.ht/~sircmpwn/tcell/views)
BuildRequires:  golang(github.com/brunnre8/go.notmuch)
BuildRequires:  golang(github.com/creack/pty)
BuildRequires:  golang(github.com/danwakefield/fnmatch)
BuildRequires:  golang(github.com/ddevault/go-libvterm)
BuildRequires:  golang(github.com/emersion/go-imap)
BuildRequires:  golang(github.com/emersion/go-imap-idle)
BuildRequires:  golang(github.com/emersion/go-imap-sortthread)
BuildRequires:  golang(github.com/emersion/go-imap/client)
BuildRequires:  golang(github.com/emersion/go-maildir)
BuildRequires:  golang(github.com/emersion/go-message)
BuildRequires:  golang(github.com/emersion/go-message/charset)
BuildRequires:  golang(github.com/emersion/go-message/mail)
BuildRequires:  golang(github.com/emersion/go-message/textproto)
BuildRequires:  golang(github.com/emersion/go-pgpmail)
BuildRequires:  golang(github.com/emersion/go-sasl)
BuildRequires:  golang(github.com/emersion/go-smtp)
BuildRequires:  golang(github.com/fsnotify/fsnotify)
BuildRequires:  golang(github.com/go-ini/ini)
BuildRequires:  golang(github.com/google/shlex)
BuildRequires:  golang(github.com/imdario/mergo)
BuildRequires:  golang(github.com/kyoh86/xdg)
BuildRequires:  golang(github.com/mattn/go-isatty)
BuildRequires:  golang(github.com/mattn/go-runewidth)
BuildRequires:  golang(github.com/miolini/datacounter)
BuildRequires:  golang(github.com/mitchellh/go-homedir)
BuildRequires:  golang(github.com/pkg/errors)
BuildRequires:  golang(github.com/ProtonMail/go-crypto/openpgp)
BuildRequires:  golang(github.com/ProtonMail/go-crypto/openpgp/errors)
BuildRequires:  golang(github.com/ProtonMail/go-crypto/openpgp/packet)
BuildRequires:  golang(github.com/riywo/loginshell)
BuildRequires:  golang(golang.org/x/oauth2)
Requires:       notmuch

%if %{with check}
# Tests
BuildRequires:  golang(github.com/stretchr/testify/assert)
%endif

%description
%{common_description}

%prep
%goprep
%patch0 -p1
# From go.mod replace statements:
# replace golang.org/x/crypto => github.com/ProtonMail/go-crypto v0.0.0-20200420072808-71bec3603bf3 # replace github.com/gdamore/tcell => git.sr.ht/~sircmpwn/tcell v0.0.0-20190807054800-3fdb6bc01a50 # replace github.com/zenhack/go.notmuch => github.com/brunnre8/go.notmuch v0.0.0-20201126061756-caa2daf7093c sed -i "s|golang.org/x/crypto|github.com/ProtonMail/go-crypto|" $(find . -name "*.go" -type f) sed -i "s|github.com/gdamore/tcell|git.sr.ht/~sircmpwn/tcell|" $(find . -name "*.go" -type f) sed -i "s|github.com/zenhack/go.notmuch|github.com/brunnre8/go.notmuch|" $(find . -name "*.go" -type f)

%build
export GOFLAGS=-tags=notmuch
export LDFLAGS="-X main.Prefix=%{_prefix} \
                -X main.ShareDir=%{_datadir}/aerc \
                -X main.Version=%{version} "
%gobuild -o %{gobuilddir}/bin/aerc %{goipath}

%install
install -m 0755 -vd                     %{buildroot}%{_bindir}
install -m 0755 -vp %{gobuilddir}/bin/* %{buildroot}%{_bindir}/
export PREFIX=%{_prefix}
%make_install

%if %{with check}
%check
%gocheck
%endif

%files
%license LICENSE
%doc doc README.md
%{_bindir}/*
%{_mandir}/man1/%{name}.1*
%{_mandir}/man1/%{name}-*.1.*
%{_datadir}/aerc

%changelog


Now the boring part is getting all the missing deps, and the missing deps's deps.
Here are the missing direct deps:

BuildRequires:  golang(git.sr.ht/~sircmpwn/getopt)
BuildRequires:  golang(git.sr.ht/~sircmpwn/tcell)
BuildRequires:  golang(github.com/brunnre8/go.notmuch)
BuildRequires:  golang(github.com/ddevault/go-libvterm)
BuildRequires:  golang(github.com/emersion/go-imap)
BuildRequires:  golang(github.com/emersion/go-imap-idle)
BuildRequires:  golang(github.com/emersion/go-imap-sortthread)
BuildRequires:  golang(github.com/emersion/go-maildir)
BuildRequires:  golang(github.com/emersion/go-message)
BuildRequires:  golang(github.com/emersion/go-pgpmail)
BuildRequires:  golang(github.com/emersion/go-sasl)
BuildRequires:  golang(github.com/emersion/go-smtp)
BuildRequires:  golang(github.com/kyoh86/xdg)
BuildRequires:  golang(github.com/miolini/datacounter)
BuildRequires:  golang(github.com/riywo/loginshell)
BuildRequires:  golang(github.com/ProtonMail/go-crypto)

You should use go2rpm to generate the SPECS and then set up a COPR to tests all the dependencies. Note that there are significant difficulties for a novice.

You'll find all the SPECS to help you here:
https://eclipseo.fedorapeople.org/aerc/

And a working COPR here:
https://copr.fedorainfracloud.org/coprs/eclipseo/aerc/

Read them all to grok what they are doing and make them your own.

I'n available for any questions regarding the packaging.

Happy hacking!

Robert-André

_______________________________________________
devel mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxx
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@xxxxxxxxxxxxxxxxxxxxxxx




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Fedora Announce]     [Fedora Users]     [Fedora Kernel]     [Fedora Testing]     [Fedora Formulas]     [Fedora PHP Devel]     [Kernel Development]     [Fedora Legacy]     [Fedora Maintainers]     [Fedora Desktop]     [PAM]     [Red Hat Development]     [Gimp]     [Yosemite News]

  Powered by Linux