From a99852ad181f2399983dd9ac60798cf89ef3b711 Mon Sep 17 00:00:00 2001 From: Herwig Hochleitner Date: Thu, 11 May 2023 13:36:05 +0200 Subject: [PATCH] lldap: build frontend from source Co-authored-by: Emily Lange --- pkgs/servers/ldap/lldap/default.nix | 127 +++++++++++++++++++--------- 1 file changed, 87 insertions(+), 40 deletions(-) diff --git a/pkgs/servers/ldap/lldap/default.nix b/pkgs/servers/ldap/lldap/default.nix index 50249e9dbe45..c4c6e1cc4384 100644 --- a/pkgs/servers/ldap/lldap/default.nix +++ b/pkgs/servers/ldap/lldap/default.nix @@ -1,68 +1,115 @@ -{ fetchFromGitHub +{ binaryen +, fetchFromGitHub +, fetchpatch , fetchzip , lib , lldap , nixosTests , rustPlatform +, stdenv +, wasm-bindgen-cli +, wasm-pack +, which }: let - # We cannot build the wasm frontend from source, as the - # wasm32-unknown-unknown rustc target isn't available in nixpkgs yet. - # Tracking issue: https://github.com/NixOS/nixpkgs/issues/89426 - frontend = fetchzip { - url = "https://github.com/lldap/lldap/releases/download/v${lldap.version}/amd64-lldap.tar.gz"; - hash = "sha256-/Ml4L5Gxpnmt1pLSiLNuxtzQYjTCatsVe/hE+Btl8BI="; - name = "lldap-frontend-${lldap.version}"; - postFetch = '' - mv $out $TMPDIR/extracted - mv $TMPDIR/extracted/app $out + + # version of wasm-opt, with https://github.com/rustwasm/wasm-pack/pull/1257 backported + wasm-pack-git = wasm-pack.overrideAttrs (oldAttrs: { + version = oldAttrs.version + "-git"; + patches = [(fetchpatch { + url = "https://patch-diff.githubusercontent.com/raw/rustwasm/wasm-pack/pull/1257.patch"; + sha256 = "sha256-npi9ewh0NaD67crTcje9AYxaLLOJOMzqjqEJXZF2LbQ="; + })]; + }); + + # replace with upstream wasm rustc, after resolution of + # https://github.com/NixOS/nixpkgs/issues/89426 + rustc-wasm = (rustPlatform.rust.rustc.override { + stdenv = stdenv.override { + targetPlatform = stdenv.targetPlatform // { + parsed = { + cpu.name = "wasm32"; + vendor.name = "unknown"; + kernel.name = "unknown"; + abi.name = "unknown"; + }; + }; + }; + }).overrideAttrs (attrs: { + configureFlags = attrs.configureFlags ++ ["--set=build.docs=false"]; + }); + + commonDerivationAttrs = rec { + pname = "lldap"; + version = "0.4.3"; + + src = fetchFromGitHub { + owner = "lldap"; + repo = "lldap"; + rev = "v${version}"; + hash = "sha256-FAUTykFh2eGVpx6LrCjV9xWbBPH8pCgAJv3vOXFMFZ4="; + }; + + postPatch = '' + ln -s --force ${./Cargo.lock} Cargo.lock ''; - }; -in -rustPlatform.buildRustPackage rec { - pname = "lldap"; - version = "0.4.3"; - src = fetchFromGitHub { - owner = "lldap"; - repo = "lldap"; - rev = "v${version}"; - hash = "sha256-FAUTykFh2eGVpx6LrCjV9xWbBPH8pCgAJv3vOXFMFZ4="; - }; - - # `Cargo.lock` has git dependencies, meaning can't use `cargoHash` - cargoLock = { - # 0.4.3 has been tagged before the actual Cargo.lock bump, resulting in an inconsitent lock file. - # To work around this, the Cargo.lock below is from the commit right after the tag: - # https://github.com/lldap/lldap/commit/7b4188a376baabda48d88fdca3a10756da48adda - lockFile = ./Cargo.lock; - outputHashes = { - "lber-0.4.1" = "sha256-2rGTpg8puIAXggX9rEbXPdirfetNOHWfFc80xqzPMT4="; - "opaque-ke-0.6.1" = "sha256-99gaDv7eIcYChmvOKQ4yXuaGVzo2Q6BcgSQOzsLF+fM="; - "yew_form-0.1.8" = "sha256-1n9C7NiFfTjbmc9B5bDEnz7ZpYJo9ZT8/dioRXJ65hc="; + # `Cargo.lock` has git dependencies, meaning can't use `cargoHash` + cargoLock = { + # 0.4.3 has been tagged before the actual Cargo.lock bump, resulting in an inconsitent lock file. + # To work around this, the Cargo.lock below is from the commit right after the tag: + # https://github.com/lldap/lldap/commit/7b4188a376baabda48d88fdca3a10756da48adda + lockFile = ./Cargo.lock; + outputHashes = { + "lber-0.4.1" = "sha256-2rGTpg8puIAXggX9rEbXPdirfetNOHWfFc80xqzPMT4="; + "opaque-ke-0.6.1" = "sha256-99gaDv7eIcYChmvOKQ4yXuaGVzo2Q6BcgSQOzsLF+fM="; + "yew_form-0.1.8" = "sha256-1n9C7NiFfTjbmc9B5bDEnz7ZpYJo9ZT8/dioRXJ65hc="; + }; }; }; + frontend = rustPlatform.buildRustPackage (commonDerivationAttrs // { + pname = commonDerivationAttrs.pname + "-frontend"; + + nativeBuildInputs = [ + wasm-pack-git wasm-bindgen-cli binaryen which rustc-wasm rustc-wasm.llvmPackages.lld + ]; + + buildPhase = '' + HOME=`pwd` RUSTFLAGS="-C linker=lld" ./app/build.sh + ''; + + installPhase = '' + mkdir -p $out + cp -R app/{index.html,pkg,static} $out/ + ''; + + doCheck = false; + }); + +in rustPlatform.buildRustPackage (commonDerivationAttrs // { patches = [ ./static-frontend-path.patch ]; - postPatch = '' - ln -s --force ${./Cargo.lock} Cargo.lock + postPatch = commonDerivationAttrs.postPatch + '' substituteInPlace server/src/infra/tcp_server.rs --subst-var-by frontend '${frontend}' ''; - passthru.tests = { - inherit (nixosTests) lldap; + passthru = { + inherit frontend; + tests = { + inherit (nixosTests) lldap; + }; }; meta = with lib; { description = "A lightweight authentication server that provides an opinionated, simplified LDAP interface for authentication"; homepage = "https://github.com/lldap/lldap"; - changelog = "https://github.com/lldap/lldap/blob/v${version}/CHANGELOG.md"; + changelog = "https://github.com/lldap/lldap/blob/v${lldap.version}/CHANGELOG.md"; license = licenses.gpl3Only; platforms = platforms.linux; - maintainers = with maintainers; [ indeednotjames ]; + maintainers = with maintainers; [ indeednotjames bendlas ]; }; -} +})