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開發手冊或網上教程,輸入的指令爲:
       
以下是對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) <target>"
  344.     @echo "Where <target> is one of:"
  345.     @echo
  346.     @echo "Or, $(MAKE) <config_target> [<make_target(s)>]"
  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)"

結果爲:

接下來就是編譯F:\px4\Firmware\cmake\configs\nuttx_px4fmu-v2_default.cmake文件。
接下來應該是編譯:F:\px4\Firmware\CMakeLists.txt文件

——Eidted By RobotBrain.M                                  LESS BUT BETTER.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章