1# Copyright 2020 The Pigweed Authors
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4# use this file except in compliance with the License. You may obtain a copy of
5# the License at
6#
7#     https://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations under
13# the License.
14"""Emits an error telling the user not to use the default toolchain."""
15
16import sys
17
18_ERROR_MESSAGE = """
19Error: trying to build a target with the default toolchain
20
21  This occurs when a GN target is listed as a dependency outside of a toolchain
22  group (such as host_clang or stm32f429i) in the root BUILD.gn file.
23
24  Make sure that your top-level targets are always instantiated with a toolchain
25  and that no dependencies are pulled in through the default toolchain.
26
27  group("my_target_wrapper") {
28    deps = [ ":my_target(//path/to/my/toolchain)" ]
29  }
30
31  group("my_target") {
32    deps = []
33    if (current_toolchain != default_toolchain) {
34      deps += [ "//my_application:image" ]
35    }
36  }
37
38  If you are developing in Pigweed itself, list your build target under one of
39  the predefined groups in //BUILD.gn. For example,
40
41    # apps is an existing group intended for building application images.
42    group("apps") {
43      deps = [
44        ...
45        "your_target:here",
46      ]
47    }
48
49  Other predefined groups include host_tools, pw_modules, and pw_module_tests.
50
51  If you want to add a custom group instead of using an existing one, it must be
52  defined alongside the predefined groups, within the toolchain condition block:
53
54    if (current_toolchain != default_toolchain) {
55      group("apps") {
56        ...
57      }
58
59      # Other predefined groups...
60
61      group("my_custom_group") {
62        deps = [ "//path/to:my_target" ]
63      }
64    }
65
66  To include your custom group in the build, add it to the pigweed_default group
67  to have it compile for every supported Pigweed target.
68
69    group("pigweed_default") {
70      deps = []
71
72      if (current_toolchain != default_toolchain) {
73        # Standard Pigweed dependencies...
74
75        # Add your group here.
76        deps += [ ":my_custom_group" ]
77      }
78    }
79
80  For more details on the Pigweed build structure and how to configure custom
81  build targets or toolchains, please refer to "Build system" in the Pigweed
82  documentation.
83"""
84
85
86def main() -> int:
87    print(_ERROR_MESSAGE, file=sys.stderr)
88    return 1
89
90
91if __name__ == '__main__':
92    sys.exit(main())
93