virtualenv and make DESTDIR=
Barry Scott
barry at barrys-emacs.org
Sun Mar 6 05:19:41 EST 2022
> On 5 Mar 2022, at 19:56, Hartmut Goebel <h.goebel at goebel-consult.de> wrote:
>
> Am 05.03.22 um 17:34 schrieb Barry Scott:
>> Have the RPM install all the pythone code and dependencies and also install a short script that
>> sets up PYTHONPATH, LD_LIBRARY_PATH, etc and execs the python3 <main>.py.
> The scripts are already created by entry-points. So basically this means to reinvent the wheel. Or did I miss something?
>
I see what are getting at - I did miss the something.
It is the setup.py that will create your entry point!
For my own understanding I turned one of my PyPI projects into an RPM.
The project source is on https://github.com/barry-scott/CLI-tools.git <https://github.com/barry-scott/CLI-tools.git>
First I turned the this into a tarball:
$ git archive --format=tar --prefix=cli-tools-3.1.0/ master >cli-tools-3.1.0.tar
$ gzip cli-tools-3.1.0.tar
Then I created a RPM spec file:
Summary: cli-tools example packaging for python
Name: cli-tools
Version: 3.1.0
Release: 1
BuildArch: noarch
Source: %{name}-%{version}.tar.gz
License: APL2.0
Prefix: /opt/barry-example
BuildRequires: python3
BuildRequires: python3-setuptools
Requires: python3
%description
cli-tools example packaging for python
%prep
# unpack Source tarball
%setup
%build
cd Source
python3 setup_ssh_wait.py build
%install
cd Source
python3 setup_ssh_wait.py install --prefix=%{prefix} --root=%{buildroot}
# need to add the site-packages folder to the sys.path as
# setup.py assumes it is installing into the systems python library
cat <<EOF
import sys
import os
site_packages = 'python%d.%d/site-packages' % (sys.version_info.major, sys.version_info.minor)
extra_python_path = os.path.join(sys.argv[2], site_packages)
with open(sys.argv[1]) as f:
script_lines = f.read().split('\n')
index = script_lines.index('import sys')
script_lines[index+1:index+1] = ['sys.path.insert(0, "%s")' % (extra_python_path,)]
with open(sys.argv[1]+'.new', 'w') as f:
f.write('\n'.join(script_lines))
EOF >fix_bin.py
python3 fix_bin.py %{buildroot}%{prefix}/bin/ssh-wait %{buildroot}%{prefix}/opt/barry-example/lib
%files
/opt/barry-example/*
%changelog
Then only thing I needed to fix up was that the entry point code needs to have the
lib folder in /opt/barry-example added to sys.path. That is what the fix_bin.py is
doing.
I then use rpmbuild to create the RPM.
$ rpmbuild -bb cli-tools.spec
To use mock the steps are:
$ rpmbuild -bs cli-tools.spec
$ mock --rebuild --root fedora-35-x86_64 ../SRPMS/cli-tools-3.1.0.arc.rpm
Then I install the built file:
$ dnf install /var/lib/mock/fedora-35-x86_64/result/cli-tools-3.1.0-1.noarch.rpm
And then I can run the command:
$ /opt/barry-example/bin/ssh-wait
Usage: ssh-wait <options> <host>
ssh-wait will wait for the service to be available
on <host>.
--verbose
- print progress messages
--nowait
- check one and exit 0 if can connect 1 if cannot
--wait-limit=<limit>
- exit 1 if service is not avaiable within <limit> seconds.
defaults to 600.
--service=<service>
- check the service <service>. Can be a service
name of a port number. Default is ssh.
Barry
More information about the Python-list
mailing list