Skip to content

Commit

Permalink
cargo-tauri.hook: init (#335751)
Browse files Browse the repository at this point in the history
  • Loading branch information
philiptaron authored Oct 1, 2024
2 parents fab601b + 26b1cef commit 69bd130
Show file tree
Hide file tree
Showing 19 changed files with 1,809 additions and 263 deletions.
1 change: 1 addition & 0 deletions doc/hooks/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ postgresql-test-hook.section.md
premake.section.md
python.section.md
scons.section.md
tauri.section.md
tetex-tex-live.section.md
unzip.section.md
validatePkgConfig.section.md
Expand Down
108 changes: 108 additions & 0 deletions doc/hooks/tauri.section.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# cargo-tauri.hook {#tauri-hook}

[Tauri](https://tauri.app/) is a framework for building smaller, faster, and
more secure desktop applications with a web frontend.

In Nixpkgs, `cargo-tauri.hook` overrides the default build and install phases.

## Example code snippet {#tauri-hook-example-code-snippet}

```nix
{
lib,
stdenv,
rustPlatform,
fetchNpmDeps,
cargo-tauri,
darwin,
glib-networking,
libsoup,
nodejs,
npmHooks,
openssl,
pkg-config,
webkitgtk,
wrapGAppsHook3,
}:
rustPlatform.buildRustPackage rec {
# . . .
cargoHash = "...";
# Assuming our app's frontend uses `npm` as a package manager
npmDeps = fetchNpmDeps {
name = "${pname}-npm-deps-${version}";
inherit src;
hash = "...";
};
nativeBuildInputs = [
# Pull in our main hook
cargo-tauri.hook
# Setup npm
nodejs
npmHooks.npmConfigHook
# Make sure we can find our libraries
pkg-config
wrapGAppsHook3
];
buildInputs =
[ openssl ]
++ lib.optionals stdenv.isLinux [
glib-networking # Most Tauri apps need networking
libsoup
webkitgtk
]
++ lib.optionals stdenv.isDarwin (
with darwin.apple_sdk.frameworks;
[
AppKit
CoreServices
Security
WebKit
]
);
# Set our Tauri source directory
cargoRoot = "src-tauri";
# And make sure we build there too
buildAndTestSubdir = cargoRoot;
# . . .
}
```

## Variables controlling cargo-tauri {#tauri-hook-variables-controlling}

### Tauri Exclusive Variables {#tauri-hook-exclusive-variables}

#### `tauriBuildFlags` {#tauri-build-flags}

Controls the flags passed to `cargo tauri build`.

#### `tauriBundleType` {#tauri-bundle-type}

The [bundle type](https://tauri.app/v1/guides/building/) to build.

#### `dontTauriBuild` {#dont-tauri-build}

Disables using `tauriBuildHook`.

#### `dontTauriInstall` {#dont-tauri-install}

Disables using `tauriInstallPostBuildHook` and `tauriInstallHook`.

### Honored Variables {#tauri-hook-honored-variables}

Along with those found in [](#compiling-rust-applications-with-cargo), the
following variables used by `cargoBuildHook` and `cargoInstallHook` are honored
by the cargo-tauri setup hook.

- `buildAndTestSubdir`
- `cargoBuildType`
- `cargoBuildNoDefaultFeatures`
- `cargoBuildFeatures`
3 changes: 3 additions & 0 deletions nixos/doc/manual/release-notes/rl-2411.section.md
Original file line number Diff line number Diff line change
Expand Up @@ -591,6 +591,9 @@

- The arguments from [](#opt-services.postgresql.initdbArgs) now get shell-escaped.

- `cargo-tauri.hook` was introduced to help users build [Tauri](https://tauri.app/) projects. It is meant to be used alongside
`rustPlatform.buildRustPackage` and Node hooks such as `npmConfigHook`, `pnpm.configHook`, and the new `yarnConfig`

- Support for *runner registration tokens* has been [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/380872)
in `gitlab-runner` 15.6 and is expected to be removed in `gitlab-runner` 18.0. Configuration of existing runners
should be changed to using *runner authentication tokens* by configuring
Expand Down
35 changes: 13 additions & 22 deletions pkgs/applications/misc/insulator2/default.nix
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
{ lib
, cmake
, dbus
, fetchFromGitHub
, fetchYarnDeps
Expand All @@ -13,12 +12,14 @@
, cyrus_sasl
, stdenv
, fixup_yarn_lock
, yarn
, yarnConfigHook
, nodejs-slim
, cargo-tauri
, cargo
, rustPlatform
, rustc
, jq
, moreutils
}:

stdenv.mkDerivation rec {
Expand All @@ -32,6 +33,11 @@ stdenv.mkDerivation rec {
hash = "sha256-Bi9GCQr7yox5Plc7o0svRKYi1XoK/HDGj1VbW1z4jac=";
};

# Yarn *really* wants us to use corepack if this is set
postPatch = ''
jq 'del(.packageManager)' package.json | sponge package.json
'';

yarnOfflineCache = fetchYarnDeps {
yarnLock = "${src}/yarn.lock";
hash = "sha256-ih5NSOvYje981SkVfPHm/u2sS1B36kgxpfe9LmQaxdo=";
Expand All @@ -47,37 +53,22 @@ stdenv.mkDerivation rec {
};
};

configurePhase = ''
export HOME=$(mktemp -d)
yarn config --offline set yarn-offline-mirror ${yarnOfflineCache}
fixup_yarn_lock yarn.lock
yarn install --offline --frozen-lockfile --ignore-scripts --no-progress --non-interactive
patchShebangs node_modules/
yarn run postinstall --offline
'';

preBuild = ''
yarn tauri build -b deb
'';

cargoRoot = "backend/";

preInstall = ''
mv backend/target/release/bundle/deb/*/data/usr/ "$out"
'';
buildAndTestDir = cargoRoot;

nativeBuildInputs = [
cmake
pkg-config
perl
rustPlatform.cargoSetupHook
cargo
rustc
cargo-tauri
cargo-tauri.hook
fixup_yarn_lock
yarn
yarnConfigHook
nodejs-slim
cyrus_sasl
jq
moreutils # for sponge
];

buildInputs = [
Expand Down
56 changes: 56 additions & 0 deletions pkgs/by-name/ca/cargo-tauri/hook.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
{
lib,
stdenv,
makeSetupHook,
cargo,
cargo-tauri,
rust,
# The subdirectory of `target/` from which to copy the build artifacts
targetSubdirectory ? stdenv.hostPlatform.rust.cargoShortTarget,
}:

let
kernelName = stdenv.hostPlatform.parsed.kernel.name;
in
makeSetupHook {
name = "tauri-hook";

propagatedBuildInputs = [
cargo
cargo-tauri
];

substitutions = {
inherit targetSubdirectory;
inherit (rust.envVars) rustHostPlatformSpec setEnv;

# A map of the bundles used for Tauri's different supported platforms
# https://github.com/tauri-apps/tauri/blob/23a912bb84d7c6088301e1ffc59adfa8a799beab/README.md#platforms
defaultTauriBundleType =
{
darwin = "app";
linux = "deb";
}
.${kernelName} or (throw "${kernelName} is not supported by cargo-tauri.hook");

# $targetDir is the path to the build artifacts (i.e., `./target/release`)
installScript =
{
darwin = ''
mkdir $out
mv "$targetDir"/bundle/macos $out/Applications
'';

linux = ''
mv "$targetDir"/bundle/deb/*/data/usr $out
'';
}
.${kernelName} or (throw "${kernelName} is not supported by cargo-tauri.hook");
};

meta = {
inherit (cargo-tauri.meta) maintainers broken;
# Platforms that Tauri supports bundles for
platforms = lib.platforms.darwin ++ lib.platforms.linux;
};
} ./hook.sh
101 changes: 101 additions & 0 deletions pkgs/by-name/ca/cargo-tauri/hook.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# shellcheck shell=bash disable=SC2034,SC2154,SC2164

# We replace these
export dontCargoBuild=true
export dontCargoInstall=true

tauriBuildHook() {
echo "Executing tauriBuildHook"

runHook preBuild

## The following is lifted from rustPlatform.cargoBuildHook
## As we're replacing it, we should also be respecting its options.

# Account for running outside of mkRustPackage where this may not be set
cargoBuildType="${cargoBuildType:-release}"

# Let stdenv handle stripping, for consistency and to not break
# separateDebugInfo.
export "CARGO_PROFILE_${cargoBuildType@U}_STRIP"=false

if [ -n "${buildAndTestSubdir-}" ]; then
# ensure the output doesn't end up in the subdirectory
CARGO_TARGET_DIR="$(pwd)/target"
export CARGO_TARGET_DIR

# Tauri doesn't respect $CARGO_TARGET_DIR, but does respect the cargo
# argument...but that doesn't respect `--target`, so we have to use the
# config file
# https://github.com/tauri-apps/tauri/issues/10190
printf '\nbuild.target-dir = "%s"' "$CARGO_TARGET_DIR" >>config.toml

pushd "${buildAndTestSubdir}"
fi

local cargoFlagsArray=(
"-j" "$NIX_BUILD_CORES"
"--target" "@rustHostPlatformSpec@"
"--offline"
)
local tauriFlagsArray=(
"--bundles" "${tauriBundleType:-@defaultTauriBundleType@}"
"--target" "@rustHostPlatformSpec@"
)

if [ "${cargoBuildType}" != "debug" ]; then
cargoFlagsArray+=("--profile" "${cargoBuildType}")
fi

if [ -n "${cargoBuildNoDefaultFeatures-}" ]; then
cargoFlagsArray+=("--no-default-features")
fi

if [ -n "${cargoBuildFeatures-}" ]; then
cargoFlagsArray+=("--features=$(concatStringsSep "," cargoBuildFeatures)")
fi

concatTo cargoFlagsArray cargoBuildFlags

if [ "${cargoBuildType:-}" == "debug" ]; then
tauriFlagsArray+=("--debug")
fi

concatTo tauriFlagsArray tauriBuildFlags

echoCmd 'cargo-tauri.hook cargoFlags' "${cargoFlagsArray[@]}"
echoCmd 'cargo-tauri.hook tauriFlags' "${tauriFlagsArray[@]}"

@setEnv@ cargo tauri build "${tauriFlagsArray[@]}" -- "${cargoFlagsArray[@]}"

if [ -n "${buildAndTestSubdir-}" ]; then
popd
fi

runHook postBuild

echo "Finished tauriBuildHook"
}

tauriInstallHook() {
echo "Executing tauriInstallHook"

runHook preInstall

# Use a nice variable for our target directory in the following script
targetDir=target/@targetSubdirectory@/$cargoBuildType

@installScript@

runHook postInstall

echo "Finished tauriInstallHook"
}

if [ -z "${dontTauriBuild:-}" ] && [ -z "${buildPhase:-}" ]; then
buildPhase=tauriBuildHook
fi

if [ -z "${dontTauriInstall:-}" ] && [ -z "${installPhase:-}" ]; then
installPhase=tauriInstallHook
fi
Loading

0 comments on commit 69bd130

Please sign in to comment.