|  | # Copyright lowRISC contributors. | 
|  | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | # SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | """Rules for declaring linker scripts and linker script fragments.""" | 
|  |  | 
|  | def _ld_library_impl(ctx): | 
|  | files = [] + ctx.files.includes | 
|  | user_link_flags = [] | 
|  |  | 
|  | # Disable non-volatile scratch region and counters if building for english | 
|  | # breakfast. This should appear before the linker script. | 
|  | if "-DOT_IS_ENGLISH_BREAKFAST_REDUCED_SUPPORT_FOR_INTERNAL_USE_ONLY_" in ctx.fragments.cpp.copts: | 
|  | user_link_flags += [ | 
|  | "-Wl,--defsym=no_ottf_nv_scratch=1", | 
|  | "-Wl,--defsym=no_ottf_nv_counter=1", | 
|  | ] | 
|  |  | 
|  | if ctx.file.script: | 
|  | files += ctx.files.script | 
|  | user_link_flags += [ | 
|  | "-Wl,-T,{}".format(ctx.file.script.path), | 
|  | ] | 
|  |  | 
|  | return [ | 
|  | cc_common.merge_cc_infos( | 
|  | direct_cc_infos = [CcInfo( | 
|  | linking_context = cc_common.create_linking_context( | 
|  | linker_inputs = depset([cc_common.create_linker_input( | 
|  | owner = ctx.label, | 
|  | additional_inputs = depset(files), | 
|  | user_link_flags = depset(user_link_flags), | 
|  | )]), | 
|  | ), | 
|  | )], | 
|  | cc_infos = [dep[CcInfo] for dep in ctx.attr.deps], | 
|  | ), | 
|  | ] | 
|  |  | 
|  | ld_library = rule( | 
|  | implementation = _ld_library_impl, | 
|  | fragments = ["cpp"], | 
|  | doc = """ | 
|  | A linker script library. Linker script libraries consist of a collection of | 
|  | "includes" (the linker equivalent of a header) and an optional script. Linker | 
|  | script libraries can depend on other libraries to access the includes they | 
|  | publish; cc_binaries can depend on an ld_library with a script to specify it | 
|  | as the linker script for that binary. | 
|  |  | 
|  | At most one ld_library in a cc_binary's dependencies may have a script. | 
|  | """, | 
|  | attrs = { | 
|  | "script": attr.label(allow_single_file = True), | 
|  | "includes": attr.label_list( | 
|  | default = [], | 
|  | allow_files = True, | 
|  | ), | 
|  | "deps": attr.label_list( | 
|  | default = [], | 
|  | providers = [CcInfo], | 
|  | ), | 
|  | }, | 
|  | ) |