xref: /aosp_15_r20/external/pigweed/pw_toolchain/non_c_toolchain.gni (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker# Copyright 2021 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker#
3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker# the License at
6*61c4878aSAndroid Build Coastguard Worker#
7*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker#
9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker# the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Workerimport("//build_overrides/pigweed.gni")
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker# Creates a toolchain that provides no C/C++ compiler. It can be used for
18*61c4878aSAndroid Build Coastguard Worker# non-C/C++ languages or actions that should only happen once across all builds.
19*61c4878aSAndroid Build Coastguard Worker# The toolchain cannot compile C/C++, and trying to use it to is an error.
20*61c4878aSAndroid Build Coastguard Worker#
21*61c4878aSAndroid Build Coastguard Worker# Args:
22*61c4878aSAndroid Build Coastguard Worker#   command: Run this command if this toolchain is used to build C/C++ code.
23*61c4878aSAndroid Build Coastguard Worker#
24*61c4878aSAndroid Build Coastguard Workertemplate("pw_non_c_toolchain") {
25*61c4878aSAndroid Build Coastguard Worker  # Import the universal stamp & copy tools.
26*61c4878aSAndroid Build Coastguard Worker  import("$dir_pw_toolchain/universal_tools.gni")
27*61c4878aSAndroid Build Coastguard Worker  _label = get_label_info(":$target_name", "label_no_toolchain")
28*61c4878aSAndroid Build Coastguard Worker
29*61c4878aSAndroid Build Coastguard Worker  # If the user tries to build a target with this toolchain, run a script that
30*61c4878aSAndroid Build Coastguard Worker  # prints out an error.
31*61c4878aSAndroid Build Coastguard Worker  _message =
32*61c4878aSAndroid Build Coastguard Worker      "Attempted to use the $target_name toolchain to compile {{source}}.\n" +
33*61c4878aSAndroid Build Coastguard Worker      "This toolchain cannot be used to compile C/C++ source code.\n\n" +
34*61c4878aSAndroid Build Coastguard Worker      "This toolchain was either explicitly specified in a deps list with\n" +
35*61c4878aSAndroid Build Coastguard Worker      "GN's :target($_label) syntax or was set as the\n" +
36*61c4878aSAndroid Build Coastguard Worker      "default toolchain in the BUILDCONFIG.gn file.\n\n" +
37*61c4878aSAndroid Build Coastguard Worker      "Ensure that no C/C++ GN targets are referred to with this toolchain,\n" +
38*61c4878aSAndroid Build Coastguard Worker      "even transitively.\n\n" +
39*61c4878aSAndroid Build Coastguard Worker      "See https://pigweed.dev/pw_toolchain for more information."
40*61c4878aSAndroid Build Coastguard Worker
41*61c4878aSAndroid Build Coastguard Worker  _command = string_join(" ",
42*61c4878aSAndroid Build Coastguard Worker                         [
43*61c4878aSAndroid Build Coastguard Worker                           "python",
44*61c4878aSAndroid Build Coastguard Worker                           rebase_path("$dir_pw_build/py/pw_build/error.py",
45*61c4878aSAndroid Build Coastguard Worker                                       root_build_dir),
46*61c4878aSAndroid Build Coastguard Worker                           "--message \"$_message\"",
47*61c4878aSAndroid Build Coastguard Worker                           "--target",
48*61c4878aSAndroid Build Coastguard Worker                           _label,
49*61c4878aSAndroid Build Coastguard Worker                           "--root",
50*61c4878aSAndroid Build Coastguard Worker                           rebase_path("//", root_build_dir),
51*61c4878aSAndroid Build Coastguard Worker                           "--out",
52*61c4878aSAndroid Build Coastguard Worker                           ".",
53*61c4878aSAndroid Build Coastguard Worker                         ])
54*61c4878aSAndroid Build Coastguard Worker
55*61c4878aSAndroid Build Coastguard Worker  if (defined(invoker.command)) {
56*61c4878aSAndroid Build Coastguard Worker    _command = invoker.command
57*61c4878aSAndroid Build Coastguard Worker  } else {
58*61c4878aSAndroid Build Coastguard Worker    not_needed([ "invoker" ])
59*61c4878aSAndroid Build Coastguard Worker  }
60*61c4878aSAndroid Build Coastguard Worker
61*61c4878aSAndroid Build Coastguard Worker  toolchain(target_name) {
62*61c4878aSAndroid Build Coastguard Worker    tool("stamp") {
63*61c4878aSAndroid Build Coastguard Worker      forward_variables_from(pw_universal_stamp, "*")
64*61c4878aSAndroid Build Coastguard Worker    }
65*61c4878aSAndroid Build Coastguard Worker
66*61c4878aSAndroid Build Coastguard Worker    tool("copy") {
67*61c4878aSAndroid Build Coastguard Worker      forward_variables_from(pw_universal_copy, "*")
68*61c4878aSAndroid Build Coastguard Worker    }
69*61c4878aSAndroid Build Coastguard Worker
70*61c4878aSAndroid Build Coastguard Worker    tool("asm") {
71*61c4878aSAndroid Build Coastguard Worker      command = _command
72*61c4878aSAndroid Build Coastguard Worker      outputs =
73*61c4878aSAndroid Build Coastguard Worker          [ "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o" ]
74*61c4878aSAndroid Build Coastguard Worker    }
75*61c4878aSAndroid Build Coastguard Worker
76*61c4878aSAndroid Build Coastguard Worker    tool("cc") {
77*61c4878aSAndroid Build Coastguard Worker      command = _command
78*61c4878aSAndroid Build Coastguard Worker      outputs =
79*61c4878aSAndroid Build Coastguard Worker          [ "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o" ]
80*61c4878aSAndroid Build Coastguard Worker    }
81*61c4878aSAndroid Build Coastguard Worker
82*61c4878aSAndroid Build Coastguard Worker    tool("cxx") {
83*61c4878aSAndroid Build Coastguard Worker      command = _command
84*61c4878aSAndroid Build Coastguard Worker      outputs =
85*61c4878aSAndroid Build Coastguard Worker          [ "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o" ]
86*61c4878aSAndroid Build Coastguard Worker    }
87*61c4878aSAndroid Build Coastguard Worker
88*61c4878aSAndroid Build Coastguard Worker    # Can't use {{source}} for the linker, so replace it if it's in the command.
89*61c4878aSAndroid Build Coastguard Worker    _command_no_source = string_replace(_command, "{{source}}", "C/C++ sources")
90*61c4878aSAndroid Build Coastguard Worker
91*61c4878aSAndroid Build Coastguard Worker    tool("link") {
92*61c4878aSAndroid Build Coastguard Worker      command = _command_no_source
93*61c4878aSAndroid Build Coastguard Worker      outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
94*61c4878aSAndroid Build Coastguard Worker    }
95*61c4878aSAndroid Build Coastguard Worker
96*61c4878aSAndroid Build Coastguard Worker    tool("alink") {
97*61c4878aSAndroid Build Coastguard Worker      command = _command_no_source
98*61c4878aSAndroid Build Coastguard Worker      outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
99*61c4878aSAndroid Build Coastguard Worker    }
100*61c4878aSAndroid Build Coastguard Worker
101*61c4878aSAndroid Build Coastguard Worker    tool("solink") {
102*61c4878aSAndroid Build Coastguard Worker      command = _command_no_source
103*61c4878aSAndroid Build Coastguard Worker      outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
104*61c4878aSAndroid Build Coastguard Worker    }
105*61c4878aSAndroid Build Coastguard Worker  }
106*61c4878aSAndroid Build Coastguard Worker}
107