# Copyright 2019 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. # Generates a host Linux gcc toolchain for a specific target. # # Args: # toolchain_cflags: Additional C/C++ compiler flags for the target. # toolchain_ldflags: Additional linker flags for the target. template("host_gcc") { _cflags_list = [ # Colorize output. Ninja's GCC invocation disables color by default. "-fdiagnostics-color", # Disable obnoxious ABI warning. # # GCC 7.1 adds an over-zealous ABI warning with little useful information # on how to resolve the issue. The warning you get is: # # note: parameter passing for argument of type '...' changed in GCC 7.1 # # There is no other information, and searching for the error is needed to # understand what is happening. For upstream Pigweed, we compile from # source so this is irrelevant; so disable it. # # See: https://gcc.gnu.org/gcc-7/changes.html (search for "psabi"). # https://gcc.gnu.org/ml/gcc/2017-05/msg00073.html "-Wno-psabi", ] if (defined(invoker.toolchain_cflags)) { _cflags_list += invoker.toolchain_cflags } _toolchain_cflags = string_join(" ", _cflags_list) _toolchain_ldflags = "" if (defined(invoker.toolchain_ldflags)) { foreach(flag, invoker.toolchain_ldflags) { _toolchain_ldflags += " " + flag } } _ar = "ar" _cc = "gcc" _cxx = "g++" toolchain(target_name) { tool("asm") { depfile = "{{output}}.d" command = "$_cc -MMD -MF $depfile $_toolchain_cflags {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}" depsformat = "gcc" description = "as {{output}}" outputs = [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o", ] } tool("cc") { depfile = "{{output}}.d" command = "$_cc -MMD -MF $depfile $_toolchain_cflags {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}" depsformat = "gcc" description = "cc {{output}}" outputs = [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o", ] } tool("cxx") { depfile = "{{output}}.d" command = "$_cxx -MMD -MF $depfile $_toolchain_cflags {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}" depsformat = "gcc" description = "c++ {{output}}" outputs = [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o", ] } tool("alink") { command = "rm -f {{output}} && $_ar rcs {{output}} {{inputs}}" description = "ar {{target_output_name}}{{output_extension}}" outputs = [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}", ] default_output_extension = ".a" } lib_switch = "-l" lib_dir_switch = "-L" _link_outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}" _link_mapfile = "{{output_dir}}/{{target_output_name}}.map" _link_command = "$_cxx {{ldflags}} -Wl,--gc-sections $_toolchain_cflags $_toolchain_ldflags -Wl,--start-group {{inputs}} -Wl,--end-group {{libs}} -Wl,-Map=$_link_mapfile -o $_link_outfile" tool("link") { command = _link_command description = "ld $_link_outfile" outputs = [ _link_outfile, ] default_output_dir = "{{target_out_dir}}" default_output_extension = "" } tool("solink") { command = _link_command + " -shared" description = "ld -shared $_link_outfile" outputs = [ _link_outfile, ] default_output_dir = "{{target_out_dir}}" default_output_extension = ".so" } tool("stamp") { command = "touch {{output}}" description = "stamp {{output}}" } tool("copy") { command = "cp -af {{source}} {{output}}" description = "cp {{source}} {{output}}" } } }