Skip to content

Commit 0eaa440

Browse files
committed
build: build deltachat-rpc-server wheels with nix
1 parent 9f7defa commit 0eaa440

File tree

3 files changed

+161
-66
lines changed

3 files changed

+161
-66
lines changed

.github/workflows/deltachat-rpc-server.yml

+24-3
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ jobs:
104104
- uses: actions/checkout@v4
105105
with:
106106
show-progress: false
107+
- uses: DeterminateSystems/nix-installer-action@main
108+
- uses: DeterminateSystems/magic-nix-cache-action@main
107109

108110
- name: Download Linux aarch64 binary
109111
uses: actions/download-artifact@v4
@@ -182,9 +184,28 @@ jobs:
182184
run: pip install wheel
183185

184186
- name: Build deltachat-rpc-server Python wheels and source package
185-
run: scripts/wheel-rpc-server.py
186-
187-
- name: List downloaded artifacts
187+
run: |
188+
nix build .#deltachat-rpc-server-x86_64-linux-wheel
189+
cp result/*.whl dist/
190+
nix build .#deltachat-rpc-server-armv7l-linux-wheel
191+
cp result/*.whl dist/
192+
nix build .#deltachat-rpc-server-armv6l-linux-wheel
193+
cp result/*.whl dist/
194+
nix build .#deltachat-rpc-server-aarch64-linux-wheel
195+
cp result/*.whl dist/
196+
nix build .#deltachat-rpc-server-i686-linux-wheel
197+
cp result/*.whl dist/
198+
nix build .#deltachat-rpc-server-win64-wheel
199+
cp result/*.whl dist/
200+
nix build .#deltachat-rpc-server-win32-wheel
201+
cp result/*.whl dist/
202+
nix build .#deltachat-rpc-server-source
203+
cp result/*.tar.gz dist/
204+
python3 scripts/wheel-rpc-server.py 1.136.3 x86_64-darwin dist/deltachat-rpc-server-x86_64-macos
205+
python3 scripts/wheel-rpc-server.py 1.136.3 aarch64-darwin dist/deltachat-rpc-server-aarch64-macos
206+
mv *.whl dist/
207+
208+
- name: List artifacts
188209
run: ls -l dist/
189210

190211
- name: Upload binaries to the GitHub release

flake.nix

+102-7
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,40 @@
251251
LD = "${pkgsCross.stdenv.cc}/bin/${pkgsCross.stdenv.cc.targetPrefix}cc";
252252
};
253253

254-
mkRustPackages = arch: {
255-
"deltachat-repl-${arch}" = mkCrossRustPackage arch "deltachat-repl";
256-
"deltachat-rpc-server-${arch}" = mkCrossRustPackage arch "deltachat-rpc-server";
257-
};
254+
mkRustPackages = arch:
255+
let
256+
rpc-server = mkCrossRustPackage arch "deltachat-rpc-server";
257+
in
258+
{
259+
"deltachat-repl-${arch}" = mkCrossRustPackage arch "deltachat-repl";
260+
"deltachat-rpc-server-${arch}" = rpc-server;
261+
"deltachat-rpc-server-${arch}-wheel" =
262+
pkgs.stdenv.mkDerivation {
263+
pname = "deltachat-rpc-server-${arch}-wheel";
264+
version = manifest.version;
265+
src = nix-filter.lib {
266+
root = ./.;
267+
include = [
268+
"scripts/wheel-rpc-server.py"
269+
"deltachat-rpc-server/README.md"
270+
"LICENSE"
271+
];
272+
};
273+
nativeBuildInputs = [
274+
pkgs.python3
275+
pkgs.python3Packages.wheel
276+
];
277+
buildInputs = [
278+
rpc-server
279+
];
280+
buildPhase = ''
281+
mkdir tmp
282+
cp ${rpc-server}/bin/deltachat-rpc-server tmp/deltachat-rpc-server
283+
python3 scripts/wheel-rpc-server.py ${manifest.version} ${arch} tmp/deltachat-rpc-server
284+
'';
285+
installPhase = ''mkdir -p $out; cp -av deltachat_rpc_server-*.whl $out'';
286+
};
287+
};
258288
in
259289
{
260290
formatter = pkgs.nixpkgs-fmt;
@@ -271,12 +301,61 @@
271301

272302
deltachat-repl-win64 = mkWin64RustPackage "deltachat-repl";
273303
deltachat-rpc-server-win64 = mkWin64RustPackage "deltachat-rpc-server";
304+
deltachat-rpc-server-win64-wheel =
305+
pkgs.stdenv.mkDerivation {
306+
pname = "deltachat-rpc-server-win64-wheel";
307+
version = manifest.version;
308+
src = nix-filter.lib {
309+
root = ./.;
310+
include = [
311+
"scripts/wheel-rpc-server.py"
312+
"deltachat-rpc-server/README.md"
313+
"LICENSE"
314+
];
315+
};
316+
nativeBuildInputs = [
317+
pkgs.python3
318+
pkgs.python3Packages.wheel
319+
];
320+
buildInputs = [
321+
deltachat-rpc-server-win64
322+
];
323+
buildPhase = ''
324+
mkdir tmp
325+
cp ${deltachat-rpc-server-win64}/bin/deltachat-rpc-server.exe tmp/deltachat-rpc-server.exe
326+
python3 scripts/wheel-rpc-server.py ${manifest.version} win64 tmp/deltachat-rpc-server.exe
327+
'';
328+
installPhase = ''mkdir -p $out; cp -av deltachat_rpc_server-*.whl $out'';
329+
};
274330

275331
deltachat-repl-win32 = mkWin32RustPackage "deltachat-repl";
276332
deltachat-rpc-server-win32 = mkWin32RustPackage "deltachat-rpc-server";
277-
278-
279-
333+
deltachat-rpc-server-win32-wheel =
334+
pkgs.stdenv.mkDerivation {
335+
pname = "deltachat-rpc-server-win32-wheel";
336+
version = manifest.version;
337+
src = nix-filter.lib {
338+
root = ./.;
339+
include = [
340+
"scripts/wheel-rpc-server.py"
341+
"deltachat-rpc-server/README.md"
342+
"LICENSE"
343+
];
344+
};
345+
nativeBuildInputs = [
346+
pkgs.python3
347+
pkgs.python3Packages.wheel
348+
];
349+
buildInputs = [
350+
deltachat-rpc-server-win32
351+
];
352+
buildPhase = ''
353+
mkdir tmp
354+
cp ${deltachat-rpc-server-win32}/bin/deltachat-rpc-server.exe tmp/deltachat-rpc-server.exe
355+
python3 scripts/wheel-rpc-server.py ${manifest.version} win32 tmp/deltachat-rpc-server.exe
356+
'';
357+
installPhase = ''mkdir -p $out; cp -av deltachat_rpc_server-*.whl $out'';
358+
};
280359
# Run `nix build .#docs` to get C docs generated in `./result/`.
281360
docs =
282361
pkgs.stdenv.mkDerivation {
@@ -314,6 +393,22 @@
314393
'';
315394
};
316395

396+
# Source package for deltachat-rpc-server.
397+
# Fake package that downloads Linux version,
398+
# needed to install deltachat-rpc-server on Android with `pip`.
399+
deltachat-rpc-server-source =
400+
pkgs.stdenv.mkDerivation {
401+
pname = "deltachat-rpc-server-source";
402+
version = manifest.version;
403+
src = pkgs.lib.cleanSource ./.;
404+
nativeBuildInputs = [
405+
pkgs.python3
406+
pkgs.python3Packages.wheel
407+
];
408+
buildPhase = ''python3 scripts/wheel-rpc-server.py ${manifest.version} source deltachat-rpc-server-${manifest.version}.tar.gz'';
409+
installPhase = ''mkdir -p $out; cp -av deltachat-rpc-server-${manifest.version}.tar.gz $out'';
410+
};
411+
317412
deltachat-rpc-client =
318413
pkgs.python3Packages.buildPythonPackage rec {
319414
pname = "deltachat-rpc-client";

scripts/wheel-rpc-server.py

+35-56
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from wheel.wheelfile import WheelFile
55
import tomllib
66
import tarfile
7+
import sys
78
from io import BytesIO
89

910

@@ -15,9 +16,7 @@ def metadata_contents(version):
1516
"""
1617

1718

18-
def build_source_package(version):
19-
filename = f"dist/deltachat-rpc-server-{version}.tar.gz"
20-
19+
def build_source_package(version, filename):
2120
with tarfile.open(filename, "w:gz") as pkg:
2221

2322
def pack(name, contents):
@@ -98,7 +97,7 @@ def run(self):
9897

9998

10099
def build_wheel(version, binary, tag, windows=False):
101-
filename = f"dist/deltachat_rpc_server-{version}-{tag}.whl"
100+
filename = f"deltachat_rpc_server-{version}-{tag}.whl"
102101

103102
with WheelFile(filename, "w") as wheel:
104103
wheel.write("LICENSE", "deltachat_rpc_server/LICENSE")
@@ -143,59 +142,39 @@ def main():
143142
)
144143

145144

146-
def main():
147-
with open("deltachat-rpc-server/Cargo.toml", "rb") as f:
148-
cargo_toml = tomllib.load(f)
149-
version = cargo_toml["package"]["version"]
150-
Path("dist").mkdir(exist_ok=True)
151-
build_source_package(version)
152-
build_wheel(
153-
version,
154-
"dist/deltachat-rpc-server-x86_64-linux",
155-
"py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.musllinux_1_1_x86_64",
156-
)
157-
build_wheel(
158-
version,
159-
"dist/deltachat-rpc-server-armv7l-linux",
160-
"py3-none-linux_armv7l.manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l",
161-
)
162-
build_wheel(
163-
version,
164-
"dist/deltachat-rpc-server-armv6l-linux",
165-
"py3-none-linux_armv6l",
166-
)
167-
build_wheel(
168-
version,
169-
"dist/deltachat-rpc-server-aarch64-linux",
170-
"py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64",
171-
)
172-
build_wheel(
173-
version,
174-
"dist/deltachat-rpc-server-i686-linux",
175-
"py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686",
176-
)
177-
145+
arch2tags = {
146+
"x86_64-linux": "manylinux_2_17_x86_64.manylinux2014_x86_64.musllinux_1_1_x86_64",
147+
"armv7l-linux": "linux_armv7l.manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l",
148+
"armv6l-linux": "linux_armv6l",
149+
"aarch64-linux": "manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64",
150+
"i686-linux": "manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686",
151+
"win64": "win_amd64",
152+
"win32": "win32",
178153
# macOS versions for platform compatibility tags are taken from https://doc.rust-lang.org/rustc/platform-support.html
179-
build_wheel(
180-
version,
181-
"dist/deltachat-rpc-server-x86_64-macos",
182-
"py3-none-macosx_10_7_x86_64",
183-
)
184-
build_wheel(
185-
version,
186-
"dist/deltachat-rpc-server-aarch64-macos",
187-
"py3-none-macosx_11_0_arm64",
188-
)
189-
190-
build_wheel(
191-
version, "dist/deltachat-rpc-server-win32.exe", "py3-none-win32", windows=True
192-
)
193-
build_wheel(
194-
version,
195-
"dist/deltachat-rpc-server-win64.exe",
196-
"py3-none-win_amd64",
197-
windows=True,
198-
)
154+
"x86_64-darwin": "macosx_10_7_x86_64",
155+
"aarch64-darwin": "macosx_11_0_arm64",
156+
}
157+
158+
159+
def main():
160+
version = sys.argv[1]
161+
if sys.argv[2] == "source":
162+
filename = f"deltachat-rpc-server-{version}.tar.gz"
163+
build_source_package(version, filename)
164+
else:
165+
arch = sys.argv[2]
166+
executable = sys.argv[3]
167+
tags = arch2tags[arch]
168+
169+
if arch in ["win32", "win64"]:
170+
build_wheel(
171+
version,
172+
executable,
173+
f"py3-none-{tags}",
174+
windows=True,
175+
)
176+
else:
177+
build_wheel(version, executable, f"py3-none-{tags}")
199178

200179

201180
main()

0 commit comments

Comments
 (0)