关于px4的编译的流程,首先运行makefile,执行cmake,执行完之后再执行make命令,完成整个编译流程。
编译px4-v2的版本,需要执行命令:
make px4fmu-v2_default
针对这句话,Makefile到底执行了哪些操作。
makefile是一种回溯性的语言,就是从执行的命令开始一步步从文件中开始解析。为了与makefile文件保持一致。还是从头开始一步步分析。
ifeq ($(wildcard .git),)
$(error YOU HAVE TO USE GIT TO DOWNLOAD THIS REPOSITORY. ABORTING.)
endif
FIRST_ARG := $(firstword $(MAKECMDGOALS))
ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
j ?= 4
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
PX4_CMAKE_GENERATOR := "MSYS\ Makefiles"
else
PX4_CMAKE_GENERATOR := "Unix\ Makefiles"
endif
PX4_MAKE = $(MAKE)
PX4_MAKE_ARGS = -j$(j) --no-print-directory
endif
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
+@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
+@(cd $(BUILD_DIR) && $(PX4_MAKE) $(PX4_MAKE_ARGS) $(ARGS))
endef
ALL_CONFIG_TARGETS := $(basename $(shell find "$(SRC_DIR)/cmake/configs" -maxdepth 1 ! -name '*_common*' ! -name '*_sdflight_*' -name '*.cmake' -print | sed -e 's:^.*/::' | sort))
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。这个还没分析到
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)