Extract common parts from jhbuildrc files.
[WebKit-https.git] / Tools / gtk / find-make-dist-errors
1 #!/usr/bin/python
2 # Copyright (C) 2011 Igalia S.L.
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17
18 import common
19 import os
20 import subprocess
21 import sys
22
23 sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../jhbuild") )
24 import jhbuildrc_common
25
26 def is_source_file_listing(line):
27     return line.strip().startswith('Source')
28
29 def get_listed_makefile_headers():
30     makefile_text = open(os.path.join(common.build_path('GNUmakefile'))).read()
31
32     # Automake often places separate includes on the same line.
33     makefile_text = makefile_text.replace(' ', '\n')
34
35     headers = []
36     for line in makefile_text.splitlines():
37         # $(srcdir)/ is the same as an empty string in a source file listing.
38         line = line.replace('$(srcdir)/', '')
39
40         # If the line doesn't start with 'Source' it isn't listing for
41         # a source file.
42         if not is_source_file_listing(line):
43             continue
44
45         # Most source listings end with \ indicating that the listing
46         # continues onto the next line.
47         line = line.replace('\\', '')
48
49         # We only care about header files. Source files result in build
50         # breakage, so we will detect them without this script.
51         line = line.strip()
52         if not line.endswith('.h'):
53             continue
54
55         # If the line contains a makefile variable we do not care about it.
56         if line.find('$') != -1:
57             continue
58
59         headers.append(line)
60
61     return headers
62
63 def scan_headers_from_dependency_files():
64     process = subprocess.Popen(['find . -name *.Plo | xargs cat | grep .h:$'],
65                                cwd=common.build_path(),
66                                stdout=subprocess.PIPE,
67                                shell=True)
68     sanitized_lines = set()
69     for line in process.communicate()[0].splitlines():
70         # Paths in Plo files are relative to the build directory so they might contain
71         # ../.. if the build directory is something like WebKitBuild/Release.
72         line = line.replace('../../', '')
73         if not is_source_file_listing(line):
74             continue
75
76         # The lines we care about end with ':'.
77         line = line.replace(':', '')
78         line = line.strip()
79         sanitized_lines.add(line)
80     return sanitized_lines
81
82 def get_unlisted_headers(listed_makefile_headers):
83     unlisted = set()
84     for header in scan_headers_from_dependency_files():
85         if not header in listed_makefile_headers:
86             unlisted.add(header)
87     return unlisted
88
89 def get_missing_headers(listed_makefile_headers):
90     missing = set()
91     for header in listed_makefile_headers:
92         if not os.path.exists(jhbuildrc_common.top_level_path(header)):
93             missing.add(header)
94     return missing
95
96 listed_makefile_headers = get_listed_makefile_headers()
97 unlisted_headers = get_unlisted_headers(listed_makefile_headers)
98 missing_headers = get_missing_headers(listed_makefile_headers)
99 if unlisted_headers:
100     print 'Headers not listed in the GNUmakefiles:'
101     for header in sorted(unlisted_headers):
102         print '\t%s' % header
103     print
104
105 if missing_headers:
106     print 'Headers listed in the GNUmakefiles that do not exist:'
107     for header in sorted(missing_headers):
108         print '\t%s' % header
109     print
110
111 sys.exit(len(unlisted_headers) + len(missing_headers))