PX4源码的Makefile详细理解(包含部分makefile语法规则和编译逻辑)

啰嗦:越会一件事情,就会忘了不会一件事情的感觉。前段时间在微信上看到这句话,深以为然,这就是为什么很多时候懂的人觉得自己讲的很清楚了,但是不懂的人却觉得并没有讲的清楚明了,简单易懂。以下把自己学习理解的过程记录下来,欢迎大神指点。


1.PX4的makefile当中用到的Makefile语法


      本小节给出Makefile文件中使用到部分语法的简单说明,如果想要完全理解、读懂、甚至编写Makefile,需要仔细阅读《GNU Makefile 中文手册》。

:=                     --直接式变量展开,引用的变量或者函数都会被其定义值替换,如果:= 右端为空,可能是赋值了一个空格;
 = 及 define        --递归式变量展开,在引用处只是文本替换,在使用时才会展开;   
$                         --取变量值操作,可以嵌套使用,例如$($(X))。同时可以用于调用内嵌函数:$(FCTION ARGUMENTS);
?=                     --条件赋值,只有变量尚未被赋值的情况下,才能将?=后边的值赋给变量;
patsubst             --模式替换,引用格式:$(patsubst A,B,(VAR)), VAR表示变量,下同,例如:$(patsubst %.c %.o, a.c,b.c);
wildcard             --通用符,引用格式如:$(wildcard *.c),当前路径下的所有.c结尾的文件;
+=                      --追加赋值,VAR定义时给一个基本值,+=就在原来的变量基础上增加一 个赋值,注意不是覆盖;
%                        --模式字符,例如:%.c 表示后缀为.c模式的文件;
ifeq、ifneq         --条件判断关键字;
ifdef、ifndef       --条件判断关键字;
// +                     --命令行前使用+,表示;
subset                --字符串替换,例如:$(subst,e,E,feet),结果为:fEEt;
filter                   --过滤函数,例如:$(filter %.c %.s, $(VAR)),返回VAR中所有后缀为.c,.s的文件;
sort                    --将字符串升序排列,并去掉重复单词;
word                  --取单词函数,$(word 1, text),取text的第1个单词;
wordlist             --取字符串函数,$(word 1,5, text)表示取text的第1个到第5个单词字串;
words                --统计字符串中单词数目;
firstword           --取字符串的第一个单词,lastword同理取最后一个单词;
dir                     --取目录,包含指定文件的路径目录;
basename         --取前缀函数,例如 $(basename src/foo.c),返回值为src/foo;
foreach             --循环执行;
call                    --实现用户自定义函数的引用,$(call 函数,参数1,参数2,...);
@echo              --在界面上输出build信息;
eval                   --比较复杂,没看懂,构造一个依赖关系链,其主要功能是根据参 数关系、结构,对它们进行替换展开;
shell                  --大致功能是将shell的参数放入shell环境中执行并返回结果;
error                 --$(error TEXT...),返回错误信息并退出执行;
MAKECMDGOALS
                         -(用户输入的)命令行参数;
$@                    -表示规则的目标文件名,一般与改符号上文中的文件相对应,例如前边出现.C,可能默认就是对应的.O文件




2.PX4的makefile编译过程分析


     本次编译过程基于Windows下的PX4Toolchain中的PX4 Console模式,方法参考PX4开发手册或网上教程,输入的指令为:
        PX4源码的Makefile详细理解(包含部分makefile语法规则和编译逻辑)_第1张图片
