about summary refs log tree commit diff
path: root/pkgs/by-name/sk/skia/package.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/by-name/sk/skia/package.nix')
-rw-r--r--pkgs/by-name/sk/skia/package.nix162
1 files changed, 162 insertions, 0 deletions
diff --git a/pkgs/by-name/sk/skia/package.nix b/pkgs/by-name/sk/skia/package.nix
new file mode 100644
index 0000000000000..f40279875d024
--- /dev/null
+++ b/pkgs/by-name/sk/skia/package.nix
@@ -0,0 +1,162 @@
+{ lib
+, stdenv
+, fetchgit
+, expat
+, fontconfig
+, freetype
+, harfbuzzFull
+, icu
+, gn
+, libGL
+, libjpeg
+, libwebp
+, libX11
+, ninja
+, python3
+, testers
+, vulkan-headers
+, vulkan-memory-allocator
+, xcbuild
+
+, enableVulkan ? !stdenv.isDarwin
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "skia";
+  # Version from https://skia.googlesource.com/skia/+/refs/heads/main/RELEASE_NOTES.md
+  # or https://chromiumdash.appspot.com/releases
+  # plus date of the tip of the corresponding chrome/m$version branch
+  version = "124-unstable-2024-05-22";
+
+  src = fetchgit {
+    url = "https://skia.googlesource.com/skia.git";
+    # Tip of the chrome/m$version branch
+    rev = "a747f7ea37db6ea3871816dbaf2eb41b5776c826";
+    hash = "sha256-zHfv4OZK/nVJc2rl+dBSCc4f6qndpAKcFZtThw06+LY=";
+  };
+
+  patches = [
+    # Package ladybird uses SkFontMgr_New_FontConfig, but this version of skia
+    # does not export it.
+    # https://skia.googlesource.com/skia/+/4bf56844d4a661d7317882cc545ecd978715a11e%5E!/?
+    ./export-SkFontMgr_New_FontConfig.patch
+  ];
+
+  postPatch = ''
+    # System zlib detection bug workaround
+    substituteInPlace BUILD.gn \
+      --replace-fail 'deps = [ "//third_party/zlib" ]' 'deps = []'
+  '';
+
+  strictDeps = true;
+  nativeBuildInputs = [
+    gn
+    ninja
+    python3
+  ] ++ lib.optional stdenv.isDarwin xcbuild;
+
+  buildInputs = [
+    expat
+    fontconfig
+    freetype
+    harfbuzzFull
+    icu
+    libGL
+    libjpeg
+    libwebp
+    libX11
+  ] ++ lib.optionals enableVulkan [
+    vulkan-headers
+    vulkan-memory-allocator
+  ];
+
+  configurePhase = let
+    cpu = {
+      "x86_64" = "x64";
+      "i686" = "x86";
+      "arm" = "arm";
+      "aarch64" = "arm64";
+    }.${stdenv.hostPlatform.parsed.cpu.name};
+  in ''
+    runHook preConfigure
+    gn gen build --args='${toString ([
+      # Build in release mode
+      "is_official_build=true"
+      "is_component_build=true"
+      # Don't use missing tools
+      "skia_use_dng_sdk=false"
+      "skia_use_wuffs=false"
+      # Use system dependencies
+      "extra_cflags=[\"-I${harfbuzzFull.dev}/include/harfbuzz\"]"
+      "cc=\"${stdenv.cc.targetPrefix}cc\""
+      "cxx=\"${stdenv.cc.targetPrefix}c++\""
+      "ar=\"${stdenv.cc.targetPrefix}ar\""
+      "target_cpu=\"${cpu}\""
+    ] ++ map (lib: "skia_use_system_${lib}=true") [
+      "zlib"
+      "harfbuzz"
+      "libpng"
+      "libwebp"
+    ] ++ lib.optionals enableVulkan [
+      "skia_use_vulkan=true"
+    ])}'
+    cd build
+    runHook postConfigure
+  '';
+
+  # Somewhat arbitrary, but similar to what other distros are doing
+  installPhase = ''
+    runHook preInstall
+
+    # Libraries
+    mkdir -p $out/lib
+    cp *.so *.a $out/lib
+
+    # Includes
+    pushd ../include
+    find . -name '*.h' -exec install -Dm644 {} $out/include/skia/{} \;
+    popd
+    pushd ../modules
+    find . -name '*.h' -exec install -Dm644 {} $out/include/skia/modules/{} \;
+    popd
+
+    # Pkg-config
+    mkdir -p $out/lib/pkgconfig
+    cat > $out/lib/pkgconfig/skia.pc <<'EOF'
+    prefix=${placeholder "out"}
+    exec_prefix=''${prefix}
+    libdir=''${prefix}/lib
+    includedir=''${prefix}/include/skia
+    Name: skia
+    Description: 2D graphic library for drawing text, geometries and images.
+    URL: https://skia.org/
+    Version: ${lib.versions.major finalAttrs.version}
+    Libs: -L''${libdir} -lskia
+    Cflags: -I''${includedir}
+    EOF
+
+    runHook postInstall
+  '';
+
+  preFixup = ''
+    # Some skia includes are assumed to be under an include sub directory by
+    # other includes
+    for file in $(grep -rl '#include "include/' $out/include); do
+      substituteInPlace "$file" \
+        --replace-fail '#include "include/' '#include "'
+    done
+  '';
+
+  passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage;
+
+  meta = {
+    description = "2D graphic library for drawing text, geometries and images";
+    homepage = "https://skia.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fgaz ];
+    platforms = with lib.platforms; arm ++ aarch64 ++ x86 ++ x86_64;
+    pkgConfigModules = [ "skia" ];
+    # https://github.com/NixOS/nixpkgs/pull/325871#issuecomment-2220610016
+    broken = stdenv.isDarwin;
+  };
+})