setuptools-zig-build 0.1.2__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: setuptools_zig_build
3
- Version: 0.1.2
3
+ Version: 0.2.0
4
4
  Summary: A setuptools extension, for building cpython extensions with zig build
5
5
  Home-page: https://codeberg.org/dasimmet/setuptools-zig-build
6
6
  Author-email: dasimmet@gmail.com
@@ -31,7 +31,37 @@ Dynamic: summary
31
31
  # Setuptools zig build
32
32
 
33
33
  A setuptools extension, for building cpython extensions with zig build,
34
- enabling source-only pip distributions that compile at install time.
34
+ enabling simple source-only pip distributions that compile at install time.
35
+
36
+ check out [zig-zon](https://gitlab.com/dasimmet/python-zig-zon) for an example
37
+
38
+ ## Example `setup.py`
39
+
40
+ ```python
41
+ from setuptools import Extension
42
+ from setuptools import setup
43
+
44
+ setup(
45
+ name='zig-zon',
46
+ packages=[],
47
+ zig_build={
48
+ # stores zig's depdendencies in python's sdist. requires a call to
49
+ # CPython.addSdistList(b); in `build.zig`
50
+ "sdist": True,
51
+ # tries to import 'ziglang' to get a zig compiler when building wheel
52
+ "use_ziglang_python_package": True,
53
+ # passes -Doptimize= to zig build
54
+ "optimize": "ReleaseSmall",
55
+ # passes -Dversion=<pip package version> to zig build
56
+ "pass_version_option": True,
57
+ # extra arguments to zig build
58
+ 'extra_args': [
59
+ "install", "test",
60
+ ],
61
+ },
62
+ ext_modules=[Extension('zig_zon', [])],
63
+ )
64
+ ```
35
65
 
36
66
  ## References
37
67
 
@@ -0,0 +1,38 @@
1
+ # Setuptools zig build
2
+
3
+ A setuptools extension, for building cpython extensions with zig build,
4
+ enabling simple source-only pip distributions that compile at install time.
5
+
6
+ check out [zig-zon](https://gitlab.com/dasimmet/python-zig-zon) for an example
7
+
8
+ ## Example `setup.py`
9
+
10
+ ```python
11
+ from setuptools import Extension
12
+ from setuptools import setup
13
+
14
+ setup(
15
+ name='zig-zon',
16
+ packages=[],
17
+ zig_build={
18
+ # stores zig's depdendencies in python's sdist. requires a call to
19
+ # CPython.addSdistList(b); in `build.zig`
20
+ "sdist": True,
21
+ # tries to import 'ziglang' to get a zig compiler when building wheel
22
+ "use_ziglang_python_package": True,
23
+ # passes -Doptimize= to zig build
24
+ "optimize": "ReleaseSmall",
25
+ # passes -Dversion=<pip package version> to zig build
26
+ "pass_version_option": True,
27
+ # extra arguments to zig build
28
+ 'extra_args': [
29
+ "install", "test",
30
+ ],
31
+ },
32
+ ext_modules=[Extension('zig_zon', [])],
33
+ )
34
+ ```
35
+
36
+ ## References
37
+
38
+ @ruamel and [setuptools-zig](https://sourceforge.net/p/setuptools-zig)
@@ -2,7 +2,7 @@ from setuptools import setup
2
2
 
3
3
  setup(
4
4
  name='setuptools_zig_build',
5
- version="0.1.2",
5
+ version="0.2.0",
6
6
  author_email='dasimmet@gmail.com',
7
7
  description='A setuptools extension, for building cpython extensions with zig build',
8
8
  long_description=open("README.md").read(),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: setuptools_zig_build
3
- Version: 0.1.2
3
+ Version: 0.2.0
4
4
  Summary: A setuptools extension, for building cpython extensions with zig build
5
5
  Home-page: https://codeberg.org/dasimmet/setuptools-zig-build
6
6
  Author-email: dasimmet@gmail.com
@@ -31,7 +31,37 @@ Dynamic: summary
31
31
  # Setuptools zig build
32
32
 
33
33
  A setuptools extension, for building cpython extensions with zig build,
34
- enabling source-only pip distributions that compile at install time.
34
+ enabling simple source-only pip distributions that compile at install time.
35
+
36
+ check out [zig-zon](https://gitlab.com/dasimmet/python-zig-zon) for an example
37
+
38
+ ## Example `setup.py`
39
+
40
+ ```python
41
+ from setuptools import Extension
42
+ from setuptools import setup
43
+
44
+ setup(
45
+ name='zig-zon',
46
+ packages=[],
47
+ zig_build={
48
+ # stores zig's depdendencies in python's sdist. requires a call to
49
+ # CPython.addSdistList(b); in `build.zig`
50
+ "sdist": True,
51
+ # tries to import 'ziglang' to get a zig compiler when building wheel
52
+ "use_ziglang_python_package": True,
53
+ # passes -Doptimize= to zig build
54
+ "optimize": "ReleaseSmall",
55
+ # passes -Dversion=<pip package version> to zig build
56
+ "pass_version_option": True,
57
+ # extra arguments to zig build
58
+ 'extra_args': [
59
+ "install", "test",
60
+ ],
61
+ },
62
+ ext_modules=[Extension('zig_zon', [])],
63
+ )
64
+ ```
35
65
 
36
66
  ## References
37
67
 
@@ -9,6 +9,7 @@ import shlex
9
9
  from setuptools import Extension
10
10
  from distutils.dist import Distribution
11
11
  from setuptools.command.build_ext import build_ext as SetupToolsBuildExt
12
+ from setuptools.command.sdist import sdist as SetupToolsSdist
12
13
 
13
14
 
14
15
  class ZigCompilerError(Exception):
@@ -28,14 +29,11 @@ class ZigBuild:
28
29
  use_ziglang_python_package: bool = False,
29
30
  optimize: str = "ReleaseSafe",
30
31
  pass_version_option: bool = False,
31
- test_step: str = None,
32
32
  extra_args: list = [],
33
+ sdist: bool = False,
33
34
  ):
34
35
  assert isinstance(use_ziglang_python_package, bool)
35
36
  self.use_ziglang_python_package = use_ziglang_python_package
36
- assert test_step == None or (isinstance(
37
- test_step, str) and not test_step.startswith('-'))
38
- self.test_step = test_step
39
37
  assert optimize == None or (isinstance(
40
38
  optimize, str) and optimize in self.OPTIMIZE)
41
39
  self.optimize = optimize
@@ -45,6 +43,8 @@ class ZigBuild:
45
43
  for arg in extra_args:
46
44
  assert isinstance(arg, str)
47
45
  self.extra_args = extra_args
46
+ assert isinstance(sdist, bool)
47
+ self.sdist = sdist
48
48
 
49
49
 
50
50
  class BuildExt(SetupToolsBuildExt):
@@ -82,12 +82,9 @@ class BuildExt(SetupToolsBuildExt):
82
82
  zig_exe = os.path.join(
83
83
  os.path.dirname(ziglang.__file__), "zig")
84
84
 
85
- bld_cmd = [zig_exe, 'build', 'install',
85
+ bld_cmd = [zig_exe, 'build',
86
86
  '-Dpython={}'.format(sys.executable), '--prefix', str(zig_out.absolute())]
87
87
 
88
- if self._zig_value.test_step != None:
89
- bld_cmd.append(self._zig_value.test_step)
90
-
91
88
  if self._zig_value.optimize != None:
92
89
  bld_cmd.append(
93
90
  '-Doptimize={}'.format(self._zig_value.optimize))
@@ -98,6 +95,15 @@ class BuildExt(SetupToolsBuildExt):
98
95
 
99
96
  bld_cmd.extend(self._zig_value.extra_args)
100
97
 
98
+ if self._zig_value.sdist:
99
+ if os.path.isdir(".zig-dependencies"):
100
+ for it in os.listdir(".zig-dependencies"):
101
+ dep_dir = os.path.join(".zig-dependencies", it)
102
+ if os.path.isdir(".zig-dependencies"):
103
+ fetch_cmd = [zig_exe, "fetch", dep_dir]
104
+ print("cmd: {}".format(shlex.join(fetch_cmd)))
105
+ run(fetch_cmd, check=True)
106
+
101
107
  os.makedirs(self.build_temp, exist_ok=True)
102
108
  print('\ncmd', shlex.join(bld_cmd))
103
109
  sys.stdout.flush()
@@ -124,6 +130,56 @@ class BuildExt(SetupToolsBuildExt):
124
130
  output.rename(target)
125
131
 
126
132
 
133
+ class Sdist(SetupToolsSdist):
134
+ def make_release_tree(self, base_dir, files) -> None:
135
+ import os
136
+ import json
137
+ self.zig_dep_sources = []
138
+
139
+ sdistlist_name = os.path.join(base_dir, 'sdistlist.json')
140
+
141
+ from subprocess import run
142
+ zig_exe = "zig"
143
+ try:
144
+ import ziglang
145
+ zig_exe = os.path.join(
146
+ os.path.dirname(ziglang.__file__), "zig")
147
+ except:
148
+ pass
149
+
150
+ cmd = [zig_exe, "build", "sdistlist", '--prefix', base_dir]
151
+ print("cmd:", cmd)
152
+ run(cmd, check=True)
153
+ import shutil
154
+
155
+ with open(sdistlist_name) as fd:
156
+ sdistlist = json.load(fd)
157
+
158
+ for deps in sdistlist['dependencies']:
159
+ src = os.path.join(sdistlist['global_cache_dir'], 'p', deps[1])
160
+ dst = os.path.join(base_dir, '.zig-dependencies', deps[1])
161
+ if not os.path.isdir(src):
162
+ print("dep not found:", deps[0], src)
163
+ continue
164
+ print("packaging zig dep:", deps[0], src)
165
+ for root, _, walk_files in os.walk(src):
166
+ if '.zig-cache' in root:
167
+ continue
168
+ rel_dir = os.path.relpath(root, src)
169
+ os.makedirs(os.path.join(dst, rel_dir), exist_ok=True)
170
+ for f in walk_files:
171
+ source_file = os.path.join(root, f)
172
+ rel_file = os.path.normpath(
173
+ os.path.join(rel_dir, f))
174
+ dest_file = os.path.normpath(
175
+ os.path.join(dst, rel_dir, f))
176
+ shutil.copyfile(source_file, dest_file)
177
+ self.zig_dep_sources.append(rel_file)
178
+
179
+ super().make_release_tree(base_dir, files)
180
+ files.extend(self.zig_dep_sources)
181
+
182
+
127
183
  class ZigBuildExtension:
128
184
  def __init__(self, value):
129
185
  self._value = value
@@ -136,5 +192,8 @@ def setup_zig_build(dist, keyword, value):
136
192
  '''our hook into setuptools '''
137
193
  assert isinstance(dist, Distribution)
138
194
  assert keyword == 'zig_build'
139
- be = dist.cmdclass.get('build_ext')
195
+ dist.cmdclass.get('build_ext')
140
196
  dist.cmdclass['build_ext'] = ZigBuildExtension(value)
197
+ if 'sdist' in value and value['sdist'] == True:
198
+ dist.cmdclass.get('sdist')
199
+ dist.cmdclass['sdist'] = Sdist
@@ -1,8 +0,0 @@
1
- # Setuptools zig build
2
-
3
- A setuptools extension, for building cpython extensions with zig build,
4
- enabling source-only pip distributions that compile at install time.
5
-
6
- ## References
7
-
8
- @ruamel and [setuptools-zig](https://sourceforge.net/p/setuptools-zig)