enscons package wydaje się być tak zaprojektowane, aby robić to, co zadał pytanie. Przykład użycia go do zbudowania pakietu z rozszerzeniami C to here.
Można mieć podstawową strukturę pakietów takiego jak:
pkgroot/
pyproject.toml
setup.py
SConstruct
README.md
pkgname/
__init__.py
pkgname.py
cfile.c
W ten plik, pyproject.toml
może wyglądać mniej więcej tak:
[build-system]
requires = ["enscons"]
[tool.enscons]
name = "pkgname"
description = "My nice packahe"
version = "0.0.1"
author = "Me"
author_email = "[email protected]"
keywords = ["spam"]
url = "https://github.com/me/pkgname"
src_root = ""
packages = ["pkgname"]
gdzie sekcja [tool.enscons]
zawiera wiele rzeczy znanych do setuptools/distutils setup
funkcji. Kopiowanie z here funkcja setup.py
może zawierać coś takiego:
#!/usr/bin/env python
# Call enscons to emulate setup.py, installing if necessary.
import sys, subprocess, os.path
sys.path[0:0] = ['setup-requires']
try:
import enscons.setup
except ImportError:
requires = ["enscons"]
subprocess.check_call([sys.executable, "-m", "pip", "install",
"-t", "setup-requires"] + requires)
del sys.path_importer_cache['setup-requires'] # needed if setup-requires was absent
import enscons.setup
enscons.setup.setup()
Wreszcie, plik SConstruct
mógłby wyglądać następująco:
# Build pkgname
import sys, os
import pytoml as toml
import enscons, enscons.cpyext
metadata = dict(toml.load(open('pyproject.toml')))['tool']['enscons']
# most specific binary, non-manylinux1 tag should be at the top of this list
import wheel.pep425tags
full_tag = next(tag for tag in wheel.pep425tags.get_supported() if not 'manylinux' in tag)
env = Environment(tools=['default', 'packaging', enscons.generate, enscons.cpyext.generate],
PACKAGE_METADATA=metadata,
WHEEL_TAG=full_tag)
ext_filename = os.path.join('pkgname', 'libcfile')
extension = env.SharedLibrary(target=ext_filename,
source=['pkgname/cfile.c'])
py_source = Glob('pkgname/*.py')
platlib = env.Whl('platlib', py_source + extension, root='')
whl = env.WhlFile(source=platlib)
# Add automatic source files, plus any other needed files.
sdist_source=list(set(FindSourceFiles() +
['PKG-INFO', 'setup.py'] +
Glob('pkgname/*', exclude=['pkgname/*.os'])))
sdist = env.SDist(source=sdist_source)
env.Alias('sdist', sdist)
install = env.Command("#DUMMY", whl,
' '.join([sys.executable, '-m', 'pip', 'install', '--no-deps', '$SOURCE']))
env.Alias('install', install)
env.AlwaysBuild(install)
env.Default(whl, sdist)
Po tym powinieneś być w stanie uruchomić
sudo python setup.py install
, aby skompilować rozszerzenie C i zbudować koło, i zainstalować pakiet python, lub
python setup.py sdist
zbudować dystrybucję źródła.
Myślę, że zasadniczo można zrobić wszystko, co można z SCons w pliku SConstruct
.
Zamiast publikowania linków jako odpowiedzi dodaj tekst wyjaśniający, w jaki sposób ta odpowiedź pomaga OP w naprawianiu bieżącego wydania. Dzięki –
@ ρяσѕρєяK dodałem bardziej konkretny przykład wywodzący się z linków. –
Myślę, że @joeforker jest autorem enscons, więc mogliby dodać do tej odpowiedzi. –