[GTK] Add support for loading web process extensions
[WebKit-https.git] / Tools / gtk / generate-gtkdoc
1 #!/usr/bin/env 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 glob
20 import gtkdoc
21 import logging
22 import os.path
23 import sys
24
25 def configure_logging():
26     level = logging.DEBUG if '-v' in sys.argv else logging.INFO
27     logger = logging.getLogger('gtkdoc')
28     logger.setLevel(level)
29     handler = logging.StreamHandler()
30     handler.setLevel(level)
31     logger.addHandler(handler)
32     if level == logging.DEBUG:
33         handler.setFormatter(logging.Formatter('[%(asctime)s]  %(message)s'))
34     else:
35         handler.setFormatter(logging.Formatter('%(message)s'))
36
37
38 def get_gtkdoc_module_paths(xref_dep_packages):
39     deps = []
40     html_dir = os.path.join('share', 'gtk-doc', 'html')
41
42     for package in xref_dep_packages:
43         prefix = common.prefix_of_pkg_config_file(package)
44         if prefix is None:
45             continue
46         for module in xref_dep_packages[package]:
47             deps.append(os.path.join(prefix, html_dir, module))
48
49     return deps
50
51
52 def get_common_options():
53     # TODO: We should consider using an arguments parsing library if
54     # we need more of these complex ones.
55     virtual_root = ''
56     for argument in sys.argv:
57         if argument.startswith('--virtual-root='):
58             virtual_root = argument.split('=')[1]
59             break
60
61     return {
62         'decorator': 'WEBKIT_API',
63         'deprecation_guard': 'WEBKIT_DISABLE_DEPRECATED',
64         'library_path' : common.build_path('.libs'),
65         'virtual_root' : virtual_root,
66     }
67
68 def get_common_xref_deps():
69     return {
70         'glib-2.0' : ['glib', 'gobject', 'gio'],
71         'libsoup-2.4' : ['libsoup-2.4'],
72         'gdk-pixbuf-2.0': ['gdk-pixbuf']
73     }
74
75 def get_webkit2_options():
76     def derived_sources_path(*args):
77         return common.build_path(*(('DerivedSources', 'WebKit2') + args))
78     def src_path(*args):
79         return common.top_level_path(*(('Source', 'WebKit2', 'UIProcess', 'API', 'gtk') + args))
80     def injected_bundle_src_path(*args):
81         return common.top_level_path(*(('Source', 'WebKit2', 'WebProcess', 'InjectedBundle', 'API', 'gtk') + args))
82
83     xref_deps = get_common_xref_deps().copy()
84     xref_deps.update({
85         'gtk+-3.0' : ['gtk3', 'gdk3']
86     })
87
88     options = get_common_options().copy()
89     options.update({
90         'module_name' : 'webkit2gtk',
91         'doc_dir' : src_path('docs'),
92         'output_dir' : common.build_path('Documentation', 'webkit2gtk'),
93         'source_dirs' : [src_path(), derived_sources_path('webkit2gtk', 'webkit2'), injected_bundle_src_path()],
94         'cflags' : ' -I' + derived_sources_path('webkit2gtk', 'include') + \
95                    ' -I' + derived_sources_path('webkit2gtk') + \
96                    ' -I' + derived_sources_path('include') + \
97                    ' -I' + common.top_level_path('Source') + \
98                    ' -I' + src_path(),
99         'cross_reference_deps' : get_gtkdoc_module_paths(xref_deps),
100         'ignored_files': glob.glob(src_path('*Private.h')) + \
101                          glob.glob(injected_bundle_src_path('*Private.h')) + \
102                          glob.glob(src_path('*Client*')) + \
103                          glob.glob(src_path('WebKit2GtkAuthenticationDialog.*')) + \
104                          glob.glob(src_path('WebKitGeolocationProvider.*')) + \
105                          glob.glob(src_path('WebKitTextChecker.*')) + \
106                          glob.glob(src_path('WebKitWebViewBaseAccessible.*')) + \
107                          glob.glob(src_path('WebViewBaseInputMethodFilter.*')) + \
108                          glob.glob(derived_sources_path('webkit2gtk', 'webkit2', 'WebKitMarshal.*')) + \
109                          glob.glob(derived_sources_path('webkit2gtk', 'webkit2', 'WebKitEnumTypes.*')) + \
110                          glob.glob(src_path('tests/*.h'))
111     })
112     return options
113
114 def get_webkit1_options(gtk_version):
115     def src_path(*args):
116         return common.top_level_path(*(('Source', 'WebKit', 'gtk') + args))
117
118     xref_deps = get_common_xref_deps().copy()
119     if gtk_version == 3:
120         xref_deps.update({
121                 'gtk+-3.0' : ['gtk3', 'gdk3']
122         })
123     else:
124         xref_deps.update({
125                 'gtk+-2.0' : ['gtk', 'gdk']
126         })
127
128     options = get_common_options().copy()
129     options.update({
130         'module_name' : 'webkitgtk',
131         'doc_dir' : src_path('docs'),
132         'output_dir' : common.build_path('Documentation', 'webkitgtk'),
133         'source_dirs' : [src_path('webkit'), common.build_path('Source', 'WebKit', 'gtk', 'webkit')],
134         'cflags' : ' -I' + common.build_path('WebKit', 'gtk') + \
135                    ' -I' + common.build_path('DerivedSources') + \
136                    ' -I' + src_path() + \
137                    ' -I' + common.top_level_path('Source') + \
138                    ' -I' + common.top_level_path('Source', 'JavaScriptCore', 'ForwardingHeaders'),
139         'cross_reference_deps' : get_gtkdoc_module_paths(xref_deps),
140         'ignored_files': glob.glob(src_path('webkit', '*private.*')) + \
141                          glob.glob(src_path('webkit', 'webkitspellcheckerenchant.*'))
142     })
143     return options
144
145 def print_missing_api(generator):
146     missing_api = generator.api_missing_documentation()
147     if not missing_api:
148         return
149     print("\nThe following API are missing documentation:")
150     for api in missing_api:
151         print("\t%s" % api)
152
153 def generate_doc(generator):
154     generator.generate(html='--skip-html' not in sys.argv)
155     if generator.saw_warnings:
156         print_missing_api(generator)
157     return generator.saw_warnings
158
159 configure_logging()
160
161 # We need to add the JavaScriptCore build directory to the PKG_CONFIG_PATH
162 # so that pkgconfig can properly resolve the libjavascriptcore dependency.
163 pkg_config_path = os.environ.get("PKG_CONFIG_PATH")
164 os.environ['PKG_CONFIG_PATH'] = common.build_path('Source', 'JavaScriptCore')
165 if pkg_config_path:
166     os.environ['PKG_CONFIG_PATH'] += ':' + pkg_config_path
167
168 # Newer versions of glib have deprecated g_type_init, so we need to disable
169 # that warning when running gtkdoc-scanobj by overriding the CFLAGS we use
170 # to compile it.
171 cflags = os.environ.get('CFLAGS', '')
172 cflags += ' -DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_32'
173 os.environ['CFLAGS'] = cflags
174
175 saw_webkit1_warnings = saw_webkit2_warnings = False
176
177 pkg_config_path = common.build_path('Source', 'WebKit', 'gtk', 'webkitgtk-3.0.pc')
178 if not os.path.exists(pkg_config_path):
179     pkg_config_path = common.build_path('Source', 'WebKit', 'gtk', 'webkit-1.0.pc')
180 if os.path.exists(pkg_config_path):
181     options = get_webkit1_options(common.gtk_version_of_pkg_config_file(pkg_config_path))
182     generator = gtkdoc.PkgConfigGTKDoc(pkg_config_path, options)
183     if '--rebase' not in sys.argv:
184         print("Generating WebKit1 documentation...")
185         saw_webkit1_warnings = generate_doc(generator)
186     else:
187         print("Rebasing WebKit1 documentation...")
188         try:
189             generator.rebase_installed_docs()
190         except Exception:
191             print("Rebase did not happen, likely no documentation is present.")
192
193 # WebKit2 might not be enabled, so check for the pkg-config file before building documentation.
194 pkg_config_path = common.build_path('Source', 'WebKit2', 'webkit2gtk-3.0.pc')
195 if os.path.exists(pkg_config_path):
196     generator = gtkdoc.PkgConfigGTKDoc(pkg_config_path, get_webkit2_options())
197     if '--rebase' not in sys.argv:
198         print("\nGenerating WebKit2 documentation...")
199         saw_webkit2_warnings = generate_doc(generator)
200     else:
201         print("\nRebasing WebKit2 documentation...")
202         try:
203             generator.rebase_installed_docs()
204         except Exception:
205             print("Rebase did not happen, likely no documentation is present.")
206
207 sys.exit(saw_webkit1_warnings or saw_webkit2_warnings)