| # Copyright 2021 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. |
| |
| import("//build_overrides/pigweed.gni") |
| |
| import("$dir_pw_build/linker_script.gni") |
| import("$dir_pw_build/target_types.gni") |
| import("$dir_pw_third_party/stm32cube/stm32cube.gni") |
| |
| if (dir_pw_third_party_stm32cube == "") { |
| group("linker_script_template") { |
| } |
| group("core_init_template") { |
| } |
| group("cmsis_init_template") { |
| } |
| group("hal_config_template") { |
| } |
| group("stm32cube_headers") { |
| } |
| group("stm32cube") { |
| } |
| } else { |
| stm32cube_builder_script = |
| "$dir_pw_stm32cube_build/py/pw_stm32cube_build/__main__.py" |
| |
| rebased_dir_pw_third_party_stm32cube = |
| rebase_path(dir_pw_third_party_stm32cube) |
| |
| find_files_args = [ |
| "find_files", |
| rebased_dir_pw_third_party_stm32cube, |
| pw_third_party_stm32cube_PRODUCT, |
| ] |
| if (pw_third_party_stm32cube_CORE_INIT == |
| "$dir_pw_third_party/stm32cube:core_init_template") { |
| find_files_args += [ "--init" ] |
| } |
| |
| # This script finds the files relavent for the current product. |
| files = exec_script(stm32cube_builder_script, |
| find_files_args, |
| "scope", |
| [ "$rebased_dir_pw_third_party_stm32cube/files.txt" ]) |
| |
| if (pw_third_party_stm32cube_CORE_INIT == |
| "$dir_pw_third_party/stm32cube:core_init_template") { |
| assert(files.gcc_linker != "" || files.iar_linker != "", |
| "No linker file found") |
| |
| gcc_linker = files.gcc_linker |
| if (gcc_linker == "") { |
| gcc_linker = "$target_gen_dir/linker.ld" |
| gcc_linker_str = exec_script(stm32cube_builder_script, |
| [ |
| "icf_to_ld", |
| files.iar_linker, |
| ], |
| "string", |
| [ files.iar_linker ]) |
| write_file(gcc_linker, gcc_linker_str) |
| } |
| |
| startup_file = "$target_gen_dir/startup.s" |
| startup_file_str = exec_script(stm32cube_builder_script, |
| [ |
| "inject_init", |
| files.startup, |
| ], |
| "string", |
| [ files.startup ]) |
| write_file(startup_file, startup_file_str) |
| |
| pw_linker_script("linker_script_template") { |
| linker_script = gcc_linker |
| } |
| |
| pw_source_set("core_init_template") { |
| deps = [ ":linker_script_template" ] |
| sources = [ startup_file ] |
| } |
| } |
| |
| pw_source_set("hal_timebase_template") { |
| deps = [ ":stm32cube_headers" ] |
| sources = [ "$dir_pw_third_party_stm32cube/hal_driver/Src/${files.family}_hal_timebase_tim_template.c" ] |
| } |
| |
| pw_source_set("cmsis_init_template") { |
| deps = [ ":stm32cube_headers" ] |
| sources = [ "$dir_pw_third_party_stm32cube/cmsis_device/Source/Templates/system_${files.family}.c" ] |
| } |
| |
| # Generate a stub config header that points to the correct template. |
| write_file("$target_gen_dir/template_config/${files.family}_hal_conf.h", |
| "#include \"${files.family}_hal_conf_template.h\"") |
| config("hal_config_template_includes") { |
| include_dirs = [ "$target_gen_dir/template_config" ] |
| } |
| pw_source_set("hal_config_template") { |
| public_configs = [ ":hal_config_template_includes" ] |
| |
| # This is to make sure GN properly detects changes to these files. The |
| # generated file shouldn't change, but the file it redirects to might. |
| public = [ "$target_gen_dir/template_config/${files.family}_hal_conf.h" ] |
| inputs = [ "$dir_pw_third_party_stm32cube/hal_driver/Inc/${files.family}_hal_conf_template.h" ] |
| } |
| |
| config("flags") { |
| cflags = [ "-Wno-unused-parameter" ] |
| cflags_c = [ |
| "-Wno-redundant-decls", |
| "-Wno-sign-compare", |
| "-Wno-undef", |
| "-Wno-implicit-function-declaration", |
| "-Wno-switch-enum", |
| ] |
| if (pw_toolchain_SCOPE.cc == "clang") { |
| cflags_c += [ "-Wno-parentheses-equality" ] |
| } else { |
| cflags_c += [ |
| "-Wno-old-style-declaration", |
| "-Wno-maybe-uninitialized", |
| ] |
| } |
| |
| defines = [ |
| "USE_HAL_DRIVER", |
| files.product_define, |
| "STM32CUBE_HEADER=\"${files.family}.h\"", |
| "__ARMCC_VERSION=0", # workaround for bug at stm32l552xx.h:1303 |
| ] |
| visibility = [ ":*" ] |
| } |
| |
| config("public_include_paths") { |
| include_dirs = files.include_dirs |
| include_dirs += [ "public" ] |
| visibility = [ ":*" ] |
| } |
| |
| # Only libraries that implement parts of the stm32cube hal should depend on |
| # this. If you just want to depend on the hal, depend on stm32cube directly. |
| pw_source_set("stm32cube_headers") { |
| public_configs = [ |
| ":flags", |
| ":public_include_paths", |
| ] |
| public = [ |
| "public/stm32cube/init.h", |
| "public/stm32cube/stm32cube.h", |
| ] |
| public += files.headers |
| public_deps = [ pw_third_party_stm32cube_CONFIG ] |
| visibility = [ ":*" ] |
| if (pw_third_party_stm32cube_CORE_INIT != "") { |
| visibility += [ pw_third_party_stm32cube_CORE_INIT ] |
| } |
| } |
| |
| pw_source_set("stm32cube") { |
| public_deps = [ ":stm32cube_headers" ] |
| sources = files.sources |
| deps = [ |
| pw_third_party_stm32cube_CMSIS_INIT, |
| pw_third_party_stm32cube_TIMEBASE, |
| ] |
| if (pw_third_party_stm32cube_CORE_INIT != "") { |
| deps += [ pw_third_party_stm32cube_CORE_INIT ] |
| } |
| } |
| } |