Checking in miniswig: It's a flex/bison based parser that is able to parse
[supertux.git] / mk / jam / bisonflex.jam
1 #============================================================================
2 # Rules for flex and bison
3 #============================================================================
4
5 if $(LEX)
6 {
7   rule LexRule
8   {
9     local cfile = [ LocateTarget $(<:S=.c) ] ;
10     local object = [ CompileObjects $(cfile) ] ;
11
12     Lex $(cfile) : $(<) ;
13     
14     return $(object) ;
15   }
16   RegisterFileType LexRule : .l ;
17   
18   rule Lex++Rule
19   {
20     local cppfile = [ LocateTarget $(<:S=.cpp) ] ;
21     local object = [ CompileObjects $(cppfile) ] ;
22
23     Lex $(cppfile) : $(<) ;
24
25     return $(object) ;
26   }
27   RegisterFileType Lex++Rule : .ll ;
28
29   if $(COMPILER_TYPE) != "GCC"
30   {
31     # compilers like msvc don't like #line statements.
32     LEX_FLAGS += -L ;
33   }
34
35   rule Lex
36   {
37     Depends $(<) : $(>) ;
38     LEX_FLAGS on $(cfile) += $(LEX_FLAGS) ;    
39     Clean clean : $(cfile) ;
40   }
41   
42   # Use -t and output redirection to avoid flex choosing stupid names for it's
43   # output files.
44   actions Lex
45   {
46     $(LEX) -t $(LEX_FLAGS) $(>) > $(<)
47   }
48 }
49
50 if $(BISON)
51 {
52   rule BisonRule
53   {
54     local cfile = [ LocateTarget $(<:S=.c) ] ;
55     local headerfile = [ LocateTarget $(<:S=.h) ] ;
56     local object = [ CompileObjects $(cfile) ] ;
57
58     Includes $(headerfile:G=) : $(headerfile) ;
59     
60     Bison $(cfile) : $(<) ;
61     # work around jam warning about independent target 
62     Includes $(cfile) : $(headerfile) ;
63
64     return $(object) ;
65   }
66   RegisterFileType BisonRule : .y ;
67
68   rule Bison++Rule
69   {
70     local cppfile = [ LocateTarget $(<:S=.cpp) ] ;
71     local headerfile = [ LocateTarget $(<:S=.hpp) ] ;
72     headerfile = $(headerfile:G=) ;
73     local object = [ CompileObjects $(cppfile) ] ;
74
75     # jams header file scannning doesn't use grist so we have to workaround this
76     # here
77     Includes $(headerfile:G=) : $(headerfile) ;
78
79     Bison $(cppfile) : $(<) ;
80 #Includes $(cppfile) : $(headerfile) ;
81
82     return $(object) ;
83   }
84   RegisterFileType Bison++Rule : .yy ;
85     
86   rule Bison
87   {
88     Depends $(<) : $(>) ;
89     BISON_FLAGS on $(<) += $(BISON_FLAGS) ;
90     Clean clean : $(<) ;
91   }
92   rule BisonFlags
93   {
94     local target ;
95     
96     if $(<:S) = .yy
97     {
98       target = [ LocateTarget $(<:S=.cpp) $(<:S=.hpp) ] ;
99     }
100     else
101     {
102       target = [ LocateTarget $(<:S=.c) $(<:S=.h) ] ;
103     }
104     BISON_FLAGS on $(target) += $(>) ;
105   }
106
107   if $(COMPILER_TYPE) != "GCC"
108   {
109     # compilers like msvc don't like #line statements.
110     BISON_FLAGS += --no-lines ;
111   }
112   actions Bison
113   {
114     $(BISON) -d $(BISON_FLAGS) -o $(<[1]) $(>)
115   }
116 }
117