Merge pull request #4650 from Repiteo/node-explicit-types
[scons.git] / doc / user / builders-built-in.xml
blob31602233009b06ede9ed0ad82e41877eb8589cd8
1 <?xml version='1.0'?>
3 <!--
4 SPDX-FileCopyrightText: Copyright The SCons Foundation (https://scons.org)
5 SPDX-License-Identifier: MIT
6 SPDX-FileType: DOCUMENTATION
8 This file is processed by the bin/SConsDoc.py module.
9 -->
11 <!DOCTYPE sconsdoc [
12     <!ENTITY % scons SYSTEM "../scons.mod">
13     %scons;
15     <!ENTITY % builders-mod SYSTEM "../generated/builders.mod">
16     %builders-mod;
17     <!ENTITY % functions-mod SYSTEM "../generated/functions.mod">
18     %functions-mod;
19     <!ENTITY % tools-mod SYSTEM "../generated/tools.mod">
20     %tools-mod;
21     <!ENTITY % variables-mod SYSTEM "../generated/variables.mod">
22     %variables-mod;
26 <chapter id="chap-builders-built-in"
27          xmlns="http://www.scons.org/dbxsd/v1.0"
28          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
29          xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
31 <!-- NOTE: this file is incomplete, and main.xml does not currently include it -->
32 <title>Built-In Builders</title>
34   <para>
36   &SCons; provides the ability to build a lot of different
37   types of files right "out of the box."
38   So far, we've been using &SCons;' ability to build
39   programs, objects and libraries to
40   illustrate much of the underlying functionality of &SCons;
41   This section will describe all of the different
42   types of files that you can build with &SCons;,
43   and the built-in &Builder; objects used to build them.
44   By default, all of the  &Builder; objects in this section
45   can be built either with or without an explicit
46   construction environment.
48   </para>
50   <section>
51   <title>Programs:  the &Program; Builder</title>
53     <para>
55     As we've seen, the &b-link-Program; Builder
56     is used to build an executable program.
57     The &source; argument is one or more
58     source-code files or object files,
59     and the &target; argument is the
60     name of the executable program name to be created.
61     For example:
63     </para>
65     <programlisting>
66 Program('prog', 'file1.o')
67     </programlisting>
69     <para>
71     Will create the &prog;
72     executable on a POSIX system,
73     the &prog_exe; executable on a Windows system.
75     </para>
77     <para>
79     The target file's prefix and suffix may be omitted,
80     and the values from the
81     &cv-link-PROGPREFIX;
82     and
83     &cv-link-PROGSUFFIX;
84     construction variables
85     will be appended appropriately.
86     For example:
88     </para>
90     <programlisting>
91 env = Environment(PROGPREFIX='my', PROGSUFFIX='.xxx')
92 env.Program('prog', ['file1.o', 'file2.o'])
93     </programlisting>
95     <para>
97     Will create a program named
98     <filename>myprog.xxx</filename>
99     regardless of the system on which it is run.
101     </para>
103     <para>
105     If you omit the &target;,
106     the base of the first input
107     file name specified
108     becomes the base of the target
109     program created.
110     For example:
112     </para>
114     <programlisting>
115 Program(['hello.c', 'goodbye.c'])
116     </programlisting>
118     <para>
120     Will create the &hello;
121     executable on a POSIX system,
122     the &hello_exe; executable on a Windows system.
124     </para>
126     <para>
128     Two construction variables control what libraries
129     will be linked with the resulting program.
130     The &cv-link-LIBS; variable is a list of the names of
131     libraries that will be linked into any programs,
132     and the &cv-link-LIBPATH; variables is a list of
133     directories that will be searched for
134     the specified libraries.
135     &SCons; will construct the right command-line
136     options for the running system.
137     For example:
139     </para>
141     <scons_example name="buildersbuiltin_libs">
142       <file name="SConstruct" printme="1">
143 env = Environment(LIBS=['foo1', 'foo2'], LIBPATH=['/usr/dir1', 'dir2'])
144 env.Program(['hello.c', 'goodbye.c'])
145       </file>
146       <file name="hello.c">
147 int hello() { printf("Hello, world!\n"); }
148       </file>
149       <file name="goodbye.c">
150 int goodbye() { printf("Goodbye, world!\n"); }
151       </file>
152     </scons_example>
154     <para>
156     Will execute as follows on a POSIX system:
158     </para>
160     <scons_output example="buildersbuiltin_libs" os="posix" suffix="1">
161       <scons_output_command>scons -Q</scons_output_command>
162     </scons_output>
164     <para>
166     And execute as follows on a Windows system:
168     </para>
170     <scons_output example="buildersbuiltin_libs" os="win32" suffix="2">
171       <scons_output_command>scons -Q</scons_output_command>
172     </scons_output>
174     <para>
176     The &cv-LIBS; construction variable
177     is turned into command line options
178     by appending the &cv-link-LIBLINKPREFIX; and &cv-link-LIBLINKSUFFIX;
179     construction variables to the beginning and end,
180     respectively, of each specified library.
182     </para>
184     <para>
186     The &cv-LIBPATH; construction variable
187     is turned into command line options
188     by appending the &cv-link-LIBDIRPREFIX; and &cv-link-LIBDIRSUFFIX;
189     construction variables to the beginning and end,
190     respectively, of each specified library.
192     </para>
194     <para>
196     Other relevant construction variables
197     include those used by the &b-link-Object;
198     builders to affect how the
199     source files specified as input to the <literal>Program</literal>
200     builders are turned into object files;
201     see the next section.
203     </para>
205     <para>
207     The command line used to control how a program is linked
208     is specified by the &cv-link-LINKCOM; construction variable.
209     By default, it uses the
210     &cv-link-LINK; construction variable
211     and the &cv-link-LINKFLAGS; construction variable.
213     </para>
215   </section>
217   <section>
218   <title>Object-File Builders</title>
220     <para>
222     &SCons; provides separate Builder objects
223     to create static and shared object files.
224     The distinction becomes especially important when
225     archiving object files into different types of libraries.
227     </para>
229     <section>
230     <title>The &StaticObject; Builder</title>
232       <para>
234       The &b-link-StaticObject; Builder
235       is used to build an object file
236       suitable for static linking into a program,
237       or for inclusion in a static library.
238       The &source; argument is a single source-code file,
239       and the &target; argument is the
240       name of the static object file to be created.
241       For example:
243       </para>
245       <programlisting>
246 StaticObject('file', 'file.c')
247       </programlisting>
249       <para>
251       Will create the &file_o;
252       object file on a POSIX system,
253       the &file_obj; executable on a Windows system.
255       </para>
257       <para>
259       The target file's prefix and suffix may be omitted,
260       and the values from the
261       &cv-link-OBJPREFIX;
262       and
263       &cv-link-OBJSUFFIX;
264       construction variables
265       will be appended appropriately.
266       For example:
268       </para>
270       <programlisting>
271 env = Environment(OBJPREFIX='my', OBJSUFFIX='.xxx')
272 env.StaticObject('file', 'file.c')
273       </programlisting>
275       <para>
277       Will create an object file named
278       <filename>myfile.xxx</filename>
279       regardless of the system on which it is run.
281       </para>
283       <para>
285       If you omit the &target;,
286       the base of the first input
287       file name specified
288       beomces the base of the name
289       of the static object file to be created.
290       For example:
292       </para>
294       <programlisting>
295 StaticObject('file.c')
296       </programlisting>
298       <para>
300       Will create the &file_o;
301       executable on a POSIX system,
302       the &file_obj; executable on a Windows system.
304       </para>
306     </section>
308     <section>
309     <title>The &SharedObject; Builder</title>
311       <para>
313       The &b-link-SharedObject; Builder
314       is used to build an object file
315       suitable for shared linking into a program,
316       or for inclusion in a shared library.
317       The &source; argument is a single source-code file,
318       and the &target; argument is the
319       name of the shared object file to be created.
320       For example:
322       </para>
324       <programlisting>
325 SharedObject('file', 'file.c')
326       </programlisting>
328       <para>
330       Will create the &file_o;
331       object file on a POSIX system,
332       the &file_obj; executable on a Windows system.
334       </para>
336       <para>
338       The target file's prefix and suffix may be omitted,
339       and the values from the
340       &cv-link-SHOBJPREFIX;
341       and
342       &cv-link-SHOBJSUFFIX;
343       construction variables
344       will be appended appropriately.
345       For example:
347       </para>
349       <programlisting>
350 env = Environment(SHOBJPREFIX='my', SHOBJSUFFIX='.xxx')
351 env.SharedObject('file', 'file.c')
352       </programlisting>
354       <para>
356       Will create an object file named
357       <filename>myfile.xxx</filename>
358       regardless of the system on which it is run.
360       </para>
362       <para>
364       If you omit the &target;,
365       the base of the first input
366       file name specified
367       becomes the base of the name
368       of the shared object file to be created.
369       For example:
371       </para>
373       <programlisting>
374 SharedObject('file.c')
375       </programlisting>
377       <para>
379       Will create the &file_o;
380       executable on a POSIX system,
381       the &file_obj; executable on a Windows system.
383       </para>
385     </section>
387     <section>
388     <title>The &Object; Builder</title>
390       <para>
392       The &b-link-Object; Builder is a synonym for &b-link-StaticObject;
393       and is completely equivalent.
395       </para>
397     </section>
399   </section>
401   <section>
402   <title>Library Builders</title>
404     <para>
406     &SCons; provides separate Builder objects
407     to create static and shared libraries.
409     </para>
411     <section>
412     <title>The &StaticLibrary; Builder</title>
414       <para>
416       The &b-link-StaticLibrary; Builder
417       is used to create a library
418       suitable for static linking into a program.
419       The &source; argument is one or more
420       source-code files or object files,
421       and the &target; argument is the
422       name of the static library to be created.
423       For example:
425       </para>
427       <programlisting>
428 StaticLibrary('foo', ['file1.c', 'file2.c'])
429       </programlisting>
431       <para>
433       The target file's prefix and suffix may be omitted,
434       and the values from the
435       &cv-link-LIBPREFIX;
436       and
437       &cv-link-LIBSUFFIX;
438       construction variables
439       will be appended appropriately.
440       For example:
442       </para>
444       <programlisting>
445 env = Environment(LIBPREFIX='my', LIBSUFFIX='.xxx')
446 env.StaticLibrary('lib', ['file1.o', 'file2.o'])
447       </programlisting>
449       <para>
451       Will create an object file named
452       <filename>mylib.xxx</filename>
453       regardless of the system on which it is run.
455       </para>
457       <programlisting>
458 StaticLibrary('foo', ['file1.c', 'file2.c'])
459       </programlisting>
461       <para>
463       If you omit the &target;,
464       the base of the first input
465       file name specified
466       becomes the base of the name of the static object file to be created.
467       For example:
469       </para>
471       <programlisting>
472 StaticLibrary(['file.c', 'another.c'])
473       </programlisting>
475       <para>
477       Will create the &libfile_a;
478       library on a POSIX system,
479       the &file_lib; library on a Windows system.
481       </para>
483     </section>
485     <section>
486     <title>The &SharedLibrary; Builder</title>
488       <para>
490       The &b-link-SharedLibrary; Builder
491       is used to create a shared library
492       suitable for linking with a program.
493       The &source; argument is one or more
494       source-code files or object files,
495       and the &target; argument is the
496       name of the shared library to be created.
497       For example:
499       </para>
501       <programlisting>
502 SharedLibrary('foo', ['file1.c', 'file2.c'])
503       </programlisting>
505       <para>
507       The target file's prefix and suffix may be omitted,
508       and the values from the
509       &cv-link-SHLIBPREFIX;
510       and
511       &cv-link-SHLIBSUFFIX;
512       construction variables
513       will be appended appropriately.
514       For example:
516       </para>
518       <programlisting>
519 env = Environment(SHLIBPREFIX='my', SHLIBSUFFIX='.xxx')
520 env.SharedLibrary('shared', ['file1.o', 'file2.o'])
521       </programlisting>
523       <para>
525       Will create an object file named
526       <filename>myshared.xxx</filename>
527       regardless of the system on which it is run.
529       </para>
531       <programlisting>
532 SharedLibrary('foo', ['file1.c', 'file2.c'])
533       </programlisting>
535       <para>
537       If you omit the &target;,
538       the base of the first input
539       file name specified
540       becomes the base of the name of the shared library to be created.
541       For example:
543       </para>
545       <programlisting>
546 SharedLibrary(['file.c', 'another.c'])
547       </programlisting>
549       <para>
551       Will create the &libfile_so;
552       library on a POSIX system,
553       the &file_dll; library on a Windows system.
555       </para>
557     </section>
559     <section>
560     <title>The &Library; Builder</title>
562       <para>
564       The &b-link-Library; Builder is a synonym for &b-link-StaticLibrary;
565       and is completely equivalent.
567       </para>
569     </section>
571   </section>
573   <section>
574   <title>Pre-Compiled Headers:  the &PCH; Builder</title>
576     <para>
578     XXX PCH()
580     </para>
582   </section>
584   <section>
585   <title>&MSVC; Resource Files: the &RES; Builder</title>
587     <para>
589     XXX RES()
591     </para>
593   </section>
595   <section>
596   <title>Source Files</title>
598     <para>
600     By default
601     &SCons; supports two Builder objects
602     that know how to build source files
603     from other input files.
604     These are typically invoked "internally"
605     to turn files that need preprocessing into other source files.
607     </para>
609     <section>
610     <title>The &CFile; Builder</title>
612       <para>
614       XXX CFile()
616       </para>
618       <programlisting>
619 XXX CFile() programlisting
620       </programlisting>
622       <screen>
623 XXX CFile() screen
624       </screen>
626     </section>
628     <section>
629     <title>The &CXXFile; Builder</title>
631       <para>
633       XXX CXXFILE()
635       </para>
637       <programlisting>
638 XXX CXXFILE() programlisting
639       </programlisting>
641       <screen>
642 XXX CXXFILE() screen
643       </screen>
645     </section>
647   </section>
649   <section>
650   <title>Documents</title>
652     <para>
654     &SCons; provides a number of Builder objects
655     for creating different types of documents.
657     </para>
659     <section>
660     <title>The &DVI; Builder</title>
662       <para>
664       XXX DVI() para
666       </para>
668       <programlisting>
669 XXX DVI() programlisting
670       </programlisting>
672       <screen>
673 XXX DVI() screen
674       </screen>
676     </section>
678     <section>
679     <title>The &PDF; Builder</title>
681       <para>
683       XXX PDF() para
685       </para>
687     </section>
689     <section>
690     <title>The &PostScript; Builder</title>
692       <para>
694       XXX PostScript() para
696       </para>
698       <programlisting>
699 XXX PostScript() programlisting
700       </programlisting>
702       <screen>
703 XXX PostScript() screen
704       </screen>
706     </section>
708   </section>
710   <section>
711   <title>Archives</title>
713     <para>
715     &SCons; provides Builder objects
716     for creating two different types of archive files.
718     </para>
720     <section>
721     <title>The &Tar; Builder</title>
723       <para>
725       The &b-link-Tar; Builder object uses the &tar;
726       utility to create archives of files
727       and/or directory trees:
729       </para>
731       <scons_example name="buildersbuiltin_ex1">
732         <file name="SConstruct" printme="1">
733 env = Environment()
734 env.Tar('out1.tar', ['file1', 'file2'])
735 env.Tar('out2', 'directory')
736         </file>
737         <file name="file1">
738 file1
739         </file>
740         <file name="file2">
741 file2
742         </file>
743         <file name="directory/file3">
744 directory/file3
745         </file>
746       </scons_example>
748       <scons_output example="buildersbuiltin_ex1" os="posix" suffix="1">
749         <scons_output_command>scons -Q .</scons_output_command>
750       </scons_output>
752       <para>
754       One common requirement when creating a &tar; archive
755       is to create a compressed archive using the
756       <option>-z</option> option.
757       This is easily handled by specifying
758       the value of the &cv-link-TARFLAGS; variable
759       when you create the construction environment.
760       Note, however, that the <option>-c</option> used to
761       to instruct &tar; to create the archive
762       is part of the default value of &cv-TARFLAGS;,
763       so you need to set it both options:
765       </para>
767       <scons_example name="buildersbuiltin_ex2">
768         <file name="SConstruct" printme="1">
769 env = Environment(TARFLAGS = '-c -z')
770 env.Tar('out.tar.gz', 'directory')
771         </file>
772         <file name="directory/file">
773 directory/file
774         </file>
775       </scons_example>
777       <scons_output example="buildersbuiltin_ex2" os="posix" suffix="1">
778         <scons_output_command>scons -Q .</scons_output_command>
779       </scons_output>
781       <para>
783       you may also wish to set the value of the
784       &cv-link-TARSUFFIX; construction variable
785       to your desired suffix for compress &tar; archives,
786       so that &SCons; can append it to the target file name
787       without your having to specify it explicitly:
789       </para>
791       <scons_example name="buildersbuiltin_ex3">
792         <file name="SConstruct" printme="1">
793 env = Environment(TARFLAGS='-c -z', TARSUFFIX='.tgz')
794 env.Tar('out', 'directory')
795         </file>
796         <file name="directory/file">
797 directory/file
798         </file>
799       </scons_example>
801       <scons_output example="buildersbuiltin_ex3" os="posix" suffix="1">
802         <scons_output_command>scons -Q .</scons_output_command>
803       </scons_output>
805     </section>
807     <section>
808     <title>The &Zip; Builder</title>
810       <para>
812       The &b-link-Zip; Builder object creates archives of files
813       and/or directory trees in the ZIP file format.
814       Python versions 1.6 or later
815       contain an internal &zipfile; module
816       that &SCons; will use.
817       In this case, given the following
818       &SConstruct; file:
820       </para>
822       <scons_example name="buildersbuiltin_ex4">
823         <file name="SConstruct" printme="1">
824 env = Environment()
825 env.Zip('out', ['file1', 'file2'])
826         </file>
827         <file name="file1">
828 file1
829         </file>
830         <file name="file2">
831 file2
832         </file>
833       </scons_example>
835       <para>
837       Your output will reflect the fact
838       that an internal Python function
839       is being used to create the output ZIP archive:
841       </para>
843       <scons_output example="buildersbuiltin_ex4" os="posix" suffix="1">
844         <scons_output_command>scons -Q .</scons_output_command>
845       </scons_output>
847     </section>
849   </section>
851   <section>
852   <title>Java</title>
854     <para>
856     &SCons; provides Builder objects
857     for creating various types of Java output files.
859     </para>
861     <section>
862     <title>Building Class Files:  the &Java; Builder</title>
864       <para>
866       The &b-link-Java; builder takes one or more input
867       <filename>.java</filename> files
868       and turns them into one or more
869       <filename>.class</filename> files
870       Unlike most builders, however,
871       the &Java; builder takes
872       target and source <emphasis>directories</emphasis>,
873       not files, as input.
875       </para>
877       <programlisting>
878 env = Environment()
879 env.Java(target='classes', source='src')
880       </programlisting>
882       <para>
884       The &Java; builder will then
885       search the specified source directory
886       tree for all <filename>.java</filename> files,
887       and pass any out-of-date
889       </para>
891       <screen>
892 XXX Java() screen
893       </screen>
895     </section>
897     <section>
898     <title>The &Jar; Builder</title>
900       <para>
902       XXX The &Jar; builder object
904       </para>
906       <programlisting>
907 env = Environment()
908 env.Java(target='classes', source='src')
909 env.Jar(target='', source='classes')
910       </programlisting>
912       <screen>
913 XXX Jar() screen
914       </screen>
916     </section>
918     <section>
919     <title>Building C header and stub files:  the &JavaH; Builder</title>
921       <para>
923       XXX JavaH() para
925       </para>
927       <programlisting>
928 XXX JavaH() programlisting
929       </programlisting>
931       <screen>
932 XXX JavaH() screen
933       </screen>
935     </section>
937     <section>
938     <title>Building RMI stub and skeleton class files:  the &RMIC; Builder</title>
940       <para>
942       XXX RMIC() para
944       </para>
946       <programlisting>
947 XXX RMIC() programlisting
948       </programlisting>
950       <screen>
951 XXX RMIC() screen
952       </screen>
954     </section>
956   </section>
958 </chapter>