您的位置:首页 > 其它

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 Makefile