主CMakelist —— kconfig

    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_DEPENDSappendBOARD_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的内容,处理的方式不同:

  1. LABEL 等于 default qurt recoery bootloader canbootloader的话:
    ${DEFCONFIG_PATH} ${BOARD_DEFCONFIG}
  2. 否则
    ${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.cmakepx4_impl_os中实现了3个函数:

  1. px4_os_add_flags : Set the nuttx build flags.
  2. px4_os_determine_build_chip : Sets PX4_CHIP and PX4_CHIP_MANUFACTURER.
  3. px4_os_prebuild_targets : This function generates os dependent targets.
px4_os_prebuild_targets(OUT prebuild_targets BOARD ${PX4_BOARD})

这里没看很明白~
大致意思是 生成一个类型为INTERFACElibrary,该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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容