DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(flex.info.gz) Makefiles and Flex

Info Catalog (flex.info.gz) Appendices (flex.info.gz) Appendices (flex.info.gz) Bison Bridge
 
 A.1 Makefiles and Flex
 ======================
 
 In this appendix, we provide tips for writing Makefiles to build your
 scanners.
 
    In a traditional build environment, we say that the `.c' files are
 the sources, and the `.o' files are the intermediate files. When using
 `flex', however, the `.l' files are the sources, and the generated `.c'
 files (along with the `.o' files) are the intermediate files.  This
 requires you to carefully plan your Makefile.
 
    Modern `make' programs understand that `foo.l' is intended to
 generate `lex.yy.c' or `foo.c', and will behave accordingly(1)(2).  The
 following Makefile does not explicitly instruct `make' how to build
 `foo.c' from `foo.l'. Instead, it relies on the implicit rules of the
 `make' program to build the intermediate file, `scan.c':
 
 
          # Basic Makefile -- relies on implicit rules
          # Creates "myprogram" from "scan.l" and "myprogram.c"
          #
          LEX=flex
          myprogram: scan.o myprogram.o
          scan.o: scan.l
 
    For simple cases, the above may be sufficient. For other cases, you
 may have to explicitly instruct `make' how to build your scanner.  The
 following is an example of a Makefile containing explicit rules:
 
 
          # Basic Makefile -- provides explicit rules
          # Creates "myprogram" from "scan.l" and "myprogram.c"
          #
          LEX=flex
          myprogram: scan.o myprogram.o
                  $(CC) -o $@  $(LDFLAGS) $^
 
          myprogram.o: myprogram.c
                  $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $^
 
          scan.o: scan.c
                  $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $^
 
          scan.c: scan.l
                  $(LEX) $(LFLAGS) -o $@ $^
 
          clean:
                  $(RM) *.o scan.c
 
    Notice in the above example that `scan.c' is in the `clean' target.
 This is because we consider the file `scan.c' to be an intermediate
 file.
 
    Finally, we provide a realistic example of a `flex' scanner used
 with a `bison' parser(3).  There is a tricky problem we have to deal
 with. Since a `flex' scanner will typically include a header file
 (e.g., `y.tab.h') generated by the parser, we need to be sure that the
 header file is generated BEFORE the scanner is compiled. We handle this
 case in the following example:
 
 
          # Makefile example -- scanner and parser.
          # Creates "myprogram" from "scan.l", "parse.y", and "myprogram.c"
          #
          LEX     = flex
          YACC    = bison -y
          YFLAGS  = -d
          objects = scan.o parse.o myprogram.o
 
          myprogram: $(objects)
          scan.o: scan.l parse.c
          parse.o: parse.y
          myprogram.o: myprogram.c
 
    In the above example, notice the line,
 
 
          scan.o: scan.l parse.c
 
    , which lists the file `parse.c' (the generated parser) as a
 dependency of `scan.o'. We want to ensure that the parser is created
 before the scanner is compiled, and the above line seems to do the
 trick. Feel free to experiment with your specific implementation of
 `make'.
 
    For more details on writing Makefiles, see  Top (make)Top.
 
    ---------- Footnotes ----------
 
    (1) GNU `make' and GNU `automake' are two such programs that provide
 implicit rules for flex-generated scanners.
 
    (2) GNU `automake' may generate code to execute flex in
 lex-compatible mode, or to stdout. If this is not what you want, then
 you should provide an explicit rule in your Makefile.am
 
    (3) This example also applies to yacc parsers.
 
Info Catalog (flex.info.gz) Appendices (flex.info.gz) Appendices (flex.info.gz) Bison Bridge
automatically generated byinfo2html