diff --git a/pkgs/by-name/tr/tree-sitter/package.nix b/pkgs/by-name/tr/tree-sitter/package.nix index 1ae410255fc0..a456828b16b2 100644 --- a/pkgs/by-name/tr/tree-sitter/package.nix +++ b/pkgs/by-name/tr/tree-sitter/package.nix @@ -18,8 +18,11 @@ substitute, installShellFiles, buildPackages, + cmake, + wasmtime_36, enableShared ? !stdenv.hostPlatform.isStatic, enableStatic ? stdenv.hostPlatform.isStatic, + wasmSupport ? false, webUISupport ? false, }: @@ -124,9 +127,14 @@ rustPlatform.buildRustPackage (finalAttrs: { cargoHash = "sha256-9FeWnWWPUWmMF15Psmul8GxGv2JceHWc2WZPmOr81gw="; + cargoBuildFeatures = lib.optionals wasmSupport [ "wasm" ]; + buildInputs = [ installShellFiles ] + ++ lib.optionals wasmSupport [ + wasmtime_36 + ] ++ lib.optionals webUISupport [ openssl ]; @@ -134,6 +142,9 @@ rustPlatform.buildRustPackage (finalAttrs: { rustPlatform.bindgenHook which ] + ++ lib.optionals wasmSupport [ + cmake + ] ++ lib.optionals webUISupport [ emscripten pkg-config @@ -164,6 +175,15 @@ rustPlatform.buildRustPackage (finalAttrs: { sed -i '/^install:/,/^[^[:space:]]/ { /$(SOEXT/d; }' ./Makefile ''; + # The Makefile install can't enable the wasm feature. + cmakeFlags = lib.optionals wasmSupport [ + (lib.cmakeBool "TREE_SITTER_FEATURE_WASM" true) + (lib.cmakeFeature "WASMTIME_INCLUDE_DIR" "${lib.getDev wasmtime_36}/include") + (lib.cmakeFeature "WASMTIME_LIBRARY" "${lib.getLib wasmtime_36}/lib/libwasmtime${stdenv.hostPlatform.extensions.sharedLibrary}") + (lib.cmakeFeature "CMAKE_INSTALL_INCLUDEDIR" "include") + (lib.cmakeFeature "CMAKE_INSTALL_LIBDIR" "lib") + ]; + # Compile web assembly with emscripten. The --debug flag prevents us from # minifying the JavaScript; passing it allows us to side-step more Node # JS dependencies for installation. @@ -175,6 +195,11 @@ rustPlatform.buildRustPackage (finalAttrs: { postInstall = '' PREFIX=$out make install + '' + + lib.optionalString wasmSupport '' + cmake --install $cmakeBuildDir + '' + + '' ${lib.optionalString (!enableShared) "rm -f $out/lib/*.so{,.*}"} ${lib.optionalString (!enableStatic) "rm -f $out/lib/*.a"} @@ -196,6 +221,16 @@ rustPlatform.buildRustPackage (finalAttrs: { # test result: FAILED. 120 passed; 13 failed; 0 ignored; 0 measured; 0 filtered out doCheck = false; + # CMake builds libtree-sitter with wasm support; cargo still builds the CLI. + ${if wasmSupport then "configurePhase" else null} = '' + cmakeConfigurePhase + cd .. + ''; + + ${if wasmSupport then "postBuild" else null} = '' + cmake --build $cmakeBuildDir + ''; + passthru = { inherit grammars