Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cargo-tauri.hook: init #335751

Merged
merged 16 commits into from
Oct 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.
getchoo marked this conversation as resolved.
Show resolved Hide resolved

## 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
getchoo marked this conversation as resolved.
Show resolved Hide resolved
}:

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
getchoo marked this conversation as resolved.
Show resolved Hide resolved
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
getchoo marked this conversation as resolved.
Show resolved Hide resolved
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
getchoo marked this conversation as resolved.
Show resolved Hide resolved
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