build(nix): cleanup cross-compilation code

This commit is contained in:
link2xt
2024-03-05 06:26:41 +00:00
parent 273719ae7c
commit 251917e602

290
flake.nix
View File

@@ -14,6 +14,69 @@
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;
rustSrc = nix-filter.lib {
root = ./.;
# Include only necessary files
# to avoid rebuilds e.g. when README.md or flake.nix changes.
include = [
./benches
./assets
./Cargo.lock
./Cargo.toml
./CMakeLists.txt
./CONTRIBUTING.md
./deltachat_derive
./deltachat-ffi
./deltachat-jsonrpc
./deltachat-ratelimit
./deltachat-repl
./deltachat-rpc-client
./deltachat-time
./deltachat-rpc-server
./format-flowed
./release-date.in
./src
];
exclude = [
(nix-filter.lib.matchExt "nix")
"flake.lock"
];
};
# Map from architecture name to rust targets and nixpkgs targets.
arch2targets = {
"x86_64-linux" = {
rustTarget = "x86_64-unknown-linux-musl";
crossTarget = "x86_64-unknown-linux-musl";
};
"armv7l-linux" = {
rustTarget = "armv7-unknown-linux-musleabihf";
crossTarget = "armv7l-unknown-linux-musleabihf";
};
"armv6l-linux" = {
rustTarget = "arm-unknown-linux-musleabihf";
crossTarget = "armv6l-unknown-linux-musleabihf";
};
"aarch64-linux" = {
rustTarget = "aarch64-unknown-linux-musl";
crossTarget = "aarch64-unknown-linux-musl";
};
"i686-linux" = {
rustTarget = "i686-unknown-linux-musl";
crossTarget = "i686-unknown-linux-musl";
};
"x86_64-darwin" = {
rustTarget = "x86_64-apple-darwin";
crossTarget = "x86_64-darwin";
};
"aarch64-darwin" = {
rustTarget = "aarch64-apple-darwin";
crossTarget = "aarch64-darwin";
};
};
cargoLock = { cargoLock = {
lockFile = ./Cargo.lock; lockFile = ./Cargo.lock;
outputHashes = { outputHashes = {
@@ -141,8 +204,10 @@
LD = "${winCC}/bin/${winCC.targetPrefix}cc"; LD = "${winCC}/bin/${winCC.targetPrefix}cc";
}; };
mkCrossRustPackage = rustTarget: crossTarget: packageName: mkCrossRustPackage = arch: packageName:
let let
rustTarget = arch2targets."${arch}".rustTarget;
crossTarget = arch2targets."${arch}".crossTarget;
pkgsCross = import nixpkgs { pkgsCross = import nixpkgs {
system = system; system = system;
crossSystem.config = crossTarget; crossSystem.config = crossTarget;
@@ -164,7 +229,7 @@
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 = rustSrc;
nativeBuildInputs = [ nativeBuildInputs = [
pkgs.perl # Needed to build vendored OpenSSL. pkgs.perl # Needed to build vendored OpenSSL.
]; ];
@@ -182,150 +247,113 @@
LD = "${pkgsCross.stdenv.cc}/bin/${pkgsCross.stdenv.cc.targetPrefix}cc"; LD = "${pkgsCross.stdenv.cc}/bin/${pkgsCross.stdenv.cc.targetPrefix}cc";
}; };
mk-aarch64-RustPackage = mkCrossRustPackage "aarch64-unknown-linux-musl" "aarch64-unknown-linux-musl"; mkRustPackages = arch: {
mk-i686-RustPackage = mkCrossRustPackage "i686-unknown-linux-musl" "i686-unknown-linux-musl"; "deltachat-repl-${arch}" = mkCrossRustPackage arch "deltachat-repl";
mk-x86_64-RustPackage = mkCrossRustPackage "x86_64-unknown-linux-musl" "x86_64-unknown-linux-musl"; "deltachat-rpc-server-${arch}" = mkCrossRustPackage arch "deltachat-rpc-server";
mk-armv7l-RustPackage = mkCrossRustPackage "armv7-unknown-linux-musleabihf" "armv7l-unknown-linux-musleabihf"; };
mk-armv6l-RustPackage = mkCrossRustPackage "arm-unknown-linux-musleabihf" "armv6l-unknown-linux-musleabihf";
in in
{ {
formatter = pkgs.nixpkgs-fmt; formatter = pkgs.nixpkgs-fmt;
packages = rec { packages =
# Run with `nix run .#deltachat-repl foo.db`. mkRustPackages "aarch64-linux" //
deltachat-repl = mkRustPackage "deltachat-repl"; mkRustPackages "i686-linux" //
deltachat-rpc-server = mkRustPackage "deltachat-rpc-server"; mkRustPackages "x86_64-linux" //
mkRustPackages "armv7l-linux" //
mkRustPackages "armv6l-linux" // rec {
# Run with `nix run .#deltachat-repl foo.db`.
deltachat-repl = mkRustPackage "deltachat-repl";
deltachat-rpc-server = mkRustPackage "deltachat-rpc-server";
deltachat-repl-win64 = mkWin64RustPackage "deltachat-repl"; deltachat-repl-win64 = mkWin64RustPackage "deltachat-repl";
deltachat-rpc-server-win64 = mkWin64RustPackage "deltachat-rpc-server"; deltachat-rpc-server-win64 = mkWin64RustPackage "deltachat-rpc-server";
deltachat-repl-win32 = mkWin32RustPackage "deltachat-repl"; deltachat-repl-win32 = mkWin32RustPackage "deltachat-repl";
deltachat-rpc-server-win32 = mkWin32RustPackage "deltachat-rpc-server"; deltachat-rpc-server-win32 = mkWin32RustPackage "deltachat-rpc-server";
deltachat-repl-aarch64-linux = mk-aarch64-RustPackage "deltachat-repl";
deltachat-rpc-server-aarch64-linux = mk-aarch64-RustPackage "deltachat-rpc-server";
deltachat-repl-i686-linux = mk-i686-RustPackage "deltachat-repl";
deltachat-rpc-server-i686-linux = mk-i686-RustPackage "deltachat-rpc-server";
deltachat-repl-x86_64-linux = mk-x86_64-RustPackage "deltachat-repl"; # Run `nix build .#docs` to get C docs generated in `./result/`.
deltachat-rpc-server-x86_64-linux = mk-x86_64-RustPackage "deltachat-rpc-server"; 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'';
};
deltachat-repl-armv7l-linux = mk-armv7l-RustPackage "deltachat-repl"; libdeltachat =
deltachat-rpc-server-armv7l-linux = mk-armv7l-RustPackage "deltachat-rpc-server"; pkgs.stdenv.mkDerivation rec {
pname = "libdeltachat";
version = manifest.version;
src = rustSrc;
cargoDeps = pkgs.rustPlatform.importCargoLock cargoLock;
deltachat-repl-armv6l-linux = mk-armv6l-RustPackage "deltachat-repl"; nativeBuildInputs = [
deltachat-rpc-server-armv6l-linux = mk-armv6l-RustPackage "deltachat-rpc-server"; pkgs.perl # Needed to build vendored OpenSSL.
pkgs.cmake
# Run `nix build .#docs` to get C docs generated in `./result/`. pkgs.rustPlatform.cargoSetupHook
docs = pkgs.cargo
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 =
pkgs.stdenv.mkDerivation rec {
pname = "libdeltachat";
version = manifest.version;
src = nix-filter.lib {
root = ./.;
# Include only necessary files
# to avoid rebuilds e.g. when README.md or flake.nix changes.
include = [
./benches
./assets
./Cargo.lock
./Cargo.toml
./CMakeLists.txt
./CONTRIBUTING.md
./deltachat_derive
./deltachat-ffi
./deltachat-jsonrpc
./deltachat-ratelimit
./deltachat-repl
./deltachat-rpc-client
./deltachat-time
./deltachat-rpc-server
./format-flowed
./release-date.in
./src
]; ];
exclude = [
(nix-filter.lib.matchExt "nix") postInstall = ''
"flake.lock" substituteInPlace $out/include/deltachat.h \
--replace __FILE__ '"${placeholder "out"}/include/deltachat.h"'
'';
};
deltachat-rpc-client =
pkgs.python3Packages.buildPythonPackage rec {
pname = "deltachat-rpc-client";
version = manifest.version;
src = pkgs.lib.cleanSource ./deltachat-rpc-client;
format = "pyproject";
propagatedBuildInputs = [
pkgs.python3Packages.setuptools
pkgs.python3Packages.setuptools_scm
]; ];
}; };
cargoDeps = pkgs.rustPlatform.importCargoLock cargoLock;
nativeBuildInputs = [ deltachat-python =
pkgs.perl # Needed to build vendored OpenSSL. pkgs.python3Packages.buildPythonPackage rec {
pkgs.cmake pname = "deltachat-python";
pkgs.rustPlatform.cargoSetupHook version = manifest.version;
pkgs.cargo src = pkgs.lib.cleanSource ./python;
]; format = "pyproject";
buildInputs = [
postInstall = '' libdeltachat
substituteInPlace $out/include/deltachat.h \ ];
--replace __FILE__ '"${placeholder "out"}/include/deltachat.h"' nativeBuildInputs = [
''; pkgs.pkg-config
}; ];
propagatedBuildInputs = [
deltachat-rpc-client = pkgs.python3Packages.setuptools
pkgs.python3Packages.buildPythonPackage rec { pkgs.python3Packages.setuptools_scm
pname = "deltachat-rpc-client"; pkgs.python3Packages.pkgconfig
version = manifest.version; pkgs.python3Packages.cffi
src = pkgs.lib.cleanSource ./deltachat-rpc-client; pkgs.python3Packages.imap-tools
format = "pyproject"; pkgs.python3Packages.pluggy
propagatedBuildInputs = [ pkgs.python3Packages.requests
pkgs.python3Packages.setuptools ];
pkgs.python3Packages.setuptools_scm };
]; python-docs =
}; pkgs.stdenv.mkDerivation {
pname = "docs";
deltachat-python = version = manifest.version;
pkgs.python3Packages.buildPythonPackage rec { src = pkgs.lib.cleanSource ./.;
pname = "deltachat-python"; buildInputs = [
version = manifest.version; deltachat-python
src = pkgs.lib.cleanSource ./python; deltachat-rpc-client
format = "pyproject"; pkgs.python3Packages.breathe
buildInputs = [ pkgs.python3Packages.sphinx_rtd_theme
libdeltachat ];
]; nativeBuildInputs = [ pkgs.sphinx ];
nativeBuildInputs = [ buildPhase = ''sphinx-build -b html -a python/doc/ dist/html'';
pkgs.pkg-config installPhase = ''mkdir -p $out; cp -av dist/html $out'';
]; };
propagatedBuildInputs = [ };
pkgs.python3Packages.setuptools
pkgs.python3Packages.setuptools_scm
pkgs.python3Packages.pkgconfig
pkgs.python3Packages.cffi
pkgs.python3Packages.imap-tools
pkgs.python3Packages.pluggy
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'';
};
};
} }
); );
} }