Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ardupilot
GitHub Repository: Ardupilot/ardupilot
Path: blob/master/Tools/ardupilotwaf/esp32.py
9743 views
1
# encoding: utf-8
2
3
# flake8: noqa
4
5
"""
6
Waf tool for ESP32 build
7
"""
8
9
from waflib import Build, ConfigSet, Configure, Context, Task, Utils
10
from waflib import Errors, Logs
11
from waflib.TaskGen import before, after_method, before_method, feature
12
from waflib.Configure import conf
13
from collections import OrderedDict
14
15
import os
16
import shutil
17
import sys
18
import traceback
19
import re
20
import pickle
21
import subprocess
22
23
import hal_common
24
25
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../libraries/AP_HAL_ESP32/hwdef/scripts'))
26
import esp32_hwdef # noqa:501
27
28
def configure(cfg):
29
mcu_esp32s3 = True if (cfg.variant[0:7] == "esp32s3") else False
30
target = "esp32s3" if mcu_esp32s3 else "esp32"
31
bldnode = cfg.bldnode.make_node(cfg.variant)
32
def srcpath(path):
33
return cfg.srcnode.make_node(path).abspath()
34
def bldpath(path):
35
return bldnode.make_node(path).abspath()
36
37
#Load cmake builder and make
38
cfg.load('cmake')
39
40
#define env and location for the cmake esp32 file
41
env = cfg.env
42
env.AP_HAL_ESP32 = srcpath('libraries/AP_HAL_ESP32/targets/'+target+'/esp-idf')
43
env.AP_PROGRAM_FEATURES += ['esp32_ap_program']
44
45
env.ESP_IDF_PREFIX_REL = 'esp-idf'
46
47
prefix_node = bldnode.make_node(env.ESP_IDF_PREFIX_REL)
48
env.ESP32_TARGET = target
49
env.BUILDROOT = bldpath('')
50
env.SRCROOT = srcpath('')
51
env.APJ_TOOL = srcpath('Tools/scripts/apj_tool.py')
52
53
#Check if esp-idf env are loaded, or load it
54
try:
55
env.IDF = os.environ['IDF_PATH']
56
except:
57
env.IDF = cfg.srcnode.abspath()+"/modules/esp_idf"
58
print("USING EXPRESSIF IDF:"+str(env.IDF))
59
60
try:
61
hwdef_obj = generate_hwdef_h(env)
62
except Exception:
63
traceback.print_exc()
64
cfg.fatal("Failed to process hwdef.dat")
65
hal_common.process_hwdef_results(cfg, hwdef_obj)
66
67
def generate_hwdef_h(env):
68
'''run esp32_hwdef.py'''
69
hwdef_dir = os.path.join(env.SRCROOT, 'libraries/AP_HAL_ESP32/hwdef')
70
71
if len(env.HWDEF) == 0:
72
env.HWDEF = os.path.join(hwdef_dir, env.BOARD, 'hwdef.dat')
73
hwdef_out = env.BUILDROOT
74
if not os.path.exists(hwdef_out):
75
os.mkdir(hwdef_out)
76
hwdef = [env.HWDEF]
77
if env.HWDEF_EXTRA:
78
hwdef.append(env.HWDEF_EXTRA)
79
80
hwdef_obj = esp32_hwdef.ESP32HWDef(
81
outdir=hwdef_out,
82
hwdef=hwdef,
83
quiet=False,
84
)
85
hwdef_obj.run()
86
87
return hwdef_obj
88
89
# delete the output sdkconfig file when the input defaults changes. we take the
90
# stamp as the output so we can compute the path to the sdkconfig, yet it
91
# doesn't have to exist when we're done.
92
class clean_sdkconfig(Task.Task):
93
def keyword(self):
94
return "delete sdkconfig generated from"
95
96
def run(self):
97
prefix = ".clean-stamp-"
98
for out in self.outputs:
99
if not out.name.startswith(prefix):
100
raise ValueError("not a stamp file: "+out)
101
dest = out.parent.abspath()+"/"+out.name[len(prefix):]
102
if os.path.exists(dest):
103
os.unlink(dest)
104
105
# waf needs the output to exist after the task, so touch it
106
open(out.abspath(), "w").close()
107
108
def pre_build(self):
109
"""Configure esp-idf as lib target"""
110
lib_vars = OrderedDict()
111
lib_vars['ARDUPILOT_CMD'] = self.cmd
112
lib_vars['WAF_BUILD_TARGET'] = self.targets
113
lib_vars['ARDUPILOT_LIB'] = self.bldnode.find_or_declare('lib/').abspath()
114
lib_vars['ARDUPILOT_BIN'] = self.bldnode.find_or_declare('lib/bin').abspath()
115
target = self.env.ESP32_TARGET
116
esp_idf = self.cmake(
117
name='esp-idf',
118
cmake_vars=lib_vars,
119
cmake_src='libraries/AP_HAL_ESP32/targets/'+target+'/esp-idf',
120
cmake_bld='esp-idf_build',
121
)
122
123
esp_idf_showinc = esp_idf.build('showinc', target='esp-idf_build/includes.list')
124
125
# task to delete the sdkconfig (thereby causing it to be regenerated) when
126
# the .defaults changes. it uses a stamp to find the sdkconfig. changing
127
# the sdkconfig WILL NOT cause it to be deleted as it's not an input. this
128
# is by design so the user can tweak it for testing purposes.
129
clean_sdkconfig_task = esp_idf_showinc.create_task("clean_sdkconfig",
130
src=self.srcnode.find_or_declare(self.env.AP_HAL_ESP32+"/sdkconfig.defaults"),
131
tgt=self.bldnode.find_or_declare("esp-idf_build/.clean-stamp-sdkconfig"))
132
133
esp_idf_showinc.post()
134
135
# ensure the sdkconfig will be deleted before the cmake configure occurs
136
# that regenerates it
137
esp_idf_showinc.cmake_config_task.set_run_after(clean_sdkconfig_task)
138
139
from waflib import Task
140
class load_generated_includes(Task.Task):
141
"""After includes.list generated include it in env"""
142
always_run = True
143
def run(tsk):
144
bld = tsk.generator.bld
145
includes = bld.bldnode.find_or_declare('esp-idf_build/includes.list').read().split()
146
#print(includes)
147
bld.env.prepend_value('INCLUDES', includes)
148
149
tsk = load_generated_includes(env=self.env)
150
tsk.set_inputs(self.path.find_resource('esp-idf_build/includes.list'))
151
self.add_to_group(tsk)
152
153
@feature('esp32_ap_program')
154
@after_method('process_source')
155
def esp32_firmware(self):
156
self.link_task.always_run = True
157
esp_idf = self.bld.cmake('esp-idf')
158
159
build = esp_idf.build('all', target='esp-idf_build/ardupilot.bin')
160
build.post()
161
162
build.cmake_build_task.set_run_after(self.link_task)
163
164
# optional upload is last
165
if self.bld.options.upload:
166
flasher = esp_idf.build('flash')
167
flasher.post()
168
169