107 lines
3.6 KiB
Plaintext
107 lines
3.6 KiB
Plaintext
# Copyright 2021 The Pigweed Authors
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
# use this file except in compliance with the License. You may obtain a copy of
|
|
# the License at
|
|
#
|
|
# https://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations under
|
|
# the License.
|
|
|
|
import("//build_overrides/pigweed.gni")
|
|
|
|
# Creates a toolchain that provides no C/C++ compiler. It can be used for
|
|
# non-C/C++ languages or actions that should only happen once across all builds.
|
|
# The toolchain cannot compile C/C++, and trying to use it to is an error.
|
|
#
|
|
# Args:
|
|
# command: Run this command if this toolchain is used to build C/C++ code.
|
|
#
|
|
template("pw_non_c_toolchain") {
|
|
# Import the universal stamp & copy tools.
|
|
import("$dir_pw_toolchain/universal_tools.gni")
|
|
_label = get_label_info(":$target_name", "label_no_toolchain")
|
|
|
|
# If the user tries to build a target with this toolchain, run a script that
|
|
# prints out an error.
|
|
_message =
|
|
"Attempted to use the $target_name toolchain to compile {{source}}.\n" +
|
|
"This toolchain cannot be used to compile C/C++ source code.\n\n" +
|
|
"This toolchain was either explicitly specified in a deps list with\n" +
|
|
"GN's :target($_label) syntax or was set as the\n" +
|
|
"default toolchain in the BUILDCONFIG.gn file.\n\n" +
|
|
"Ensure that no C/C++ GN targets are referred to with this toolchain,\n" +
|
|
"even transitively.\n\n" +
|
|
"See https://pigweed.dev/pw_toolchain for more information."
|
|
|
|
_command = string_join(" ",
|
|
[
|
|
"python",
|
|
rebase_path("$dir_pw_build/py/pw_build/error.py",
|
|
root_build_dir),
|
|
"--message \"$_message\"",
|
|
"--target",
|
|
_label,
|
|
"--root",
|
|
rebase_path("//", root_build_dir),
|
|
"--out",
|
|
".",
|
|
])
|
|
|
|
if (defined(invoker.command)) {
|
|
_command = invoker.command
|
|
} else {
|
|
not_needed([ "invoker" ])
|
|
}
|
|
|
|
toolchain(target_name) {
|
|
tool("stamp") {
|
|
forward_variables_from(pw_universal_stamp, "*")
|
|
}
|
|
|
|
tool("copy") {
|
|
forward_variables_from(pw_universal_copy, "*")
|
|
}
|
|
|
|
tool("asm") {
|
|
command = _command
|
|
outputs =
|
|
[ "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o" ]
|
|
}
|
|
|
|
tool("cc") {
|
|
command = _command
|
|
outputs =
|
|
[ "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o" ]
|
|
}
|
|
|
|
tool("cxx") {
|
|
command = _command
|
|
outputs =
|
|
[ "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o" ]
|
|
}
|
|
|
|
# Can't use {{source}} for the linker, so replace it if it's in the command.
|
|
_command_no_source = string_replace(_command, "{{source}}", "C/C++ sources")
|
|
|
|
tool("link") {
|
|
command = _command_no_source
|
|
outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
|
|
}
|
|
|
|
tool("alink") {
|
|
command = _command_no_source
|
|
outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
|
|
}
|
|
|
|
tool("solink") {
|
|
command = _command_no_source
|
|
outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
|
|
}
|
|
}
|
|
}
|