nixpkgs/pkgs/development/tools/electron/common.nix
2023-12-05 19:38:28 +01:00

205 lines
6.2 KiB
Nix

{ lib
, stdenv
, chromium
, nodejs
, python3
, fetchYarnDeps
, fetchNpmDeps
, fixup_yarn_lock
, npmHooks
, yarn
, substituteAll
, libnotify
, unzip
, pkgs
, pkgsBuildHost
, info
}:
let
fetchdep = dep: let
opts = removeAttrs dep ["fetcher"];
in pkgs.${dep.fetcher} opts;
in (chromium.override { upstream-info = info.chromium; }).mkDerivation (base: {
packageName = "electron";
inherit (info) version;
buildTargets = [ "electron:electron_dist_zip" ];
nativeBuildInputs = base.nativeBuildInputs ++ [ nodejs yarn fixup_yarn_lock unzip npmHooks.npmConfigHook ];
buildInputs = base.buildInputs ++ [ libnotify ];
electronOfflineCache = fetchYarnDeps {
yarnLock = (fetchdep info.deps."src/electron") + "/yarn.lock";
sha256 = info.electron_yarn_hash;
};
npmDeps = fetchNpmDeps {
src = fetchdep info.deps."src";
sourceRoot = "source/third_party/node";
hash = info.chromium_npm_hash;
};
src = null;
patches = base.patches ++ lib.optional (lib.versionOlder info.version "27")
(substituteAll {
name = "version.patch";
src = ./version.patch;
inherit (info) version;
})
;
unpackPhase = ''
runHook preUnpack
'' + (
lib.concatStrings (lib.mapAttrsToList (path: dep: ''
mkdir -p ${builtins.dirOf path}
cp -r ${fetchdep dep}/. ${path}
chmod u+w -R ${path}
'') info.deps)
) + ''
sourceRoot=src
runHook postUnpack
'';
npmRoot = "third_party/node";
postPatch = ''
mkdir -p third_party/jdk/current/bin
echo 'build_with_chromium = true' >> build/config/gclient_args.gni
echo 'checkout_google_benchmark = false' >> build/config/gclient_args.gni
echo 'checkout_android = false' >> build/config/gclient_args.gni
echo 'checkout_android_prebuilts_build_tools = false' >> build/config/gclient_args.gni
echo 'checkout_android_native_support = false' >> build/config/gclient_args.gni
echo 'checkout_ios_webkit = false' >> build/config/gclient_args.gni
echo 'checkout_nacl = false' >> build/config/gclient_args.gni
echo 'checkout_openxr = false' >> build/config/gclient_args.gni
echo 'checkout_rts_model = false' >> build/config/gclient_args.gni
echo 'checkout_src_internal = false' >> build/config/gclient_args.gni
echo 'cros_boards = ""' >> build/config/gclient_args.gni
echo 'cros_boards_with_qemu_images = ""' >> build/config/gclient_args.gni
echo 'generate_location_tags = true' >> build/config/gclient_args.gni
echo 'LASTCHANGE=${info.deps."src".rev}-refs/heads/master@{#0}' > build/util/LASTCHANGE
echo "$SOURCE_DATE_EPOCH" > build/util/LASTCHANGE.committime
cat << EOF > gpu/config/gpu_lists_version.h
/* Generated by lastchange.py, do not edit.*/
#ifndef GPU_CONFIG_GPU_LISTS_VERSION_H_
#define GPU_CONFIG_GPU_LISTS_VERSION_H_
#define GPU_LISTS_VERSION "${info.deps."src".rev}"
#endif // GPU_CONFIG_GPU_LISTS_VERSION_H_
EOF
cat << EOF > skia/ext/skia_commit_hash.h
/* Generated by lastchange.py, do not edit.*/
#ifndef SKIA_EXT_SKIA_COMMIT_HASH_H_
#define SKIA_EXT_SKIA_COMMIT_HASH_H_
#define SKIA_COMMIT_HASH "${info.deps."src/third_party/skia".rev}-"
#endif // SKIA_EXT_SKIA_COMMIT_HASH_H_
EOF
echo -n '${info.deps."src/third_party/dawn".rev}' > gpu/webgpu/DAWN_VERSION
(
cd electron
export HOME=$TMPDIR/fake_home
yarn config --offline set yarn-offline-mirror $electronOfflineCache
fixup_yarn_lock yarn.lock
yarn install --offline --frozen-lockfile --ignore-scripts --no-progress --non-interactive
)
(
cd ..
PATH=$PATH:${lib.makeBinPath (with pkgsBuildHost; [ jq git ])}
config=src/electron/patches/config.json
for key in $(jq -r "keys[]" $config)
do
value=$(jq -r ".\"$key\"" $config)
echo patching $value
for patch in $(cat $key/.patches)
do
git apply -p1 --directory=$value $key/$patch
done
done
)
'' + base.postPatch;
preConfigure = ''
(
cd third_party/node
grep patch update_npm_deps | sh
)
'' + (base.preConfigure or "");
gnFlags = rec {
# build/args/release.gn
is_component_build = false;
is_official_build = true;
rtc_use_h264 = proprietary_codecs;
is_component_ffmpeg = true;
# build/args/all.gn
is_electron_build = true;
root_extra_deps = [ "//electron" ];
node_module_version = info.modules;
v8_promise_internal_field_count = 1;
v8_embedder_string = "-electron.0";
v8_enable_snapshot_native_code_counters = false;
v8_scriptormodule_legacy_lifetime = true;
v8_enable_javascript_promise_hooks = true;
enable_cdm_host_verification = false;
proprietary_codecs = true;
ffmpeg_branding = "Chrome";
enable_printing = true;
angle_enable_vulkan_validation_layers = false;
dawn_enable_vulkan_validation_layers = false;
enable_pseudolocales = false;
allow_runtime_configurable_key_storage = true;
enable_cet_shadow_stack = false;
is_cfi = false;
use_qt = false;
enable_widevine = false;
use_perfetto_client_library = false;
enable_check_raw_ptr_fields = false;
} // lib.optionalAttrs (lib.versionAtLeast info.version "27") {
override_electron_version = info.version;
};
installPhase = ''
mkdir -p $libExecPath
unzip -d $libExecPath out/Release/dist.zip
'';
requiredSystemFeatures = [ "big-parallel" ];
passthru = {
inherit info;
headers = stdenv.mkDerivation rec {
name = "node-v${info.node}-headers.tar.xz";
nativeBuildInputs = [ python3 ];
src = fetchdep info.deps."src/third_party/electron_node";
buildPhase = ''
make tar-headers
'';
installPhase = ''
mv ${name} $out
'';
};
};
meta = with lib; {
description = "Cross platform desktop application shell";
homepage = "https://github.com/electron/electron";
platforms = lib.platforms.linux;
license = licenses.mit;
maintainers = with maintainers; [ yuka ];
mainProgram = "electron";
hydraPlatforms = lib.optionals (!(hasInfix "alpha" info.version) && !(hasInfix "beta" info.version)) ["aarch64-linux" "x86_64-linux"];
timeout = 172800; # 48 hours (increased from the Hydra default of 10h)
};
})