From 117548771829843cc4f91a805d0ab10782188236 Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Wed, 16 Oct 2024 23:10:26 +0100 Subject: [PATCH] flake: import package.nix from nixpkgs So we can have more control of the build process compared to overriding the picom derivation. Also add expressions to cross-compile picom for arm32, arm64, and x86. Signed-off-by: Yuxuan Shui --- flake.nix | 83 ++++++++++++++++----------------------- package.nix | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+), 49 deletions(-) create mode 100644 package.nix diff --git a/flake.nix b/flake.nix index ff89646e..3a7ec035 100644 --- a/flake.nix +++ b/flake.nix @@ -7,41 +7,22 @@ inputs.nixpkgs.follows = "nixpkgs"; }; }; - outputs = { - self, - flake-utils, - nixpkgs, - git-ignore-nix, - ... - }: - flake-utils.lib.eachDefaultSystem (system: let + outputs = + { self + , flake-utils + , nixpkgs + , git-ignore-nix + , ... + }: + flake-utils.lib.eachDefaultSystem (system: + let # like lib.lists.remove, but takes a list of elements to remove removeFromList = toRemove: list: pkgs.lib.foldl (l: e: pkgs.lib.remove e l) list toRemove; - overlay = self: super: { - picom = super.picom.overrideAttrs (oldAttrs: rec { - version = "11"; - pname = "picom"; - nativeBuildInputs = (removeFromList [ self.asciidoc ] oldAttrs.nativeBuildInputs) ++ - [ - self.asciidoctor - ]; - buildInputs = - [ - self.pcre2 - self.xorg.xcbutil - self.libepoxy - ] ++ (removeFromList [ - self.xorg.libXinerama - self.xorg.libXext - self.pcre - ] oldAttrs.buildInputs); - src = git-ignore-nix.lib.gitignoreSource ./.; - }); - }; - python = pkgs.python3.withPackages (ps: with ps; [ - xcffib pip dbus-next - ]); - + picomOverlay = final: prev: { picom = prev.callPackage ./package.nix { }; }; + overlays = [ + (final: prev: { inherit git-ignore-nix; }) + picomOverlay + ]; pkgs = import nixpkgs { inherit system overlays; config.allowBroken = true; @@ -60,15 +41,8 @@ ]; }; - overlays = [overlay]; mkDevShell = p: p.overrideAttrs (o: { - nativeBuildInputs = o.nativeBuildInputs ++ (with pkgs; [ - clang-tools_18 - llvmPackages_18.clang-unwrapped.python - llvmPackages_18.libllvm - python - ]); - hardeningDisable = ["fortify"]; + hardeningDisable = [ "fortify" ]; shellHook = '' # Workaround a NixOS limitation on sanitizers: # See: https://github.com/NixOS/nixpkgs/issues/287763 @@ -77,21 +51,32 @@ export ASAN_OPTIONS="disable_coredump=0:unmap_shadow_on_exit=1:abort_on_error=1" ''; }); - in rec { - inherit - overlay - overlays - ; + in + rec { + overlay = picomOverlay; packages = { + picom = pkgs.picom; default = pkgs.picom; - }; - devShells.default = mkDevShell packages.default; + } // (nixpkgs.lib.optionalAttrs (system == "x86_64-linux") rec { + picom-cross = { + armv7l = pkgs.pkgsCross.armv7l-hf-multiplatform.picom; + aarch64 = pkgs.pkgsCross.aarch64-multiplatform.picom; + i686 = pkgs.pkgsi686Linux.picom; + merged = pkgs.runCommand "picom-merged" {} '' + mkdir $out + ln -s ${picom-cross.armv7l} $out/armv7l + ln -s ${picom-cross.aarch64} $out/aarch64 + ln -s ${picom-cross.i686} $out/i686 + ''; + }; + }); + devShells.default = mkDevShell (packages.default.override { devShell = true; }); devShells.useClang = devShells.default.override { inherit (pkgs.llvmPackages_18) stdenv; }; # build picom and all dependencies with frame pointer, making profiling/debugging easier. # WARNING! many many rebuilds - devShells.useClangProfile = (mkDevShell profilePkgs.picom).override { + devShells.useClangProfile = (mkDevShell (profilePkgs.picom.override { devShell = true; })).override { stdenv = profilePkgs.withCFlags "-fno-omit-frame-pointer" profilePkgs.llvmPackages_18.stdenv; }; }); diff --git a/package.nix b/package.nix new file mode 100644 index 00000000..ca81594d --- /dev/null +++ b/package.nix @@ -0,0 +1,109 @@ +{ asciidoctor +, dbus +, docbook_xml_dtd_45 +, docbook_xsl +, fetchFromGitHub +, clang-tools_18 +, llvmPackages_18 +, lib +, libconfig +, libdrm +, libev +, libGL +, libepoxy +, libX11 +, libxcb +, libxdg_basedir +, libXext +, libxml2 +, libxslt +, makeWrapper +, meson +, ninja +, pcre2 +, pixman +, pkg-config +, python3 +, stdenv +, uthash +, xcbutil +, xcbutilimage +, xcbutilrenderutil +, xorgproto +, xwininfo +, withDebug ? false +, git-ignore-nix +, devShell ? false +}: + +let + versionFromMeson = s: builtins.head (builtins.match "project\\('picom',.*version: *'([0-9.]*)'.*" s); +in +stdenv.mkDerivation (finalAttrs: { + pname = "picom"; + version = versionFromMeson (builtins.readFile ./meson.build); + + src = git-ignore-nix.lib.gitignoreSource ./.; + + strictDeps = true; + + + nativeBuildInputs = [ + asciidoctor + docbook_xml_dtd_45 + docbook_xsl + makeWrapper + meson + ninja + pkg-config + ] ++ (lib.optional devShell [ + clang-tools_18 + llvmPackages_18.clang-unwrapped.python + llvmPackages_18.libllvm + (python3.withPackages (ps: with ps; [ + xcffib pip dbus-next + ])) + ]); + + buildInputs = [ + dbus + libconfig + libdrm + libev + libGL + libepoxy + libX11 + libxcb + libxdg_basedir + libXext + libxml2 + libxslt + pcre2 + pixman + uthash + xcbutil + xcbutilimage + xcbutilrenderutil + xorgproto + ]; + + # Use "debugoptimized" instead of "debug" so perhaps picom works better in + # normal usage too, not just temporary debugging. + mesonBuildType = if withDebug then "debugoptimized" else "release"; + dontStrip = withDebug; + + mesonFlags = [ + "-Dwith_docs=true" + ]; + + installFlags = [ "PREFIX=$(out)" ]; + + # In debug mode, also copy src directory to store. If you then run `gdb picom` + # in the bin directory of picom store path, gdb finds the source files. + postInstall = '' + wrapProgram $out/bin/picom-trans \ + --prefix PATH : ${lib.makeBinPath [ xwininfo ]} + '' + lib.optionalString withDebug '' + cp -r ../src $out/ + ''; +})