0
0
Fork 0
mirror of https://github.com/NixOS/nixpkgs.git synced 2025-07-14 14:10:33 +03:00

canon-cups-ufr2: Rework build script with RPM spec

Strongly inspired by the AUR package [1], this commit removes most
manual build and install commands in favor of reusing the RPM spec file.

With the rework and a small patch, cngplp now builds and is installed
correctly. Previously, we would skip building cngplp, resulting in
broken symlinks in the output folder.

[1]: https://aur.archlinux.org/packages/cnrdrvcups-lb

Fixes #380572
This commit is contained in:
Lukas Werling 2025-02-12 00:40:00 +01:00
parent c467a40d68
commit 6a289bafb9
2 changed files with 96 additions and 96 deletions

View file

@ -1,6 +1,8 @@
{
lib,
stdenv,
writeTextFile,
writeScript,
fetchurl,
unzip,
autoconf,
@ -61,6 +63,43 @@ let
cairo
atk
];
convertSpec = writeTextFile {
name = "convert-spec.awk";
checkPhase = "awk -f $target < /dev/null";
text = ''
$1 == "%" phase { inPhase = 1; next }
inPhase && /^%/ { exit }
inPhase {
gsub("[$]{RPM_BUILD_DIR}", "$sourceRoot");
gsub("[$]{RPM_BUILD_ROOT}", "");
gsub("%{nobuild}", "0");
gsub("%{_builddir}", "$sourceRoot");
gsub("%{_prefix}", "$out");
gsub("%{_libsarch}", "libs64/${system}");
gsub("%{_libdir}", "$out/lib");
gsub("%{locallibs}", "$out/lib");
gsub("%{_bindir}", "$out/bin");
gsub("%{_includedir}", "$out/include");
gsub("%{_cflags}", "");
gsub("%{_machine_type}", "MACHINETYPE=${stdenv.hostPlatform.parsed.cpu.name}");
gsub("%{common_dir}", "cnrdrvcups-common-${version}");
gsub("%{driver_dir}", "cnrdrvcups-lb-${version}");
gsub("%{utility_dir}", "cnrdrvcups-utility-${version}");
gsub("%{b_lib_dir}", "$sourceRoot/lib");
gsub("%{b_include_dir}", "$sourceRoot/include");
gsub("-m 4755", "-m 755"); # no setuid
if (/%/) {
print "error: variable not replaced:", $0 > "/dev/stderr"
print "exit 1"
exit 1
}
print
}
'';
};
in
stdenv.mkDerivation rec {
pname = "canon-cups-ufr2";
@ -71,28 +110,32 @@ stdenv.mkDerivation rec {
dontPatchELF = true;
postUnpack = ''
export sourceRoot=$PWD/$sourceRoot
(
cd $sourceRoot
tar -xf Sources/cnrdrvcups-lb-${version}-1.${suffix2}.tar.xz
sed -i -e "s@_prefix=/usr@_prefix=$out@" cnrdrvcups-common-${version}/allgen.sh
sed -i -e "s@_libdir=/usr/lib@_libdir=$out/lib@" cnrdrvcups-common-${version}/allgen.sh
sed -i -e "s@_bindir=/usr/bin@_bindir=$out/bin@" cnrdrvcups-common-${version}/allgen.sh
sed -i -e "s@/usr@$out@" cnrdrvcups-common-${version}/{{backend,rasterfilter}/Makefile.am,rasterfilter/cnrasterproc.h}
sed -i -e "s@etc/cngplp@$out/etc/cngplp@" cnrdrvcups-common-${version}/cngplp/Makefile.am
sed -i -e "s@usr/share/cngplp@$out/usr/share/cngplp@" cnrdrvcups-common-${version}/cngplp/src/Makefile.am
patchShebangs cnrdrvcups-common-${version}
sed -i -e "s@_prefix=/usr@_prefix=$out@" cnrdrvcups-lb-${version}/allgen.sh
sed -i -e "s@_libdir=/usr/lib@_libdir=$out/lib@" cnrdrvcups-lb-${version}/allgen.sh
sed -i -e "s@_bindir=/usr/bin@_bindir=$out/bin@" cnrdrvcups-lb-${version}/allgen.sh
sed -i -e '/^cd \.\.\/cngplp/,/^cd files/{/^cd files/!{d}}' cnrdrvcups-lb-${version}/allgen.sh
sed -i -e "s@cd \.\./pdftocpca@cd pdftocpca@" cnrdrvcups-lb-${version}/allgen.sh
sed -i -e "s@/usr@$out@" cnrdrvcups-lb-${version}/pdftocpca/Makefile.am
sed -i "/CNGPLPDIR/d" cnrdrvcups-lb-${version}/Makefile
patchShebangs cnrdrvcups-lb-${version}
)
'';
patches = [
./replace_incorrect_int_with_char.patch
];
postPatch = ''
substituteInPlace $(find cnrdrvcups-lb-${version}/cngplp -name Makefile.am) \
--replace-quiet /usr/include/libxml2/ ${libxml2.dev}/include/libxml2/
substituteInPlace \
cnrdrvcups-common-${version}/{{backend,cngplp/src,rasterfilter}/Makefile.am,rasterfilter/cnrasterproc.h} \
cnrdrvcups-lb-${version}/{cngplp/files,pdftocpca}/Makefile.am \
--replace-fail /usr "$out"
substituteInPlace cnrdrvcups-common-${version}/cngplp/Makefile.am \
--replace-fail etc/cngplp "$out/etc/cngplp"
patchShebangs cnrdrvcups-common-${version} cnrdrvcups-lb-${version}
'';
nativeBuildInputs = [
makeWrapper
unzip
@ -104,78 +147,39 @@ stdenv.mkDerivation rec {
inherit buildInputs;
configureScript = writeScript "canon-cups-ufr2-configure" ''
set -eu
# Update old automake files
for dir in \
cnrdrvcups-common-${version}/{backend,buftool,cngplp,cnjbig,rasterfilter} \
cnrdrvcups-lb-${version}/{cngplp/files,cngplp,cpca,pdftocpca}
do
echo autoreconf $dir
pushd "$dir"
# For some reason, autoreconf fails to create ltmain.sh on first run.
autoreconf --force --install --warnings=none || autoreconf --force --install --warnings=none
popd
done
awk -f ${convertSpec} -v phase=setup cnrdrvcups-lb.spec | bash -eux
'';
buildPhase = ''
runHook preBuild
awk -f ${convertSpec} -v phase=build cnrdrvcups-lb.spec | bash -eux
runHook postBuild
'';
installPhase = ''
runHook preInstall
(
cd cnrdrvcups-common-${version}
./allgen.sh
make install
)
(
cd cnrdrvcups-common-${version}/Rule
mkdir -p $out/share/cups/usb
install -m 644 *.usb-quirks $out/share/cups/usb
)
(
cd cnrdrvcups-lb-${version}
./allgen.sh
make install
mkdir -p $out/share/cups/model
install -m 644 ppd/*.ppd $out/share/cups/model/
)
(
cd lib
mkdir -p $out/lib
install -m 755 libs64/${system}/libColorGearCufr2.so.2.0.0 $out/lib
install -m 755 libs64/${system}/libcaepcmufr2.so.1.0 $out/lib
install -m 755 libs64/${system}/libcaiocnpkbidir.so.1.0.0 $out/lib
install -m 755 libs64/${system}/libcaiousb.so.1.0.0 $out/lib
install -m 755 libs64/${system}/libcaiowrapufr2.so.1.0.0 $out/lib
install -m 755 libs64/${system}/libcanon_slimufr2.so.1.0.0 $out/lib
install -m 755 libs64/${system}/libcanonufr2r.so.1.0.0 $out/lib
install -m 755 libs64/${system}/libcnaccm.so.1.0 $out/lib
install -m 755 libs64/${system}/libcnlbcmr.so.1.0 $out/lib
install -m 755 libs64/${system}/libcnncapcmr.so.1.0 $out/lib
install -m 755 libs64/${system}/libufr2filterr.so.1.0.0 $out/lib
install -m 755 libs64/${system}/cnpdfdrv $out/bin
install -m 755 libs64/${system}/cnpkbidir $out/bin
install -m 755 libs64/${system}/cnpkmoduleufr2r $out/bin
install -m 755 libs64/${system}/cnrsdrvufr2 $out/bin
install -m 755 libs64/${system}/cnsetuputil2 $out/bin/cnsetuputil2
mkdir -p $out/share/cnpkbidir
install -m 644 libs64/${system}/cnpkbidir_info* $out/share/cnpkbidir
mkdir -p $out/share/ufr2filter
install -m 644 libs64/${system}/ThLB* $out/share/ufr2filter
)
awk -f ${convertSpec} -v phase=install cnrdrvcups-lb.spec | bash -eux
(
cd $out/lib
ln -sf libColorGearCufr2.so.2.0.0 libColorGearCufr2.so
ln -sf libColorGearCufr2.so.2.0.0 libColorGearCufr2.so.2
ln -sf libcaepcmufr2.so.1.0 libcaepcmufr2.so
ln -sf libcaepcmufr2.so.1.0 libcaepcmufr2.so.1
ln -sf libcaiocnpkbidir.so.1.0.0 libcaiocnpkbidir.so
ln -sf libcaiocnpkbidir.so.1.0.0 libcaiocnpkbidir.so.1
ln -sf libcaiowrapufr2.so.1.0.0 libcaiowrapufr2.so
ln -sf libcaiowrapufr2.so.1.0.0 libcaiowrapufr2.so.1
ln -sf libcanon_slimufr2.so.1.0.0 libcanon_slimufr2.so
ln -sf libcanon_slimufr2.so.1.0.0 libcanon_slimufr2.so.1
ln -sf libcanonufr2r.so.1.0.0 libcanonufr2r.so
ln -sf libcanonufr2r.so.1.0.0 libcanonufr2r.so.1
ln -sf libcnlbcmr.so.1.0 libcnlbcmr.so
ln -sf libcnlbcmr.so.1.0 libcnlbcmr.so.1
ln -sf libufr2filterr.so.1.0.0 libufr2filterr.so
ln -sf libufr2filterr.so.1.0.0 libufr2filterr.so.1
ln -sf libuictlufr2r.so.1.0.0 libuictlufr2r.so
ln -sf libuictlufr2r.so.1.0.0 libuictlufr2r.so.1
patchelf --set-rpath "$(cat $NIX_CC/nix-support/orig-cc)/lib:${libs pkgs}:${lib.getLib stdenv.cc.cc}/lib64:${stdenv.cc.libc}/lib64:$out/lib" libcanonufr2r.so.1.0.0
patchelf --set-rpath "$(cat $NIX_CC/nix-support/orig-cc)/lib:${libs pkgs}:${lib.getLib stdenv.cc.cc}/lib64:${stdenv.cc.libc}/lib64" libcaepcmufr2.so.1.0
patchelf --set-rpath "$(cat $NIX_CC/nix-support/orig-cc)/lib:${libs pkgs}:${lib.getLib stdenv.cc.cc}/lib64:${stdenv.cc.libc}/lib64" libColorGearCufr2.so.2.0.0
@ -196,21 +200,6 @@ stdenv.mkDerivation rec {
--set NIX_REDIRECTS /usr/share/cnsetuputil2=$out/usr/share/cnsetuputil2
)
(
cd lib/data/ufr2
mkdir -p $out/share/caepcm
install -m 644 *.ICC $out/share/caepcm
install -m 644 *.icc $out/share/caepcm
install -m 644 *.PRF $out/share/caepcm
install -m 644 CnLB* $out/share/caepcm
)
(
cd cnrdrvcups-utility-${version}/data
mkdir -p $out/usr/share/cnsetuputil2
install -m 644 cnsetuputil* $out/usr/share/cnsetuputil2
)
makeWrapper "${ghostscript}/bin/gs" "$out/bin/gs" \
--prefix LD_LIBRARY_PATH ":" "$out/lib" \
--prefix PATH ":" "$out/bin"

View file

@ -0,0 +1,11 @@
--- ./cnrdrvcups-lb-6.00/cngplp/cngplpmod/execjob.c 2024-01-08 04:18:42.000000000 +0100
+++ ./cnrdrvcups-lb-6.00/cngplp/cngplpmod/execjob.c 2024-08-06 17:13:52.234522912 +0200
@@ -1161,7 +1161,7 @@
ptr_param += num;
list_num += num;
if (strlen(ppd_opt->job_result_notice_address) > 0){
- num = add_param_int(ptr_param, kPPD_Items_CNJobResultNoticeAddress, ppd_opt->job_result_notice_address);
+ num = add_param_char(ptr_param, kPPD_Items_CNJobResultNoticeAddress, ppd_opt->job_result_notice_address);
ptr_param += num;
list_num += num;
}