px4 makefile解析

2023-05-16

关于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。这个还没分析到

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

px4 makefile解析 的相关文章

  • 从 Makefile 中的 C++FLAGS 中删除一个标志?

    我有一个 Makefile 其中包含另一个设置了很多默认值的 makefile 我无法编辑包含的 makefile 并且我想更改 makefile 中 C FLAGS 的值 即使它是在包含的 makefile 中设置的 具体来说 每当 de
  • 如何调用位于其他目录的Makefile?

    我正在尝试这样做 我想打电话给 make Makefile存在于其他目录中 abc可以使用位于不同目录中的 shell 脚本的路径 我该怎么做呢 由于 shell 脚本不允许我cd进入Makefile目录并执行make 我怎样才能编写she
  • MinGW Make 抛出“系统找不到指定的路径。”错误

    我正在尝试在 Windows 7 上使用 cmake 生成一个 c 项目 在实际创建项目之前 cmake 会对您的工具链进行快速测试 我正在使用 MinGW 这就是我的问题所在 Cmake 触发 make 构建 最终失败并返回 系统找不到指
  • 如何制作一个makefile只用于编译一些java文件?

    我有三个java文件 名为A java B java C java A将创建对象B B将创建对象C 但我以前从未构建过makefile 有谁可以帮我构建一个 makefile 来编译这三个 java 文件吗 我应该使用什么工具来制作 mak
  • GNU make 的回溯

    有没有办法让 GNU make 打印导致命令失败时执行的目标的 回溯 我经常处理严重混淆的 makefile 同时解决在新系统上构建软件的可移植性问题 这对于 make 来说似乎是一件非常简单的事情 这将极大地帮助调试 但我找不到任何方法来
  • 使用 .INTERMEDIATE 在 makefile 中进行不可靠的并行构建?

    我有一个可以生成多个输出文件的工具 众所周知 在 make 中很难建模 我正在使用食谱GNU Makefile 规则从单个源文件生成一些目标 https stackoverflow com questions 2973445 gnu mak
  • 安装 libjpeg v8 到 /opt/local

    如何在 OSX 上将 libjpeg 8 安装到 opt local 我问的原因是我想用以下方法制作大脑活动的小电影MNE C 库 http www nmr mgh harvard edu martinos userInfo data MN
  • 与 GNU Make 等 Python 相关的并行任务并发

    我正在寻找一种方法或者可能是一种哲学方法来如何在 python 中执行类似 GNU Make 的操作 目前 我们使用 makefile 来执行处理 因为 makefile 非常擅长通过更改单个选项 j x 进行并行运行 此外 gnu mak
  • 配置:错误:无法运行C编译的程序

    我正在尝试使用 Debian Wheezy 操作系统在我的 Raspberry Pi 上安装不同的软件 当我运行尝试配置软件时 我尝试安装我得到此输出 checking for C compiler default output file
  • 如何在 Makefile 中定义全局 shell 函数?

    我想定义一个shell函数 bin sh test do some complicated tests 1 2 if something then build thisway 1 2 else build otherway 1 2 fi 这
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 使用 MS NMAKE 打印长编译行

    我有一个遗留的 MS NMAKE Makefile 我需要修复其中的一些错误 我希望调试一些非常长的命令行 这些命令行正在使用 NMAKE 技巧执行 内联文件 http msdn microsoft com en us library se
  • 将 libpng 链接到 android 原生项目

    我在尝试在本机 Android 项目中加载 libpng 时遇到问题 编译器似乎无法识别 libpng 函数 但可以识别类型 如 png byte 它可以正常编译类型 但如果我添加函数 则会抛出错误 这是编译输出 Windows 7 cmd
  • 链接器失败:存档中的成员不是对象

    我正在尝试在 Windows 7 上使用 64 位 mingw 构建 Open CASCADE 6 7 1 库 我正在使用x86 64 4 9 1 release posix seh rt v3 rev1 from mingw w64 项目
  • make:仅针对单个目标禁用子目录中的并行构建

    我有一个相当庞大的由自动工具驱动的项目 它位于一个目录树中 该目录树由许多带有子目录的目录组成 它有一个目标check 在每个子目录以及主目录中 执行大量自动化测试 这check目标是递归构建的 并行构建和测试 通过 j选项 make 适用
  • 从 makefile 内部传递命令行参数

    我有一个 makefile 我试图从中调用一个可执行文件 该可执行文件需要 5 个参数 我如何从 makefile 传递这些参数 这样做不起作用 run exe arg1 somevalue arg2 somevalue arg3 some
  • 生成带有完整路径的 gcc 依赖项

    我有一个简单的项目 看起来像这样 build file1 o one file1 o file2 o depend Makefile src file1 cpp one file1 cpp file2 cpp Makefile 是这样的 G
  • 如何让 Makefile 目标被多次调用?

    在下面的简单示例中 我想做一个make dist并拥有distclean之前执行的目标distdebug and distrelease PHONY distclean dist distdebug distrelease echo in
  • Windows 上使用 g++ 的 Makefile,链接库

    我已经厌倦了 MSVC 6 以及每个人总是告诉我它是一个蹩脚的编译器等等 所以现在我决定尝试使用 vim 加 g 和 makefile 这是我的问题 我有以下 makefile This is supposed to be a commen
  • 为什么不触发 .PHONY 隐式模式规则?

    我有以下递归生成文件 PHONY all clean subdir MAKE C src MAKE C dict all all subdir clean clean subdir 它工作正常 make all make C src all

