px4 makefile解析
2018-01-08 17:38
204 查看
关于px4的编译的流程,首先运行makefile,执行cmake,执行完之后再执行make命令,完成整个编译流程。
编译px4-v2的版本,需要执行命令:make px4fmu-v2_default
针对这句话,Makefile到底执行了哪些操作。
makefile是一种回溯性的语言,就是从执行的命令开始一步步从文件中开始解析。为了与makefile文件保持一致。还是从头开始一步步分析。
#检测是否存在.git文件,不存在则报错 ifeq ($(wildcard .git),) $(error YOU HAVE TO USE GIT TO DOWNLOAD THIS REPOSITORY. ABORTING.) endif
#以 make px4fmu-v2_default为例,则MAKECMDGOALS为px4fmu-v2_default, #则 FIRST_ARG为px4fmu-v2_default #ARGS 为空 #j为4 FIRST_ARG := $(firstword $(MAKECMDGOALS)) ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) j ?= 4
#这句话是一系列对编译时候的参数进行设置。设置参数如下: #NINJA_BUILD 为 ninja版本号 #PX4_CMAKE_GENERATOR 为 Ninja #PX4_MAKE 为 ninja #PX4_MAKE_ARGS 为 空 NINJA_BIN := ninja ifndef NO_NINJA_BUILD NINJA_BUILD := $(shell $(NINJA_BIN) --version 2>/dev/null) ifndef NINJA_BUILD NINJA_BIN := ninja-build NINJA_BUILD := $(shell $(NINJA_BIN) --version 2>/dev/null) endif endif ifdef NINJA_BUILD PX4_CMAKE_GENERATOR := Ninja PX4_MAKE := $(NINJA_BIN) ifdef VERBOSE PX4_MAKE_ARGS := -v else PX4_MAKE_ARGS := endif else ifdef SYSTEMROOT # Windows PX4_CMAKE_GENERATOR := "MSYS\ Makefiles" else PX4_CMAKE_GENERATOR := "Unix\ Makefiles" endif PX4_MAKE = $(MAKE) PX4_MAKE_ARGS = -j$(j) --no-print-directory endif
#执行shell命令,则SRC_DIR 为 ./src/Firmware SRC_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
这个定义是make时最关键的部分,每次make都是对 cmake-build的展开和运行。后边会结合具体进行分析。 define cmake-build +@$(eval BUILD_DIR = $(SRC_DIR)/build/$@$(BUILD_DIR_SUFFIX)) +@if [ $(PX4_CMAKE_GENERATOR) = "Ninja" ] && [ -e $(BUILD_DIR)/Makefile ]; then rm -rf $(BUILD_DIR); fi #执行cmake +@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 #执行make +@(cd $(BUILD_DIR) && $(PX4_MAKE) $(PX4_MAKE_ARGS) $(ARGS)) endef
# basename 是取出.之前的部分,即文件名。 #这句话的意思是取出 src\Firmware\cmake\configs中以.cmake为后缀的文件名,保存到ALL_CONFIG_TARGETS。 # Get a list of all config targets cmake/configs/*.cmake ALL_CONFIG_TARGETS := $(basename $(shell find "$(SRC_DIR)/cmake/configs" -maxdepth 1 ! -name '*_common*' ! -name '*_sdflight_*' -name '*.cmake' -print | sed -e 's:^.*/::' | sort)) #这句话的意思把 ALL_CONFIG_TARGETS 中以 nuttx_ 开头的字符都去掉。以nuttx_px4fmu-v2_default.cmake为例,变成px4fmu-v2_default # Strip off leading nuttx_ NUTTX_CONFIG_TARGETS := $(patsubst nuttx_%,%,$(filter nuttx_%,$(ALL_CONFIG_TARGETS)))
每次make的时候实质第一步指向的是这个部分,然后一步步展开解析
# 实际运行时指向该位置。 # 在前面提到 NUTTX_CONFIG_TARGETS 中包含一系列的编译目标,px4fmu-v2_default只是其中的一部分 # 这部分就开始调用 cmake 进行编译。以 make px4fmu-v2_default为例,则这句话调用咱们上面提到的部分,具体指令: # call cmake-build nuttx_px4fmu-v2_default ./src/Firmware # BUILD_DIR = ./src/Firmware/build/px4fmu-v2_default # 第一次编译的话,因为不存在 $(BUILD_DIR)/Makefile,则这句话不执行。后边编译的话, # 会删除 ./src/Firmware/build/px4fmu-v2_default 整个文件 # 下面一句if,判断 $(BUILD_DIR)/CMakeCache.txt不存在,则开始执行 cmake,具体指令为 # # mkdir -p ./src/Firmware/build/px4fmu-v2_default # cd ./src/Firmware/build/px4fmu-v2_default # cmake ./src/Firmware -G"Ninja" -DCONFIG=nuttx_px4fmu-v2_default # cd /src/Firmware/build && Ninja $(NUTTX_CONFIG_TARGETS): $(call cmake-build,nuttx_$@,$(SRC_DIR))
这部分没想明白的是如何调用到make px4io-v2_defalut。这个还没分析到
相关文章推荐
- 第二章 PX4-RCS启动文件解析
- 裸机开发-Makefile文件的解析
- Makefile完全解析PART9.隐含规则
- Linux下makefile和kconfig简单解析
- 解析Makefile --- 简单的Makefile示例
- Makefile文件解析
- Makefile的通用模板解析
- Linux顶层目录下的Makefile作用解析
- 第三章 PX4-SPI底层驱动解析
- [编译]Makefile兼APUE解析(UNP12)
- Makefile完全解析PART10.使用make更新函数库文件
- vivi的Makefile文件解析
- 一个makefile解析
- 使用autotools建立Makefile简单实例解析
- Linux内核makefile解析
- 解析Linux的MakeFile
- makefile 之伪目标解析
- Makefile解析(最简单的LED)
- Makefile全解析
- ucore中Makefile 内核文件组织全解析,学习软件的组织方式