xref: /aosp_15_r20/external/pigweed/third_party/stm32cube/BUILD.gn (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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 Workerimport("$dir_pw_build/linker_script.gni")
18*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_build/target_types.gni")
19*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_third_party/stm32cube/stm32cube.gni")
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Workerif (dir_pw_third_party_stm32cube == "") {
22*61c4878aSAndroid Build Coastguard Worker  group("linker_script_template") {
23*61c4878aSAndroid Build Coastguard Worker  }
24*61c4878aSAndroid Build Coastguard Worker  group("core_init_template") {
25*61c4878aSAndroid Build Coastguard Worker  }
26*61c4878aSAndroid Build Coastguard Worker  group("cmsis_init_template") {
27*61c4878aSAndroid Build Coastguard Worker  }
28*61c4878aSAndroid Build Coastguard Worker  group("hal_config_template") {
29*61c4878aSAndroid Build Coastguard Worker  }
30*61c4878aSAndroid Build Coastguard Worker  group("stm32cube_headers") {
31*61c4878aSAndroid Build Coastguard Worker  }
32*61c4878aSAndroid Build Coastguard Worker  group("stm32cube") {
33*61c4878aSAndroid Build Coastguard Worker  }
34*61c4878aSAndroid Build Coastguard Worker} else {
35*61c4878aSAndroid Build Coastguard Worker  stm32cube_builder_script =
36*61c4878aSAndroid Build Coastguard Worker      "$dir_pw_stm32cube_build/py/pw_stm32cube_build/__main__.py"
37*61c4878aSAndroid Build Coastguard Worker
38*61c4878aSAndroid Build Coastguard Worker  rebased_dir_pw_third_party_stm32cube =
39*61c4878aSAndroid Build Coastguard Worker      rebase_path(dir_pw_third_party_stm32cube)
40*61c4878aSAndroid Build Coastguard Worker
41*61c4878aSAndroid Build Coastguard Worker  find_files_args = [
42*61c4878aSAndroid Build Coastguard Worker    "find_files",
43*61c4878aSAndroid Build Coastguard Worker    rebased_dir_pw_third_party_stm32cube,
44*61c4878aSAndroid Build Coastguard Worker    pw_third_party_stm32cube_PRODUCT,
45*61c4878aSAndroid Build Coastguard Worker  ]
46*61c4878aSAndroid Build Coastguard Worker  if (pw_third_party_stm32cube_CORE_INIT ==
47*61c4878aSAndroid Build Coastguard Worker      "$dir_pw_third_party/stm32cube:core_init_template") {
48*61c4878aSAndroid Build Coastguard Worker    find_files_args += [ "--init" ]
49*61c4878aSAndroid Build Coastguard Worker  }
50*61c4878aSAndroid Build Coastguard Worker
51*61c4878aSAndroid Build Coastguard Worker  # This script finds the files relavent for the current product.
52*61c4878aSAndroid Build Coastguard Worker  files = exec_script(stm32cube_builder_script,
53*61c4878aSAndroid Build Coastguard Worker                      find_files_args,
54*61c4878aSAndroid Build Coastguard Worker                      "scope",
55*61c4878aSAndroid Build Coastguard Worker                      [ "$rebased_dir_pw_third_party_stm32cube/files.txt" ])
56*61c4878aSAndroid Build Coastguard Worker
57*61c4878aSAndroid Build Coastguard Worker  if (pw_third_party_stm32cube_CORE_INIT ==
58*61c4878aSAndroid Build Coastguard Worker      "$dir_pw_third_party/stm32cube:core_init_template") {
59*61c4878aSAndroid Build Coastguard Worker    assert(files.gcc_linker != "" || files.iar_linker != "",
60*61c4878aSAndroid Build Coastguard Worker           "No linker file found")
61*61c4878aSAndroid Build Coastguard Worker
62*61c4878aSAndroid Build Coastguard Worker    gcc_linker = files.gcc_linker
63*61c4878aSAndroid Build Coastguard Worker    if (gcc_linker == "") {
64*61c4878aSAndroid Build Coastguard Worker      gcc_linker = "$target_gen_dir/linker.ld"
65*61c4878aSAndroid Build Coastguard Worker      gcc_linker_str = exec_script(stm32cube_builder_script,
66*61c4878aSAndroid Build Coastguard Worker                                   [
67*61c4878aSAndroid Build Coastguard Worker                                     "icf_to_ld",
68*61c4878aSAndroid Build Coastguard Worker                                     files.iar_linker,
69*61c4878aSAndroid Build Coastguard Worker                                   ],
70*61c4878aSAndroid Build Coastguard Worker                                   "string",
71*61c4878aSAndroid Build Coastguard Worker                                   [ files.iar_linker ])
72*61c4878aSAndroid Build Coastguard Worker      write_file(gcc_linker, gcc_linker_str)
73*61c4878aSAndroid Build Coastguard Worker    }
74*61c4878aSAndroid Build Coastguard Worker
75*61c4878aSAndroid Build Coastguard Worker    startup_file = "$target_gen_dir/startup.s"
76*61c4878aSAndroid Build Coastguard Worker    startup_file_str = exec_script(stm32cube_builder_script,
77*61c4878aSAndroid Build Coastguard Worker                                   [
78*61c4878aSAndroid Build Coastguard Worker                                     "inject_init",
79*61c4878aSAndroid Build Coastguard Worker                                     files.startup,
80*61c4878aSAndroid Build Coastguard Worker                                   ],
81*61c4878aSAndroid Build Coastguard Worker                                   "string",
82*61c4878aSAndroid Build Coastguard Worker                                   [ files.startup ])
83*61c4878aSAndroid Build Coastguard Worker    write_file(startup_file, startup_file_str)
84*61c4878aSAndroid Build Coastguard Worker
85*61c4878aSAndroid Build Coastguard Worker    pw_linker_script("linker_script_template") {
86*61c4878aSAndroid Build Coastguard Worker      linker_script = gcc_linker
87*61c4878aSAndroid Build Coastguard Worker    }
88*61c4878aSAndroid Build Coastguard Worker
89*61c4878aSAndroid Build Coastguard Worker    pw_source_set("core_init_template") {
90*61c4878aSAndroid Build Coastguard Worker      deps = [ ":linker_script_template" ]
91*61c4878aSAndroid Build Coastguard Worker      sources = [ startup_file ]
92*61c4878aSAndroid Build Coastguard Worker    }
93*61c4878aSAndroid Build Coastguard Worker  }
94*61c4878aSAndroid Build Coastguard Worker
95*61c4878aSAndroid Build Coastguard Worker  pw_source_set("hal_timebase_template") {
96*61c4878aSAndroid Build Coastguard Worker    deps = [ ":stm32cube_headers" ]
97*61c4878aSAndroid Build Coastguard Worker    sources = [ "$dir_pw_third_party_stm32cube/hal_driver/Src/${files.family}_hal_timebase_tim_template.c" ]
98*61c4878aSAndroid Build Coastguard Worker  }
99*61c4878aSAndroid Build Coastguard Worker
100*61c4878aSAndroid Build Coastguard Worker  pw_source_set("cmsis_init_template") {
101*61c4878aSAndroid Build Coastguard Worker    deps = [ ":stm32cube_headers" ]
102*61c4878aSAndroid Build Coastguard Worker    sources = [ "$dir_pw_third_party_stm32cube/cmsis_device/Source/Templates/system_${files.family}.c" ]
103*61c4878aSAndroid Build Coastguard Worker  }
104*61c4878aSAndroid Build Coastguard Worker
105*61c4878aSAndroid Build Coastguard Worker  # Generate a stub config header that points to the correct template.
106*61c4878aSAndroid Build Coastguard Worker  write_file("$target_gen_dir/template_config/${files.family}_hal_conf.h",
107*61c4878aSAndroid Build Coastguard Worker             "#include \"${files.family}_hal_conf_template.h\"")
108*61c4878aSAndroid Build Coastguard Worker  config("hal_config_template_includes") {
109*61c4878aSAndroid Build Coastguard Worker    include_dirs = [ "$target_gen_dir/template_config" ]
110*61c4878aSAndroid Build Coastguard Worker  }
111*61c4878aSAndroid Build Coastguard Worker  pw_source_set("hal_config_template") {
112*61c4878aSAndroid Build Coastguard Worker    public_configs = [ ":hal_config_template_includes" ]
113*61c4878aSAndroid Build Coastguard Worker
114*61c4878aSAndroid Build Coastguard Worker    # This is to make sure GN properly detects changes to these files. The
115*61c4878aSAndroid Build Coastguard Worker    # generated file shouldn't change, but the file it redirects to might.
116*61c4878aSAndroid Build Coastguard Worker    public = [ "$target_gen_dir/template_config/${files.family}_hal_conf.h" ]
117*61c4878aSAndroid Build Coastguard Worker    inputs = [ "$dir_pw_third_party_stm32cube/hal_driver/Inc/${files.family}_hal_conf_template.h" ]
118*61c4878aSAndroid Build Coastguard Worker  }
119*61c4878aSAndroid Build Coastguard Worker
120*61c4878aSAndroid Build Coastguard Worker  config("header_flags") {
121*61c4878aSAndroid Build Coastguard Worker    cflags = [ "-Wno-unused-parameter" ]
122*61c4878aSAndroid Build Coastguard Worker    cflags_c = [
123*61c4878aSAndroid Build Coastguard Worker      "-Wno-redundant-decls",
124*61c4878aSAndroid Build Coastguard Worker      "-Wno-sign-compare",
125*61c4878aSAndroid Build Coastguard Worker      "-Wno-undef",
126*61c4878aSAndroid Build Coastguard Worker      "-Wno-implicit-function-declaration",
127*61c4878aSAndroid Build Coastguard Worker      "-Wno-switch-enum",
128*61c4878aSAndroid Build Coastguard Worker    ]
129*61c4878aSAndroid Build Coastguard Worker
130*61c4878aSAndroid Build Coastguard Worker    # TODO: b/301262374 - Provide a better way to detect the compiler type.
131*61c4878aSAndroid Build Coastguard Worker    if (get_path_info(pw_toolchain_SCOPE.cc, "file") == "clang") {
132*61c4878aSAndroid Build Coastguard Worker      cflags += [ "-Wno-deprecated-volatile" ]
133*61c4878aSAndroid Build Coastguard Worker      cflags_c += [ "-Wno-parentheses-equality" ]
134*61c4878aSAndroid Build Coastguard Worker    } else {
135*61c4878aSAndroid Build Coastguard Worker      cflags_c += [
136*61c4878aSAndroid Build Coastguard Worker        "-Wno-old-style-declaration",
137*61c4878aSAndroid Build Coastguard Worker        "-Wno-maybe-uninitialized",
138*61c4878aSAndroid Build Coastguard Worker      ]
139*61c4878aSAndroid Build Coastguard Worker      cflags_cc = [ "-Wno-volatile" ]
140*61c4878aSAndroid Build Coastguard Worker    }
141*61c4878aSAndroid Build Coastguard Worker
142*61c4878aSAndroid Build Coastguard Worker    defines = [
143*61c4878aSAndroid Build Coastguard Worker      "USE_HAL_DRIVER",
144*61c4878aSAndroid Build Coastguard Worker      files.product_define,
145*61c4878aSAndroid Build Coastguard Worker      "STM32CUBE_HEADER=\"${files.family}.h\"",
146*61c4878aSAndroid Build Coastguard Worker      "__ARMCC_VERSION=0",  # workaround for bug at stm32l552xx.h:1303
147*61c4878aSAndroid Build Coastguard Worker    ]
148*61c4878aSAndroid Build Coastguard Worker    visibility = [ ":*" ]
149*61c4878aSAndroid Build Coastguard Worker  }
150*61c4878aSAndroid Build Coastguard Worker
151*61c4878aSAndroid Build Coastguard Worker  config("sources_flags") {
152*61c4878aSAndroid Build Coastguard Worker    if (get_path_info(pw_toolchain_SCOPE.cc, "file") == "clang") {
153*61c4878aSAndroid Build Coastguard Worker      cflags_c = [ "-Wno-unused-but-set-variable" ]
154*61c4878aSAndroid Build Coastguard Worker    }
155*61c4878aSAndroid Build Coastguard Worker
156*61c4878aSAndroid Build Coastguard Worker    visibility = [ ":*" ]
157*61c4878aSAndroid Build Coastguard Worker  }
158*61c4878aSAndroid Build Coastguard Worker
159*61c4878aSAndroid Build Coastguard Worker  config("public_include_paths") {
160*61c4878aSAndroid Build Coastguard Worker    include_dirs = files.include_dirs
161*61c4878aSAndroid Build Coastguard Worker    include_dirs += [ "public" ]
162*61c4878aSAndroid Build Coastguard Worker    visibility = [ ":*" ]
163*61c4878aSAndroid Build Coastguard Worker  }
164*61c4878aSAndroid Build Coastguard Worker
165*61c4878aSAndroid Build Coastguard Worker  # Only libraries that implement parts of the stm32cube hal should depend on
166*61c4878aSAndroid Build Coastguard Worker  # this. If you just want to depend on the hal, depend on stm32cube directly.
167*61c4878aSAndroid Build Coastguard Worker  pw_source_set("stm32cube_headers") {
168*61c4878aSAndroid Build Coastguard Worker    public_configs = [
169*61c4878aSAndroid Build Coastguard Worker      ":header_flags",
170*61c4878aSAndroid Build Coastguard Worker      ":public_include_paths",
171*61c4878aSAndroid Build Coastguard Worker    ]
172*61c4878aSAndroid Build Coastguard Worker    public = [
173*61c4878aSAndroid Build Coastguard Worker      "public/stm32cube/init.h",
174*61c4878aSAndroid Build Coastguard Worker      "public/stm32cube/stm32cube.h",
175*61c4878aSAndroid Build Coastguard Worker    ]
176*61c4878aSAndroid Build Coastguard Worker    public += files.headers
177*61c4878aSAndroid Build Coastguard Worker    public_deps = [ pw_third_party_stm32cube_CONFIG ]
178*61c4878aSAndroid Build Coastguard Worker    visibility = [ ":*" ]
179*61c4878aSAndroid Build Coastguard Worker    if (pw_third_party_stm32cube_CORE_INIT != "") {
180*61c4878aSAndroid Build Coastguard Worker      visibility += [ pw_third_party_stm32cube_CORE_INIT ]
181*61c4878aSAndroid Build Coastguard Worker    }
182*61c4878aSAndroid Build Coastguard Worker  }
183*61c4878aSAndroid Build Coastguard Worker
184*61c4878aSAndroid Build Coastguard Worker  pw_source_set("stm32cube") {
185*61c4878aSAndroid Build Coastguard Worker    configs = [ ":sources_flags" ]
186*61c4878aSAndroid Build Coastguard Worker    public_deps = [ ":stm32cube_headers" ]
187*61c4878aSAndroid Build Coastguard Worker    sources = files.sources
188*61c4878aSAndroid Build Coastguard Worker    deps = [
189*61c4878aSAndroid Build Coastguard Worker      pw_third_party_stm32cube_CMSIS_INIT,
190*61c4878aSAndroid Build Coastguard Worker      pw_third_party_stm32cube_TIMEBASE,
191*61c4878aSAndroid Build Coastguard Worker    ]
192*61c4878aSAndroid Build Coastguard Worker    if (pw_third_party_stm32cube_CORE_INIT != "") {
193*61c4878aSAndroid Build Coastguard Worker      deps += [ pw_third_party_stm32cube_CORE_INIT ]
194*61c4878aSAndroid Build Coastguard Worker    }
195*61c4878aSAndroid Build Coastguard Worker  }
196*61c4878aSAndroid Build Coastguard Worker}
197