1 set(BOARD_DEFCONFIG ${PX4_CONFIG_FILE} CACHE FILEPATH "path to defconfig" FORCE)
2 set(BOARD_CONFIG ${PX4_BINARY_DIR}/boardconfig CACHE FILEPATH "path to config" FORCE)
其中
PX4_CONFIG_FILE
在上篇<px4_config>中定义set(PX4_BOARD_DIR "${PX4_SOURCE_DIR}/boards/${vendor}/${model}" CACHE STRING "PX4 board directory" FORCE)
PX4_BINARY_DIR
在CMakeList中定义set(PX4_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE FILEPATH "PX4 binary directory" FORCE)
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${BOARD_DEFCONFIG})
CMAKE_CONFIGURE_DEPENDS
appendBOARD_DEFCONFIG
16 set(COMMON_KCONFIG_ENV_SETTINGS
17 PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}
18 KCONFIG_CONFIG=${BOARD_CONFIG}
19 # Set environment variables so that Kconfig can prune Kconfig source
20 # files for other architectures
21 PLATFORM=${PX4_PLATFORM}
22 VENDOR=${PX4_BOARD_VENDOR}
23 MODEL=${PX4_BOARD_MODEL}
24 LABEL=${PX4_BOARD_LABEL}
25 TOOLCHAIN=${CMAKE_TOOLCHAIN_FILE}
26 ARCHITECTURE=${CMAKE_SYSTEM_PROCESSOR}
27 ROMFSROOT=${config_romfs_root}
28 )
构建环境变量,其中KCONFIG_CONFIG
指向BOARD_CONFIG
,存储最终生成的配置文件(推断)。
37 if(${LABEL} MATCHES "default" OR ${LABEL} MATCHES "qurt" OR ${LABEL} MATCHES "recovery" OR ${LABEL} MATCHES "bootloader" OR ${LABEL} MATCHES "canbootloader")
38 ¦ # Generate boardconfig from saved defconfig
39 ¦ execute_process(COMMAND ${CMAKE_COMMAND} -E env ${COMMON_KCONFIG_ENV_SETTINGS}
40 ¦ ¦ ¦ ¦ ¦ ${DEFCONFIG_PATH} ${BOARD_DEFCONFIG}
41 ¦ ¦ ¦ ¦ ¦ WORKING_DIRECTORY ${PX4_SOURCE_DIR}
42 ¦ ¦ ¦ ¦ ¦ OUTPUT_VARIABLE DUMMY_RESULTS)
43 else()
44 ¦ # Generate boardconfig from default.px4board and {label}.px4board
45 ¦ execute_process(COMMAND ${CMAKE_COMMAND} -E env ${COMMON_KCONFIG_ENV_SETTINGS}
46 ¦ ¦ ¦ ¦ ¦ ${PYTHON_EXECUTABLE} ${PX4_SOURCE_DIR}/Tools/kconfig/merge_config.py Kconfig ${BOARD_CONFIG} ${PX4_BOARD_DIR}/default.px4board ${BOARD_DEFCONFIG}
47 ¦ ¦ ¦ ¦ ¦ WORKING_DIRECTORY ${PX4_SOURCE_DIR}
48 ¦ ¦ ¦ ¦ ¦ OUTPUT_VARIABLE DUMMY_RESULTS)
49 endif()
根据LABEL
的内容,处理的方式不同:
- LABEL 等于 default qurt recoery bootloader canbootloader的话:
${DEFCONFIG_PATH} ${BOARD_DEFCONFIG}
- 否则
${PYTHON_EXECUTABLE} ${PX4_SOURCE_DIR}/Tools/kconfig/merge_config.py Kconfig ${BOARD_CONFIG} ${PX4_BOARD_DIR}/default.px4board ${BOARD_DEFCONFIG}
举例:LABEL = multicopter,那么就会将multicopter.px4board与default.px4board通过 merge_config.py合并生成${BOARD_CONFIG}
51 # Generate header file for C/C++ preprocessor
52 execute_process(COMMAND ${CMAKE_COMMAND} -E env ${COMMON_KCONFIG_ENV_SETTINGS}
53 ¦ ¦ ¦ ¦ ${GENCONFIG_PATH} --header-path ${PX4_BINARY_DIR}/px4_boardconfig.h
54 ¦ ¦ ¦ ¦ WORKING_DIRECTORY ${PX4_SOURCE_DIR}
55 ¦ ¦ ¦ ¦ OUTPUT_VARIABLE DUMMY_RESULTS)
生成头文件px4_boardconfig.h
58 file(STRINGS ${BOARD_CONFIG} ConfigContents)
59 foreach(NameAndValue ${ConfigContents})
--------------------------------------------------------我是分割线--------------------------------------------------------
读取${BOARD_CONFIG}
并逐行解析:
- 逐行预处理
60 ¦ # Strip leading spaces
61 ¦ string(REGEX REPLACE "^[ ]+" "" NameAndValue ${NameAndValue})
去掉开头的“[ ]" (推测,大概应该不出意外没问题)。
- 第一层处理
63 ¦ # Find variable name
64 ¦ string(REGEX MATCH "^CONFIG[^=]+" Name ${NameAndValue})
65
66 ¦ if(Name)
67 ¦ ¦ # Find the value
68 ¦ ¦ string(REPLACE "${Name}=" "" Value ${NameAndValue})
69
70 ¦ ¦ if(Value)
71 ¦ ¦ ¦ # remove extra quotes
72 ¦ ¦ ¦ string(REPLACE "\"" "" Value ${Value})
73
74 ¦ ¦ ¦ # Set the variable
75 ¦ ¦ ¦ set(${Name} ${Value} CACHE INTERNAL "BOARD DEFCONFIG: ${Name}" FORCE)
76 ¦ ¦ endif()
77 ¦ endif()
生成初级环境变量,例如 CONFIG_BOARD_PLATFORM="nuttx",形成环境变量 ${CONFIG_BOARD_PLATFORM} = "nuttx"
- 第二层处理 —— board配置相关
79 ¦ # Find variable name
80 ¦ string(REGEX MATCH "^CONFIG_BOARD_" Board ${NameAndValue})
81
82 ¦ if(Board)
83 ¦ ¦ string(REPLACE "CONFIG_BOARD_" "" ConfigKey ${Name})
84 ¦ ¦ if(Value)
85 ¦ ¦ ¦ set(${ConfigKey} ${Value})
86 ¦ ¦ ¦ message(STATUS "${ConfigKey} ${Value}")
87 ¦ ¦ endif()
88 ¦ endif()
例如 CONFIG_BOARD_PLATFORM="nuttx",形成环境变量 ${PLATFORM} = "nuttx"
- 第二层处理 —— user配置相关
90 ¦ # Find variable name
91 ¦ string(REGEX MATCH "^CONFIG_USER[^=]+" Userspace ${NameAndValue})
92
93 ¦ if(Userspace)
94 ¦ ¦ # Find the value
95 ¦ ¦ string(REPLACE "${Name}=" "" Value ${NameAndValue})
96 ¦ ¦ string(REPLACE "CONFIG_USER_" "" module ${Name})
97 ¦ ¦ string(TOLOWER ${module} module)
98 ¦ ¦ list(APPEND config_user_list ${module})
99 ¦ endif()
这个配置在当前列子中没有
- 第二层处理 —— driver配置相关
101 ¦ # Find variable name
102 ¦ string(REGEX MATCH "^CONFIG_DRIVERS[^=]+" Drivers ${NameAndValue})
103
104 ¦ if(Drivers)
105 ¦ ¦ # Find the value
106 ¦ ¦ string(REPLACE "${Name}=" "" Value ${NameAndValue})
107 ¦ ¦ string(REPLACE "CONFIG_DRIVERS_" "" driver ${Name})
108 ¦ ¦ string(TOLOWER ${driver} driver)
109
110 ¦ ¦ string(REPLACE "_" "/" driver_path ${driver})
111
112 ¦ ¦ # Pattern 1 XXX / XXX_XXX
113 ¦ ¦ string(REGEX REPLACE "(^[a-z]+)_([a-z0-9]+_[a-z0-9]+).*$" "\\1" driver_p1_folder ${driver})
114 ¦ ¦ string(REGEX REPLACE "(^[a-z]+)_([a-z0-9]+_[a-z0-9]+).*$" "\\2" driver_p1_subfolder ${driver})
115
116 ¦ ¦ # Pattern 2 XXX_XXX / XXXXXX
117 ¦ ¦ string(REGEX REPLACE "(^[a-z]+_[a-z0-9]+)_([a-z0-9]+).*$" "\\1" driver_p2_folder ${driver})
118 ¦ ¦ string(REGEX REPLACE "(^[a-z]+_[a-z0-9]+)_([a-z0-9]+).*$" "\\2" driver_p2_subfolder ${driver})
119
120 ¦ ¦ # Pattern 3 XXXXXX / XXX_XXX / XXXXXX
121 ¦ ¦ string(REGEX REPLACE "(^[a-z]+)_([a-z0-9]+_[a-z0-9]+)_([a-z]+[a-z0-9]+).*$" "\\1" driver_p3_folder ${driver})
122 ¦ ¦ string(REGEX REPLACE "(^[a-z]+)_([a-z0-9]+_[a-z0-9]+)_([a-z]+[a-z0-9]+).*$" "\\2" driver_p3_subfolder ${driver})
123 ¦ ¦ string(REGEX REPLACE "(^[a-z]+)_([a-z0-9]+_[a-z0-9]+)_([a-z]+[a-z0-9]+).*$" "\\3" driver_p3_subsubfolder ${driver})
124
125 ¦ ¦ # Pattern 4 XXX_XXX / XXX_XXX_XXX
126 ¦ ¦ string(REGEX REPLACE "(^[a-z]+_[a-z0-9]+)_([a-z_0-9]+).*$" "\\1" driver_p4_folder ${driver})
127 ¦ ¦ string(REGEX REPLACE "(^[a-z]+_[a-z0-9]+)_([a-z_0-9]+).*$" "\\2" driver_p4_subfolder ${driver})
128
129 ¦ ¦ # Pattern 5 XXXXXX / XXXXXX / XXX_XXX
130 ¦ ¦ string(REGEX REPLACE "(^[a-z]+)_([a-z0-9]+[a-z0-9]+)_([a-z0-9]+_[a-z0-9]+).*$" "\\1" driver_p5_folder ${driver})
131 ¦ ¦ string(REGEX REPLACE "(^[a-z]+)_([a-z0-9]+[a-z0-9]+)_([a-z0-9]+_[a-z0-9]+).*$" "\\2" driver_p5_subfolder ${driver})
132 ¦ ¦ string(REGEX REPLACE "(^[a-z]+)_([a-z0-9]+[a-z0-9]+)_([a-z0-9]+_[a-z0-9]+).*$" "\\3" driver_p5_subsubfolder ${driver})
133
134 ¦ ¦ # Trick circumvent PX4 src naming problem with underscores and slashes
135 ¦ ¦ if(EXISTS ${PX4_SOURCE_DIR}/src/drivers/${driver})
136 ¦ ¦ ¦ list(APPEND config_module_list drivers/${driver})
137 ¦ ¦ elseif(EXISTS ${PX4_SOURCE_DIR}/src/drivers/${driver_path})
138 ¦ ¦ ¦ list(APPEND config_module_list drivers/${driver_path})
139 ¦ ¦ elseif(EXISTS ${PX4_SOURCE_DIR}/src/drivers/${driver_p3_folder}/${driver_p3_subfolder}/${driver_p3_subsubfolder})
140 ¦ ¦ ¦ list(APPEND config_module_list drivers/${driver_p3_folder}/${driver_p3_subfolder}/${driver_p3_subsubfolder})
141 ¦ ¦ elseif(EXISTS ${PX4_SOURCE_DIR}/src/drivers/${driver_p1_folder}/${driver_p1_subfolder})
142 ¦ ¦ ¦ list(APPEND config_module_list drivers/${driver_p1_folder}/${driver_p1_subfolder})
143 ¦ ¦ elseif(EXISTS ${PX4_SOURCE_DIR}/src/drivers/${driver_p4_folder}/${driver_p4_subfolder})
144 ¦ ¦ ¦ list(APPEND config_module_list drivers/${driver_p4_folder}/${driver_p4_subfolder})
145 ¦ ¦ elseif(EXISTS ${PX4_SOURCE_DIR}/src/drivers/${driver_p2_folder}/${driver_p2_subfolder})
146 ¦ ¦ ¦ list(APPEND config_module_list drivers/${driver_p2_folder}/${driver_p2_subfolder})
147 ¦ ¦ elseif(EXISTS ${PX4_SOURCE_DIR}/src/drivers/${driver_p5_folder}/${driver_p5_subfolder}/${driver_p5_subsubfolder})
148 ¦ ¦ ¦ list(APPEND config_module_list drivers/${driver_p5_folder}/${driver_p5_subfolder}/${driver_p5_subsubfolder})
149 ¦ ¦ else()
150 ¦ ¦ ¦ message(FATAL_ERROR "Couldn't find path for ${driver}")
151 ¦ ¦ endif()
152
153 ¦ endif()
以CONFIG_DRIVERS_BAROMETER_MS5611=y为例,首先得到 driver = barometer_ms5611,进一步处理driver_path = barometer/ms5611,然后config_module_list += drivers/${driver_path}。
- 第二层处理 —— module相关
155 ¦ # Find variable name
156 ¦ string(REGEX MATCH "^CONFIG_MODULES[^=]+" Modules ${NameAndValue})
157
158 ¦ if(Modules)
159 ¦ ¦ # Find the value
160 ¦ ¦ string(REPLACE "${Name}=" "" Value ${NameAndValue})
161 ¦ ¦ string(REPLACE "CONFIG_MODULES_" "" module ${Name})
162 ¦ ¦ string(TOLOWER ${module} module)
163
164 ¦ ¦ string(REPLACE "_" "/" module_path ${module})
165
166 ¦ ¦ # Pattern 1 XXX / XXX_XXX
167 ¦ ¦ string(REGEX REPLACE "(^[a-z]+)_([a-z0-9]+_[a-z0-9]+).*$" "\\1" module_p1_folder ${module})
168 ¦ ¦ string(REGEX REPLACE "(^[a-z]+)_([a-z0-9]+_[a-z0-9]+).*$" "\\2" module_p1_subfolder ${module})
169
170 ¦ ¦ # Pattern 2 XXX / XXX_XXX_XXX
171 ¦ ¦ string(REGEX REPLACE "(^[a-z]+)_([a-z0-9]+_[a-z0-9]+_[a-z0-9]+).*$" "\\1" module_p2_folder ${module})
172 ¦ ¦ string(REGEX REPLACE "(^[a-z]+)_([a-z0-9]+_[a-z0-9]+_[a-z0-9]+).*$" "\\2" module_p2_subfolder ${module})
173
174 ¦ ¦ # Trick circumvent PX4 src naming problem with underscores and slashes
175 ¦ ¦ if(EXISTS ${PX4_SOURCE_DIR}/src/modules/${module})
176 ¦ ¦ ¦ list(APPEND config_module_list modules/${module})
177 ¦ ¦ elseif(EXISTS ${PX4_SOURCE_DIR}/src/modules/${module_path})
178 ¦ ¦ ¦ list(APPEND config_module_list modules/${module_path})
179 ¦ ¦ elseif(EXISTS ${PX4_SOURCE_DIR}/src/modules/${module_p1_folder}/${module_p1_subfolder})
180 ¦ ¦ ¦ list(APPEND config_module_list modules/${module_p1_folder}/${module_p1_subfolder})
181 ¦ ¦ elseif(EXISTS ${PX4_SOURCE_DIR}/src/modules/${module_p2_folder}/${module_p2_subfolder})
182 ¦ ¦ ¦ list(APPEND config_module_list modules/${module_p2_folder}/${module_p2_subfolder})
183 ¦ ¦ else()
184 ¦ ¦ ¦ message(FATAL_ERROR "Couldn't find path for ${module}")
185 ¦ ¦ endif()
186 ¦ endif()
以CONFIG_MODULES_BATTERY_STATUS=y为例,先生成module = "battery_status", module_path = "battery/status",然后config_module_list += moules/${module_path}。
- 第二层处理 —— systemcmds相关
188 ¦ # Find variable name
189 ¦ string(REGEX MATCH "^CONFIG_SYSTEMCMDS[^=]+" Systemcmds ${NameAndValue})
190
191 ¦ if(Systemcmds)
192 ¦ ¦ # Find the value
193 ¦ ¦ string(REPLACE "${Name}=" "" Value ${NameAndValue})
194 ¦ ¦ string(REPLACE "CONFIG_SYSTEMCMDS_" "" systemcmd ${Name})
195 ¦ ¦ string(TOLOWER ${systemcmd} systemcmd)
196
197 ¦ ¦ list(APPEND config_module_list systemcmds/${systemcmd})
198 ¦ endif()
以CONFIG_SYSTEMCMDS_HARDFAULT_LOG=y为例,先生成systemcmd = harddefault_log,然后config_module_list += systemdcmds/${systemcmd}。
- 第二层处理 —— examples相关
203 ¦ if(Examples)
204 ¦ ¦ # Find the value
205 ¦ ¦ string(REPLACE "${Name}=" "" Value ${NameAndValue})
206 ¦ ¦ string(REPLACE "CONFIG_EXAMPLES_" "" example ${Name})
207 ¦ ¦ string(TOLOWER ${example} example)
208
209 ¦ ¦ list(APPEND config_module_list examples/${example})
210 ¦ endif()
以CONFIG_EXAMPLES_HELLO is not set为例,先生成example = hello,然后config_module_list += examples/${example}。
--------------------------------------------------------我是分割线--------------------------------------------------------
214 # Put every module not in userspace also to kernel list
215 foreach(modpath ${config_module_list})
216 ¦ get_filename_component(module ${modpath} NAME)
217 ¦ list(FIND config_user_list ${module} _index)
218
219 ¦ if (${_index} EQUAL -1)
220 ¦ ¦ list(APPEND config_kernel_list ${modpath})
221 ¦ endif()
222 endforeach()
如果不在config_user_list中的config_module_list的元素,放在config_kernel_list中。
224 if(PLATFORM)
225 ¦ # set OS, and append specific platform module path
226 ¦ set(PX4_PLATFORM ${PLATFORM} CACHE STRING "PX4 board OS" FORCE)
227 ¦ list(APPEND CMAKE_MODULE_PATH ${PX4_SOURCE_DIR}/platforms/${PX4_PLATFORM}/cmake)
228
229 ¦ # platform-specific include path
230 ¦ include_directories(${PX4_SOURCE_DIR}/platforms/${PX4_PLATFORM}/src/px4/common/include)
231
232 ¦ if(PLATFORM STREQUAL "qurt")
233 ¦ ¦ include(${PX4_SOURCE_DIR}/boards/modalai/voxl2/cmake/voxl2_qurt.cmake)
234 ¦ endif()
235 endif()
上面说到了
例如 CONFIG_BOARD_PLATFORM="nuttx",形成环境变量 ${PLATFORM} = "nuttx"
这里将平台相关信息关联起来,CMAKE_MODULE_PATH 和 include_directories。
237 if(ARCHITECTURE)
238 set(CMAKE_SYSTEM_PROCESSOR ${ARCHITECTURE} CACHE INTERNAL "system processor" FORCE)
239 endif()
240
241 if(TOOLCHAIN)
242 set(CMAKE_TOOLCHAIN_FILE Toolchain-${TOOLCHAIN} CACHE INTERNAL "toolchain file" FORCE)
243 endif()
架构和编译链的设置,处理看上面:
21 CONFIG_BOARD_TOOLCHAIN="arm-none-eabi"
22 CONFIG_BOARD_ARCHITECTURE="cortex-m4"
245 set(romfs_extra_files)
246 set(config_romfs_extra_dependencies)
247 # additional embedded metadata
248 if (NOT CONSTRAINED_FLASH AND NOT EXTERNAL_METADATA AND NOT ${PX4_BOARD_LABEL} STREQUAL "test")
249 list(APPEND romfs_extra_files
250 ${PX4_BINARY_DIR}/parameters.json.xz
251 ${PX4_BINARY_DIR}/events/all_events.json.xz
252 ${PX4_BINARY_DIR}/actuators.json.xz)
253 list(APPEND romfs_extra_dependencies
254 parameters_xml
255 events_json
256 actuators_json)
257 endif()
258 list(APPEND romfs_extra_files ${PX4_BINARY_DIR}/component_general.json.xz)
259 list(APPEND romfs_extra_dependencies component_general_json)
260 set(config_romfs_extra_files ${romfs_extra_files} CACHE INTERNAL "extra ROMFS files" FORCE)
261 set(config_romfs_extra_dependencies ${romfs_extra_dependencies} CACHE INTERNAL "extra ROMFS deps" FORCE)
处理额外的依赖和文件,产出2个变量 config_romfs_extra_files 和 config_romfs_extra_dependencies
263 if(SERIAL_PORTS)
264 set(board_serial_ports ${SERIAL_PORTS} PARENT_SCOPE)
265 endif()
266
267 # Serial ports
268 set(board_serial_ports)
269 if(SERIAL_URT6)
270 list(APPEND board_serial_ports URT6:${SERIAL_URT6})
271 endif()
272 if(SERIAL_GPS1)
273 ¦ list(APPEND board_serial_ports GPS1:${SERIAL_GPS1})
274 endif()
275 if(SERIAL_GPS2)
276 ¦ list(APPEND board_serial_ports GPS2:${SERIAL_GPS2})
277 endif()
278 if(SERIAL_GPS3)
279 ¦ list(APPEND board_serial_ports GPS3:${SERIAL_GPS3})
280 endif()
281 if(SERIAL_GPS4)
282 ¦ list(APPEND board_serial_ports GPS4:${SERIAL_GPS4})
283 endif()
284 if(SERIAL_GPS5)
285 ¦ list(APPEND board_serial_ports GPS5:${SERIAL_GPS5})
286 endif()
287 if(SERIAL_TEL1)
288 ¦ list(APPEND board_serial_ports TEL1:${SERIAL_TEL1})
289 endif()
290 if(SERIAL_TEL2)
291 ¦ list(APPEND board_serial_ports TEL2:${SERIAL_TEL2})
292 endif()
293 if(SERIAL_TEL3)
294 ¦ list(APPEND board_serial_ports TEL3:${SERIAL_TEL3})
295 endif()
296 if(SERIAL_TEL4)
297 ¦ list(APPEND board_serial_ports TEL4:${SERIAL_TEL4})
298 endif()
299 if(SERIAL_TEL5)
300 ¦ list(APPEND board_serial_ports TEL5:${SERIAL_TEL5})
301 endif()
302 if(SERIAL_RC)
303 list(APPEND board_serial_ports RC:${SERIAL_RC})
304 endif()
305 if(SERIAL_WIFI)
306 ¦ list(APPEND board_serial_ports WIFI:${SERIAL_WIFI})
307 endif()
308 if(SERIAL_PPB)
309 ¦ list(APPEND board_serial_ports PPB:${SERIAL_PPB})
310 endif()
串口相关处理,产出变量 board_serial_ports。
313 # ROMFS
314 if(ROMFSROOT)
315 set(config_romfs_root ${ROMFSROOT} CACHE INTERNAL "ROMFS root" FORCE)
316
317 if(UAVCAN_PERIPHERALS)
318 set(config_uavcan_peripheral_firmware ${UAVCAN_PERIPHERALS} CACHE INTERNAL "UAVCAN peripheral firmware" FORCE)
319 endif()
320 endif()
321
322 if(UAVCAN_INTERFACES)
323 set(config_uavcan_num_ifaces ${UAVCAN_INTERFACES} CACHE INTERNAL "UAVCAN interfaces" FORCE)
324 endif()
325
326 if(UAVCAN_TIMER_OVERRIDE)
327 set(config_uavcan_timer_override ${UAVCAN_TIMER_OVERRIDE} CACHE INTERNAL "UAVCAN TIMER OVERRIDE" FORCE)
328 endif()
ROMFS相关配置。
330 # OPTIONS
331
332 if(CONSTRAINED_FLASH)
333 set(px4_constrained_flash_build "1" CACHE INTERNAL "constrained flash build" FORCE)
334 add_definitions(-DCONSTRAINED_FLASH)
335 endif()
336
337 if (NO_HELP)
338 add_definitions(-DCONSTRAINED_FLASH_NO_HELP="https://docs.px4.io/main/en/modules/modules_main.html")
339 endif()
340
341 if(CONSTRAINED_MEMORY)
342 set(px4_constrained_memory_build "1" CACHE INTERNAL "constrained memory build" FORCE)
343 add_definitions(-DCONSTRAINED_MEMORY)
344 endif()
345
346 if(TESTING)
347 set(PX4_TESTING "1" CACHE INTERNAL "testing enabled" FORCE)
348 endif()
349
350 if(ETHERNET)
351 set(PX4_ETHERNET "1" CACHE INTERNAL "ethernet enabled" FORCE)
352 endif()
353
354 if(CRYPTO)
355 set(PX4_CRYPTO "1" CACHE INTERNAL "PX4 crypto implementation" FORCE)
356 add_definitions(-DPX4_CRYPTO)
357 endif()
358
359 if(LINKER_PREFIX)
360 set(PX4_BOARD_LINKER_PREFIX ${LINKER_PREFIX} CACHE STRING "PX4 board linker prefix" FORCE)
361 else()
362 set(PX4_BOARD_LINKER_PREFIX "" CACHE STRING "PX4 board linker prefix" FORCE)
363 endif()
364
365 if(COMPILE_DEFINITIONS)
366 ¦ add_definitions( ${COMPILE_DEFINITIONS})
367 endif()
368
369 if(LINUX)
370 ¦ add_definitions( "-D__PX4_LINUX" )
371 endif()
372
373 if(LOCKSTEP)
374 ¦ set(ENABLE_LOCKSTEP_SCHEDULER yes)
375 endif()
376
377 if(NOLOCKSTEP)
378 ¦ set(ENABLE_LOCKSTEP_SCHEDULER no)
379 endif()
380
381 if(FULL_OPTIMIZATION)
382 ¦ set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE)
383 endif()
OPTIONS相关
385 include(px4_impl_os)
结合上面关于CMAKE_MODULE_PATH的处理,这里include的是 platforms/nuttx/cmake/px4_impl_os.cmake
。px4_impl_os中实现了3个函数:
- px4_os_add_flags : Set the nuttx build flags.
- px4_os_determine_build_chip : Sets PX4_CHIP and PX4_CHIP_MANUFACTURER.
- px4_os_prebuild_targets : This function generates os dependent targets.
px4_os_prebuild_targets(OUT prebuild_targets BOARD ${PX4_BOARD})
这里没看很明白~
大致意思是 生成一个类型为INTERFACE的library,该library链接nuttx_xx m gcc并依赖nuttx_context uorb_headers。
388 # add board config directory src to build modules
389 file(RELATIVE_PATH board_support_src_rel ${PX4_SOURCE_DIR}/src ${PX4_BOARD_DIR})
390 list(APPEND config_module_list ${board_support_src_rel}/src)
添加板子的源码到config_module_list
398 if(${LABEL} MATCHES "default" OR ${LABEL} MATCHES "bootloader" OR ${LABEL} MATCHES "canbootloader")
399 add_custom_target(boardconfig
400 ¦ ${CMAKE_COMMAND} -E env
401 ¦ ${COMMON_KCONFIG_ENV_SETTINGS}
402 ¦ ${MENUCONFIG_PATH} Kconfig
403 ¦ COMMAND ${CMAKE_COMMAND} -E env ${COMMON_KCONFIG_ENV_SETTINGS} ${SAVEDEFCONFIG_PATH}
404 ¦ COMMAND ${CMAKE_COMMAND} -E copy defconfig ${BOARD_DEFCONFIG}
405 ¦ COMMAND ${CMAKE_COMMAND} -E remove defconfig
406 ¦ COMMAND ${CMAKE_COMMAND} -E remove ${PX4_BINARY_DIR}/NuttX/apps_copy.stamp
407 ¦ WORKING_DIRECTORY ${PX4_SOURCE_DIR}
408 ¦ USES_TERMINAL
409 ¦ COMMAND_EXPAND_LISTS
410 )
411
412 add_custom_target(boardguiconfig
413 ¦ ${CMAKE_COMMAND} -E env
414 ¦ ${COMMON_KCONFIG_ENV_SETTINGS}
415 ¦ ${GUICONFIG_PATH} Kconfig
416 ¦ COMMAND ${CMAKE_COMMAND} -E env ${COMMON_KCONFIG_ENV_SETTINGS} ${SAVEDEFCONFIG_PATH}
417 ¦ COMMAND ${CMAKE_COMMAND} -E copy defconfig ${BOARD_DEFCONFIG}
418 ¦ COMMAND ${CMAKE_COMMAND} -E remove defconfig
419 ¦ COMMAND ${CMAKE_COMMAND} -E remove ${PX4_BINARY_DIR}/NuttX/apps_copy.stamp
420 ¦ WORKING_DIRECTORY ${PX4_SOURCE_DIR}
421 ¦ USES_TERMINAL
422 ¦ COMMAND_EXPAND_LISTS
423 )
424 else()
425 add_custom_target(boardconfig
426 ¦ ${CMAKE_COMMAND} -E env
427 ¦ ${COMMON_KCONFIG_ENV_SETTINGS}
428 ¦ ${MENUCONFIG_PATH} Kconfig
429 ¦ COMMAND ${CMAKE_COMMAND} -E env ${COMMON_KCONFIG_ENV_SETTINGS} ${SAVEDEFCONFIG_PATH}
430 ¦ COMMAND ${CMAKE_COMMAND} -E env ${COMMON_KCONFIG_ENV_SETTINGS} ${PYTHON_EXECUTABLE} ${PX4_SOURCE_DIR}/Tools/kconfig/diffconfig.py -m ${PX4_BOARD_DIR}/default.px4board defconfig > ${BOARD_DEFCONFIG}
431 ¦ COMMAND ${CMAKE_COMMAND} -E remove defconfig
432 ¦ COMMAND ${CMAKE_COMMAND} -E remove ${PX4_BINARY_DIR}/NuttX/apps_copy.stamp
433 ¦ WORKING_DIRECTORY ${PX4_SOURCE_DIR}
434 ¦ USES_TERMINAL
435 ¦ COMMAND_EXPAND_LISTS
436 )
437
438 add_custom_target(boardguiconfig
439 ¦ ${CMAKE_COMMAND} -E env
440 ¦ ${COMMON_KCONFIG_ENV_SETTINGS}
441 ¦ ${GUICONFIG_PATH} Kconfig
442 ¦ COMMAND ${CMAKE_COMMAND} -E env ${COMMON_KCONFIG_ENV_SETTINGS} ${SAVEDEFCONFIG_PATH}
443 ¦ COMMAND ${CMAKE_COMMAND} -E env ${COMMON_KCONFIG_ENV_SETTINGS} ${PYTHON_EXECUTABLE} ${PX4_SOURCE_DIR}/Tools/kconfig/diffconfig.py -m ${PX4_BOARD_DIR}/default.px4board defconfig > ${BOARD_DEFCONFIG}
444 ¦ COMMAND ${CMAKE_COMMAND} -E remove defconfig
445 ¦ COMMAND ${CMAKE_COMMAND} -E remove ${PX4_BINARY_DIR}/NuttX/apps_copy.stamp
446 ¦ WORKING_DIRECTORY ${PX4_SOURCE_DIR}
447 ¦ USES_TERMINAL
448 ¦ COMMAND_EXPAND_LISTS
449 )
450 endif()
生成defconfig