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