]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | # Copyright 2006 Vladimir Prus |
2 | # Distributed under the Boost Software License, Version 1.0. | |
1e59de90 | 3 | # (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt) |
7c673cae FG |
4 | |
5 | # This is example of a fictional code generator tool. | |
6 | # It accepts a single input of type '.gci' and produces | |
7 | # either one or two outputs of type .cpp, depending | |
8 | # on the value of the feature <server-mode> | |
9 | # | |
10 | # This example is loosely based on gSOAP code generator. | |
11 | ||
12 | import type ; | |
13 | import generators ; | |
14 | import feature ; | |
15 | import common ; | |
16 | import "class" : new ; | |
17 | import os ; | |
18 | ||
19 | type.register GCI : gci ; | |
20 | ||
21 | feature.feature server : off on : incidental ; | |
22 | ||
23 | class soap-generator : generator | |
24 | { | |
25 | import "class" : new ; | |
26 | ||
27 | rule __init__ ( * : * ) | |
28 | { | |
29 | generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ; | |
30 | } | |
31 | ||
32 | rule run ( project name ? : property-set : sources * ) | |
33 | { | |
34 | if ! $(sources[2]) | |
35 | { | |
36 | # Accept only single source. | |
37 | local t = [ $(sources[1]).type ] ; | |
38 | if $(t) = GCI | |
39 | { | |
40 | # The type is correct. | |
41 | ||
42 | # If no output name is specified, guess it from sources. | |
43 | if ! $(name) | |
44 | { | |
45 | name = [ generator.determine-output-name $(sources) ] ; | |
46 | } | |
47 | ||
48 | # Produce one output, using just copy. | |
49 | local a = [ new action $(sources[1]) | |
50 | : common.copy : $(property-set) ] ; | |
51 | local t = [ new file-target $(name) : CPP : $(project) | |
52 | : $(a) ] ; | |
53 | ||
54 | # If in server mode, create another output -- an | |
55 | # empty file. If this were a real SOAP generator, we | |
56 | # might have created a single action, and two targets | |
57 | # both using that action. | |
58 | local t2 ; | |
59 | if [ $(property-set).get <server> ] = "on" | |
60 | { | |
61 | local a = [ new action : soap.touch : $(property-set) ] ; | |
62 | t2 = [ new file-target $(name)_server : CPP : $(project) | |
63 | : $(a) ] ; | |
64 | } | |
65 | return [ virtual-target.register $(t) ] | |
66 | [ virtual-target.register $(t2) ] ; | |
67 | } | |
68 | } | |
69 | } | |
70 | } | |
71 | ||
72 | generators.register [ new soap-generator soap.soap : GCI : CPP ] ; | |
73 | ||
74 | TOUCH = [ common.file-touch-command ] ; | |
75 | actions touch | |
76 | { | |
77 | $(TOUCH) $(<) | |
78 | } | |
79 | ||
80 | if [ os.name ] = VMS | |
81 | { | |
82 | actions touch | |
83 | { | |
84 | $(TOUCH) $(<:W) | |
85 | } | |
86 | } |