Use 'use lib $FindBin::Bin' to append Perl module include path
[WebKit-https.git] / Source / WebCore / css / makegrammar.pl
1 #! /usr/bin/perl
2 #
3 #   This file is part of the WebKit project
4 #
5 #   Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
6 #
7 #   This library is free software; you can redistribute it and/or
8 #   modify it under the terms of the GNU Library General Public
9 #   License as published by the Free Software Foundation; either
10 #   version 2 of the License, or (at your option) any later version.
11 #
12 #   This library is distributed in the hope that it will be useful,
13 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 #   Library General Public License for more details.
16 #
17 #   You should have received a copy of the GNU Library General Public License
18 #   along with this library; see the file COPYING.LIB.  If not, write to
19 #   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 #   Boston, MA 02110-1301, USA.
21 use strict;
22 use warnings;
23 use FindBin;
24 use lib "$FindBin::Bin/../bindings/scripts";
25
26 use File::Basename;
27 use File::Spec;
28 use Getopt::Long;
29
30 my $outputDir = ".";
31 my $extraDefines = "";
32 my $symbolsPrefix = "";
33 my $preprocessor = "";
34 my $preprocessOnly = 0;
35 my $bison = "bison";
36
37 GetOptions(
38     'outputDir=s' => \$outputDir,
39     'extraDefines=s' => \$extraDefines,
40     'bison=s' => \$bison,
41     'preprocessor=s' => \$preprocessor,
42     'preprocessOnly' => \$preprocessOnly,
43     'symbolsPrefix=s' => \$symbolsPrefix
44 );
45
46 my $grammarFilePath = $ARGV[0];
47 my $grammarIncludesFilePath = @ARGV > 0 ? $ARGV[1] : "";
48
49 if (!length($symbolsPrefix) && !$preprocessOnly) {
50     die "Need a symbols prefix to give to bison (e.g. cssyy, xpathyy)";
51 }
52
53 my ($filename, $basePath, $suffix) = fileparse($grammarFilePath, (".y", ".y.in"));
54
55 if ($suffix eq ".y.in") {
56     my $grammarFileOutPath = File::Spec->join($outputDir, "$filename.y");
57     if (!$grammarIncludesFilePath) {
58         $grammarIncludesFilePath = "${basePath}${filename}.y.includes";
59     }
60
61     open GRAMMAR, ">$grammarFileOutPath" or die;
62     open INCLUDES, "<$grammarIncludesFilePath" or die;
63
64     require preprocessor;
65
66     while (<INCLUDES>) {
67         print GRAMMAR;
68     }
69     print GRAMMAR join("", applyPreprocessor($grammarFilePath, $extraDefines, $preprocessor));
70     close GRAMMAR;
71
72     $grammarFilePath = $grammarFileOutPath;
73
74     exit if $preprocessOnly;
75 }
76
77 my $fileBase = File::Spec->join($outputDir, $filename);
78 system("\"$bison\" -d -p $symbolsPrefix $grammarFilePath -o $fileBase.cpp");
79
80 open HEADER, ">$fileBase.h" or die;
81 print HEADER << "EOF";
82 #ifndef CSSGRAMMAR_H
83 #define CSSGRAMMAR_H
84 EOF
85
86 open HPP, "<$fileBase.cpp.h" or open HPP, "<$fileBase.hpp" or die;
87 while (<HPP>) {
88     print HEADER;
89 }
90 close HPP;
91
92 print HEADER "#endif\n";
93 close HEADER;
94
95 unlink("$fileBase.cpp.h");
96 unlink("$fileBase.hpp");
97