2019-06-16 19:59:06 +00:00
|
|
|
{ stdenv, lib, makeDesktopItem
|
2022-05-10 11:11:10 +00:00
|
|
|
, unzip, libsecret, libXScrnSaver, libxshmfence, wrapGAppsHook, makeWrapper
|
2022-03-14 20:23:25 +00:00
|
|
|
, atomEnv, at-spi2-atk, autoPatchelfHook
|
2021-09-03 11:58:51 +00:00
|
|
|
, systemd, fontconfig, libdbusmenu, glib, buildFHSUserEnvBubblewrap
|
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
|
2022-09-03 15:10:49 +00:00
|
|
|
, version, src, meta, sourceRoot, commandLineArgs
|
2021-05-24 19:46:44 +00:00
|
|
|
, executableName, longName, shortName, pname, updateScript
|
2021-06-24 06:45:06 +00:00
|
|
|
# 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
|
2019-02-10 04:03:48 +00:00
|
|
|
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
|
|
|
|
2018-11-04 01:29:00 +00:00
|
|
|
passthru = {
|
2019-10-16 21:09:38 +00:00
|
|
|
inherit executableName longName tests updateScript;
|
2021-04-08 07:05:37 +00:00
|
|
|
fhs = fhs {};
|
|
|
|
fhsWithPackages = f: fhs { additionalPkgs = f; };
|
2018-11-04 01:29:00 +00:00
|
|
|
};
|
|
|
|
|
2016-04-22 10:27:38 +00:00
|
|
|
desktopItem = makeDesktopItem {
|
2018-11-04 01:29:00 +00:00
|
|
|
name = executableName;
|
2019-01-27 14:05:42 +00:00
|
|
|
desktopName = longName;
|
|
|
|
comment = "Code Editing. Redefined.";
|
|
|
|
genericName = "Text Editor";
|
2020-11-24 11:38:25 +00:00
|
|
|
exec = "${executableName} %F";
|
2020-04-01 04:35:01 +00:00
|
|
|
icon = "code";
|
2022-02-22 14:56:15 +00:00
|
|
|
startupNotify = true;
|
|
|
|
startupWMClass = shortName;
|
|
|
|
categories = [ "Utility" "TextEditor" "Development" "IDE" ];
|
|
|
|
mimeTypes = [ "text/plain" "inode/directory" ];
|
|
|
|
keywords = [ "vscode" ];
|
|
|
|
actions.new-empty-window = {
|
|
|
|
name = "New Empty Window";
|
|
|
|
exec = "${executableName} --new-window %F";
|
|
|
|
icon = "code";
|
|
|
|
};
|
2019-01-27 14:05:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
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";
|
2019-01-27 14:05:42 +00:00
|
|
|
exec = executableName + " --open-url %U";
|
2020-04-01 04:35:01 +00:00
|
|
|
icon = "code";
|
2022-02-22 14:56:15 +00:00
|
|
|
startupNotify = true;
|
|
|
|
categories = [ "Utility" "TextEditor" "Development" "IDE" ];
|
|
|
|
mimeTypes = [ "x-scheme-handler/vscode" ];
|
|
|
|
keywords = [ "vscode" ];
|
|
|
|
noDisplay = true;
|
2016-04-22 10:27:38 +00:00
|
|
|
};
|
|
|
|
|
2021-03-18 12:35:59 +00:00
|
|
|
buildInputs = [ libsecret libXScrnSaver libxshmfence ]
|
2022-03-14 20:23:25 +00:00
|
|
|
++ lib.optionals (!stdenv.isDarwin) ([ at-spi2-atk ] ++ atomEnv.packages);
|
2018-12-17 03:09:21 +00:00
|
|
|
|
2022-10-06 16:38:53 +00:00
|
|
|
runtimeDependencies = lib.optionals stdenv.isLinux [ (lib.getLib systemd) fontconfig.lib libdbusmenu ];
|
2020-03-04 10:54:33 +00:00
|
|
|
|
2022-05-10 11:11:10 +00:00
|
|
|
nativeBuildInputs = [ unzip ]
|
|
|
|
++ lib.optionals stdenv.isLinux [
|
|
|
|
autoPatchelfHook
|
|
|
|
nodePackages.asar
|
2022-05-10 14:03:29 +00:00
|
|
|
(wrapGAppsHook.override { inherit makeWrapper; })
|
2022-05-10 11:11:10 +00:00
|
|
|
];
|
2016-04-03 15:07:05 +00:00
|
|
|
|
2019-02-10 04:03:48 +00:00
|
|
|
dontBuild = true;
|
|
|
|
dontConfigure = true;
|
2022-03-14 20:24:17 +00:00
|
|
|
noDumpEnvVars = true;
|
2019-02-10 04:03:48 +00:00
|
|
|
|
2021-04-14 12:50:46 +00:00
|
|
|
installPhase = ''
|
|
|
|
runHook preInstall
|
2021-07-11 20:51:17 +00:00
|
|
|
'' + (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
|
|
|
|
2021-09-03 11:58:51 +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
|
2022-09-23 19:19:37 +00:00
|
|
|
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}"
|
2022-09-03 15:10:49 +00:00
|
|
|
--add-flags ${lib.escapeShellArg commandLineArgs}
|
2021-09-03 11:58:51 +00:00
|
|
|
)
|
|
|
|
'';
|
|
|
|
|
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"
|
2022-04-16 06:34:58 +00:00
|
|
|
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
|
|
|
|
2022-04-16 06:35:14 +00:00
|
|
|
# without this symlink loading JsChardet, the library that is used for auto encoding detection when files.autoGuessEncoding is true,
|
|
|
|
# fails to load with: electron/js2c/renderer_init: Error: Cannot find module 'jschardet'
|
|
|
|
# and the window immediately closes which renders VSCode unusable
|
|
|
|
# see https://github.com/NixOS/nixpkgs/issues/152939 for full log
|
|
|
|
ln -rs "$unpacked" "$packed"
|
|
|
|
|
2021-09-16 15:32:14 +00:00
|
|
|
# this fixes bundled ripgrep
|
2022-02-05 04:43:47 +00:00
|
|
|
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;
|
|
|
|
|
2022-02-01 12:55:03 +00:00
|
|
|
# symlink shared assets, including icons and desktop entries
|
2021-04-08 07:05:37 +00:00
|
|
|
extraInstallCommands = ''
|
2022-02-01 12:55:03 +00:00
|
|
|
ln -s "${unwrapped}/share" "$out/"
|
2021-04-08 07:05:37 +00:00
|
|
|
'';
|
|
|
|
|
|
|
|
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
|
|
|
|
};
|
|
|
|
|
2021-04-24 19:42:38 +00:00
|
|
|
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
|