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