以下是对Makefile原文注解:

  1. ############################################################################
  2. #
  3. # Copyright (c) 2015 - 2017 PX4 Development Team. All rights reserved.
  4. #
  5. #部分版权、使用等的申明,此处删去
  6. #
  7. ############################################################################
  8. # Enforce the presence of the GIT repository
  9. #
  10. # We depend on our submodules, so we have to prevent attempts to
  11. # compile without it being present.
  12. # 强制性保证GIT repository存在,由于于PX4依赖于其子模块,
  13. # 所以必须防止在缺少子模块的情况下编译,从而有了此处的强制检查
  14. # $(wildcard .git)用来获取工作路径下所有后缀为.git的文件,执行GIT检查
  15. # ifeq...endif为条件判断
  16. ifeq ($(wildcard .git),)
  17.     $(error YOU HAVE TO USE GIT TO DOWNLOAD THIS REPOSITORY. ABORTING.)
  18. endif
  19. # Help
  20. # --------------------------------------------------------------------
  21. # Don't be afraid of this makefile, it is just passing
  22. # arguments to cmake to allow us to keep the wiki pages etc.
  23. # that describe how to build the px4 firmware
  24. # the same even when using cmake instead of make.
  25. # 这个Makefile主要是讲怎么传递参数,怎么编译px4固件,同时使用make和cmake是一样的
  26. # Example usage:三种使用方法示例
  27. #
  28. # make px4fmu-v2_default                  (builds)
  29. # make px4fmu-v2_default upload     (builds and uploads)
  30. # make px4fmu-v2_default test          (builds and tests)
  31. #
  32. # This tells cmake to build the nuttx px4fmu-v2 default config in the
  33. # directory build/nuttx_px4fmu-v2_default and then call make
  34. # in that directory with the target upload.
  35. # 以上的命令告诉cmake使用build/nuttx_px4fmu-v2_default的默认配置来build nuttx
  36. # px4fmu,然后调用该路径下的make来上传target(编译好的文件)
  37. #  明确设置默认的build目标,编译目标为all,编译规则为posix_sitl_default,如果make不指定编译
  38. #  目标就会编译默认目标,此处输出的编译目标是px4fmu-v2_default
  39. all: posix_sitl_default # (默认build就是这个)
  40. # Parsing 解析
  41. # --------------------------------------------------------------------
  42. # assume 1st argument passed is the main target, the
  43. # rest are arguments to pass to the makefile generated
  44. # by cmake in the subdirectory
  45. # 假设第传递的第一个参数是主目标,余下的参数是传输给子路径下的cmake产生的makefile的
  46. # MAKECMDGOALS 就是输出的命令行参数px4fmu-v2_default
  47. # FIRST_ARG 变量值就是px4fmu
  48. FIRST_ARG := $(firstword$(MAKECMDGOALS))
  49. # ARGS的变量值就是default
  50. ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
  51. #如果j为赋值,就将j赋值为4
  52. j ?= 4
  53. # ninja赋值给NINJA_BIN,ninja貌似是一套编译工具,在此处没有用到
  54. NINJA_BIN := ninja
  55. ifndef NO_NINJA_BUILD
  56.        NINJA_BUILD := $(shell $(NINJA_BIN) --version 2>/dev/null)
  57.        ifndef NINJA_BUILD
  58.             NINJA_BIN:=ninja-build
  59.             NINJA_BUILD := $(shell $(NINJA_BIN) --version 2>/dev/null)
  60.         endif
  61. endif
  62. ifdef NINJA_BUILD
  63.     PX4_CMAKE_GENERATOR := Ninja
  64.     PX4_MAKE := $(NINJA_BIN)
  65.     ifdef VERBOSE
  66.         PX4_MAKE_ARGS := -v
  67.     else
  68.         PX4_MAKE_ARGS :=
  69.     endif
  70. else
  71.     #SYSTEMROOT C:\windows
  72.  ifdef SYSTEMROOT
  73.         # Windows 在windows系统下
  74.         PX4_CMAKE_GENERATOR := "MSYS\ Makefiles"
  75.     #在其余系统下,主要是Linux
  76.   else
  77.         PX4_CMAKE_GENERATOR := "Unix\ Makefiles"
  78.     endif
  79.     #$(MAKE) 其实就是make命令
  80.     PX4_MAKE = $(MAKE)
  81.     #设置编译参数 -j4 --no-print-directory:同一时刻可同时允许执行4行命令,
  82.     #禁止所有关于目录信息的打印
  83.     PX4_MAKE_ARGS = -j$(j) --no-print-directory
  84. endif
  85. #firmware所在的文件夹,我的是:/f/px4/firmware
  86. SRC_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
  87. # check if replay env variable is set & set build dir accordingly
  88. # 检查是否定义relay环境变量,并更改build目录的后缀:BUILD_DIR_SUFFIX
  89. ifdef replay
  90.     BUILD_DIR_SUFFIX := _replay
  91. else
  92.     BUILD_DIR_SUFFIX :=
  93. endif
  94. # additional config parameters passed to cmake
  95. # 添加额外的配置参数
  96. ifdef EXTERNAL_MODULES_LOCATION
  97.     CMAKE_ARGS += -DEXTERNAL_MODULES_LOCATION:STRING=$(EXTERNAL_MODULES_LOCATION)
  98. endif
  99. ifdef PX4_CMAKE_BUILD_TYPE
  100.     CMAKE_ARGS += -DCMAKE_BUILD_TYPE=${PX4_CMAKE_BUILD_TYPE}
  101. endif
  102. # Functions 函数
  103. # --------------------------------------------------------------------
  104. # 描述如何build一个cmake配置文件, 定义了cmke-build命令规则
  105. define cmake-build
  106. +@$(eval BUILD_DIR =$(SRC_DIR)/build/$@$(BUILD_DIR_SUFFIX))
  107. +@if [ $(PX4_CMAKE_GENERATOR) = "Ninja" ] && [ -e $(BUILD_DIR)/Makefile ]; then rm -rf $(BUILD_DIR); fi
  108. #以下命令是就是创建build文件夹,用cmake进行编译,然后再删除build文件夹
  109. #本次编译就是走这个流程,注意这里的cmake编译的应该是CMakelist.txt文件,不是直接的.cmake文件
  110. #$(2)应该是第二个参数,也就是传递的CMakelist.txt的路径,$(1)应该是传递的编译目标的名称,本次是nuttx_px4fmu-v2_default
  111. +@if [ ! -e $(BUILD_DIR)/CMakeCache.txt ]; then mkdir -p $(BUILD_DIR) && cd $(BUILD_DIR) && cmake $(2) -G"$(PX4_CMAKE_GENERATOR)" $(CMAKE_ARGS) -DCONFIG=$(1) || (rm -rf $(BUILD_DIR)); fi
  112. +@(cd $(BUILD_DIR) && $(PX4_MAKE) $(PX4_MAKE_ARGS) $(ARGS))
  113. endef
  114. COLOR_BLUE = \033[0;34m
  115. NO_COLOR   = \033[m
  116. define colorecho
  117. +@echo "${COLOR_BLUE}${1} ${NO_COLOR}"
  118. endef
  119. # Get a list of all config targets cmake/configs/*.cmake
  120. # 获得所有cmake/configs/下所有的cmake目标文件,
  121. # 本次编译的nuttx_px4fmu-v2_defualt就是从这里获得
  122. ALL_CONFIG_TARGETS :=$(basename $(shell find "$(SRC_DIR)/cmake/configs" -maxdepth 1 ! -name '*_common*' ! -name '*_sdflight_*' -name '*.cmake' -print | sed  -e 's:^.*/::' | sort))
  123. # Strip off leading nuttx_
  124. # 去掉NUTTX_前缀并返回,这样NUTTX_CONFIG_TARGETS就是包含了所有关于NUTTX配置的一个组
  125. NUTTX_CONFIG_TARGETS := $(patsubst nuttx_%,%,$(filter nuttx_%,$(ALL_CONFIG_TARGETS)))
  126. # ADD CONFIGS HERE 在此添加配置
  127. # --------------------------------------------------------------------
  128. #  Do not put any spaces between function arguments.
  129. # All targets. 所有的目标
  130. # $(ALL_CONFIG_TARGETS)指代了所有的编译目标,
  131. # 每个目标都执行$(call cmake-build,$@,$(SRC_DIR))这个命令行
  132. # 这是一种简便的书写模式
  133. $(ALL_CONFIG_TARGETS):
  134.     $(call cmake-build,$@,$(SRC_DIR))
  135. # Abbreviated config targets.
  136. # nuttx_ is left off by default; provide a rule to allow that. 只和nuttx相关的目标
  137. # $(NUTTX_CONFIG_TARGETS):指代了所有的编译目标,在本次就是px4fmu-v2_default
  138. # 每个目标都执行$(call cmake-build,$@,$(SRC_DIR))这个命令行,等价于
  139. # $(call cmake-build,nuttx_px4fmu-v2_default,/f/px4/firmware),本次编译就是由此处进入到对
  140. # nuttx_px4fmu-v2_default的编译
  141. $(NUTTX_CONFIG_TARGETS):
  142.     $(call cmake-build,nuttx_$@,$(SRC_DIR))
  143. #######################################################################################
  144. #
  145. #从此往后的就是一些伪目标,对本次编译来讲不重要,这些伪目标的作用有:
  146. #1. 如clean执行清除任务,并不生成可执行目标,这种为目标的主要作用是执行命令
  147. #2. 为了同时创建多个可执行目标,将一个为目标例如all作为终极目标,同时将
  148. #   其依赖多伪目标
  149. #
  150. #######################################################################################
  151. all_nuttx_targets: $(NUTTX_CONFIG_TARGETS)
  152. posix: posix_sitl_default
  153. broadcast: posix_sitl_broadcast
  154. # All targets with just dependencies but no recipe must either be marked as phony (or have the special @: as recipe).
  155. # 通过.PHONY将其冒号后的目标申明为伪目标,主要为了防止一些意外情况
  156. .PHONY: all posix broadcast all_nuttx_targets
  157. # Multi- config targets. 多目标(板)配置
  158. eagle_default: posix_eagle_default qurt_eagle_default
  159. eagle_rtps: posix_eagle_rtps qurt_eagle_default
  160. eagle_legacy_default: posix_eagle_legacy qurt_eagle_legacy
  161. excelsior_default: posix_excelsior_default qurt_excelsior_default
  162. excelsior_rtps: posix_excelsior_rtps qurt_excelsior_default
  163. excelsior_legacy_default: posix_excelsior_legacy qurt_excelsior_legacy
  164. .PHONY: eagle_default eagle_rtps eagle_legacy_default
  165. .PHONY: excelsior_default excelsior_rtps excelsior_legacy_default
  166. # Other targets
  167. # --------------------------------------------------------------------
  168. .PHONY: qgc_firmware px4fmu_firmware misc_qgc_extra_firmware alt_firmware check_rtps
  169. # QGroundControl flashable NuttX firmware
  170. qgc_firmware: px4fmu_firmware misc_qgc_extra_firmware
  171. # px4fmu NuttX firmware
  172. px4fmu_firmware: \
  173.     check_px4io-v2_default \
  174.     check_px4fmu-v2_default \
  175.     check_px4fmu-v3_default \
  176.     check_px4fmu-v4_default \
  177.     check_px4fmu-v4pro_default \
  178.     check_px4fmu-v5_default \
  179.     sizes
  180. misc_qgc_extra_firmware: \
  181.     check_aerocore2_default \
  182.     check_aerofc-v1_default \
  183.     check_auav-x21_default \
  184.     check_crazyflie_default \
  185.     check_mindpx-v2_default \
  186.     check_px4fmu-v2_lpe \
  187.     check_tap-v1_default \
  188.     sizes
  189. # Other NuttX firmware
  190. alt_firmware: \
  191.     check_nxphlite-v3_default \
  192.     check_px4-same70xplained-v1_default \
  193.     check_px4-stm32f4discovery_default \
  194.     check_px4cannode-v1_default \
  195.     check_px4esc-v1_default \
  196.     check_px4nucleoF767ZI-v1_default \
  197.     check_s2740vc-v1_default \
  198.     sizes
  199. # builds with RTPS
  200. check_rtps: \
  201.     check_px4fmu-v3_rtps \
  202.     check_px4fmu-v4_rtps \
  203.     check_px4fmu-v4pro_rtps \
  204.     check_posix_sitl_rtps \
  205.     sizes
  206. .PHONY: sizes check quick_check check_rtps uorb_graphs
  207. sizes:
  208.     @-find build -name *.elf -type f | xargs size 2> /dev/null || :
  209. # All default targets that don't require a special build environment
  210. check: check_posix_sitl_default px4fmu_firmware misc_qgc_extra_firmware alt_firmware tests check_format
  211. # quick_check builds a single nuttx and posix target, runs testing, and checks the style
  212. quick_check: check_posix_sitl_default check_px4fmu-v4pro_default tests check_format
  213. check_%:
  214.     @echo
  215.     $(call colorecho,"Building" $(subst check_,,$@))
  216.     @$(MAKE) --no-print-directory $(subst check_,,$@)
  217.     @echo
  218. uorb_graphs:
  219.     @./Tools/uorb_graph/create_from_startupscript.sh
  220.     @./Tools/uorb_graph/create.py --src-path src --exclude-path src/examples --file Tools/uorb_graph/graph_full
  221.     @$(MAKE) --no-print-directory px4fmu-v2_default uorb_graph
  222.     @$(MAKE) --no-print-directory px4fmu-v4_default uorb_graph
  223.     @$(MAKE) --no-print-directory posix_sitl_default uorb_graph
  224. .PHONY: coverity_scan
  225. coverity_scan: posix_sitl_default
  226. # Documentation
  227. # --------------------------------------------------------------------
  228. .PHONY: parameters_metadata airframe_metadata module_documentation px4_metadata
  229. parameters_metadata:
  230.     @python $(SRC_DIR)/src/modules/systemlib/param/px_process_params.py -s `find $(SRC_DIR)/src -maxdepth 4 -type d` --inject-xml $(SRC_DIR)/src/modules/systemlib/param/parameters_injected.xml --markdown
  231.     @python $(SRC_DIR)/src/modules/systemlib/param/px_process_params.py -s `find $(SRC_DIR)/src -maxdepth 4 -type d` --inject-xml $(SRC_DIR)/src/modules/systemlib/param/parameters_injected.xml --xml
  232. airframe_metadata:
  233.     @python $(SRC_DIR)/Tools/px_process_airframes.py -v -a $(SRC_DIR)/ROMFS/px4fmu_common/init.d --markdown
  234.     @python $(SRC_DIR)/Tools/px_process_airframes.py -v -a $(SRC_DIR)/ROMFS/px4fmu_common/init.d --xml
  235. module_documentation:
  236.     @python $(SRC_DIR)/Tools/px_process_module_doc.py -v --markdown $(SRC_DIR)/modules --src-path $(SRC_DIR)/src
  237. px4_metadata: parameters_metadata airframe_metadata module_documentation
  238. # Astyle
  239. # --------------------------------------------------------------------
  240. .PHONY: check_format format
  241. check_format:
  242.     $(call colorecho,"Checking formatting with astyle")
  243.     @$(SRC_DIR)/Tools/astyle/check_code_style_all.sh
  244.     @cd $(SRC_DIR) &&git diff --check
  245. format:
  246.     $(call colorecho,"Formatting with astyle")
  247.     @$(SRC_DIR)/Tools/astyle/check_code_style_all.sh --fix
  248. # Testing
  249. # --------------------------------------------------------------------
  250. .PHONY: tests tests_coverage tests_mission tests_offboard rostest
  251. tests:
  252.     @$(MAKE) --no-print-directory posix_sitl_default test_results \
  253.     ASAN_OPTIONS="color=always:check_initialization_order=1:detect_stack_use_after_return=1" \
  254.     UBSAN_OPTIONS="color=always"
  255. tests_coverage:
  256.     @$(MAKE) clean
  257.     @$(MAKE) --no-print-directory posix_sitl_default PX4_CMAKE_BUILD_TYPE=Coverage
  258.     @$(MAKE) --no-print-directory posix_sitl_default sitl_gazebo PX4_CMAKE_BUILD_TYPE=Coverage
  259.     @$(SRC_DIR)/test/rostest_px4_run.sh mavros_posix_tests_missions.test
  260.     @$(SRC_DIR)/test/rostest_px4_run.sh mavros_posix_tests_offboard_attctl.test
  261.     @$(SRC_DIR)/test/rostest_px4_run.sh mavros_posix_tests_offboard_posctl.test
  262.     @$(MAKE) --no-print-directory posix_sitl_default test_coverage_genhtml PX4_CMAKE_BUILD_TYPE=Coverage
  263.     @echo "Open $(SRC_DIR)/build/posix_sitl_default/coverage-html/index.html to see coverage"
  264. rostest: posix_sitl_default
  265.     @$(MAKE) --no-print-directory posix_sitl_default sitl_gazebo
  266. tests_mission: rostest
  267.     @$(SRC_DIR)/test/rostest_px4_run.sh mavros_posix_tests_missions.test
  268. tests_offboard: rostest
  269.     @$(SRC_DIR)/test/rostest_px4_run.sh mavros_posix_tests_offboard_attctl.test
  270.     @$(SRC_DIR)/test/rostest_px4_run.sh mavros_posix_tests_offboard_posctl.test
  271. # static analyzers (scan-build, clang-tidy, cppcheck)
  272. # --------------------------------------------------------------------
  273. .PHONY: scan-build posix_sitl_default-clang clang-tidy clang-tidy-fix clang-tidy-quiet cppcheck check_stack
  274. scan-build:
  275.     @export CCC_CC=clang
  276.     @export CCC_CXX=clang++
  277.     @rm -rf $(SRC_DIR)/build/posix_sitl_default-scan-build
  278.     @rm -rf $(SRC_DIR)/build/scan-build/report_latest
  279.     @mkdir -p $(SRC_DIR)/build/posix_sitl_default-scan-build
  280.     @cd $(SRC_DIR)/build/posix_sitl_default-scan-build && scan-build cmake $(SRC_DIR) -GNinja -DCONFIG=posix_sitl_default
  281.     @scan-build -o $(SRC_DIR)/build/scan-build cmake --build $(SRC_DIR)/build/posix_sitl_default-scan-build
  282.     @find $(SRC_DIR)/build/scan-build -maxdepth 1 -mindepth 1 -type d -exec cp -r "{}" $(SRC_DIR)/build/scan-build/report_latest \;
  283. posix_sitl_default-clang:
  284.     @mkdir -p $(SRC_DIR)/build/posix_sitl_default-clang
  285.     @cd $(SRC_DIR)/build/posix_sitl_default-clang && cmake $(SRC_DIR) $(CMAKE_ARGS) -G"$(PX4_CMAKE_GENERATOR)" -DCONFIG=posix_sitl_default -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
  286.     @$(PX4_MAKE) -C $(SRC_DIR)/build/posix_sitl_default-clang
  287. clang-tidy: posix_sitl_default-clang
  288.     @cd $(SRC_DIR)/build/posix_sitl_default-clang && $(SRC_DIR)/Tools/run-clang-tidy.py -header-filter=".*\.hpp" -j$(j) -p .
  289. # to automatically fix a single check at a time, eg modernize-redundant-void-arg
  290. #  % run-clang-tidy-4.0.py -fix -j4 -checks=-\*,modernize-redundant-void-arg -p .
  291. clang-tidy-fix: posix_sitl_default-clang
  292.     @cd $(SRC_DIR)/build/posix_sitl_default-clang && $(SRC_DIR)/Tools/run-clang-tidy.py -header-filter=".*\.hpp" -j$(j) -fix -p .
  293. # modified version of run-clang-tidy.py to return error codes and only output relevant results
  294. clang-tidy-quiet: posix_sitl_default-clang
  295.     @cd $(SRC_DIR)/build/posix_sitl_default-clang && $(SRC_DIR)/Tools/run-clang-tidy.py -header-filter=".*\.hpp" -j$(j) -p .
  296. # TODO: Fix cppcheck errors then try --enable=warning,performance,portability,style,unusedFunction or --enable=all
  297. cppcheck: posix_sitl_default
  298.     @mkdir -p $(SRC_DIR)/build/cppcheck
  299.     @cppcheck -i$(SRC_DIR)/src/examples --enable=performance --std=c++11 --std=c99 --std=posix --project=$(SRC_DIR)/build/posix_sitl_default/compile_commands.json --xml-version=2 2> $(SRC_DIR)/build/cppcheck/cppcheck-result.xml > /dev/null
  300.     @cppcheck-htmlreport --source-encoding=ascii --file=$(SRC_DIR)/build/cppcheck/cppcheck-result.xml --report-dir=$(SRC_DIR)/build/cppcheck --source-dir=$(SRC_DIR)/src/
  301. check_stack: px4fmu-v4pro_default
  302.     @echo "Checking worst case stack usage with checkstack.pl ..."
  303.     @echo " "
  304.     @echo "Top 10:"
  305.     @cd $(SRC_DIR)/build/px4fmu-v4pro_default && mkdir -p stack_usage && arm-none-eabi-objdump -d nuttx_px4fmu-v4pro_default.elf | $(SRC_DIR)/Tools/stack_usage/checkstack.pl arm 0 > stack_usage/checkstack_output.txt 2> stack_usage/checkstack_errors.txt
  306.     @head -n 10 $(SRC_DIR)/build/px4fmu-v4pro_default/stack_usage/checkstack_output.txt | c++filt
  307.     @echo " "
  308.     @echo "Symbols with 'main', 'thread' or 'task':"
  309.     @cat $(SRC_DIR)/build/px4fmu-v4pro_default/stack_usage/checkstack_output.txt | c++filt | grep -E 'thread|main|task'
  310. # Cleanup
  311. # --------------------------------------------------------------------
  312. .PHONY: clean submodulesclean submodulesupdate gazeboclean distclean
  313. clean:
  314.     @rm -rf $(SRC_DIR)/build
  315. submodulesclean:
  316.     @git submodule foreach --quiet --recursive git clean -ff -x -d
  317.     @git submodule update --quiet --init --recursive --force || true
  318.     @git submodule sync --recursive
  319.     @git submodule update --init --recursive --force
  320. submodulesupdate:
  321.     @git submodule update --quiet --init --recursive || true
  322.     @git submodule sync --recursive
  323.     @git submodule update --init --recursive
  324. gazeboclean:
  325.     @rm -rf ~/.gazebo/*
  326. distclean: gazeboclean
  327.     @git submodule deinit -f .
  328.     @git clean -ff -x -d -e ".project" -e ".cproject" -e ".idea" -e ".settings" -e ".vscode"
  329. # --------------------------------------------------------------------
  330. # All other targets are handled by PX4_MAKE. Add a rule here to avoid printing an error.
  331. %:
  332.     $(if $(filter $(FIRST_ARG),$@), \
  333.         $(error"$@ cannot be the first argument. Use '$(MAKE) help|list_config_targets' to get a list of all possible [configuration] targets."),@#)
  334. #help:
  335. #    @echo
  336. #    @echo "Type 'make ' and hit the tab key twice to see a list of the available"
  337. #    @echo "build configurations."
  338. #    @echo
  339. empty :=
  340. space := $(empty) $(empty)
  341. # Print a list of non-config targets (based on http://stackoverflow.com/a/26339924/1487069)
  342. help:
  343.     @echo "Usage: $(MAKE) "
  344.     @echo "Where is one of:"
  345.     @echo
  346.     @echo "Or, $(MAKE) []"
  347.     @echo "Use '$(MAKE) list_config_targets' for a list of configuration targets."
  348.     @echo "$()"
  349. # Print a list of all config targets.
  350. list_config_targets:
  351.     @for targ in $(patsubst nuttx_%,[nuttx_]%,$(ALL_CONFIG_TARGETS));do echo $$targ;done

  在默认的Makefile添加以下函数,可以将Makefile中变量值打印出来,更加清晰的查看Makefile的配置和运行过程:

  1.   .PHONY:VARValue
  2.   VARValue:
  3.        @echo "$(MAKEFILE_LIST)"
  4.        @echo "$(MAKECMDGOALS)"
  5.        @echo "$(SRC_DIR)"
  6.        @echo "$(PX4_MAKE)"
  7.        @echo "$(PX4_CMAKE_GENERATOR)"
  8.        @echo "$(SYSTEMROOT)"
  9.        @echo "$(PX4_MAKE_ARGS)"
  10.        @echo "$(ALL_CONFIG_TARGETS)"
  11.        @echo "$(NUTTX_CONFIG_TARGETS)"

结果为:
PX4源码的Makefile详细理解(包含部分makefile语法规则和编译逻辑)_第2张图片
接下来就是编译F:\px4\Firmware\cmake\configs\nuttx_px4fmu-v2_default.cmake文件。
接下来应该是编译:F:\px4\Firmware\CMakeLists.txt文件

——Eidted By RobotBrain.M                                  LESS BUT BETTER.

你可能感兴趣的:(飞控,PX4,Makefile,飞控,编译)