1
0
Fork 0
mirror of https://github.com/yshui/picom.git synced 2024-11-25 14:06:08 -05:00

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 <yshuiv7@gmail.com>
This commit is contained in:
Yuxuan Shui 2024-10-16 23:10:26 +01:00
parent a44f6a2ebe
commit 1175487718
No known key found for this signature in database
GPG key ID: D3A4405BE6CC17F4
2 changed files with 143 additions and 49 deletions

View file

@ -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;
};
});

109
package.nix Normal file
View file

@ -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/
'';
})