diff options
author | Gary Oberbrunner <garyo@oberbrunner.com> | 2010-06-17 01:51:41 (GMT) |
---|---|---|
committer | Gary Oberbrunner <garyo@oberbrunner.com> | 2010-06-17 01:51:41 (GMT) |
commit | 6c4dc321483d6a2a292fc5b83ccad761d4f5ed5a (patch) | |
tree | b8594ebbad831d05737c2302cce7a5d4417dbf87 /doc | |
parent | ca8afe780ab024efb85e8e0e6b41bbe4fefb813d (diff) | |
download | SCons-6c4dc321483d6a2a292fc5b83ccad761d4f5ed5a.zip SCons-6c4dc321483d6a2a292fc5b83ccad761d4f5ed5a.tar.gz SCons-6c4dc321483d6a2a292fc5b83ccad761d4f5ed5a.tar.bz2 |
Add Users Guide example of generating source code.
Diffstat (limited to 'doc')
-rw-r--r-- | doc/user/tasks.in | 67 | ||||
-rw-r--r-- | doc/user/tasks.xml | 58 |
2 files changed, 123 insertions, 2 deletions
diff --git a/doc/user/tasks.in b/doc/user/tasks.in index 8823189..9608f6a 100644 --- a/doc/user/tasks.in +++ b/doc/user/tasks.in @@ -29,7 +29,7 @@ on as they become more complex. Most build tools have special purpose constructs for performing these tasks, but since &SConscript; files are &Python; scripts, you can use more flexible built-in &Python; services to perform these tasks. This appendix lists a number of these -tasks and how to implement them in &Python;. +tasks and how to implement them in &Python; and &Scons;. </para> <example> @@ -79,3 +79,68 @@ output</title> output = os.popen(command).read() </programlisting> </example> + +<example> +<title>Generating source code: how code can be generated and used by SCons</title> + +<para> + +The Copy builders here could be any arbitrary shell or python function +that produces one or more files. This example shows how to create +those files and use them in &SCons;. + +</para> + +<scons_example name="ex1"> +<file name="SConstruct" printme="1"> +#### SConstruct +env = Environment() +env.Append(CPPPATH = "#") + +## Header example +env.Append(BUILDERS = + {'Copy1' : Builder(action = 'cat < $SOURCE > $TARGET', + suffix='.h', src_suffix='.bar')}) +env.Copy1('test.bar') # produces test.h from test.bar. +env.Program('app','main.cpp') # indirectly depends on test.bar + +## Source file example +env.Append(BUILDERS = + {'Copy2' : Builder(action = 'cat < $SOURCE > $TARGET', + suffix='.cpp', src_suffix='.bar2')}) +foo = env.Copy2('foo.bar2') # produces foo.cpp from foo.bar2. +env.Program('app2',['main2.cpp'] + foo) # compiles main2.cpp and foo.cpp into app2. +</file> + +<file name="main.cpp"> +#include "test.h" +</file> +<file name="test.bar"> +// nothing here +</file> +<file name="main2.cpp"> +//// main2.cpp +</file> +<file name="foo.bar2"> +// nothing here +</file> +</scons_example> + +<para> + +Where main.cpp looks like this: + +</para> + + <scons_example_file example="ex1" name="main.cpp"> + </scons_example_file> + +<para> +produces this: +</para> + + <scons_output example="ex1"> + <scons_output_command>scons -Q</scons_output_command> + </scons_output> + +</example> diff --git a/doc/user/tasks.xml b/doc/user/tasks.xml index 8823189..fe99fa6 100644 --- a/doc/user/tasks.xml +++ b/doc/user/tasks.xml @@ -29,7 +29,7 @@ on as they become more complex. Most build tools have special purpose constructs for performing these tasks, but since &SConscript; files are &Python; scripts, you can use more flexible built-in &Python; services to perform these tasks. This appendix lists a number of these -tasks and how to implement them in &Python;. +tasks and how to implement them in &Python; and &Scons;. </para> <example> @@ -79,3 +79,59 @@ output</title> output = os.popen(command).read() </programlisting> </example> + +<example> +<title>Generating source code: how code can be generated and used by SCons</title> + +<para> + +The Copy builders here could be any arbitrary shell or python function +that produces one or more files. This example shows how to create +those files and use them in &SCons;. + +</para> + +<programlisting> +#### SConstruct +env = Environment() +env.Append(CPPPATH = "#") + +## Header example +env.Append(BUILDERS = + {'Copy1' : Builder(action = 'cat < $SOURCE > $TARGET', + suffix='.h', src_suffix='.bar')}) +env.Copy1('test.bar') # produces test.h from test.bar. +env.Program('app','main.cpp') # indirectly depends on test.bar + +## Source file example +env.Append(BUILDERS = + {'Copy2' : Builder(action = 'cat < $SOURCE > $TARGET', + suffix='.cpp', src_suffix='.bar2')}) +foo = env.Copy2('foo.bar2') # produces foo.cpp from foo.bar2. +env.Program('app2',['main2.cpp'] + foo) # compiles main2.cpp and foo.cpp into app2. +</programlisting> + +<para> + +Where main.cpp looks like this: + +</para> + + + <programlisting> +#include "test.h" +</programlisting> + +<para> +produces this: +</para> + + <screen> + % <userinput>scons -Q</userinput> + cc -o app main.cpp + cat < foo.bar2 > foo.cpp + cc -o app2 main2.cpp foo.cpp + cat < test.bar > test.h + </screen> + +</example> |