]> git.ipfire.org Git - thirdparty/cups.git/blame - doc/help/spec-cmp.html
Load cups into easysw/current.
[thirdparty/cups.git] / doc / help / spec-cmp.html
CommitLineData
4744bd90 1<HTML>
2<!-- SECTION: Specifications -->
3<HEAD>
e1d6a774 4 <TITLE>CUPS Developer Guide</TITLE>
4744bd90 5</HEAD>
6<BODY>
7
e1d6a774 8<P>This developer guide documents the guidelines and processes we
9use when developing and maintaining the Common UNIX Printing
10System ("CUPS") and related software. Our goal is to provide
11reliable and efficient software and documentation that addresses
12the needs of our users.</P>
4744bd90 13
14<H2 CLASS="title"><A NAME="COMMUNICATION">Communication</A></H2>
15
16<H3><A NAME="CONTACT">How to Contact the Developers</A></H3>
17
18<P>The <A HREF="http://www.cups.org/newsgroups.php">CUPS
19Forums</A> are the primary means of asking questions and
20informally discussing issues and feature requests with the CUPS
21developers. Table 1 shows the available forums and their
22focus:</P>
23
24<DIV CLASS="table"><TABLE SUMMARY="CUPS Forums">
25<CAPTION>Table 1: CUPS Forums</CAPTION>
26<TR>
27 <TH>Forum</TH>
28 <TH>Focus/Purpose</TH>
29</TR>
30<TR>
31 <TD>cups.bugs</TD>
32 <TD>Discussion of bugs and issues in the CUPS
33 software</TD>
34</TR>
35<TR>
36 <TD>cups.commit</TD>
37 <TD>Report of all commits to the Subversion repository
38 (read-only)</TD>
39</TR>
40<TR>
41 <TD>cups.ddk</TD>
42 <TD>Usage and development questions for the CUPS Driver
43 Development Kit</TD>
44</TR>
45<TR>
46 <TD>cups.development</TD>
47 <TD>Development questions and discussion of new features
48 in the CUPS software</TD>
49</TR>
50<TR>
51 <TD>cups.general</TD>
52 <TD>Usage questions for the CUPS software</TD>
53</TR>
54</TABLE></DIV>
55
56<H3><A NAME="SUBMIT">How to Submit a Bug Report or Feature Request</A></H3>
57
58<P>The CUPS "<A HREF="http://www.cups.org/str.php">Bugs &amp;
59Features</A>" page provides access to the CUPS <em>software
60trouble report</em> database and is the formal way to submit a
61bug report or feature request to the CUPS developers. Please
62note, however, that we <em>do not</em> provide answers to usage
63questions or resolve problems in third-party software on this
64page - use the CUPS Forums for that instead.</P>
65
66<P>Unlike discussions that occur on the CUPS Forums, formal bug
67reports and feature requests must be acted on by the CUPS
68developers. This does not mean that every bug report is resolved
69or every feature request is implemented, but we do respond and
70keep track of them all for posterity.</P>
71
72<BLOCKQUOTE>Please use the search feature of the Bugs &amp;
73Features page before submitting a new bug report or feature
74request. If you see an existing report that matches your issue,
75please post a message to that report ("I have this issue as
76well", "I would also like to see", etc.) rather than submitting a
77new report. This helps speed the resolution of your issue by
78reducing the CUPS developers' work load.</BLOCKQUOTE>
79
80<H3><A NAME="PATCH">How to Prepare a Patch</A></H3>
81
82<P>When submitting a bug report or feature request, you can
83include patch files that resolve the bug or implement the feature
84to speed the inclusion of that bug fix or feature in a new CUPS
85release. For changes to existing files, we prefer a unified diff
86against the current Subversion <VAR>trunk</VAR> branch, which can
87be generated easily using the following Subversion command:</P>
88
89<PRE CLASS="command">
90svn diff >filename.patch
91</PRE>
92
93<P>If you produce a patch using a released source archive, use
94one of the following commands instead:</P>
95
96<PRE CLASS="command">
97diff -u oldfilename filename >filename.patch
98
99diff -urN olddirectory directory >filename.patch
100</PRE>
101
102<P>New files and files with significant changes can be submitted
103in their entirety, however that may delay the adoption of your
104changes.</P>
105
106<BLOCKQUOTE>Patches and files must conform to the standards
107outlined in the "<A HREF="#CODING">Coding Guidelines</A>" and "<A
108HREF="#MAKEFILES">Makefile Guidelines</A>" sections in this
109document. In addition, since Easy Software Products provides CUPS
110under multiple licenses, we require that you assign the copyright
111for your changes and files to us for inclusion in
112CUPS.</BLOCKQUOTE>
113
114
115<H2 CLASS="title"><A NAME="PRACTICES">Software Development Practices</A></H2>
116
117<H3><A NAME="VERSIONS">Version Numbering</A></H3>
118
119<P>CUPS uses a three-part version number separated by periods to
120represent the major, minor, and patch release numbers. Major
121release numbers indicate large design changes or
122backwards-incompatible changes to the CUPS API or CUPS Imaging
123API. Minor release numbers indicate new features and other
124smaller changes which are backwards-compatible with previous CUPS
125releases. Patch numbers indicate bug fixes to the previous
126release.</P>
127
128<BLOCKQUOTE>When we talk about compatibility, we are talking
129about binary compatibility for public APIs and output format
130compatibility for program interfaces. Changes to configuration
131file formats or the default behavior of programs are not
132generally considered incompatible as the upgrade process can
133normally address such changes gracefully.</BLOCKQUOTE>
134
135<P>Production releases use the plain version numbers:</P>
136
137<PRE CLASS="command">
138MAJOR.MINOR.PATCH
1391.0.0
1401.0.1
1411.0.2
142...
1431.1.0
144...
1451.1.23
1461.2.0
1471.2.1
148...
1491.3.0
150...
1512.0.0
152</PRE>
153
154<P>The first production release in a MAJOR.MINOR series
155(MAJOR.MINOR.0) is called a feature release. Feature releases are
156the only releases that may contain new features. Subsequent
157production releases in a MAJOR.MINOR series may only contain bug
158fixes.</P>
159
160<BLOCKQUOTE>We did not hold to this limitation in the CUPS 1.1
161series for a variety of reasons. Starting with CUPS 1.2, the "no
162new features in a patch release" policy will be strictly
163enforced. This should yield more frequent minor releases with
164fewer new features (and interactions!) to
165validate/test.</BLOCKQUOTE>
166
167<P>Beta-test releases are identified by appending the letter B
168to the major and minor version numbers followed by the beta
169release number:</P>
170
171<PRE CLASS="command">
172MAJOR.MINORbNUMBER
1731.2b1
174</PRE>
175
176<P>Release candidates are identified by appending the letters RC
177to the major and minor version numbers followed by the release
178candidate number:</P>
179
180<PRE CLASS="command">
181MAJOR.MINORrcNUMBER
1821.2rc1
183</PRE>
184
185<P>Developer snapshots are identified by appending the letters
186SVN-R to the major and minor version numbers followed by the
187revision number:</P>
188
189<PRE CLASS="command">
190MAJOR.MINORsvn-rREV
1911.2svn-r1234
192</PRE>
193
194<P>Beta-test releases, release candidates, and developer
195snapshots are only created for new minor releases. Once a
196production release has been made (MAJOR.MINOR.0), subsequent
197patch releases are issues without preliminary beta or release
198testing.</P>
199
200<H3>Version Control (Subversion)</H3>
201
202<P>The CUPS source files are managed by the Subversion ("SVN")
203software, available at:</P>
204
205<PRE CLASS="command">
206<A HREF="http://subversion.tigris.org/" TARGET="_blank">subversion.tigris.org</A>
207</PRE>
208
209<P>Source files are "checked in" with each change so that
210modifications can be tracked, and each checkin must reference any
211applicable STRs. The following format <em>must</em> be used for
212commit log messages:</P>
213
214<PRE CLASS="command">
215Summary of the change ("fix PostScript printing bug") along
216with corresponding STRs ("STR #1, STR #6")
217
218foo.cxx:
219 - function(): Detailed list of changes
220 - function2(): Detailed list of changes
221 - Summary of design changes ("added new foo struct")
222
223bar.h:
224 - More detailed changes
225</PRE>
226
227<P>Primary development occurs on the <var>trunk</var> branch,
228with changes merged back to release branches as needed. Table 2
229shows the URLs developers use for the various CUPS subprojects
230and branches:</P>
231
232<DIV CLASS="table"><TABLE SUMMARY="CUPS Subversion URLs">
233<CAPTION>Table 2: CUPS Subversion URLs</CAPTION>
234<TR>
235 <TH>URL</TH>
236 <TH>Purpose</TH>
237</TR>
238<TR>
239 <TD><A HREF="http://svn.easysw.com/public/cups/trunk/">https://svn.easysw.com/public/cups/trunk/</A></TD>
240 <TD>Primary CUPS development branch</TD>
241</TR>
242<TR>
243 <TD><A HREF="http://svn.easysw.com/public/cups/branches/">https://svn.easysw.com/public/cups/branches/</A></TD>
244 <TD>CUPS maintenance branches (merge-only)</TD>
245</TR>
246<TR>
247 <TD><A HREF="http://svn.easysw.com/public/cups/tags/">https://svn.easysw.com/public/cups/tags/</A></TD>
248 <TD>CUPS release tags (read-only)</TD>
249</TR>
250<TR>
251 <TD><A HREF="http://svn.easysw.com/public/cupsddk/trunk/">https://svn.easysw.com/public/cupsddk/trunk/</A></TD>
252 <TD>Primary CUPS DDK development branch</TD>
253</TR>
254<TR>
255 <TD><A HREF="http://svn.easysw.com/public/cupsddk/branches/">https://svn.easysw.com/public/cupsddk/branches/</A></TD>
256 <TD>CUPS DDK maintenance branches (merge-only)</TD>
257</TR>
258<TR>
259 <TD><A HREF="http://svn.easysw.com/public/cupsddk/tags/">https://svn.easysw.com/public/cupsddk/tags/</A></TD>
260 <TD>CUPS DDK release tags (read-only)</TD>
261</TR>
262<TR>
263 <TD><A HREF="http://svn.easysw.com/public/espgs/trunk/">https://svn.easysw.com/public/espgs/trunk/</A></TD>
264 <TD>Primary ESP Ghostscript development branch</TD>
265</TR>
266<TR>
267 <TD><A HREF="http://svn.easysw.com/public/espgs/branches/">https://svn.easysw.com/public/espgs/branches/</A></TD>
268 <TD>ESP Ghostscript maintenance branches (merge-only)</TD>
269</TR>
270<TR>
271 <TD><A HREF="http://svn.easysw.com/public/espgs/tags/">https://svn.easysw.com/public/espgs/tags/</A></TD>
272 <TD>ESP Ghostscript release tags (read-only)</TD>
273</TR>
274<TR>
275 <TD><A HREF="http://svn.easysw.com/public/windows/trunk/">https://svn.easysw.com/public/windows/trunk/</A></TD>
276 <TD>Primary CUPS Windows Driver development branch</TD>
277</TR>
278<TR>
279 <TD><A HREF="http://svn.easysw.com/public/windows/branches/">https://svn.easysw.com/public/windows/branches/</A></TD>
280 <TD>CUPS Windows Driver maintenance branches (merge-only)</TD>
281</TR>
282<TR>
283 <TD><A HREF="http://svn.easysw.com/public/windows/tags/">https://svn.easysw.com/public/windows/tags/</A></TD>
284 <TD>CUPS Windows Driver release tags (read-only)</TD>
285</TR>
286</TABLE></DIV>
287
288<P>The branch for a MAJOR.MINOR release are created when the
289first production release (MAJOR.MINOR.0) is made using the name
290"branch-MAJOR.MINOR". Release tags are created for every beta,
291candidate, and production release using the name
292"release-MAJOR.MINOR.PATCHbNUMBER",
293"release-MAJOR.MINOR.PATCHrcNUMBER", or
294"release-MAJOR.MINOR.PATCH", respectively. No release tags are
295created for developer snapshots.</P>
296
297
298<H3>Files and Directories</H3>
299
300<P>File and directory names may not exceed 16 characters in
301length to ensure compability with older UNIX filesystems. In
302addition, to avoid problems with case-insensitive filesystems,
303you may not use names which differ only by case, for example
304"ReadMe" and "README" are not allowed in the same directory.</P>
305
306<P>Source files must be documented and formatted as described in
307"<A HREF="#CODING">Coding Requirements</A>". Make files must
308follow the guidelines in "<A HREF="#MAKEFILE">Makefile
309Guidelines</A>".</P>
310
311
312<H3>Build System</H3>
313
314<P>The CUPS build system uses <A
315HREF="http://www.gnu.org/software/autoconf/">GNU autoconf</A> to
316tailor the library to the local operating system. Project files
317for major IDEs are also provided for Microsoft
318Windows<suP>&reg;</suP>. To improve portability, makefiles must
319not make use of the unique features offered by <A
320HREF="http://www.gnu.org/software/make/">GNU make</A>. See the <A
321HREF="#MAKEFILES">Makefile Guidelines</A> section for a
322description of the allowed make features and makefile
323guidelines.</P>
324
325<P>Additional GNU build programs such as <A
326HREF="http://www.gnu.org/software/automake">GNU automake</A> and
327<A HREF="http://www.gnu.org/software/libtool">GNU libtool</A>
328must not be used. GNU automake produces non-portable makefiles
329which depend on GNU-specific extensions, and GNU libtool is not
330portable or reliable enough for CUPS.</P>
331
332
333<H3><A NAME="PACKAGING">Packaging</A></H3>
334
335<P>Source packages are created using the
336<VAR>tools/makesrcdist</VAR> script in the Subversion repository.
337The script optionally uses a version number argument:</P>
338
339<PRE CLASS="command">
340tools/makesrcdist
341tools/makesrcdist <I>version</I>
342</PRE>
343
344<P>When run with no arguments, the script creates a snapshot of
345the current working copy and names it using the highest revision
346number in the WC, for example
347"/tmp/cups-1.2svn-r1234-source.tar.bz2" and
348"/tmp/cups-1.2svn-r1234-source.tar.gz". When run with two
349arguments, the script creates a release tag in the repository and
350exports that tag, creating the files
351"/tmp/cups-<I>version</I>-source.tar.bz2" and
352"/tmp/cups-<I>version</I>-source.tar.gz".</P>
353
354<P>Binary packages are not generally distributed by the CUPS
355team, however the <VAR>packaging/cups.spec</VAR> and
356<VAR>packaging/cups.list</VAR> files may be used to create binary
357packages on Linux, MacOS X, and UNIX. The
358<VAR>packaging/cups.spec</VAR> file produces a binary package
359using the <CODE>rpmbuild(8)</CODE> software:</P>
360
361<PRE CLASS="command">
362rpmbuild -ta cups-<I>version</I>-source.tar.gz
363</PRE>
364
365<P>The <VAR>cups.list</VAR> file is generated by the
366<VAR>configure</VAR> script and produces binary packages for many
367platforms using the <A HREF="http://www.easysw.com/epm/"
368TARGET="_blank">EPM</A> software. Table 3 shows the targets that
369are available for each type of binary package:</P>
370
371<DIV CLASS="table"><TABLE SUMMARY="Binary Package Targets">
372<CAPTION>Table 3: Binary Package Targets</CAPTION>
373<TR>
374 <TH>Target</TH>
375 <TH>Type of Package</TH>
376</TR>
377<TR>
378 <TD>aix</TD>
379 <TD>AIX installp</TD>
380</TR>
381<TR>
382 <TD>bsd</TD>
383 <TD>*BSD pkg_install</TD>
384</TR>
385<TR>
386 <TD>deb</TD>
387 <TD>Debian dpkg</TD>
388</TR>
389<TR>
390 <TD>depot</TD>
391 <TD>HP-UX swinstall</TD>
392</TR>
393<TR>
394 <TD>epm</TD>
395 <TD>Portable tarball with install script</TD>
396</TR>
397<TR>
398 <TD>inst</TD>
399 <TD>IRIX inst/tardist</TD>
400</TR>
401<TR>
402 <TD>osx</TD>
403 <TD>MacOS X Install</TD>
404</TR>
405<TR>
406 <TD>pkg</TD>
407 <TD>Solaris pkgadd</TD>
408</TR>
409<TR>
410 <TD>rpm</TD>
411 <TD>RPM binary</TD>
412</TR>
413<TR>
414 <TD>setld</TD>
415 <TD>Tru64 UNIX setld</TD>
416</TR>
417<TR>
418 <TD>slackware</TD>
419 <TD>Slackware install</TD>
420</TR>
421<TR>
422 <TD>swinstall</TD>
423 <TD>HP-UX swinstall</TD>
424</TR>
425<TR>
426 <TD>tardist</TD>
427 <TD>IRIX inst/tardist</TD>
428</TR>
429</TABLE></DIV>
430
431<P>Finally, the <VAR>tools/testrpm</VAR> and
432<VAR>tools/testosx</VAR> scripts can be used to create binary
433packages from the current working copy for testing on Linux and
434MacOS X, respectively:</P>
435
436<PRE CLASS="command">
437tools/testrpm
438sudo rpm -U /usr/src/redhat/RPMS/i386/cups*.rpm
439
440sudo tools/testosx
441open cups.pkg
442</PRE>
443
444
445<H3><A NAME="TESTING">Testing</A></H3>
446
447<P>Software testing is conducted according to the <A
448HREF="spec-stp.html">CUPS Software Test Plan</A>. This testing is
449automated via the top-level makefile <VAR>test</VAR> target:</P>
450
451<PRE CLASS="command">
452make test
453</PRE>
454
455<P>The test environment allows for both short-term automated
456testing and long-term testing and development without the
457automated test script.</P>
458
459
460<H2 CLASS="title"><A NAME="STR">Trouble Report Processing</A></H2>
461
462<P>A Software Trouble Report ("STR") must be submitted every time
463a user or vendor experiences a problem with the CUPS software.
464Trouble reports are maintained on the <A
465HREF="http://www.cups.org/str.php" TARGET="_blank">Bugs &amp;
466Features</A> page with one of the following states:</P>
467
468<OL>
469
470 <LI>STR is closed with complete resolution</LI>
471
472 <LI>STR is closed without resolution</LI>
473
474 <LI>STR is active, waiting on information from submitter</LI>
475
476 <LI>STR is pending with additional information from submitter</LI>
477
478 <LI>STR is newly submitted</LI>
479
480</OL>
481
482<P>Trouble reports are processed using the following steps.</P>
483
484<OL>
485
486<LI>Classification
487
488<P>When a trouble report is received it must be classified at one
489of the following priority levels:</P>
490
491<OL>
492
493 <LI>Request for enhancement, e.g. asking for a
494 feature
495
496 <LI>Low, e.g. a documentation error or undocumented
497 side-effect
498
499 <LI>Moderate, e.g. unable to print a file or unable to
500 compile the software
501
502 <LI>High, e.g. unable to print to a printer or key
503 functionality not working
504
505 <LI>Critical, e.g. unable to print at all
506
507</OL>
508
509<P>Level 4 and 5 trouble reports must be resolved in the next
510software release. Level 2 and 3 trouble reports are scheduled for
511resolution in a specific release at the discretion of the release
512coordinator. Level 1 trouble reports are scheduled for resolution
513in a future feature release.</P>
514
515<P>The scope of the problem is also determined as:</P>
516
517<OL>
518
519 <LI>Specific to a machine or printer
520
521 <LI>Specific to an operating system
522
523 <LI>Applies to all machines, printers, and operating systems
524
525</OL>
526
527<LI>Identification
528
529<P>Once the level and scope of the trouble report is determined
530the software sub-system(s) involved with the problem are
531determined. This may involve additional communication with the
532user or vendor to isolate the problem to a specific cause.</P>
533
534<P>When the sub-system(s) involved have been identified, an
535engineer will then determine the change(s) needed and estimate
536the time required for the change(s).</P>
537
538<LI>Correction
539
540<P>Corrections are scheduled based upon the severity and
541complexity of the problem. Once all changes have been made,
542documented, and tested successfully a new software release
543snapshot is generated. Additional tests are added as necessary
544for proper testing of the changes.</P>
545
546<LI>Notification
547
548<P>The user or vendor is notified when the fix is available or if
549the problem was caused by user error.</P>
550
551</OL>
552
553
554<H2 CLASS="title"><A NAME="RELEASES">Release Management</A></H2>
555
556<P>When testing has been completed successfully, a new source
557package is created using the <VAR>tools/makesrcdist</VAR> script.
558Three types of releases, beta, candidate, and production, are
559created and released to the public using the basic schedule in
560Table 4. At least one beta and one release candidate must be
561created prior to a production release, and there must be at least
562two weeks between the last beta and first candidate and last
563candidate and first production release.</P>
564
565<DIV CLASS="table"><TABLE SUMMARY="CUPS Basic Release Schedule">
566<CAPTION>Table: CUPS Basic Release Schedule</CAPTION>
567<TR>
568 <TH>Week</TH>
569 <TH>Version</TH>
570 <TH>Description</TH>
571</TR>
572<TR>
573 <TD>T-6 weeks</TD>
574 <TD>1.2b1</TD>
575 <TD>First beta release</TD>
576</TR>
577<TR>
578 <TD>T-5 weeks</TD>
579 <TD>1.2b2</TD>
580 <TD>Second beta release</TD>
581</TR>
582<TR>
583 <TD>T-3 weeks</TD>
584 <TD>1.2rc1</TD>
585 <TD>First release candidate</TD>
586</TR>
587<TR>
588 <TD>T-2 weeks</TD>
589 <TD>1.2rc2</TD>
590 <TD>Second release candidate</TD>
591</TR>
592<TR>
593 <TD>T-0 weeks</TD>
594 <TD>1.2.0</TD>
595 <TD>Production (feature) release</TD>
596</TR>
597</TABLE></DIV>
598
599
600<H2 CLASS="title"><A NAME="CODING">Coding Guidelines</A></H2>
601
602<P>These coding guidelines provide detailed information on source
603file formatting and documentation content and must be applied to
604all C and C++ source files provided with CUPS. Source code for
605other languages should conform to these guidelines as allowed by
606the language.</P>
607
608<H3>Source Files</H3>
609
610<P>All source files names shall be 16 characters or less in
611length to ensure compatibility with older UNIX filesystems.
612Source files containing functions shall have an extension of ".c"
613for ANSI C and ".cxx" for C++ source files. All other "include"
614files shall have an extension of ".h".</P>
615
616<P>The top of each source file shall contain a header giving the
617name of the file, the purpose or nature of the source file, the
618copyright and licensing notice, and the functions contained in
619the file. The file name and revision information is provided by
620the Subversion "&#36;Id$" tag:</P>
621
622<PRE CLASS="command">
623/*
624 * "&#36;Id$"
625 *
626 * Description of file contents.
627 *
628 * Copyright yyyy-YYYY by Easy Software Products, all rights
629 * reserved.
630 *
631 * These coded instructions, statements, and computer programs are
632 * the property of Easy Software Products and are protected by
633 * Federal copyright law. Distribution and use rights are outlined
634 * in the file "LICENSE.txt" which should have been included with
635 * this file. If this file is missing or damaged please contact
636 * Easy Software Products at:
637 *
638 * Attn: CUPS Licensing Information
639 * Easy Software Products
640 * 44141 Airport View Drive, Suite 204
641 * Hollywood, Maryland 20636 USA
642 *
643 * Voice: (301) 373-9600
644 * EMail: cups-info@cups.org
645 * WWW: http://www.cups.org/
646 *
647 * Contents:
648 *
649 * function1() - Description 1.
650 * function2() - Description 2.
651 * function3() - Description 3.
652 */
653</PRE>
654
655<P>For source files that are subject to the Apple OS-Developed
656Software exception, the following additional comment should
657appear after the contact information:</P>
658
659<PRE CLASS="command">
660 * This file is subject to the Apple OS-Developed Software exception.
661</PRE>
662
663<P>The bottom of each source file shall contain a trailer giving
664the name of the file using the Subversion "&#36;Id$" tag. The
665primary purpose of this is to mark the end of a source file; if
666the trailer is missing it is possible that code has been lost
667near the end of the file:</P>
668
669<PRE CLASS="command">
670/*
671 * End of "&#36;Id$".
672 */
673</PRE>
674
675<H3>Functions</H3>
676
677<P>Functions with a global scope shall have a lowercase prefix
678followed by capitalized words ("cupsDoThis", "cupsDoThat",
679"cupsDoSomethingElse", etc.) Private global functions shall begin
680with a leading underscore ("_cupsDoThis", "_cupsDoThat",
681etc.)</P>
682
683<P>Functions with a local scope shall be declared "static" and be
684lowercase with underscores between words ("do_this", "do_that",
685"do_something_else", etc.)</P>
686
687<P>Each function shall begin with a comment header describing
688what the function does, the possible input limits (if any), and
689the possible output values (if any), and any special information
690needed:</P>
691
692<PRE CLASS="command">
693/*
694 * 'do_this()' - Compute y = this(x).
695 *
696 * Notes: none.
697 */
698
699static float /* O - Inverse power value, 0.0 &lt;= y &lt;= 1.1 */
700do_this(float x) /* I - Power value (0.0 &lt;= x &lt;= 1.1) */
701{
702 ...
703 return (y);
704}
705</PRE>
706
707<P>Return/output values are indicated using an "O" prefix, input
708values are indicated using the "I" prefix, and values that are
709both input and output use the "IO" prefix for the corresponding
710in-line comment.</P>
711
712<P>The Mini-XML documentation generator also understands the following
713special text in the function description comment:</P>
714
715<UL>
716
717 <LI><CODE>@since CUPS <I>version</I>@</CODE> - Marks the
718 function as new in the specified version of CUPS.</LI>
719
720 <LI><CODE>@deprecated@</CODE> - Marks the function as
721 deprecated (not recommended for new development and
722 scheduled for removal)</LI>
723
724</UL>
725
726<H3>Variables</H3>
727
728<P>Variables with a global scope shall be capitalized
729("ThisVariable", "ThatVariable", "ThisStateVariable", etc.) The
730only exception to this rule shall be the CUPS interface library
731global variables which must begin with the prefix "cups"
732("cupsThisVariable", "cupsThatVariable", etc.) Global variables
733shall be replaced by function arguments whenever possible.</P>
734
735<P>Variables with a local scope shall be lowercase with
736underscores between words ("this_variable", "that_variable",
737etc.) Any local variables shared by functions within a source
738file shall be declared "static".</P>
739
740<P>Each variable shall be declared on a separate line and shall
741be immediately followed by a comment block describing the
742variable:</P>
743
744<PRE CLASS="command">
745int this_variable; /* The current state of this */
746int that_variable; /* The current state of that */
747</PRE>
748
749<H3>Types</H3>
750
751<P>All type names shall be lowercase with underscores between
752words and "_t" appended to the end of the name
753("cups_this_type_t", "cups_that_type_t", etc.) Type names must
754start with a prefix, typically "cups" or the name of the program,
755to avoid conflicts with system types. Private type names must
756start with an underscore ("_cups_this_t", "_cups_that_t",
757etc.)</P>
758
759<P>Each type shall have a comment block immediately after the
760typedef:</P>
761
762<PRE CLASS="command">
763typedef int cups_this_type_t; /* This type is for CUPS foobar options. */
764</PRE>
765
766<H3>Structures</H3>
767
768<P>All structure names shall be lowercase with underscores
769between words and "_s" appended to the end of the name
770("cups_this_s", "cups_that_s", etc.) Structure names must start
771with a prefix, typically "cups" or the name of the program, to
772avoid conflicts with system types. Private structure names must
773start with an underscore ("_cups_this_s", "_cups_that_s",
774etc.)</P>
775
776<P>Each structure shall have a comment block immediately after
777the struct and each member shall be documented in accordance with
778the variable naming policy above:</P>
779
780<PRE CLASS="command">
781struct cups_this_struct_s /* This structure is for CUPS foobar options. */
782{
783 int this_member; /* Current state for this */
784 int that_member; /* Current state for that */
785};
786</PRE>
787
788<H3>Constants</H3>
789
790<P>All constant names shall be uppercase with underscored between
791words ("CUPS_THIS_CONSTANT", "CUPS_THAT_CONSTANT", etc.)
792Constants must begin with an uppercase prefix, typically "CUPS"
793or the program name.</P>
794
795<P>Typed enumerations shall be used whenever possible to allow
796for type checking by the compiler.</P>
797
798<P>Comment blocks shall immediately follow each constant:</P>
799
800<PRE CLASS="command">
801enum
802{
803 CUPS_THIS_TRAY, /* This tray */
804 CUPS_THAT_TRAY /* That tray */
805};
806</PRE>
807
808<H3>Code</H3>
809
810<P>All source code shall utilize block comments within functions
811to describe the operations being performed by a group of
812statements; avoid putting a comment per line unless absolutely
813necessary, and then consider refactoring the code so that it is
814not necessary:</P>
815
816<PRE CLASS="command">
817/*
818 * Clear the state array before we begin...
819 */
820
821for (i = 0; i &lt; (sizeof(array) / sizeof(sizeof(array[0])); i ++)
822 array[i] = STATE_IDLE;
823
824/*
825 * Wait for state changes...
826 */
827
828do
829{
830 for (i = 0; i &lt; (sizeof(array) / sizeof(sizeof(array[0])); i ++)
831 if (array[i] != STATE_IDLE)
832 break;
833
834 if (i == (sizeof(array) / sizeof(array[0])))
835 sleep(1);
836} while (i == (sizeof(array) / sizeof(array[0])));
837</PRE>
838
839<H3>Indentation</H3>
840
841<P>All code blocks enclosed by brackets shall begin with the
842opening brace on a new line. The code then follows starting on a
843new line after the brace and is indented 2 spaces. The closing
844brace is then placed on a new line following the code at the
845original indentation:</P>
846
847<PRE CLASS="command">
848{
849 int i; /* Looping var */
850
851 /*
852 * Process foobar values from 0 to 999...
853 */
854
855 for (i = 0; i &lt; 1000; i ++)
856 {
857 do_this(i);
858 do_that(i);
859 }
860}
861</PRE>
862
863<P>Single-line statements following "do", "else", "for", "if",
864and "while" shall be indented 2 spaces as well. Blocks of code
865in a "switch" block shall be indented 4 spaces after each "case"
866and "default" case:</P>
867
868<PRE CLASS="command">
869switch (array[i])
870{
871 case STATE_IDLE :
872 do_this(i);
873 do_that(i);
874 break;
875 default :
876 do_nothing(i);
877 break;
878}
879</PRE>
880
881<H3>Spacing</H3>
882
883<P>A space shall follow each reserved word ("if", "while", etc.)
884Spaces shall not be inserted between a function name and the
885arguments in parenthesis.</P>
886
887<H3>Return Values</H3>
888
889<P>Parenthesis shall surround values returned from a function
890using "return":</P>
891
892<PRE CLASS="command">
893return (CUPS_STATE_IDLE);
894</PRE>
895
896<H3>Loops</H3>
897
898<P>Whenever convenient loops should count downward to zero to
899improve program performance:</P>
900
901<PRE CLASS="command">
902for (i = sizeof(array) / sizeof(array[0]) - 1; i >= 0; i --)
903 array[i] = CUPS_STATE_IDLE;
904</PRE>
905
906<H2 CLASS="title"><A NAME="MAKEFILES">Makefile Guidelines</A></H2>
907
908<P>The following is a guide to the makefile-based build system
909used by CUPS. These standards have been developed over the years
910to allow CUPS to be built on as many systems and environments as
911possible.</P>
912
913<H3>General Organization</H3>
914
915<P>The CUPS source code is organized functionally into a
916top-level makefile, include file, and subdirectories each with
917their own makefile and dependencies files. The ".in" files are
918template files for the <CODE>autoconf</CODE> software and are
919used to generate a static version of the corresponding file.</P>
920
921<H3>Makefile Documentation</H3>
922
923<P>Each make file must start with the standard CUPS header
924containing the Subversion "&#36;Id$" keyword, description of the
925file, and CUPS copyright and license notice:</P>
926
927<PRE CLASS="command">
928#
929# "&#36;Id$"
930#
931# Makefile for ...
932#
933# Copyright yyyy-YYYY by Easy Software Products, all rights
934# reserved.
935#
936# These coded instructions, statements, and computer programs are
937# the property of Easy Software Products and are protected by
938# Federal copyright law. Distribution and use rights are outlined
939# in the file "LICENSE.txt" which should have been included with
940# this file. If this file is missing or damaged please contact
941# Easy Software Products at:
942#
943# Attn: CUPS Licensing Information
944# Easy Software Products
945# 44141 Airport View Drive, Suite 204
946# Hollywood, Maryland 20636 USA
947#
948# Voice: (301) 373-9600
949# EMail: cups-info@cups.org
950# WWW: http://www.cups.org/
951#
952</PRE>
953
954<P>The end of each makefile must have a comment saying:</P>
955
956<PRE CLASS="command">
957#
958# End of "&#36;Id$".
959#
960</PRE>
961
962<P>The purpose of the trailer is to indicate the end of the
963makefile so that truncations are immediately obvious.</P>
964
965<H3>Portable Makefile Construction</H3>
966
967<P>CUPS uses a common subset of make program syntax to ensure
968that the software can be compiled "out of the box" on as many
969systems as possible. The following is a list of assumptions we
970follow when constructing makefiles:</P>
971
972<UL>
973
974 <LI><b>Targets</b>; we assume that the make program
975 supports the notion of simple targets of the form
976 "name:" that perform tab-indented commands that follow
977 the target, e.g.:
978 <PRE CLASS="command">
979target:
980&rarr; target commands</PRE></LI>
981
982 <LI><b>Dependencies</b>; we assume that the make program
983 supports recursive dependencies on targets, e.g.:
984 <PRE CLASS="command">
985target: foo bar
986&rarr; target commands
987
988foo: bla
989&rarr; foo commands
990
991bar:
992&rarr; bar commands
993
994bla:
995&rarr; bla commands</PRE></LI>
996
997 <LI><b>Variable Definition</b>; we assume that the make program
998 supports variable definition on the command-line or in the makefile
999 using the following form:
1000 <PRE CLASS="command">
1001name=value</PRE>
1002
1003 <LI><b>Variable Substitution</b>; we assume that the make program
1004 supports variable substitution using the following forms:
1005 <UL>
1006 <LI><CODE>$(name)</CODE>; substitutes the value of "name",</LI>
1007 <LI><CODE>($name:.old=.new)</CODE>; substitutes the value of "name"
1008 with the filename extensions ".old" changed to ".new",</LI>
1009 <LI><CODE>$(MAKEFLAGS)</CODE>; substitutes the
1010 command-line options passed to the program
1011 without the leading hyphen (-),</LI>
1012 <LI><CODE>$$</CODE>; substitutes a single <CODE>$</CODE> character,</LI>
1013 <LI><CODE>$&lt;</CODE>; substitutes the current source file or dependency, and</LI>
1014 <LI><CODE>$@</CODE>; substitutes the current target name.</LI>
1015 </UL></LI>
1016
1017 <LI><b>Suffixes</b>; we assume that the make program
1018 supports filename suffixes with assumed dependencies, e.g.:
1019 <PRE CLASS="command">
1020.SUFFIXES: .c .o
1021.c.o:
1022&rarr; $(CC) $(CFLAGS) -o $@ -c $&lt;</PRE></LI>
1023
1024 <LI><b>Include Files</b>; we assume that the make program
1025 supports the <CODE>include</CODE> directive, e.g.:
1026 <PRE CLASS="command">
1027include ../Makedefs
1028include Dependencies</PRE></LI>
1029
1030 <LI><b>Comments</b>; we assume that comments begin with
1031 a <CODE>#</CODE> character and proceed to the end of the
1032 current line.</LI>
1033
1034 <LI><b>Line Length</b>; we assume that there is no
1035 practical limit to the length of lines.</LI>
1036
1037 <LI><b>Continuation of long lines</b>; we assume that
1038 the <CODE>\</CODE> character may be placed at the end of a
1039 line to concatenate two or more lines in a
1040 makefile to form a single long line.</LI>
1041
1042 <LI><b>Shell</b>; we assume a POSIX-compatible shell is
1043 present on the build system.</LI>
1044
1045</UL>
1046
1047<H3>Standard Variables</H3>
1048
1049<P>The following variables are defined in the "Makedefs" file
1050generated by the <CODE>autoconf</CODE> software:</P>
1051
1052<UL>
1053
1054 <LI><CODE>AR</CODE>; the library archiver command,</LI>
1055
1056 <LI><CODE>ARFLAGS</CODE>; options for the library archiver command,</LI>
1057
1058 <LI><CODE>BUILDROOT</CODE>; optional installation prefix,</LI>
1059
1060 <LI><CODE>MAN1EXT</CODE>; extension for man pages in section 1,</LI>
1061
1062 <LI><CODE>MAN3EXT</CODE>; extension for man pages in section 3,</LI>
1063
1064 <LI><CODE>MAN5EXT</CODE>; extension for man pages in section 5,</LI>
1065
1066 <LI><CODE>MAN7EXT</CODE>; extension for man pages in section 7,</LI>
1067
1068 <LI><CODE>MAN8DIR</CODE>; subdirectory for man pages in section 8,</LI>
1069
1070 <LI><CODE>MAN8EXT</CODE>; extension for man pages in section 8,</LI>
1071
1072 <LI><CODE>CC</CODE>; the C compiler command,</LI>
1073
1074 <LI><CODE>CFLAGS</CODE>; options for the C compiler command,</LI>
1075
1076 <LI><CODE>CXX</CODE>; the C++ compiler command,</LI>
1077
1078 <LI><CODE>CXXFLAGS</CODE>; options for the C++ compiler command,</LI>
1079
1080 <LI><CODE>DSOCOMMAND</CODE>; the shared library building command,</LI>
1081
1082 <LI><CODE>DSOFLAGS</CODE>; options for the shared library building command,</LI>
1083
1084 <LI><CODE>INSTALL</CODE>; the <CODE>install</CODE> command,</LI>
1085
1086 <LI><CODE>INSTALL_BIN</CODE>; the program installation command,</LI>
1087
1088 <LI><CODE>INSTALL_DATA</CODE>; the data file installation command,</LI>
1089
1090 <LI><CODE>INSTALL_DIR</CODE>; the directory installation command,</LI>
1091
1092 <LI><CODE>INSTALL_LIB</CODE>; the library installation command,</LI>
1093
1094 <LI><CODE>INSTALL_MAN</CODE>; the documentation installation command,</LI>
1095
1096 <LI><CODE>INSTALL_SCRIPT</CODE>; the shell script installation command,</LI>
1097
1098 <LI><CODE>LDFLAGS</CODE>; options for the linker,</LI>
1099
1100 <LI><CODE>LIBS</CODE>; libraries for all programs,</LI>
1101
1102 <LI><CODE>LN</CODE>; the <CODE>ln</CODE> command,</LI>
1103
1104 <LI><CODE>OPTIM</CODE>; common compiler optimization options,</LI>
1105
1106 <LI><CODE>RM</CODE>; the <CODE>rm</CODE> command,</LI>
1107
1108 <LI><CODE>SHELL</CODE>; the <CODE>sh</CODE> (POSIX shell) command,</LI>
1109
1110 <LI><CODE>STRIP</CODE>; the <CODE>strip</CODE> command,</LI>
1111
1112 <LI><CODE>bindir</CODE>; the binary installation directory,</LI>
1113
1114 <LI><CODE>datadir</CODE>; the data file installation directory,</LI>
1115
1116 <LI><CODE>exec_prefix</CODE>; the installation prefix for executable files,</LI>
1117
1118 <LI><CODE>libdir</CODE>; the library installation directory,</LI>
1119
1120 <LI><CODE>mandir</CODE>; the man page installation directory,</LI>
1121
1122 <LI><CODE>prefix</CODE>; the installation prefix for non-executable files, and</LI>
1123
1124 <LI><CODE>srcdir</CODE>; the source directory.</LI>
1125
1126</UL>
1127
1128<H3>Standard Targets</H3>
1129
1130<P>The following standard targets must be defined in each
1131makefile:</P>
1132
1133<UL>
1134
1135 <LI><CODE>all</CODE>; creates all target programs,
1136 libraries, and documentation files,</LI>
1137
1138 <LI><CODE>clean</CODE>; removes all target programs,
1139 libraries, documentation files, and object files,</LI>
1140
1141 <LI><CODE>depend</CODE>; generates automatic dependencies
1142 for any C or C++ source files (also see <A
1143 HREF="#DEPEND_TARGET">"Dependencies"</A>),</LI>
1144
1145 <LI><CODE>distclean</CODE>; removes autoconf-generated files
1146 in addition to those removed by the "clean" target,</LI>
1147
1148 <LI><CODE>install</CODE>; installs all distribution files in
1149 their corresponding locations (also see <A
1150 HREF="#INSTALL_TARGET">"Install/Uninstall Support"</A>), </LI>
1151
1152 <LI><CODE>uninstall</CODE>; removes all distribution files from
1153 their corresponding locations (also see <A
1154 HREF="#INSTALL_TARGET">"Install/Uninstall Support"</A>), and</LI>
1155
1156</UL>
1157
1158
1159<H3>Object Files</H3>
1160
1161<P>Object files (the result of compiling a C or C++ source file)
1162have the extension ".o".</P>
1163
1164<H3>Programs</H3>
1165
1166<P>Program files are the result of linking object files and
1167libraries together to form an executable file. A typical
1168program target looks like:</P>
1169
1170<PRE CLASS="command">
1171program: $(OBJS)
1172&rarr; echo Linking $@...
1173&rarr; $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
1174</PRE>
1175
1176<H3>Static Libraries</H3>
1177
1178<P>Static libraries have a prefix of "lib" and the extension
1179".a". A typical static library target looks like:</P>
1180
1181<PRE CLASS="command">
1182libname.a: $(OBJECTS)
1183&rarr; echo Creating $@...
1184&rarr; $(RM) $@
1185&rarr; $(AR) $(ARFLAGS) $@ $(OBJECTS)
1186&rarr; $(RANLIB) $@
1187</PRE>
1188
1189<H3>Shared Libraries</H3>
1190
1191<P>Shared libraries have a prefix of "lib" and the extension
1192".dylib", ".sl", ".so", or "_s.a" depending on the operating
1193system. A typical shared library is composed of several targets
1194that look like:</P>
1195
1196<PRE CLASS="command">
1197libname.so: $(OBJECTS)
1198&rarr; echo $(DSOCOMMAND) libname.so.$(DSOVERSION) ...
1199&rarr; $(DSOCOMMAND) libname.so.$(DSOVERSION) $(OBJECTS)
1200&rarr; $(RM) libname.so libname.so.$(DSOMAJOR)
1201&rarr; $(LN) libname.so.$(DSOVERSION) libname.so.$(DSOMAJOR)
1202&rarr; $(LN) libname.so.$(DSOVERSION) libname.so
1203
1204libname.sl: $(OBJECTS)
1205&rarr; echo $(DSOCOMMAND) libname.sl.$(DSOVERSION) ...
1206&rarr; $(DSOCOMMAND) libname.sl.$(DSOVERSION) $(OBJECTS)
1207&rarr; $(RM) libname.sl libname.sl.$(DSOMAJOR)
1208&rarr; $(LN) libname.sl.$(DSOVERSION) libname.sl.$(DSOMAJOR)
1209&rarr; $(LN) libname.sl.$(DSOVERSION) libname.sl
1210
1211libname.dylib: $(OBJECTS)
1212&rarr; echo $(DSOCOMMAND) libname.$(DSOVERSION).dylib ...
1213&rarr; $(DSOCOMMAND) libname.$(DSOVERSION).dylib \
1214&rarr; &rarr; -install_name $(libdir)/libname.$(DSOMAJOR).dylib \
1215&rarr; &rarr; -current_version libname.$(DSOVERSION).dylib \
1216&rarr; &rarr; -compatibility_version $(DSOMAJOR).0 \
1217&rarr; &rarr; $(OBJECTS) $(LIBS)
1218&rarr; $(RM) libname.dylib
1219&rarr; $(RM) libname.$(DSOMAJOR).dylib
1220&rarr; $(LN) libname.$(DSOVERSION).dylib libname.$(DSOMAJOR).dylib
1221&rarr; $(LN) libname.$(DSOVERSION).dylib libname.dylib
1222
1223libname_s.a: $(OBJECTS)
1224&rarr; echo $(DSOCOMMAND) libname_s.o ...
1225&rarr; $(DSOCOMMAND) libname_s.o $(OBJECTS) $(LIBS)
1226&rarr; echo $(LIBCOMMAND) libname_s.a libname_s.o
1227&rarr; $(RM) $@
1228&rarr; $(LIBCOMMAND) libname_s.a libname_s.o
1229&rarr; $(CHMOD) +x libname_s.a
1230</PRE>
1231
1232
1233<H3>Dependencies</H3>
1234
1235<P>Static dependencies are expressed in each makefile following the
1236target, for example:</P>
1237
1238<PRE CLASS="command">
1239foo: bar
1240</PRE>
1241
1242<P>Static dependencies shall only be used when it is not
1243possible to automatically generate them. Automatic dependencies
1244are stored in a file named "Dependencies" and included at the
1245end of the makefile. The following "depend" target rule shall be
1246used to create the automatic dependencies:
1247
1248<PRE CLASS="command">
1249depend:
1250&rarr; $(MAKEDEPEND) -Y -I.. -f Dependencies $(OBJS:.o=.c)
1251</PRE>
1252
1253<P>We only regenerate the automatic dependencies on a Linux
1254system and express any non-Linux dependencies statically in the
1255makefile.</P>
1256
1257<H3><A NAME="TARGET_INSTALL">Install/Uninstall Support</A></H3>
1258
1259<P>All makefiles must contain install and uninstall rules which
1260install or remove the corresponding software. These rules must
1261use the <CODE>$(BUILDROOT)</CODE> variable as a prefix to any
1262installation directory so that CUPS can be installed in a
1263temporary location for packaging by programs like
1264<CODE>rpmbuild</CODE>.</P>
1265
1266<P>The <CODE>$(INSTALL_BIN)</CODE>, <CODE>$(INSTALL_DATA)</CODE>,
1267<CODE>$(INSTALL_DIR)</CODE>, <CODE>$(INSTALL_LIB)</CODE>,
1268<CODE>$(INSTALL_MAN)</CODE>, and <CODE>$(INSTALL_SCRIPT)</CODE>
1269variables must be used when installing files so that the proper
1270ownership and permissions are set on the installed files.</P>
1271
1272<P>The <CODE>$(RANLIB)</CODE> command must be run on any static
1273libraries after installation since the symbol table is
1274invalidated when the library is copied on some platforms.</P>
1275
1276</BODY>
1277</HTML>