| # 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 an arm-eabi-none 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("arm_gcc_toolchain") { |
| _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) |
| |
| # Specify the default C++ version, which targets can override with a config. |
| _toolchain_cflags_cc = "-std=c++17 -Wno-register" |
| |
| _toolchain_ldflags = "" |
| if (defined(invoker.toolchain_ldflags)) { |
| _toolchain_ldflags += string_join(" ", invoker.toolchain_ldflags) |
| } |
| |
| # TODO(frolv): This assumes that the ARM gcc toolchain is in the PATH. |
| # It should be updated to point to the prebuilt path within the source tree |
| # once that is added. |
| _tool_name_root = "arm-none-eabi-" |
| |
| _ar = _tool_name_root + "ar" |
| _cc = _tool_name_root + "gcc" |
| _cxx = _tool_name_root + "g++" |
| |
| toolchain(target_name) { |
| tool("asm") { |
| depfile = "{{output}}.d" |
| command = string_join(" ", |
| [ |
| _cc, |
| "-MMD -MF $depfile", # Write out dependencies. |
| _toolchain_cflags, |
| "{{defines}}", |
| "{{include_dirs}}", |
| "{{asmflags}}", |
| "-c {{source}}", |
| "-o {{output}}", |
| ]) |
| depsformat = "gcc" |
| description = "as {{output}}" |
| outputs = [ |
| # Use {{source_file_part}}, which includes the extension, instead of |
| # {{source_name_part}} so that object files created from <file_name>.c |
| # and <file_name>.cc sources are unique. |
| "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o", |
| ] |
| } |
| |
| tool("cc") { |
| depfile = "{{output}}.d" |
| command = string_join(" ", |
| [ |
| _cc, |
| "-MMD -MF $depfile", # Write out dependencies. |
| _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_file_part}}.o", |
| ] |
| } |
| |
| tool("cxx") { |
| depfile = "{{output}}.d" |
| command = string_join(" ", |
| [ |
| _cc, |
| "-MMD -MF $depfile", # Write out dependencies. |
| _toolchain_cflags_cc, |
| _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_file_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 = string_join( |
| " ", |
| [ |
| _cxx, |
| "{{ldflags}}", |
| |
| # Delete unreferenced sections. Helpful with -ffunction-sections. |
| "-Wl,--gc-sections", |
| |
| # Output a map file that shows symbols and their location. |
| "-Wl,-Map=$_link_mapfile", |
| |
| _toolchain_cflags, |
| _toolchain_ldflags, |
| |
| "{{inputs}}", |
| |
| # Load all object files from all libraries to resolve symbols. |
| # Short of living in the ideal world where all dependency graphs |
| # among static libs are acyclic and all developers diligently |
| # express such graphs in terms that GN understands, this is the |
| # safest option. |
| # Make sure you use this with --gc-sections, otherwise the |
| # resulting binary will contain every symbol defined in every |
| # input file and every static library. That could be quite a lot. |
| "-Wl,--whole-archive", |
| "{{libs}}", |
| "-Wl,--no-whole-archive", |
| |
| "-o $_link_outfile", |
| ]) |
| |
| tool("link") { |
| command = _link_command |
| description = "ld $_link_outfile" |
| outputs = [ |
| _link_outfile, |
| ] |
| default_output_dir = "{{target_out_dir}}" |
| default_output_extension = ".elf" |
| } |
| |
| 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}}" |
| } |
| } |
| } |