This commit is contained in:
Septias
2024-11-13 13:34:08 +01:00
parent 37f15c5282
commit 4b13f9352c

277
flake.nix
View File

@@ -8,21 +8,23 @@
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
android.url = "github:tadfisher/android-nixpkgs"; android.url = "github:tadfisher/android-nixpkgs";
}; };
outputs = { outputs =
self, { self
nixpkgs, , nixpkgs
flake-utils, , flake-utils
nix-filter, , nix-filter
naersk, , naersk
fenix, , fenix
android, , android
}: ,
}:
flake-utils.lib.eachDefaultSystem ( flake-utils.lib.eachDefaultSystem (
system: let system:
let
pkgs = nixpkgs.legacyPackages.${system}; pkgs = nixpkgs.legacyPackages.${system};
inherit (pkgs.stdenv) isDarwin; inherit (pkgs.stdenv) isDarwin;
fenixPkgs = fenix.packages.${system}; fenixPkgs = fenix.packages.${system};
naersk' = pkgs.callPackage naersk {}; naersk' = pkgs.callPackage naersk { };
manifest = (pkgs.lib.importTOML ./Cargo.toml).package; manifest = (pkgs.lib.importTOML ./Cargo.toml).package;
androidSdk = android.sdk.${system} (sdkPkgs: androidSdk = android.sdk.${system} (sdkPkgs:
builtins.attrValues { builtins.attrValues {
@@ -104,7 +106,7 @@
mkRustPackage = packageName: mkRustPackage = packageName:
naersk'.buildPackage { naersk'.buildPackage {
pname = packageName; pname = packageName;
cargoBuildOptions = x: x ++ ["--package" packageName]; cargoBuildOptions = x: x ++ [ "--package" packageName ];
version = manifest.version; version = manifest.version;
src = pkgs.lib.cleanSource ./.; src = pkgs.lib.cleanSource ./.;
nativeBuildInputs = [ nativeBuildInputs = [
@@ -117,21 +119,22 @@
doCheck = false; # Disable test as it requires network access. doCheck = false; # Disable test as it requires network access.
}; };
pkgsWin64 = pkgs.pkgsCross.mingwW64; pkgsWin64 = pkgs.pkgsCross.mingwW64;
mkWin64RustPackage = packageName: let mkWin64RustPackage = packageName:
rustTarget = "x86_64-pc-windows-gnu"; let
toolchainWin = fenixPkgs.combine [ rustTarget = "x86_64-pc-windows-gnu";
fenixPkgs.stable.rustc toolchainWin = fenixPkgs.combine [
fenixPkgs.stable.cargo fenixPkgs.stable.rustc
fenixPkgs.targets.${rustTarget}.stable.rust-std fenixPkgs.stable.cargo
]; fenixPkgs.targets.${rustTarget}.stable.rust-std
naerskWin = pkgs.callPackage naersk { ];
cargo = toolchainWin; naerskWin = pkgs.callPackage naersk {
rustc = toolchainWin; cargo = toolchainWin;
}; rustc = toolchainWin;
in };
in
naerskWin.buildPackage rec { naerskWin.buildPackage rec {
pname = packageName; pname = packageName;
cargoBuildOptions = x: x ++ ["--package" packageName]; cargoBuildOptions = x: x ++ [ "--package" packageName ];
version = manifest.version; version = manifest.version;
strictDeps = true; strictDeps = true;
src = pkgs.lib.cleanSource ./.; src = pkgs.lib.cleanSource ./.;
@@ -157,45 +160,46 @@
}; };
pkgsWin32 = pkgs.pkgsCross.mingw32; pkgsWin32 = pkgs.pkgsCross.mingw32;
mkWin32RustPackage = packageName: let mkWin32RustPackage = packageName:
rustTarget = "i686-pc-windows-gnu"; let
in let rustTarget = "i686-pc-windows-gnu";
toolchainWin = fenixPkgs.combine [ in
fenixPkgs.stable.rustc let
fenixPkgs.stable.cargo toolchainWin = fenixPkgs.combine [
fenixPkgs.targets.${rustTarget}.stable.rust-std fenixPkgs.stable.rustc
]; fenixPkgs.stable.cargo
naerskWin = pkgs.callPackage naersk { fenixPkgs.targets.${rustTarget}.stable.rust-std
cargo = toolchainWin; ];
rustc = toolchainWin; naerskWin = pkgs.callPackage naersk {
}; cargo = toolchainWin;
rustc = toolchainWin;
};
# Get rid of MCF Gthread library. # Get rid of MCF Gthread library.
# See <https://github.com/NixOS/nixpkgs/issues/156343> # See <https://github.com/NixOS/nixpkgs/issues/156343>
# and <https://discourse.nixos.org/t/statically-linked-mingw-binaries/38395> # and <https://discourse.nixos.org/t/statically-linked-mingw-binaries/38395>
# for details. # for details.
# #
# Use DWARF-2 instead of SJLJ for exception handling. # Use DWARF-2 instead of SJLJ for exception handling.
winCC = pkgsWin32.buildPackages.wrapCC ( winCC = pkgsWin32.buildPackages.wrapCC (
(pkgsWin32.buildPackages.gcc-unwrapped.override (pkgsWin32.buildPackages.gcc-unwrapped.override
{ {
threadsCross = { threadsCross = {
model = "win32"; model = "win32";
package = null; package = null;
}; };
}).overrideAttrs (oldAttr: {
configureFlags =
oldAttr.configureFlags
++ [
"--disable-sjlj-exceptions --with-dwarf2"
];
}) })
.overrideAttrs (oldAttr: { );
configureFlags = in
oldAttr.configureFlags
++ [
"--disable-sjlj-exceptions --with-dwarf2"
];
})
);
in
naerskWin.buildPackage rec { naerskWin.buildPackage rec {
pname = packageName; pname = packageName;
cargoBuildOptions = x: x ++ ["--package" packageName]; cargoBuildOptions = x: x ++ [ "--package" packageName ];
version = manifest.version; version = manifest.version;
strictDeps = true; strictDeps = true;
src = pkgs.lib.cleanSource ./.; src = pkgs.lib.cleanSource ./.;
@@ -220,27 +224,29 @@
LD = "${winCC}/bin/${winCC.targetPrefix}cc"; LD = "${winCC}/bin/${winCC.targetPrefix}cc";
}; };
mkCrossRustPackage = arch: packageName: let mkCrossRustPackage = arch: packageName:
rustTarget = arch2targets."${arch}".rustTarget; let
crossTarget = arch2targets."${arch}".crossTarget; rustTarget = arch2targets."${arch}".rustTarget;
pkgsCross = import nixpkgs { crossTarget = arch2targets."${arch}".crossTarget;
system = system; pkgsCross = import nixpkgs {
crossSystem.config = crossTarget; system = system;
}; crossSystem.config = crossTarget;
in let };
toolchain = fenixPkgs.combine [ in
fenixPkgs.stable.rustc let
fenixPkgs.stable.cargo toolchain = fenixPkgs.combine [
fenixPkgs.targets.${rustTarget}.stable.rust-std fenixPkgs.stable.rustc
]; fenixPkgs.stable.cargo
naersk-lib = pkgs.callPackage naersk { fenixPkgs.targets.${rustTarget}.stable.rust-std
cargo = toolchain; ];
rustc = toolchain; naersk-lib = pkgs.callPackage naersk {
}; cargo = toolchain;
in rustc = toolchain;
};
in
naersk-lib.buildPackage rec { naersk-lib.buildPackage rec {
pname = packageName; pname = packageName;
cargoBuildOptions = x: x ++ ["--package" packageName]; cargoBuildOptions = x: x ++ [ "--package" packageName ];
version = manifest.version; version = manifest.version;
strictDeps = true; strictDeps = true;
src = rustSrc; src = rustSrc;
@@ -280,24 +286,25 @@
}; };
}; };
mkAndroidRustPackage = arch: packageName: let mkAndroidRustPackage = arch: packageName:
rustTarget = androidAttrs.${arch}.rustTarget; let
toolchain = fenixPkgs.combine [ rustTarget = androidAttrs.${arch}.rustTarget;
fenixPkgs.stable.rustc toolchain = fenixPkgs.combine [
fenixPkgs.stable.cargo fenixPkgs.stable.rustc
fenixPkgs.targets.${rustTarget}.stable.rust-std fenixPkgs.stable.cargo
]; fenixPkgs.targets.${rustTarget}.stable.rust-std
naersk-lib = pkgs.callPackage naersk { ];
cargo = toolchain; naersk-lib = pkgs.callPackage naersk {
rustc = toolchain; cargo = toolchain;
}; rustc = toolchain;
targetToolchain = "${androidNdkRoot}/toolchains/llvm/prebuilt/linux-x86_64"; };
targetCcName = androidAttrs.${arch}.cc; targetToolchain = "${androidNdkRoot}/toolchains/llvm/prebuilt/linux-x86_64";
targetCc = "${targetToolchain}/bin/${targetCcName}"; targetCcName = androidAttrs.${arch}.cc;
in targetCc = "${targetToolchain}/bin/${targetCcName}";
in
naersk-lib.buildPackage rec { naersk-lib.buildPackage rec {
pname = packageName; pname = packageName;
cargoBuildOptions = x: x ++ ["--package" packageName]; cargoBuildOptions = x: x ++ [ "--package" packageName ];
version = manifest.version; version = manifest.version;
strictDeps = true; strictDeps = true;
src = rustSrc; src = rustSrc;
@@ -323,39 +330,42 @@
"deltachat-repl-${arch}-android" = mkAndroidRustPackage arch "deltachat-repl"; "deltachat-repl-${arch}-android" = mkAndroidRustPackage arch "deltachat-repl";
}; };
mkRustPackages = arch: let mkRustPackages = arch:
rpc-server = mkCrossRustPackage arch "deltachat-rpc-server"; let
in { rpc-server = mkCrossRustPackage arch "deltachat-rpc-server";
"deltachat-repl-${arch}" = mkCrossRustPackage arch "deltachat-repl"; in
"deltachat-rpc-server-${arch}" = rpc-server; {
"deltachat-rpc-server-${arch}-wheel" = pkgs.stdenv.mkDerivation { "deltachat-repl-${arch}" = mkCrossRustPackage arch "deltachat-repl";
pname = "deltachat-rpc-server-${arch}-wheel"; "deltachat-rpc-server-${arch}" = rpc-server;
version = manifest.version; "deltachat-rpc-server-${arch}-wheel" = pkgs.stdenv.mkDerivation {
src = nix-filter.lib { pname = "deltachat-rpc-server-${arch}-wheel";
root = ./.; version = manifest.version;
include = [ src = nix-filter.lib {
"scripts/wheel-rpc-server.py" root = ./.;
"deltachat-rpc-server/README.md" include = [
"LICENSE" "scripts/wheel-rpc-server.py"
"Cargo.toml" "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'';
}; };
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'';
}; };
}; in
in { {
formatter = pkgs.nixpkgs-fmt; formatter = pkgs.nixpkgs-fmt;
packages = packages =
@@ -435,7 +445,7 @@
pname = "docs"; pname = "docs";
version = manifest.version; version = manifest.version;
src = pkgs.lib.cleanSource ./.; src = pkgs.lib.cleanSource ./.;
nativeBuildInputs = [pkgs.doxygen]; nativeBuildInputs = [ pkgs.doxygen ];
buildPhase = ''scripts/run-doxygen.sh''; buildPhase = ''scripts/run-doxygen.sh'';
installPhase = ''mkdir -p $out; cp -av deltachat-ffi/html deltachat-ffi/xml $out''; installPhase = ''mkdir -p $out; cp -av deltachat-ffi/html deltachat-ffi/xml $out'';
}; };
@@ -521,18 +531,19 @@
pkgs.python3Packages.breathe pkgs.python3Packages.breathe
pkgs.python3Packages.sphinx_rtd_theme pkgs.python3Packages.sphinx_rtd_theme
]; ];
nativeBuildInputs = [pkgs.sphinx]; nativeBuildInputs = [ pkgs.sphinx ];
buildPhase = ''sphinx-build -b html -a python/doc/ dist/html''; buildPhase = ''sphinx-build -b html -a python/doc/ dist/html'';
installPhase = ''mkdir -p $out; cp -av dist/html $out''; installPhase = ''mkdir -p $out; cp -av dist/html $out'';
}; };
}; };
devShells.default = let devShells.default =
pkgs = import nixpkgs { let
system = system; pkgs = import nixpkgs {
overlays = [fenix.overlays.default]; system = system;
}; overlays = [ fenix.overlays.default ];
in };
in
pkgs.mkShell { pkgs.mkShell {
buildInputs = with pkgs; [ buildInputs = with pkgs; [
(fenix.packages.${system}.complete.withComponents [ (fenix.packages.${system}.complete.withComponents [