blob: 53f7bdddf69c696df3956a2b52f4e0be6e2d64d0 [file] [log] [blame]
Wyatt Heplerf6f74f42021-04-13 19:26:20 -07001# Copyright 2021 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
15import("//build_overrides/pigweed.gni")
16
17# Creates a toolchain that provides no C/C++ compiler. It can be used for
18# non-C/C++ languages or actions that should only happen once across all builds.
19# The toolchain cannot compile C/C++, and trying to use it to is an error.
20#
21# Args:
22# command: Run this command if this toolchain is used to build C/C++ code.
23#
24template("pw_non_c_toolchain") {
25 # Import the universal stamp & copy tools.
26 import("$dir_pw_toolchain/universal_tools.gni")
27 _label = get_label_info(":$target_name", "label_no_toolchain")
28
29 # If the user tries to build a target with this toolchain, run a script that
30 # prints out an error.
31 _message =
32 "Attempted to use the $target_name toolchain to compile {{source}}.\n" +
33 "This toolchain cannot be used to compile C/C++ source code.\n\n" +
34 "This toolchain was either explicitly specified in a deps list with\n" +
35 "GN's :target($_label) syntax or was set as the\n" +
36 "default toolchain in the BUILDCONFIG.gn file.\n\n" +
37 "Ensure that no C/C++ GN targets are referred to with this toolchain,\n" +
38 "even transitively.\n\n" +
39 "See https://pigweed.dev/pw_toolchain for more information."
40
41 _command = string_join(" ",
42 [
43 "python",
Michael Spangc8b93902021-05-30 15:53:56 -040044 rebase_path("$dir_pw_build/py/pw_build/error.py",
45 root_build_dir),
Wyatt Heplerf6f74f42021-04-13 19:26:20 -070046 "--message \"$_message\"",
47 "--target",
48 _label,
49 "--root",
Michael Spangc8b93902021-05-30 15:53:56 -040050 rebase_path("//", root_build_dir),
Wyatt Heplerf6f74f42021-04-13 19:26:20 -070051 "--out",
Michael Spangc8b93902021-05-30 15:53:56 -040052 ".",
Wyatt Heplerf6f74f42021-04-13 19:26:20 -070053 ])
54
55 if (defined(invoker.command)) {
56 _command = invoker.command
57 } else {
58 not_needed([ "invoker" ])
59 }
60
61 toolchain(target_name) {
62 tool("stamp") {
63 forward_variables_from(pw_universal_stamp, "*")
64 }
65
66 tool("copy") {
67 forward_variables_from(pw_universal_copy, "*")
68 }
69
70 tool("asm") {
71 command = _command
72 outputs =
73 [ "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o" ]
74 }
75
76 tool("cc") {
77 command = _command
78 outputs =
79 [ "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o" ]
80 }
81
82 tool("cxx") {
83 command = _command
84 outputs =
85 [ "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o" ]
86 }
87
88 # Can't use {{source}} for the linker, so replace it if it's in the command.
89 _command_no_source = string_replace(_command, "{{source}}", "C/C++ sources")
90
91 tool("link") {
92 command = _command_no_source
93 outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
94 }
95
96 tool("alink") {
97 command = _command_no_source
98 outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
99 }
100
101 tool("solink") {
102 command = _command_no_source
103 outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
104 }
105 }
106}