diff options
Diffstat (limited to 'nixpkgs/pkgs/development/tools/electron/common.nix')
-rw-r--r-- | nixpkgs/pkgs/development/tools/electron/common.nix | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/tools/electron/common.nix b/nixpkgs/pkgs/development/tools/electron/common.nix new file mode 100644 index 000000000000..19725cc8f148 --- /dev/null +++ b/nixpkgs/pkgs/development/tools/electron/common.nix @@ -0,0 +1,206 @@ +{ 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 "28") + (substituteAll { + name = "version.patch"; + src = if lib.versionAtLeast info.version "27" then ./version.patch else ./version-old.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.versionOlder info.version "26") { + use_gnome_keyring = false; + } // lib.optionalAttrs (lib.versionAtLeast info.version "28") { + 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) + }; +}) |