随机推荐

  • 学校人力资源管理系统可行性分析

    学校人力资源管理系统可行性分析 一 技术可行性 硬件实施的可行性 xff0c 学校电脑配置相对较高 xff0c 可满足信息系统运行的需要 xff1b 学校可以采用常用的数据库应用程序开发工具实现学校内部的业务管理是完全可行的 xff0c 不
  • Jetson TX2 刷机教程(JetPack4.2版本)

    自从NVIDIA出现JetPack4 2 Ubuntu18 04 版本之后 xff0c 安装方式和之前就大不相同 xff0c 看了前面的几个安装版本之后 xff0c 感觉新版的好像安装起来更加简洁了 xff0c 只需要一个SDK就可以 xf
  • FactSystem设计思路

    Fact System 模块设计思路与学习总结 组成结构 FactSystem xff08 事件系统 参数系统 xff09 FactControls xff08 事件控制 xff09 FactPanelController xff08 事件
  • GPS设计思路

    GPS模块设计思路与学习总结 1 组成结构 Drivers src xff08 驱动程序资源包 xff09 gps helper xff08 GPS助手 xff09 ubx xff08 UBX协议 xff09 RTCM RTCMMavlin
  • ipv4和ipv6的区别

    ipv4 和ipv6 的区别本质在于它们的二进制表示位数 xff0c ipv4是用32位0 1序列来表示的 xff0c 而ipv6使用128位0 1序列来表示的 ipv4用32位 xff0c 为了方便人类记录和阅读 xff0c 我们通常将i
  • PHP字符串函数strrev(反转字符串)

    在PHP中 xff0c 字符串函数 strrev 用来反转字符串 函数语法 xff1a strrev string string string 函数参数说明 xff1a 参数描述string必需 规定要反转的字符串 strrev 用来反转字
  • STL(标准模板库)中class并不一定是“类”

    在模板库里面 xff0c 可谓 处处 皆模板 xff0c 当然了不是模板就不叫模板库了 xff0c 但是有一点经常让人忽视 xff0c 使用模板时候 xff0c 类就真的时候类 xff1f 也就是说class就真的是类 xff1f 答案是否
  • VS2008 和 MatlabR2015a 混合编程

    唉 xff0c 在做支持向量机分类优化实验的时候 xff0c 支持向量机的c 代码写的头疼 有些核函数和分类训练函数不会写 xff0c 搞得头疼 后来听同学介绍说matlab里面有包直接可以用 xff0c 我又去载了一个R2015a最新的m
  • 学习总结:C++中STL的数据结构

    1 STL介绍 STL xff08 Standard Template Library xff09 xff0c 即标准模板库 xff0c 是一个具有工业强度的 xff0c 高效的C 43 43 程序库 它被容纳于C 43 43 标准程序库
  • 基于深度学习的移动网络异常检测

    1 文章信息 文章题为 Detection of mobile network abnormality using deep learning models on massive network measurement data xff0c
  • Multilinear Relationship Networks:多任务学习框架

    1 文章信息 文章题为 Learning Multiple Tasks with Multilinear Relationship Networks xff0c 该文章于2017年发表至Advances in neural informat
  • 学校人力资源管理系统——需求分析(一)

    需求分析 一 系统功能 1 通过表的创建过程进行数据的关联和约束 2 插入 修改 删除功能 3 查询功能 二 系统概要设计 本系统共有6个实体 xff0c 分别是教职工 xff0c 部门 xff0c 职称 xff0c 职务 xff0c 学籍
  • vsode 编译报错:main.c:4:10: fatal error: iostream: 没有那个文件或目录

    文档声明 xff1a 以下资料均属于本人在学习过程中产出的学习笔记 xff0c 如果错误或者遗漏之处 xff0c 请多多指正 并且该文档在后期会随着学习的深入不断补充完善 感谢各位的参考查看 笔记资料仅供学习交流使用 xff0c 转载请标明
  • JSON未定义解决办法

    https blog csdn net wanglei9876 article details 41752863 ie6 ie7下JSON parse JSON未定义的解决方法 解决方法一 xff1a var jsons 61 req re
  • datax抽取mongoDB只需要访问隐藏节点源码修改

    背景 由于在mongoDB的业务库数据量较大 且使用方比较多 搜索 业务方和数仓 使得主节点和其他从节点压力很大 为了不影响正常的业务 DBA新增了一台隐藏节点作为搜索和数仓抽取数据用 用datax抽取mongo的数据默认是主节点优先 所以
  • 禁忌搜索算法(Tabu Search)

    一 局部领域搜索 又称 爬山启发式算法 xff0c 从当前的节点开始 xff0c 和周围的邻居节点的值进行比较 如果当前节点是最大的 xff0c 那么返回当前节点 xff0c 作为最大值 即 山峰最高点 xff1b 反之就用最高的邻居节点替
  • Linux基础认识与简单命令的带图示范

    一 Linux的基础认识 Linux全称GUN Linux 是林纳斯 本纳第克特 托瓦兹于1991年10月5日首发 通常公司的服务器都用它是因为GUN是开源组织 xff0c 大家很多都一致Linux是操作系统 xff0c 其实Linux指的
  • MPU6050-扫盲

    文章部分内容转载于 https blog csdn net zmjames2000 article details 88379640 管脚名称说明VCC3 3 5V xff08 内部有稳压芯片 xff09 GND地线SCLMPU6050作为
  • OpenStack 虚拟机修改mac 地址

    查看虚拟机id root 64 controller01 source admin openrc 查看 ip 地址的port id root 64 controller01 neutron port list grep 190 b6c8eb
  • px4 makefile解析

    关于px4的编译的流程 xff0c 首先运行makefile xff0c 执行cmake xff0c 执行完之后再执行make命令 xff0c 完成整个编译流程 编译px4 v2的版本 xff0c 需要执行命令 xff1a make px4