• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2
3# Copyright (C) 2018 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#      http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17"""Generates wrapped include files to workaround -Wunused-parameter errors.
18
19In Chrome repository, "-Wunused-parameter" is disabled, and several header
20files in Chrome repository have actually unused-parameter.
21One of the typical scenarios is; in Chrome, Observer class is often defined
22as follows:
23
24class Foo {
25 public:
26  class Observer {
27   public:
28    virtual void OnSomeEvent(EventArg arg) {}
29    virtual void OnAnotherEvent(EventArg arg) {}
30    ...
31  };
32  ...
33};
34
35Here, On...Event() methods do nothing by default, and subclasses will override
36only necessary ones.
37In this use case, argument names can also work as documentation, and overrides
38can use these good interface-defined default names as a starting point for
39their implementation.
40
41On the other hand, in Android, -Wunused-parameter is enabled by default.
42Thus, if such a project includes header files from libchrome, it could cause
43a compile error (by the warning and "-Werror").
44
45To avoid such a situation, libchrome exports include files wrapped by the
46pragmas as follows.
47
48#pragma GCC diagnostic push
49#pragma GCC diagnostic ignored "-Wunused-parameter"
50${actual_include_file_content}
51#pragma GCC diagnostic pop
52
53so, the unused-parameter warning generated by the libchrome include headers
54will be ignored.
55Note that these GCC pragmas are also supported by clang for compatibility. cf)
56https://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas
57
58Usage: include_generator.py $(in) $(out)
59"""
60
61import sys
62
63
64def _generate(input_path, output_path):
65    """Generates a include file wrapped by pragmas.
66
67    Reads the file at |input_path| and output the content with wrapping by
68    #pragma to ignore unused-parameter warning into the file at |output_path|.
69    If the parent directories of |output_path| do not exist, creates them.
70
71    Args:
72        input_path: Path to the source file. Expected this is a chrome's header
73            file.
74        output_path: Path to the output file.
75    """
76    with open(input_path, 'r') as f:
77        content = f.read()
78
79    with open(output_path, 'w') as f:
80        f.writelines([
81            '// Generated by %s\n' % sys.argv[0],
82            '#pragma GCC diagnostic push\n'
83            '#pragma GCC diagnostic ignored "-Wunused-parameter"\n',
84            content,
85            '#pragma GCC diagnostic pop\n'])
86
87
88def main():
89    _generate(*sys.argv[1:])
90
91
92if __name__ == '__main__':
93    main()
94