nixpkgs/pkgs/misc/vscode-extensions/ms-dotnettools-csharp/default.nix

138 lines
4.1 KiB
Nix

{ lib
, fetchurl
, vscode-utils
, unzip
, patchelf
, makeWrapper
, icu
, stdenv
, openssl
, mono
}:
let
# Get as close as possible as the `package.json` required version.
# This is what drives omnisharp.
rtDepsSrcsFromJson = lib.importJSON ./rt-deps-bin-srcs.json;
rtDepsBinSrcs = builtins.mapAttrs (k: v:
let
# E.g: "OmniSharp-x86_64-linux"
kSplit = builtins.split "(__)" k;
name = builtins.elemAt kSplit 0;
system = builtins.elemAt kSplit 2;
in
{
inherit name system;
installPath = v.installPath;
binaries = v.binaries;
bin-src = fetchurl {
urls = v.urls;
inherit (v) sha256;
};
}
)
rtDepsSrcsFromJson;
rtDepBinSrcByName = bSrcName:
rtDepsBinSrcs."${bSrcName}__${stdenv.targetPlatform.system}";
omnisharp = rtDepBinSrcByName "OmniSharp";
vsdbg = rtDepBinSrcByName "Debugger";
razor = rtDepBinSrcByName "Razor";
in
vscode-utils.buildVscodeMarketplaceExtension {
mktplcRef = {
name = "csharp";
publisher = "ms-dotnettools";
version = "1.23.15";
sha256 = "0b74jr45zl7lzirjgj8s2lbf3viy9pbwlgjh055rcwmy77wcml1x";
};
nativeBuildInputs = [
unzip
patchelf
makeWrapper
];
postPatch = ''
declare ext_unique_id
# See below as to why we cannot take the whole basename.
ext_unique_id="$(basename "$out" | head -c 32)"
# Fix 'Unable to connect to debuggerEventsPipeName .. exceeds the maximum length 107.' when
# attempting to launch a specific test in debug mode. The extension attemps to open
# a pipe in extension dir which would fail anyway. We change to target file path
# to a path in tmp dir with a short name based on the unique part of the nix store path.
# This is however a brittle patch as we're working on minified code.
# Hence the attempt to only hold on stable names.
# However, this really would better be fixed upstream.
sed -i \
-E -e 's/(this\._pipePath=[a-zA-Z0-9_]+\.join\()([a-zA-Z0-9_]+\.getExtensionPath\(\)[^,]*,)/\1require("os").tmpdir(), "'"$ext_unique_id"'"\+/g' \
"$PWD/dist/extension.js"
unzip_to() {
declare src_zip="''${1?}"
declare target_dir="''${2?}"
mkdir -p "$target_dir"
if unzip "$src_zip" -d "$target_dir"; then
true
elif [[ "1" -eq "$?" ]]; then
1>&2 echo "WARNING: unzip('$?' -> skipped files)."
else
1>&2 echo "ERROR: unzip('$?')."
fi
}
patchelf_add_icu_as_needed() {
declare elf="''${1?}"
declare icu_major_v="${
with builtins; head (splitVersion (parseDrvName icu.name).version)}"
for icu_lib in icui18n icuuc icudata; do
patchelf --add-needed "lib''${icu_lib}.so.$icu_major_v" "$elf"
done
}
patchelf_common() {
declare elf="''${1?}"
patchelf_add_icu_as_needed "$elf"
patchelf --add-needed "libssl.so" "$elf"
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
--set-rpath "${lib.makeLibraryPath [ stdenv.cc.cc openssl.out icu.out ]}:\$ORIGIN" \
"$elf"
}
declare omnisharp_dir="$PWD/${omnisharp.installPath}"
unzip_to "${omnisharp.bin-src}" "$omnisharp_dir"
rm "$omnisharp_dir/bin/mono"
ln -s -T "${mono}/bin/mono" "$omnisharp_dir/bin/mono"
chmod a+x "$omnisharp_dir/run"
touch "$omnisharp_dir/install.Lock"
declare vsdbg_dir="$PWD/${vsdbg.installPath}"
unzip_to "${vsdbg.bin-src}" "$vsdbg_dir"
chmod a+x "$vsdbg_dir/vsdbg-ui"
chmod a+x "$vsdbg_dir/vsdbg"
touch "$vsdbg_dir/install.complete"
touch "$vsdbg_dir/install.Lock"
patchelf_common "$vsdbg_dir/vsdbg"
patchelf_common "$vsdbg_dir/vsdbg-ui"
declare razor_dir="$PWD/${razor.installPath}"
unzip_to "${razor.bin-src}" "$razor_dir"
chmod a+x "$razor_dir/rzls"
touch "$razor_dir/install.Lock"
patchelf_common "$razor_dir/rzls"
'';
meta = with lib; {
description = "C# for Visual Studio Code (powered by OmniSharp)";
homepage = "https://github.com/OmniSharp/omnisharp-vscode";
license = licenses.mit;
maintainers = [ maintainers.jraygauthier ];
platforms = [ "x86_64-linux" ];
};
}