File OpenPrintingPPDs.spec of Package OpenPrintingPPDs
#
# spec file for package OpenPrintingPPDs
#
# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
Name: OpenPrintingPPDs
BuildRequires: cups
# All printer driver packages should have "BuildRequires: python-cups"
# because python-cups installs special rpm macros that adds Provides tags
# for the printer drivers supported by the package,
# see https://bugzilla.novell.com/show_bug.cgi?id=735865
# but python-cups is not available for SLE10, regarding the suse_version value for SLE10
# see http://en.opensuse.org/openSUSE:Build_Service_cross_distribution_howto
%if 0%{?suse_version} > 1010
BuildRequires: python-cups
%endif
Summary: PPD files from OpenPrinting.org
License: GPL-2.0+ and MIT
Group: Hardware/Printing
# The package version is the PPD-O-MATIC version mentioned in the PPD files
# which is currently "PPD-O-MATIC (4.0.0 or newer)"
# and/or the required minimal foomatic-rip version by the PPD files
# which is currently "Foomatic 4.0.0"
# (macro name can be only alphanumeric and '_' i.e. "foomatic-rip_version" does not work)
%define foomatic_rip_version 4.0.0
# plus an additional trailing version number by openSUSE
# so that openSUSE package upgrades get a strictly increasing sequence of versions:
Version: 4.0.0.2
Release: 0
Url: http://www.linuxfoundation.org/collaborate/workgroups/openprinting/database/query
BuildArch: noarch
# The main-package OpenPrintingPPDs alone is useless because it does not contain any PPD files.
# The PPD files are provided via its sub-packages depending on which kind of driver software
# is needed so that the appropriate RPM requirements can be specified for each sub-package.
# Nevertheless when a user selects only the main-package to be installed, he probably
# wants "all the OpenPrintingPPDs" and therefore all sub-packages are recommended:
Recommends: OpenPrintingPPDs-ghostscript
Recommends: OpenPrintingPPDs-hpijs
Recommends: OpenPrintingPPDs-postscript
# Howto make Source0:
# See the HOWTO file in the sources.
Source0: OpenPrintingPPDs-%{version}.tar.bz2
# Install into this non-root directory (required when norootforbuild is used):
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
To set up a printer configuration a printer description file
(PPD file) is required.
A printer description file is not a driver.
For non-PostScript printers a driver is needed
together with a PPD file which matches exactly
to the particular driver.
For PostScript printers, a PPD file alone is sufficient
(except for older PostScript level 1 printer models).
The PPD files are provided in the following sub-packages
depending on which kind of driver software is needed:
OpenPrintingPPDs-ghostscript provides PPDs
which use Ghostscript built-in drivers.
OpenPrintingPPDs-hpijs provides PPDs
which use the hpijs driver from HPLIP.
OpenPrintingPPDs-postscript provides PPDs
which need no driver.
%package ghostscript
Summary: PPD files from OpenPrinting.org which use Ghostscript built-in drivers
Group: Hardware/Printing
# This version is no typo because the PPDs are created at OpenPrinting.org
# by PPD-O-MATIC version X.Y.Z which is the version of this package
# and usually those PPDs require at least the same version of the foomatic-rip filter:
Requires: foomatic-filters >= %{foomatic_rip_version}
Requires: ghostscript-library
%description ghostscript
PPD files for non-PostScript printers
which use a Ghostscript built-in driver
and PPD files for PostScript level 1 printers
which use the Ghostscript driver pswrite.
%package hpijs
Summary: PPD files from OpenPrinting.org which use the hpijs driver
Group: Hardware/Printing
# This version is no typo because the PPDs are created at OpenPrinting.org
# by PPD-O-MATIC version X.Y.Z which is the version of this package
# and usually those PPDs require at least the same version of the foomatic-rip filter:
Requires: foomatic-filters >= %{foomatic_rip_version}
Requires: ghostscript-library
Requires: hplip-hpijs
%description hpijs
PPD files for non-PostScript printers
which use the Ghostscript IJS driver
/usr/bin/hpijs from HPLIP.
%package postscript
Summary: PPD files from OpenPrinting.org for PostScript printers
Group: Hardware/Printing
# Regardless that PPD files for PostScript printers do not require a driver
# many PPD files from OpenPrinting.org for PostScript printers still
# require the foomatic-rip filter which does not call 'gs' or another real driver program
# but inserts PostScript snippets from the PPD at the beginning of the PostScript data.
# This version is no typo because the PPDs are created at OpenPrinting.org
# by PPD-O-MATIC version X.Y.Z which is the version of this package
# and usually those PPDs require at least the same version of the foomatic-rip filter:
Requires: foomatic-filters >= %{foomatic_rip_version}
%description postscript
PPD files for PostScript printers
which do not use a driver but
may use the foomatic-rip filter.
%prep
# Be quiet when unpacking:
%setup -q -n OpenPrintingPPDs
%build
# There is nothing to "make" as the sources contain plain PPD files.
# Neverteless some conversion and testing must be done.
PPDs_DIRs="PPDs_for_printers_for_ghostscript_drivers \
PPDs_for_printers_for_hpijs_drivers \
PPDs_for_printers_for_postscript_drivers"
set +x
# Make some general tests and adjustments for all PPDs:
# - Add a line-feed to the end of all PPDs to fix those PPDs where it is missing.
# See Novell/Suse Bugzilla bug #309832: Unix/Linux text files must end with a line-feed.
# Otherwise reading the last line results EOF and then some programs may ignore the last line.
# - Only keep files which are really PPD files (test file's output).
# - Only keep files which are of '*LanguageVersion: English'.
# - Remove PPDs which use an non-Ghostscript external driver filter program.
# - Remove whitespaces (except \n) from lines which contain only whitespaces
# ('\n \n' is not allowed but '\n\n' is).
# Some of the manufactuer's PPD files contain a non-free redistribution license
# which demands that "the contents of the file are not altered"
# but adding only a line-feed to the end of a PPD file and
# removing lines which contain only whitespaces
# is considered to be still allowed:
for d in $PPDs_DIRs
do echo "Making general tests and adjustments for the PPDs in $d"
for p in $d/*.ppd
do echo -en '\n' >>$p
file $p | grep -q 'PPD file, ve' || { rm -v $p ; continue ; }
grep -q '^\*LanguageVersion:[[:space:]]*English' $p || { rm -v $p ; continue ; }
grep -q '^\*driverType F/Filter:' $p && { rm -v $p ; continue ; }
sed -i -e 's/^[[:space:]]*$//' $p
done
echo "Finished general tests and adjustments for the PPDs in $d"
done
# Fix trivial bugs for particular PPDs:
# Some Lexmark PPDs contain "* DefaultColorSep:", "* DefaultOutputOrder:", "* DefaultScreenProc:", "* InkName:"
# which must be "*DefaultColorSep:", "*DefaultOutputOrder:", "*DefaultScreenProc:", "*InkName:"
for p in PPDs_for_printers_for_postscript_drivers/Lexmark-*.Postscript-Lexmark.ppd
do echo "Fixing trivial bugs for Lexmark PPD $p"
for k in DefaultColorSep DefaultOutputOrder DefaultScreenProc InkName
do sed -i -e "s/^\* $k:/*$k:/" $p
done
done
# For Kyocera PPDs:
# Some have an 1284DeviceID entry "MFG:Kyocera Mita:Model:...
# which should be "MFG:Kyocera Mita;Model:...
# (i.e. wrong field seperator ':' instead of ';')
for p in PPDs_for_printers_for_postscript_drivers/Kyocera-CS-*.Postscript-Kyocera.ppd
do echo "Fixing trivial bugs for Kyocera PPD $p"
if grep -q 'MFG:Kyocera Mita:Model:' $p
then # Some of Kyocera's PostScript PPD files contain a non-free redistribution license
# which demands that "the contents of the file are not altered in any way from their original form"
# so that issues in those PPD files cannot be fixed:
if grep -q 'contents of the file are not altered' $p
then echo "Kyocera's redistribution license forbids to fix 'MFG:Kyocera Mita:Model:' bug in $p"
else sed -i -e 's/MFG:Kyocera Mita:Model:/MFG:Kyocera Mita;Model:/' $p
echo "Fixed 'MFG:Kyocera Mita:Model:' bug in $p"
fi
fi
done
# Final test by cupstestppd:
# Keep all PPDs even if cupstestppd FAILs.
# Reason:
# With each CUPS version upgrade cupstestppd finds more and more errors
# so that more and more PPDs would be no longer included in the RPM
# which have been included before which results a regression.
# As far as we know there have been no problems at all because of
# not strictly compliant PPDs so that it is much better
# to provide all PPDs so that the matching printers can be used
# than to be rigorous regarding enforcing compliance to the PPD specification:
for d in $PPDs_DIRs
do echo "Testing with cupstestppd the PPDs in $d"
for p in $d/*.ppd
do cupstestppd -q -W all -r $p || echo "cupstestppd failed for $p"
done
echo "Finished testing with cupstestppd the PPDs in $d"
done
# Check and warn for duplicate NickName entries.
# Usually the NickName entry is shown to the user to let him select a PPD
# and then PPDs with same NickName entries are undistinguishable for the user.
# Nevertheless we keep them because e.g. in YaST or when using "lpadmin"
# the user can alternatively select a PPD via its file name.
for d in $PPDs_DIRs
do echo "Checking duplicate NickName entries for the PPDs in $d"
grep -h '^\*NickName:' $d/*.ppd | grep -o '"[^"]*"' | sort -f | uniq -dci | grep '.*' && echo "There are duplicate NickName entries in PPDs in $d"
echo "Finished checking duplicate NickName entries for the PPDs in $d"
done
# Finally compress the PPDs:
for d in $PPDs_DIRs
do echo "Compressing the PPDs in $d"
for p in $d/*.ppd
do gzip -9 "$p"
done
echo "Finished compressing the PPDs in $d"
done
%install
# Make the install directories and install the matching PPDs:
for d in ghostscript hpijs postscript
do mkdir -p %{buildroot}/usr/share/cups/model/OpenPrintingPPDs/$d
set +x
echo "Installing the '$d' PPDs."
for p in PPDs_for_printers_for_${d}_drivers/*.ppd.gz
do install -m 644 $p %{buildroot}/usr/share/cups/model/OpenPrintingPPDs/$d
done
echo "Finished installing the '$d' PPDs."
set -x
done
# Do not install the "Generic GDI Printer" PPD because there is no such thing
# as a "Generic GDI Printer", see http://www.cups.org/str.php?L3759
# The particular GDI printer models which are supported have already their
# individual /usr/share/cups/model/OpenPrintingPPDs/ghostscript/*gdi* PPD files.
rm %{buildroot}/usr/share/cups/model/OpenPrintingPPDs/ghostscript/Generic-GDI_Printer.gdi.ppd.gz
%files
%defattr(-,root,root)
%doc HOWTO README gpl-2.0.txt makePPDtest
%files ghostscript
%defattr(-,root,root)
%dir /usr/share/cups
%dir /usr/share/cups/model
%dir /usr/share/cups/model/OpenPrintingPPDs
/usr/share/cups/model/OpenPrintingPPDs/ghostscript
%files hpijs
%defattr(-,root,root)
%dir /usr/share/cups
%dir /usr/share/cups/model
%dir /usr/share/cups/model/OpenPrintingPPDs
/usr/share/cups/model/OpenPrintingPPDs/hpijs
%files postscript
%defattr(-,root,root)
%dir /usr/share/cups
%dir /usr/share/cups/model
%dir /usr/share/cups/model/OpenPrintingPPDs
/usr/share/cups/model/OpenPrintingPPDs/postscript
%changelog