Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s
202 lines
4.8 KiB
Nix
202 lines
4.8 KiB
Nix
{
|
|
stdenv,
|
|
lib,
|
|
requireFile,
|
|
runCommand,
|
|
rcu,
|
|
testers,
|
|
copyDesktopItems,
|
|
coreutils,
|
|
desktopToDarwinBundle,
|
|
gnutar,
|
|
libsForQt5,
|
|
makeDesktopItem,
|
|
net-tools,
|
|
protobuf,
|
|
python312Packages,
|
|
system-config-printer,
|
|
wget,
|
|
}:
|
|
|
|
let
|
|
python3Packages = python312Packages;
|
|
in
|
|
python3Packages.buildPythonApplication rec {
|
|
pname = "rcu";
|
|
version = "4.0.29";
|
|
|
|
format = "other";
|
|
|
|
src =
|
|
let
|
|
src-tarball = requireFile {
|
|
name = "rcu-${version}-source.tar.gz";
|
|
hash = "sha256-qbHjRKH9GOwBduyod8AOm2SYOjGUH1mYSpCTifOehVM=";
|
|
url = "https://www.davisr.me/projects/rcu/";
|
|
};
|
|
in
|
|
runCommand "${src-tarball.name}-unpacked" { } ''
|
|
gunzip -ck ${src-tarball} | tar -xvf-
|
|
mv rcu $out
|
|
ln -s ${src-tarball} $out/src
|
|
'';
|
|
|
|
patches = [
|
|
./Port-to-paramiko-4.x.patch
|
|
];
|
|
|
|
postPatch = ''
|
|
substituteInPlace src/main.py \
|
|
--replace-fail "ui_basepath = '.'" "ui_basepath = '$out/share/rcu'"
|
|
|
|
substituteInPlace package_support/gnulinux/50-remarkable.rules \
|
|
--replace-fail 'GROUP="yourgroup"' 'GROUP="users"'
|
|
|
|
# This must match the protobuf version imported at runtime, regenerate it
|
|
rm src/model/update_metadata_pb2.py
|
|
protoc --proto_path src/model src/model/update_metadata.proto --python_out=src/model
|
|
|
|
# We don't make it available at this location, wrapping adds it to PATH instead
|
|
substituteInPlace src/model/document.py \
|
|
--replace-fail '/sbin/ifconfig' 'ifconfig'
|
|
'';
|
|
|
|
nativeBuildInputs = [
|
|
copyDesktopItems
|
|
protobuf
|
|
libsForQt5.wrapQtAppsHook
|
|
]
|
|
++ lib.optionals stdenv.hostPlatform.isDarwin [
|
|
desktopToDarwinBundle
|
|
];
|
|
|
|
buildInputs = [
|
|
libsForQt5.qtbase
|
|
libsForQt5.qtwayland
|
|
];
|
|
|
|
propagatedBuildInputs = with python3Packages; [
|
|
certifi
|
|
packaging
|
|
paramiko
|
|
pdfminer-six
|
|
pikepdf
|
|
pillow
|
|
python3Packages.protobuf # otherwise it picks up protobuf from function args
|
|
pyside2
|
|
];
|
|
|
|
desktopItems = [
|
|
(makeDesktopItem {
|
|
name = "rcu";
|
|
desktopName = "reMarkable Connection Utility";
|
|
comment = "All-in-one offline/local management software for reMarkable e-paper tablets";
|
|
icon = "rcu";
|
|
exec = "rcu";
|
|
})
|
|
];
|
|
|
|
dontConfigure = true;
|
|
dontBuild = true;
|
|
|
|
# No tests
|
|
doCheck = false;
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
|
|
mkdir -p $out/{bin,share}
|
|
cp -r src $out/share/rcu
|
|
|
|
''
|
|
+ lib.optionalString stdenv.hostPlatform.isLinux ''
|
|
install -Dm644 package_support/gnulinux/50-remarkable.rules $out/etc/udev/rules.d/50-remarkable.rules
|
|
''
|
|
+ ''
|
|
|
|
# Keep source from being GC'd by linking into it
|
|
|
|
for icondir in $(find icons -type d -name '[0-9]*x[0-9]*'); do
|
|
iconsize=$(basename $icondir)
|
|
mkdir -p $out/share/icons/hicolor/$iconsize/apps
|
|
ln -s ${src}/icons/$iconsize/rcu-icon-$iconsize.png $out/share/icons/hicolor/$iconsize/apps/rcu.png
|
|
done
|
|
|
|
mkdir -p $out/share/icons/hicolor/scalable/apps
|
|
ln -s ${src}/icons/64x64/rcu-icon-64x64.svg $out/share/icons/hicolor/scalable/apps/rcu.svg
|
|
|
|
mkdir -p $out/share/doc/rcu
|
|
for docfile in {COPYING,manual.pdf}; do
|
|
ln -s ${src}/manual/$docfile $out/share/doc/rcu/$docfile
|
|
done
|
|
|
|
mkdir -p $out/share/licenses/rcu
|
|
ln -s ${src}/COPYING $out/share/licenses/rcu/COPYING
|
|
|
|
runHook postInstall
|
|
'';
|
|
|
|
# Manually creating wrapper, hook struggles with lack of shebang & symlink
|
|
dontWrapPythonPrograms = true;
|
|
|
|
preFixup = ''
|
|
makeWrapperArgs+=(
|
|
"''${qtWrapperArgs[@]}"
|
|
--prefix PATH : ${
|
|
lib.makeBinPath [
|
|
coreutils
|
|
gnutar
|
|
wget
|
|
]
|
|
}
|
|
''
|
|
+ lib.optionalString stdenv.hostPlatform.isLinux ''
|
|
--prefix PATH : ${
|
|
lib.makeBinPath [
|
|
net-tools
|
|
system-config-printer
|
|
]
|
|
}
|
|
''
|
|
+ ''
|
|
)
|
|
'';
|
|
|
|
postFixup = ''
|
|
makeWrapper ${lib.getExe python3Packages.python} $out/bin/rcu \
|
|
''${makeWrapperArgs[@]} \
|
|
--prefix PYTHONPATH : ${
|
|
python3Packages.makePythonPath (propagatedBuildInputs ++ [ (placeholder "out") ])
|
|
} \
|
|
--add-flags $out/share/rcu/main.py
|
|
'';
|
|
|
|
passthru = {
|
|
tests.version = testers.testVersion {
|
|
package = rcu;
|
|
version =
|
|
let
|
|
versionSuffixPos = (lib.strings.stringLength rcu.version) - 1;
|
|
in
|
|
"d${lib.strings.substring 0 versionSuffixPos rcu.version}(${
|
|
lib.strings.substring versionSuffixPos 1 rcu.version
|
|
})";
|
|
};
|
|
|
|
# Python stuff automatically adds an updateScript that just fails
|
|
updateScript = null;
|
|
};
|
|
|
|
meta = {
|
|
mainProgram = "rcu";
|
|
description = "All-in-one offline/local management software for reMarkable e-paper tablets";
|
|
homepage = "http://www.davisr.me/projects/rcu/";
|
|
license = lib.licenses.agpl3Plus;
|
|
maintainers = with lib.maintainers; [
|
|
OPNA2608
|
|
m0streng0
|
|
];
|
|
hydraPlatforms = [ ]; # requireFile used as src
|
|
};
|
|
}
|