about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/tools/electron/common.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/tools/electron/common.nix')
-rw-r--r--nixpkgs/pkgs/development/tools/electron/common.nix206
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)
+  };
+})