blob: c6e0360502ce89f0717508d77c03ec4cdf45a611 [file] [log] [blame]
Armando Montanez70095662020-01-09 14:25:04 -08001# Copyright 2020 The Pigweed Authors
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4# use this file except in compliance with the License. You may obtain a copy of
5# the License at
6#
7# https://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations under
13# the License.
14
Armando Montanezfb3d3fb2020-06-09 18:12:12 -070015# gn-format disable
16import("//build_overrides/pigweed.gni")
17
18import("$dir_pigweed/legacy_target.gni")
Armando Montanez70095662020-01-09 14:25:04 -080019import("$dir_pw_build/exec.gni")
Alexei Frolovedd2f142020-06-09 19:11:27 -070020import("$dir_pw_build/target_types.gni")
Armando Montanezfd5de702020-06-10 16:51:01 -070021import("$dir_pw_toolchain/generate_toolchain.gni")
Armando Montanez70095662020-01-09 14:25:04 -080022
23# Preprocess a linker script and turn it into a target.
24#
Armando Montanez70095662020-01-09 14:25:04 -080025# In lieu of direct GN support for linker scripts, this template makes it
26# possible to run the C Preprocessor on a linker script file so defines can
27# be properly evaluated before the linker script is passed to the dir_pw_build
28#
29# TODO(pwbug/53): This template serves as a stand-in until native GN support for
30# linker scripts is added.
31#
32# Args:
33# linker_script: The linker script to send through the C preprocessor.
34#
35# defines: Preprocessor defines to apply when running the C preprocessor.
36#
37# cflags: Flags to pass to the C compiler.
38#
39# inputs: Files that, when changed, should trigger a re-build of the linker
40# script. linker_script is implicitly added to this by the template.
41#
42# Example:
43#
44# pw_linker_script("generic_linker_script") {
45# defines = [
46# "PW_HEAP_SIZE=1K",
47# "PW_NOINIT_SIZE=512"
48# ]
49# linker_script = "basic_script.ld"
50# }
51#
52template("pw_linker_script") {
53 assert(
Armando Montanez70095662020-01-09 14:25:04 -080054 defined(invoker.linker_script) && invoker.linker_script != "",
55 "$target_name did not set `linker_script` to refer to a valid linker " +
56 "script. This variable is required for linker script targets.")
57
58 _final_linker_script = "${target_gen_dir}/${target_name}_final.ld"
59
60 # This action invokes the C compiler provided by the target to preprocess the
61 # linker script.
62 pw_exec("${target_name}_preprocess") {
Armando Montanezfd5de702020-06-10 16:51:01 -070063 program = pw_toolchain_SCOPE.cxx
Rob Mohra0ba54f2020-02-27 11:43:49 -080064 inputs = [ invoker.linker_script ]
Armando Montanez70095662020-01-09 14:25:04 -080065 args = [
66 # Run compiler in preprocessor-only mode.
67 "-E",
68
69 # Do not generate linemarkers in output.
70 "-P",
71
72 # Do not discard comments.
73 "-C",
74
75 # Treat the following file as a C file.
76 "-x",
77 "c",
Alexei Frolovee945602020-01-23 12:51:49 -080078 get_path_info(invoker.linker_script, "abspath"),
Armando Montanez70095662020-01-09 14:25:04 -080079 ]
80
81 # Include any explicitly listed c flags.
82 if (defined(invoker.cflags)) {
83 args += cflags
84 }
85
86 # Add defines.
87 if (defined(invoker.defines)) {
88 args += process_file_template(invoker.defines, "-D{{source_name_part}}")
89 }
90
91 # Set output file.
92 args += [
93 "-o",
94 _final_linker_script,
95 ]
Rob Mohra0ba54f2020-02-27 11:43:49 -080096 outputs = [ _final_linker_script ]
Armando Montanez70095662020-01-09 14:25:04 -080097 }
98
99 # This config adds a the linker script produced by the preprocess action to
100 # the linker flags.
101 config("${target_name}_config") {
Rob Mohra0ba54f2020-02-27 11:43:49 -0800102 inputs = [ invoker.linker_script ]
Armando Montanez70095662020-01-09 14:25:04 -0800103 if (!defined(invoker.ldflags)) {
104 ldflags = []
105 }
106 ldflags += [ "-T" + rebase_path(_final_linker_script) ]
107 }
108
109 # The target that adds the linker script config to this library and everything
110 # that depends on it.
Alexei Frolovedd2f142020-06-09 19:11:27 -0700111 pw_source_set(target_name) {
Rob Mohra0ba54f2020-02-27 11:43:49 -0800112 inputs = [ _final_linker_script ]
Armando Montanez70095662020-01-09 14:25:04 -0800113 if (defined(invoker.inputs)) {
114 inputs += invoker.inputs
115 }
116 all_dependent_configs = [ ":${target_name}_config" ]
Rob Mohra0ba54f2020-02-27 11:43:49 -0800117 deps = [ ":${target_name}_preprocess" ]
Armando Montanez70095662020-01-09 14:25:04 -0800118 }
119}