From 9be14448aa2becaec3df3d48a0d38e0628c095aa Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 25 May 2026 05:14:36 +0200 Subject: [PATCH 1/2] refactor: split flake.nix into muiltple files --- flake.nix | 444 +++-------------------------------- nix/android-package.nix | 63 +++++ nix/c-docs.nix | 9 + nix/cross-rust-package.nix | 44 ++++ nix/deltachat-rpc-client.nix | 11 + nix/libdeltachat.nix | 26 ++ nix/python-docs.nix | 15 ++ nix/shell.nix | 27 +++ nix/wheel.nix | 28 +++ nix/win32-package.nix | 68 ++++++ nix/win64-package.nix | 46 ++++ 11 files changed, 370 insertions(+), 411 deletions(-) create mode 100644 nix/android-package.nix create mode 100644 nix/c-docs.nix create mode 100644 nix/cross-rust-package.nix create mode 100644 nix/deltachat-rpc-client.nix create mode 100644 nix/libdeltachat.nix create mode 100644 nix/python-docs.nix create mode 100644 nix/shell.nix create mode 100644 nix/wheel.nix create mode 100644 nix/win32-package.nix create mode 100644 nix/win64-package.nix diff --git a/flake.nix b/flake.nix index b5a1db9ca0..2686f277ad 100644 --- a/flake.nix +++ b/flake.nix @@ -29,11 +29,7 @@ rustc = fenixToolchain; }; manifest = (pkgs.lib.importTOML ./Cargo.toml).package; - androidSdk = android.sdk.${system} (sdkPkgs: - builtins.attrValues { - inherit (sdkPkgs) ndk-27-2-12479018 cmdline-tools-latest; - }); - androidNdkRoot = "${androidSdk}/share/android-sdk/ndk/27.2.12479018"; + version = manifest.version; rustSrc = nix-filter.lib { root = ./.; @@ -83,7 +79,7 @@ naersk'.buildPackage { pname = packageName; cargoBuildOptions = x: x ++ [ "--package" packageName ]; - version = manifest.version; + inherit version; src = pkgs.lib.cleanSource ./.; nativeBuildInputs = [ pkgs.perl # Needed to build vendored OpenSSL. @@ -91,221 +87,22 @@ auditable = false; # Avoid cargo-auditable failures. doCheck = false; # Disable test as it requires network access. }; - mkWin64RustPackage = packageName: - let - pkgsWin64 = pkgs.pkgsCross.mingwW64; - rustTarget = pkgsWin64.stdenv.hostPlatform.rust.rustcTarget; - toolchainWin = fenixPkgs.combine [ - fenixPkgs.stable.rustc - fenixPkgs.stable.cargo - fenixPkgs.targets.${rustTarget}.stable.rust-std - ]; - naerskWin = pkgs.callPackage naersk { - cargo = toolchainWin; - rustc = toolchainWin; - }; - in - naerskWin.buildPackage rec { - pname = packageName; - cargoBuildOptions = x: x ++ [ "--package" packageName ]; - version = manifest.version; - strictDeps = true; - src = pkgs.lib.cleanSource ./.; - nativeBuildInputs = [ - pkgs.perl # Needed to build vendored OpenSSL. - ]; - depsBuildBuild = [ - pkgsWin64.stdenv.cc - ]; - buildInputs = [ - pkgsWin64.windows.pthreads - ]; - auditable = false; # Avoid cargo-auditable failures. - doCheck = false; # Disable test as it requires network access. - - CARGO_BUILD_TARGET = rustTarget; - TARGET_CC = "${pkgsWin64.stdenv.cc}/bin/${pkgsWin64.stdenv.cc.targetPrefix}cc"; - CFLAGS_x86_64_pc_windows_gnu = "-I${pkgsWin64.windows.pthreads}/include"; - CARGO_BUILD_RUSTFLAGS = [ - "-C" - "linker=${TARGET_CC}" - "-L" - "native=${pkgsWin64.windows.pthreads}/lib" - ]; - - CC = "${pkgsWin64.stdenv.cc}/bin/${pkgsWin64.stdenv.cc.targetPrefix}cc"; - LD = "${pkgsWin64.stdenv.cc}/bin/${pkgsWin64.stdenv.cc.targetPrefix}cc"; - }; - - mkWin32RustPackage = packageName: - let - pkgsWin32 = pkgs.pkgsCross.mingw32; - rustTarget = pkgsWin32.stdenv.hostPlatform.rust.rustcTarget; - toolchainWin = fenixPkgs.combine [ - fenixPkgs.stable.rustc - fenixPkgs.stable.cargo - fenixPkgs.targets.${rustTarget}.stable.rust-std - ]; - naerskWin = pkgs.callPackage naersk { - cargo = toolchainWin; - rustc = toolchainWin; - }; - - # Get rid of MCF Gthread library. - # See - # and - # for details. - # - # Use DWARF-2 instead of SJLJ for exception handling. - winCC = pkgsWin32.buildPackages.wrapCC ( - (pkgsWin32.buildPackages.gcc-unwrapped.override - ({ - threadsCross = { - model = "win32"; - package = null; - }; - })).overrideAttrs (oldAttr: { - configureFlags = oldAttr.configureFlags ++ [ - "--disable-sjlj-exceptions" - "--with-dwarf2" - ]; - }) - ); - in - naerskWin.buildPackage rec { - pname = packageName; - cargoBuildOptions = x: x ++ [ "--package" packageName ]; - version = manifest.version; - strictDeps = true; - src = pkgs.lib.cleanSource ./.; - nativeBuildInputs = [ - pkgs.perl # Needed to build vendored OpenSSL. - pkgs.nasm # aws-lc-sys requires it - ]; - depsBuildBuild = [ - winCC - ]; - buildInputs = [ - pkgsWin32.windows.pthreads - ]; - auditable = false; # Avoid cargo-auditable failures. - doCheck = false; # Disable test as it requires network access. - - CARGO_BUILD_TARGET = rustTarget; - TARGET_CC = "${winCC}/bin/${winCC.targetPrefix}cc"; - CFLAGS_i686_pc_windows_gnu = "-I${pkgsWin32.windows.pthreads}/include"; - CARGO_BUILD_RUSTFLAGS = [ - "-C" - "linker=${TARGET_CC}" - "-L" - "native=${pkgsWin32.windows.pthreads}/lib" - ]; - - CC = "${winCC}/bin/${winCC.targetPrefix}cc"; - LD = "${winCC}/bin/${winCC.targetPrefix}cc"; - }; - mkCrossRustPackage = arch: packageName: - let - crossTarget = arch2targets."${arch}"; - pkgsCross = import nixpkgs { - system = system; - crossSystem.config = crossTarget; - }; - rustTarget = pkgsCross.stdenv.hostPlatform.rust.rustcTarget; - toolchain = fenixPkgs.combine [ - fenixPkgs.stable.rustc - fenixPkgs.stable.cargo - fenixPkgs.targets.${rustTarget}.stable.rust-std - ]; - naersk-lib = pkgs.callPackage naersk { - cargo = toolchain; - rustc = toolchain; - }; - in - naersk-lib.buildPackage rec { - pname = packageName; - cargoBuildOptions = x: x ++ [ "--package" packageName ]; - version = manifest.version; - strictDeps = true; - src = rustSrc; - nativeBuildInputs = [ - pkgs.perl # Needed to build vendored OpenSSL. - ]; - auditable = false; # Avoid cargo-auditable failures. - doCheck = false; # Disable test as it requires network access. - - CARGO_TARGET_X86_64_APPLE_DARWIN_RUSTFLAGS = "-Clink-args=-L${pkgsCross.libiconv}/lib"; - CARGO_TARGET_AARCH64_APPLE_DARWIN_RUSTFLAGS = "-Clink-args=-L${pkgsCross.libiconv}/lib"; - - CARGO_BUILD_TARGET = rustTarget; - TARGET_CC = "${pkgsCross.stdenv.cc}/bin/${pkgsCross.stdenv.cc.targetPrefix}cc"; - CARGO_BUILD_RUSTFLAGS = [ - "-C" - "linker=${TARGET_CC}" - ]; - - CC = "${pkgsCross.stdenv.cc}/bin/${pkgsCross.stdenv.cc.targetPrefix}cc"; - LD = "${pkgsCross.stdenv.cc}/bin/${pkgsCross.stdenv.cc.targetPrefix}cc"; - }; - - androidAttrs = { - armeabi-v7a = { - cc = "armv7a-linux-androideabi21-clang"; - rustTarget = "armv7-linux-androideabi"; - }; - arm64-v8a = { - cc = "aarch64-linux-android21-clang"; - rustTarget = "aarch64-linux-android"; - }; - x86 = { - cc = "i686-linux-android21-clang"; - rustTarget = "i686-linux-android"; - }; - x86_64 = { - cc = "x86_64-linux-android21-clang"; - rustTarget = "x86_64-linux-android"; - }; + mkWin64RustPackage = pkgs.callPackage ./nix/win64-package.nix { + inherit naersk system fenixPkgs version; }; - mkAndroidRustPackage = arch: packageName: - let - rustTarget = androidAttrs.${arch}.rustTarget; - toolchain = fenixPkgs.combine [ - fenixPkgs.stable.rustc - fenixPkgs.stable.cargo - fenixPkgs.targets.${rustTarget}.stable.rust-std - ]; - naersk-lib = pkgs.callPackage naersk { - cargo = toolchain; - rustc = toolchain; - }; - targetToolchain = "${androidNdkRoot}/toolchains/llvm/prebuilt/linux-x86_64"; - targetCcName = androidAttrs.${arch}.cc; - targetCc = "${targetToolchain}/bin/${targetCcName}"; - in - naersk-lib.buildPackage rec { - pname = packageName; - cargoBuildOptions = x: x ++ [ "--package" packageName ]; - version = manifest.version; - strictDeps = true; - src = rustSrc; - nativeBuildInputs = [ - pkgs.perl # Needed to build vendored OpenSSL. - ]; - auditable = false; # Avoid cargo-auditable failures. - doCheck = false; # Disable test as it requires network access. + mkWin32RustPackage = pkgs.callPackage ./nix/win32-package.nix { + inherit naersk system fenixPkgs version; + }; - CARGO_BUILD_TARGET = rustTarget; - TARGET_CC = "${targetCc}"; - CARGO_BUILD_RUSTFLAGS = [ - "-C" - "linker=${TARGET_CC}" - ]; + mkCrossRustPackage = pkgs.callPackage ./nix/cross-rust-package.nix { + inherit nixpkgs arch2targets naersk fenixPkgs system rustSrc version; + }; - CC = "${targetCc}"; - LD = "${targetCc}"; - }; + mkAndroidRustPackage = pkgs.callPackage ./nix/android-package.nix { + inherit naersk fenixPkgs system rustSrc android version; + }; mkAndroidPackages = arch: let @@ -315,32 +112,7 @@ "deltachat-rpc-server-${arch}-android" = rpc-server; "deltachat-repl-${arch}-android" = mkAndroidRustPackage arch "deltachat-repl"; "deltachat-rpc-server-${arch}-android-wheel" = - pkgs.stdenv.mkDerivation { - pname = "deltachat-rpc-server-${arch}-android-wheel"; - version = manifest.version; - src = nix-filter.lib { - root = ./.; - include = [ - "scripts/wheel-rpc-server.py" - "deltachat-rpc-server/README.md" - "LICENSE" - "Cargo.toml" - ]; - }; - nativeBuildInputs = [ - pkgs.python3 - pkgs.python3Packages.wheel - ]; - buildInputs = [ - rpc-server - ]; - buildPhase = '' - mkdir tmp - cp ${rpc-server}/bin/deltachat-rpc-server tmp/deltachat-rpc-server - python3 scripts/wheel-rpc-server.py ${arch}-android tmp/deltachat-rpc-server - ''; - installPhase = ''mkdir -p $out; cp -av deltachat_rpc_server-*.whl $out''; - }; + mkWheel { inherit rpc-server; arch = "${arch}-android"; }; }; mkRustPackages = arch: @@ -350,34 +122,10 @@ { "deltachat-repl-${arch}" = mkCrossRustPackage arch "deltachat-repl"; "deltachat-rpc-server-${arch}" = rpc-server; - "deltachat-rpc-server-${arch}-wheel" = - pkgs.stdenv.mkDerivation { - pname = "deltachat-rpc-server-${arch}-wheel"; - version = manifest.version; - src = nix-filter.lib { - root = ./.; - include = [ - "scripts/wheel-rpc-server.py" - "deltachat-rpc-server/README.md" - "LICENSE" - "Cargo.toml" - ]; - }; - nativeBuildInputs = [ - pkgs.python3 - pkgs.python3Packages.wheel - ]; - buildInputs = [ - rpc-server - ]; - buildPhase = '' - mkdir tmp - cp ${rpc-server}/bin/deltachat-rpc-server tmp/deltachat-rpc-server - python3 scripts/wheel-rpc-server.py ${arch} tmp/deltachat-rpc-server - ''; - installPhase = ''mkdir -p $out; cp -av deltachat_rpc_server-*.whl $out''; - }; + "deltachat-rpc-server-${arch}-wheel" = mkWheel { inherit rpc-server; arch = "${arch}"; }; }; + + mkWheel = pkgs.callPackage ./nix/wheel.nix { inherit nix-filter version; root = ./.; }; in { formatter = pkgs.nixpkgs-fmt; @@ -401,116 +149,29 @@ deltachat-repl-win64 = mkWin64RustPackage "deltachat-repl"; deltachat-rpc-server-win64 = mkWin64RustPackage "deltachat-rpc-server"; deltachat-rpc-server-win64-wheel = - pkgs.stdenv.mkDerivation { - pname = "deltachat-rpc-server-win64-wheel"; - version = manifest.version; - src = nix-filter.lib { - root = ./.; - include = [ - "scripts/wheel-rpc-server.py" - "deltachat-rpc-server/README.md" - "LICENSE" - "Cargo.toml" - ]; - }; - nativeBuildInputs = [ - pkgs.python3 - pkgs.python3Packages.wheel - ]; - buildInputs = [ - deltachat-rpc-server-win64 - ]; - buildPhase = '' - mkdir tmp - cp ${deltachat-rpc-server-win64}/bin/deltachat-rpc-server.exe tmp/deltachat-rpc-server.exe - python3 scripts/wheel-rpc-server.py win64 tmp/deltachat-rpc-server.exe - ''; - installPhase = ''mkdir -p $out; cp -av deltachat_rpc_server-*.whl $out''; - }; + mkWheel { rpc-server = deltachat-rpc-server-win64; arch = "win64"; binaryName = "deltachat-rpc-server.exe"; }; deltachat-repl-win32 = mkWin32RustPackage "deltachat-repl"; deltachat-rpc-server-win32 = mkWin32RustPackage "deltachat-rpc-server"; deltachat-rpc-server-win32-wheel = - pkgs.stdenv.mkDerivation { - pname = "deltachat-rpc-server-win32-wheel"; - version = manifest.version; - src = nix-filter.lib { - root = ./.; - include = [ - "scripts/wheel-rpc-server.py" - "deltachat-rpc-server/README.md" - "LICENSE" - "Cargo.toml" - ]; - }; - nativeBuildInputs = [ - pkgs.python3 - pkgs.python3Packages.wheel - ]; - buildInputs = [ - deltachat-rpc-server-win32 - ]; - buildPhase = '' - mkdir tmp - cp ${deltachat-rpc-server-win32}/bin/deltachat-rpc-server.exe tmp/deltachat-rpc-server.exe - python3 scripts/wheel-rpc-server.py win32 tmp/deltachat-rpc-server.exe - ''; - installPhase = ''mkdir -p $out; cp -av deltachat_rpc_server-*.whl $out''; - }; - # Run `nix build .#docs` to get C docs generated in `./result/`. - docs = - pkgs.stdenv.mkDerivation { - pname = "docs"; - version = manifest.version; - src = pkgs.lib.cleanSource ./.; - nativeBuildInputs = [ pkgs.doxygen ]; - buildPhase = ''scripts/run-doxygen.sh''; - installPhase = ''mkdir -p $out; cp -av deltachat-ffi/html deltachat-ffi/xml $out''; - }; - - libdeltachat = - let - rustPlatform = (pkgs.makeRustPlatform { - cargo = fenixToolchain; - rustc = fenixToolchain; - }); - in - pkgs.stdenv.mkDerivation { - pname = "libdeltachat"; - version = manifest.version; - src = rustSrc; - cargoDeps = pkgs.rustPlatform.importCargoLock cargoLock; + mkWheel + { rpc-server = deltachat-rpc-server-win32; arch = "win32"; binaryName = "deltachat-rpc-server.exe"; }; - nativeBuildInputs = [ - pkgs.perl # Needed to build vendored OpenSSL. - pkgs.cmake - rustPlatform.cargoSetupHook - fenixPkgs.stable.rustc - fenixPkgs.stable.cargo - ]; + # Run `nix build .#docs` to get C docs generated in `./result/`. + docs = pkgs.callPackage ./nix/c-docs.nix { inherit version; }; - postInstall = '' - substituteInPlace $out/include/deltachat.h \ - --replace __FILE__ '"${placeholder "out"}/include/deltachat.h"' - ''; - }; + libdeltachat = pkgs.callPackage ./nix/libdeltachat.nix { + inherit fenixToolchain rustSrc cargoLock fenixPkgs version; + }; - deltachat-rpc-client = - pkgs.python3Packages.buildPythonPackage { - pname = "deltachat-rpc-client"; - version = manifest.version; - src = pkgs.lib.cleanSource ./deltachat-rpc-client; - format = "pyproject"; - propagatedBuildInputs = [ - pkgs.python3Packages.setuptools - pkgs.python3Packages.imap-tools - ]; - }; + deltachat-rpc-client = pkgs.callPackage ./nix/deltachat-rpc-client.nix { + inherit version; + }; deltachat-python = pkgs.python3Packages.buildPythonPackage { pname = "deltachat-python"; - version = manifest.version; + inherit version; src = pkgs.lib.cleanSource ./python; format = "pyproject"; buildInputs = [ @@ -528,51 +189,12 @@ pkgs.python3Packages.requests ]; }; - python-docs = - pkgs.stdenv.mkDerivation { - pname = "docs"; - version = manifest.version; - src = pkgs.lib.cleanSource ./.; - buildInputs = [ - deltachat-python - deltachat-rpc-client - pkgs.python3Packages.breathe - pkgs.python3Packages.sphinx-rtd-theme - ]; - nativeBuildInputs = [ pkgs.sphinx ]; - buildPhase = ''sphinx-build -b html -a python/doc/ dist/html''; - installPhase = ''mkdir -p $out; cp -av dist/html $out''; - }; - }; - - devShells.default = - let - pkgs = import nixpkgs { - system = system; - overlays = [ fenix.overlays.default ]; + python-docs = pkgs.callPackage ./nix/python-docs.nix { + inherit deltachat-python deltachat-rpc-client version; }; - in - pkgs.mkShell { - - buildInputs = with pkgs; [ - (fenix.packages.${system}.complete.withComponents [ - "cargo" - "clippy" - "rust-src" - "rustc" - "rustfmt" - ]) - cargo-deny - rust-analyzer-nightly - cargo-nextest - perl # needed to build vendored OpenSSL - git-cliff - (python3.withPackages (pypkgs: with pypkgs; [ - tox - ])) - nodejs - ]; }; + + devShells.default = import ./nix/shell.nix { inherit nixpkgs fenix system; }; } ); } diff --git a/nix/android-package.nix b/nix/android-package.nix new file mode 100644 index 0000000000..1687046e42 --- /dev/null +++ b/nix/android-package.nix @@ -0,0 +1,63 @@ +{ pkgs, naersk, fenixPkgs, system, version, rustSrc, android }: +arch: packageName: +let + androidSdk = android.sdk.${system} (sdkPkgs: + builtins.attrValues { + inherit (sdkPkgs) ndk-27-2-12479018 cmdline-tools-latest; + }); + androidNdkRoot = "${androidSdk}/share/android-sdk/ndk/27.2.12479018"; + androidAttrs = { + armeabi-v7a = { + cc = "armv7a-linux-androideabi21-clang"; + rustTarget = "armv7-linux-androideabi"; + }; + arm64-v8a = { + cc = "aarch64-linux-android21-clang"; + rustTarget = "aarch64-linux-android"; + }; + x86 = { + cc = "i686-linux-android21-clang"; + rustTarget = "i686-linux-android"; + }; + x86_64 = { + cc = "x86_64-linux-android21-clang"; + rustTarget = "x86_64-linux-android"; + }; + }; + + rustTarget = androidAttrs.${arch}.rustTarget; + toolchain = fenixPkgs.combine [ + fenixPkgs.stable.rustc + fenixPkgs.stable.cargo + fenixPkgs.targets.${rustTarget}.stable.rust-std + ]; + naersk-lib = pkgs.callPackage naersk { + cargo = toolchain; + rustc = toolchain; + }; + targetToolchain = "${androidNdkRoot}/toolchains/llvm/prebuilt/linux-x86_64"; + targetCcName = androidAttrs.${arch}.cc; + targetCc = "${targetToolchain}/bin/${targetCcName}"; +in +naersk-lib.buildPackage rec { + pname = packageName; + cargoBuildOptions = x: x ++ [ "--package" packageName ]; + inherit version; + strictDeps = true; + src = rustSrc; + nativeBuildInputs = [ + pkgs.perl # Needed to build vendored OpenSSL. + ]; + auditable = false; # Avoid cargo-auditable failures. + doCheck = false; # Disable test as it requires network access. + + CARGO_BUILD_TARGET = rustTarget; + TARGET_CC = "${targetCc}"; + CARGO_BUILD_RUSTFLAGS = [ + "-C" + "linker=${TARGET_CC}" + ]; + + CC = "${targetCc}"; + LD = "${targetCc}"; +} diff --git a/nix/c-docs.nix b/nix/c-docs.nix new file mode 100644 index 0000000000..0b74f03d64 --- /dev/null +++ b/nix/c-docs.nix @@ -0,0 +1,9 @@ +{ pkgs, version }: +pkgs.stdenv.mkDerivation { + pname = "docs"; + inherit version; + src = pkgs.lib.cleanSource ../.; + nativeBuildInputs = [ pkgs.doxygen ]; + buildPhase = ''scripts/run-doxygen.sh''; + installPhase = ''mkdir -p $out; cp -av deltachat-ffi/html deltachat-ffi/xml $out''; +} diff --git a/nix/cross-rust-package.nix b/nix/cross-rust-package.nix new file mode 100644 index 0000000000..d995d2e06c --- /dev/null +++ b/nix/cross-rust-package.nix @@ -0,0 +1,44 @@ +{ pkgs, nixpkgs, arch2targets, naersk, fenixPkgs, system, rustSrc, version }: +arch: packageName: +let + crossTarget = arch2targets."${arch}"; + pkgsCross = import nixpkgs { + system = system; + crossSystem.config = crossTarget; + }; + rustTarget = pkgsCross.stdenv.hostPlatform.rust.rustcTarget; + toolchain = fenixPkgs.combine [ + fenixPkgs.stable.rustc + fenixPkgs.stable.cargo + fenixPkgs.targets.${rustTarget}.stable.rust-std + ]; + naersk-lib = pkgs.callPackage naersk { + cargo = toolchain; + rustc = toolchain; + }; +in +naersk-lib.buildPackage rec { + pname = packageName; + cargoBuildOptions = x: x ++ [ "--package" packageName ]; + inherit version; + strictDeps = true; + src = rustSrc; + nativeBuildInputs = [ + pkgs.perl # Needed to build vendored OpenSSL. + ]; + auditable = false; # Avoid cargo-auditable failures. + doCheck = false; # Disable test as it requires network access. + + CARGO_TARGET_X86_64_APPLE_DARWIN_RUSTFLAGS = "-Clink-args=-L${pkgsCross.libiconv}/lib"; + CARGO_TARGET_AARCH64_APPLE_DARWIN_RUSTFLAGS = "-Clink-args=-L${pkgsCross.libiconv}/lib"; + + CARGO_BUILD_TARGET = rustTarget; + TARGET_CC = "${pkgsCross.stdenv.cc}/bin/${pkgsCross.stdenv.cc.targetPrefix}cc"; + CARGO_BUILD_RUSTFLAGS = [ + "-C" + "linker=${TARGET_CC}" + ]; + + CC = "${pkgsCross.stdenv.cc}/bin/${pkgsCross.stdenv.cc.targetPrefix}cc"; + LD = "${pkgsCross.stdenv.cc}/bin/${pkgsCross.stdenv.cc.targetPrefix}cc"; +} diff --git a/nix/deltachat-rpc-client.nix b/nix/deltachat-rpc-client.nix new file mode 100644 index 0000000000..d266210f25 --- /dev/null +++ b/nix/deltachat-rpc-client.nix @@ -0,0 +1,11 @@ +{ pkgs, version }: +pkgs.python3Packages.buildPythonPackage { + pname = "deltachat-rpc-client"; + inherit version; + src = pkgs.lib.cleanSource ../deltachat-rpc-client; + format = "pyproject"; + propagatedBuildInputs = [ + pkgs.python3Packages.setuptools + pkgs.python3Packages.imap-tools + ]; +} diff --git a/nix/libdeltachat.nix b/nix/libdeltachat.nix new file mode 100644 index 0000000000..b45c73e03f --- /dev/null +++ b/nix/libdeltachat.nix @@ -0,0 +1,26 @@ +{ pkgs, fenixToolchain, rustSrc, cargoLock, fenixPkgs, version }: +let + rustPlatform = (pkgs.makeRustPlatform { + cargo = fenixToolchain; + rustc = fenixToolchain; + }); +in +pkgs.stdenv.mkDerivation { + pname = "libdeltachat"; + inherit version; + src = rustSrc; + cargoDeps = pkgs.rustPlatform.importCargoLock cargoLock; + + nativeBuildInputs = [ + pkgs.perl # Needed to build vendored OpenSSL. + pkgs.cmake + rustPlatform.cargoSetupHook + fenixPkgs.stable.rustc + fenixPkgs.stable.cargo + ]; + + postInstall = '' + substituteInPlace $out/include/deltachat.h \ + --replace __FILE__ '"${placeholder "out"}/include/deltachat.h"' + ''; +} diff --git a/nix/python-docs.nix b/nix/python-docs.nix new file mode 100644 index 0000000000..baef04d369 --- /dev/null +++ b/nix/python-docs.nix @@ -0,0 +1,15 @@ +{ pkgs, version, deltachat-python, deltachat-rpc-client }: +pkgs.stdenv.mkDerivation { + pname = "docs"; + inherit version; + src = pkgs.lib.cleanSource ../.; + buildInputs = [ + deltachat-python + deltachat-rpc-client + pkgs.python3Packages.breathe + pkgs.python3Packages.sphinx-rtd-theme + ]; + nativeBuildInputs = [ pkgs.sphinx ]; + buildPhase = ''sphinx-build -b html -a python/doc/ dist/html''; + installPhase = ''mkdir -p $out; cp -av dist/html $out''; +} diff --git a/nix/shell.nix b/nix/shell.nix new file mode 100644 index 0000000000..668873c806 --- /dev/null +++ b/nix/shell.nix @@ -0,0 +1,27 @@ +{ nixpkgs, fenix, system }: +let + pkgs = import nixpkgs { + inherit system; + overlays = [ fenix.overlays.default ]; + }; +in +pkgs.mkShell { + buildInputs = with pkgs; [ + (fenix.packages.${system}.complete.withComponents [ + "cargo" + "clippy" + "rust-src" + "rustc" + "rustfmt" + ]) + cargo-deny + rust-analyzer-nightly + cargo-nextest + perl # needed to build vendored OpenSSL + git-cliff + (python3.withPackages (pypkgs: with pypkgs; [ + tox + ])) + nodejs + ]; +} diff --git a/nix/wheel.nix b/nix/wheel.nix new file mode 100644 index 0000000000..3e84526417 --- /dev/null +++ b/nix/wheel.nix @@ -0,0 +1,28 @@ +{ pkgs, nix-filter, version, root }: +{ rpc-server, arch, binaryName ? "deltachat-rpc-server" }: +pkgs.stdenv.mkDerivation { + pname = "deltachat-rpc-server-${arch}-wheel"; + inherit version; + src = nix-filter.lib { + inherit root; + include = [ + "scripts/wheel-rpc-server.py" + "deltachat-rpc-server/README.md" + "LICENSE" + "Cargo.toml" + ]; + }; + nativeBuildInputs = [ + pkgs.python3 + pkgs.python3Packages.wheel + ]; + buildInputs = [ + rpc-server + ]; + buildPhase = '' + mkdir tmp + cp ${rpc-server}/bin/${binaryName} tmp/${binaryName} + python3 scripts/wheel-rpc-server.py ${arch} tmp/${binaryName} + ''; + installPhase = ''mkdir -p $out; cp -av deltachat_rpc_server-*.whl $out''; +} diff --git a/nix/win32-package.nix b/nix/win32-package.nix new file mode 100644 index 0000000000..ccf76ec952 --- /dev/null +++ b/nix/win32-package.nix @@ -0,0 +1,68 @@ +{ pkgs, naersk, fenixPkgs, system, version }: +packageName: +let + pkgsWin32 = pkgs.pkgsCross.mingw32; + rustTarget = pkgsWin32.stdenv.hostPlatform.rust.rustcTarget; + toolchainWin = fenixPkgs.combine [ + fenixPkgs.stable.rustc + fenixPkgs.stable.cargo + fenixPkgs.targets.${rustTarget}.stable.rust-std + ]; + naerskWin = pkgs.callPackage naersk { + cargo = toolchainWin; + rustc = toolchainWin; + }; + + # Get rid of MCF Gthread library. + # See + # and + # for details. + # + # Use DWARF-2 instead of SJLJ for exception handling. + winCC = pkgsWin32.buildPackages.wrapCC ( + (pkgsWin32.buildPackages.gcc-unwrapped.override + ({ + threadsCross = { + model = "win32"; + package = null; + }; + })).overrideAttrs (oldAttr: { + configureFlags = oldAttr.configureFlags ++ [ + "--disable-sjlj-exceptions" + "--with-dwarf2" + ]; + }) + ); +in +naerskWin.buildPackage rec { + pname = packageName; + cargoBuildOptions = x: x ++ [ "--package" packageName ]; + inherit version; + strictDeps = true; + src = pkgs.lib.cleanSource ../.; + nativeBuildInputs = [ + pkgs.perl # Needed to build vendored OpenSSL. + pkgs.nasm # aws-lc-sys requires it + ]; + depsBuildBuild = [ + winCC + ]; + buildInputs = [ + pkgsWin32.windows.pthreads + ]; + auditable = false; # Avoid cargo-auditable failures. + doCheck = false; # Disable test as it requires network access. + + CARGO_BUILD_TARGET = rustTarget; + TARGET_CC = "${winCC}/bin/${winCC.targetPrefix}cc"; + CFLAGS_i686_pc_windows_gnu = "-I${pkgsWin32.windows.pthreads}/include"; + CARGO_BUILD_RUSTFLAGS = [ + "-C" + "linker=${TARGET_CC}" + "-L" + "native=${pkgsWin32.windows.pthreads}/lib" + ]; + + CC = "${winCC}/bin/${winCC.targetPrefix}cc"; + LD = "${winCC}/bin/${winCC.targetPrefix}cc"; +} diff --git a/nix/win64-package.nix b/nix/win64-package.nix new file mode 100644 index 0000000000..cec0a76333 --- /dev/null +++ b/nix/win64-package.nix @@ -0,0 +1,46 @@ +{ pkgs, naersk, fenixPkgs, system, version }: +packageName: +let + pkgsWin64 = pkgs.pkgsCross.mingwW64; + rustTarget = pkgsWin64.stdenv.hostPlatform.rust.rustcTarget; + toolchainWin = fenixPkgs.combine [ + fenixPkgs.stable.rustc + fenixPkgs.stable.cargo + fenixPkgs.targets.${rustTarget}.stable.rust-std + ]; + naerskWin = pkgs.callPackage naersk { + cargo = toolchainWin; + rustc = toolchainWin; + }; +in +naerskWin.buildPackage rec { + pname = packageName; + cargoBuildOptions = x: x ++ [ "--package" packageName ]; + inherit version; + strictDeps = true; + src = pkgs.lib.cleanSource ../.; + nativeBuildInputs = [ + pkgs.perl # Needed to build vendored OpenSSL. + ]; + depsBuildBuild = [ + pkgsWin64.stdenv.cc + ]; + buildInputs = [ + pkgsWin64.windows.pthreads + ]; + auditable = false; # Avoid cargo-auditable failures. + doCheck = false; # Disable test as it requires network access. + + CARGO_BUILD_TARGET = rustTarget; + TARGET_CC = "${pkgsWin64.stdenv.cc}/bin/${pkgsWin64.stdenv.cc.targetPrefix}cc"; + CFLAGS_x86_64_pc_windows_gnu = "-I${pkgsWin64.windows.pthreads}/include"; + CARGO_BUILD_RUSTFLAGS = [ + "-C" + "linker=${TARGET_CC}" + "-L" + "native=${pkgsWin64.windows.pthreads}/lib" + ]; + + CC = "${pkgsWin64.stdenv.cc}/bin/${pkgsWin64.stdenv.cc.targetPrefix}cc"; + LD = "${pkgsWin64.stdenv.cc}/bin/${pkgsWin64.stdenv.cc.targetPrefix}cc"; +} From 9782963a0637821aa60d90e983e42a58637a6d73 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 15 Jun 2026 22:43:30 +0200 Subject: [PATCH 2/2] build: build for macOS with nix Closes https://github.com/chatmail/core/issues/6095 --- .github/workflows/nix.yml | 5 +---- nix/cross-rust-package.nix | 15 +++++++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index e6ad11d6c8..3e0a8875c8 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -95,10 +95,7 @@ jobs: installable: - deltachat-rpc-server - deltachat-rpc-server-x86_64-darwin - - # Fails to build - # because of . - # - deltachat-rpc-server-aarch64-darwin + - deltachat-rpc-server-aarch64-darwin steps: - uses: actions/checkout@v6 with: diff --git a/nix/cross-rust-package.nix b/nix/cross-rust-package.nix index d995d2e06c..4beb3cafd1 100644 --- a/nix/cross-rust-package.nix +++ b/nix/cross-rust-package.nix @@ -2,10 +2,17 @@ arch: packageName: let crossTarget = arch2targets."${arch}"; - pkgsCross = import nixpkgs { - system = system; - crossSystem.config = crossTarget; - }; + pkgsCross = + if system == crossSystem then + import nixpkgs + { + inherit system; + }; + else + import nixpkgs { + inherit system; + crossSystem.config = crossTarget; + }; rustTarget = pkgsCross.stdenv.hostPlatform.rust.rustcTarget; toolchain = fenixPkgs.combine [ fenixPkgs.stable.rustc