nixpkgs/pkgs/applications/editors/vscode/generic.nix

191 lines
6.3 KiB
Nix
Raw Normal View History

{ stdenv, lib, makeDesktopItem
, unzip, libsecret, libXScrnSaver, libxshmfence, wrapGAppsHook
2018-12-17 03:09:21 +00:00
, gtk2, atomEnv, at-spi2-atk, autoPatchelfHook
, systemd, fontconfig, libdbusmenu, glib, buildFHSUserEnvBubblewrap
2021-04-08 07:05:37 +00:00
, writeShellScriptBin
2016-04-22 10:27:38 +00:00
2021-02-08 12:54:24 +00:00
# Populate passthru.tests
, tests
2021-09-15 18:17:21 +00:00
# needed to fix "Save as Root"
, nodePackages, bash
2019-05-21 18:17:01 +00:00
# Attributes inherit from specific versions
, version, src, meta, sourceRoot
, executableName, longName, shortName, pname, updateScript
# sourceExecutableName is the name of the binary in the source archive, over
# which we have no control
, sourceExecutableName ? executableName
2019-05-21 18:17:01 +00:00
}:
2016-04-22 11:23:24 +00:00
2019-05-21 18:17:01 +00:00
let
inherit (stdenv.hostPlatform) system;
2021-04-08 07:05:37 +00:00
unwrapped = stdenv.mkDerivation {
2016-04-03 15:07:05 +00:00
2019-05-21 18:17:01 +00:00
inherit pname version src sourceRoot;
2016-04-03 15:07:05 +00:00
passthru = {
inherit executableName longName tests updateScript;
2021-04-08 07:05:37 +00:00
fhs = fhs {};
fhsWithPackages = f: fhs { additionalPkgs = f; };
};
2016-04-22 10:27:38 +00:00
desktopItem = makeDesktopItem {
name = executableName;
desktopName = longName;
comment = "Code Editing. Redefined.";
genericName = "Text Editor";
2020-11-24 11:38:25 +00:00
exec = "${executableName} %F";
icon = "code";
startupNotify = "true";
categories = "Utility;TextEditor;Development;IDE;";
mimeType = "text/plain;inode/directory;";
extraEntries = ''
StartupWMClass=${shortName}
Actions=new-empty-window;
Keywords=vscode;
[Desktop Action new-empty-window]
Name=New Empty Window
Exec=${executableName} --new-window %F
Icon=code
'';
};
urlHandlerDesktopItem = makeDesktopItem {
name = executableName + "-url-handler";
desktopName = longName + " - URL Handler";
comment = "Code Editing. Redefined.";
2016-04-22 10:27:38 +00:00
genericName = "Text Editor";
exec = executableName + " --open-url %U";
icon = "code";
startupNotify = "true";
categories = "Utility;TextEditor;Development;IDE;";
mimeType = "x-scheme-handler/vscode;";
extraEntries = ''
NoDisplay=true
Keywords=vscode;
'';
2016-04-22 10:27:38 +00:00
};
buildInputs = [ libsecret libXScrnSaver libxshmfence ]
2021-04-14 12:50:46 +00:00
++ lib.optionals (!stdenv.isDarwin) ([ gtk2 at-spi2-atk ] ++ atomEnv.packages);
2018-12-17 03:09:21 +00:00
2020-10-11 12:58:44 +00:00
runtimeDependencies = lib.optional (stdenv.isLinux) [ (lib.getLib systemd) fontconfig.lib libdbusmenu ];
2021-04-14 12:50:46 +00:00
nativeBuildInputs = [unzip] ++ lib.optionals (!stdenv.isDarwin) [ autoPatchelfHook wrapGAppsHook ];
2016-04-03 15:07:05 +00:00
dontBuild = true;
dontConfigure = true;
2021-04-14 12:50:46 +00:00
installPhase = ''
runHook preInstall
'' + (if stdenv.isDarwin then ''
2021-10-24 15:45:53 +00:00
mkdir -p "$out/Applications/${longName}.app" "$out/bin"
2021-04-14 12:50:46 +00:00
cp -r ./* "$out/Applications/${longName}.app"
2021-10-24 15:45:53 +00:00
ln -s "$out/Applications/${longName}.app/Contents/Resources/app/bin/${sourceExecutableName}" "$out/bin/${executableName}"
2021-04-14 12:50:46 +00:00
'' else ''
2021-10-24 15:45:53 +00:00
mkdir -p "$out/lib/vscode" "$out/bin"
cp -r ./* "$out/lib/vscode"
2021-04-14 12:50:46 +00:00
2021-10-24 15:45:53 +00:00
ln -s "$out/lib/vscode/bin/${sourceExecutableName}" "$out/bin/${executableName}"
2021-04-14 12:50:46 +00:00
2021-10-24 15:45:53 +00:00
mkdir -p "$out/share/applications"
ln -s "$desktopItem/share/applications/${executableName}.desktop" "$out/share/applications/${executableName}.desktop"
ln -s "$urlHandlerDesktopItem/share/applications/${executableName}-url-handler.desktop" "$out/share/applications/${executableName}-url-handler.desktop"
2021-04-14 12:50:46 +00:00
2021-10-24 15:45:53 +00:00
mkdir -p "$out/share/pixmaps"
cp "$out/lib/vscode/resources/app/resources/linux/code.png" "$out/share/pixmaps/code.png"
2021-04-14 12:50:46 +00:00
# Override the previously determined VSCODE_PATH with the one we know to be correct
2021-10-24 15:45:53 +00:00
sed -i "/ELECTRON=/iVSCODE_PATH='$out/lib/vscode'" "$out/bin/${executableName}"
grep -q "VSCODE_PATH='$out/lib/vscode'" "$out/bin/${executableName}" # check if sed succeeded
2021-04-14 12:50:46 +00:00
'') + ''
runHook postInstall
'';
2016-04-03 15:07:05 +00:00
preFixup = ''
gappsWrapperArgs+=(
# Add gio to PATH so that moving files to the trash works when not using a desktop environment
--prefix PATH : ${glib.bin}/bin
)
'';
2021-09-15 18:17:21 +00:00
# See https://github.com/NixOS/nixpkgs/issues/49643#issuecomment-873853897
2021-09-25 21:42:48 +00:00
# linux only because of https://github.com/NixOS/nixpkgs/issues/138729
postPatch = lib.optionalString stdenv.isLinux ''
2021-09-15 18:17:21 +00:00
# this is a fix for "save as root" functionality
packed="resources/app/node_modules.asar"
unpacked="resources/app/node_modules"
${nodePackages.asar}/bin/asar extract "$packed" "$unpacked"
2021-12-09 10:06:37 +00:00
substituteInPlace $unpacked/@vscode/sudo-prompt/index.js \
2021-09-15 18:17:21 +00:00
--replace "/usr/bin/pkexec" "/run/wrappers/bin/pkexec" \
--replace "/bin/bash" "${bash}/bin/bash"
rm -rf "$packed"
2021-09-16 15:32:14 +00:00
# this fixes bundled ripgrep
chmod +x resources/app/node_modules/vscode-ripgrep/bin/rg
2021-09-15 18:17:21 +00:00
'';
2019-05-21 18:17:01 +00:00
inherit meta;
2021-04-08 07:05:37 +00:00
};
# Vscode and variants allow for users to download and use extensions
# which often include the usage of pre-built binaries.
# This has been an on-going painpoint for many users, as
# a full extension update cycle has to be done through nixpkgs
# in order to create or update extensions.
# See: #83288 #91179 #73810 #41189
#
# buildFHSUserEnv allows for users to use the existing vscode
# extension tooling without significant pain.
fhs = { additionalPkgs ? pkgs: [] }: buildFHSUserEnvBubblewrap {
# also determines the name of the wrapped command
name = executableName;
# additional libraries which are commonly needed for extensions
targetPkgs = pkgs: (with pkgs; [
# ld-linux-x86-64-linux.so.2 and others
glibc
# dotnet
curl
icu
libunwind
libuuid
openssl
zlib
# mono
krb5
]) ++ additionalPkgs pkgs;
# restore desktop item icons
extraInstallCommands = ''
2021-10-24 15:45:53 +00:00
mkdir -p "$out/share/applications"
2021-04-08 07:05:37 +00:00
for item in ${unwrapped}/share/applications/*.desktop; do
2021-10-24 15:45:53 +00:00
ln -s "$item" "$out/share/applications/"
2021-04-08 07:05:37 +00:00
done
'';
runScript = "${unwrapped}/bin/${executableName}";
# vscode likes to kill the parent so that the
# gui application isn't attached to the terminal session
dieWithParent = false;
passthru = {
inherit executableName;
inherit (unwrapped) pname version; # for home-manager module
};
meta = meta // {
description = ''
Wrapped variant of ${pname} which launches in a FHS compatible envrionment.
Should allow for easy usage of extensions without nix-specific modifications.
'';
};
2021-04-08 07:05:37 +00:00
};
in
unwrapped