PX4开源工程开发/发布版本一致性核对
1. 源由
研发过程中,通常可以分为两类固件:
- 工程师版本(Debug)
- 产品/项目版本(Release)
如何确认工程师版本和产品/项目版本的一致性问题,对于发布版本管理来说至关重要。
若稍有不慎,将会带来灾难!
2. 编译步骤
2.1 安装 Python 虚拟环境工具
$ sudo apt install python3-venv
注:如果没有安装过虚拟环境。
2.2 初始化PX4-Autopilot编译环境
$ git clone git@github.com:PX4/PX4-Autopilot.git
$ cd PX4-Autopilot
$ ./Tools/setup/ubuntu.sh
2.3 创建并激活虚拟环境
$ python3 -m venv ~/px4-python-env
$ source ~/px4-python-env/bin/activate
注:例如在 home 目录下安装了虚拟环境。
2.4 后续使用 PX4 工具时,需要先激活虚拟环境
$ source ~/px4-python-env/bin/activate
$ cd PX4-Autopilot
$ git submodule update --init --recursive
2.5 编译代码
2.5.1 仿真环境
$ make px4_sitl gz_x500
2.5.2 mRo Pixracer
$ make px4_fmu-v4_default
2.5.3 mRo Pixhawk Flight Controller (Pixhawk 1)
$ make px4_fmu-v3_default
2.6 退出虚拟环境
$ deactivate
4. 构建目标
从PX4开源工程结构简明介绍角度看,真实构建的目的是获取:
$ ls build/holybro_kakutef7_default/holybro_kakutef7_default.* -lhs
852K -rwxrwxr-x 1 daniel daniel 852K Jul 1 06:48 build/holybro_kakutef7_default/holybro_kakutef7_default.bin
19M -rwxrwxr-x 1 daniel daniel 19M Jul 1 06:48 build/holybro_kakutef7_default/holybro_kakutef7_default.elf
3.9M -rw-rw-r-- 1 daniel daniel 3.9M Jul 1 06:48 build/holybro_kakutef7_default/holybro_kakutef7_default.map
788K -rw-rw-r-- 1 daniel daniel 787K Jul 1 06:48 build/holybro_kakutef7_default/holybro_kakutef7_default.px4
打包内容以上四个文件将会是一个不错的选择,方便后续调试定位。
3. 问题分析
实际在gcc
编译过程中,会引入一些时间、编译用户等一些环境信息,这些信息会导致编译出来的二进制MD5SUm值不一致。
从而导致研发和版本发布之间造成不小的一致性问题。
3.1 方法一
采用以下步骤,从另一个维护来保证一致性:
$ make distclean
$ rm -rf build
$ export SOURCE_DATE_EPOCH=1700000000
$ make px4_fmu-v3_default
从实际测试的结果看,本地编译,不同时间点,编译结果一致。
daniel@daniel-P15v:~/Work/PX4-Autopilot$ strings build/px4_fmu-v3_default/px4_fmu-v3_default.bin | grep daniel
/home/daniel/Work/PX4-Autopilot/src/drivers/px4io/px4io_uploader.cpp
/home/daniel/Work/PX4-Autopilot/src/systemcmds/hardfault_log/hardfault_log.c
/home/daniel/Work/PX4-Autopilot/platforms/nuttx/src/px4/stm/stm32_common/adc/adc.cpp
/home/daniel/Work/PX4-Autopilot/src/drivers/uavcan/uavcan_drivers/stm32/driver/src/uc_stm32_can.cpp
/home/daniel/Work/PX4-Autopilot/platforms/nuttx/src/px4/stm/stm32_common/spi/spi.cpp
但仍然存在其他环境变量,比如:用户名
3.2 方法二
在方法一的基础上,采用机器指令对比分析:
$ make distclean
$ rm -rf build
$ export SOURCE_DATE_EPOCH=1700000000
$ make px4_fmu-v3_default
$ arm-none-eabi-objdump -d build/px4_fmu-v3_default/px4_fmu-v3_default.elf > px4_fmu-v3_default.asm
daniel@daniel-P15v:~/Work/PX4-Autopilot$ strings px4_fmu-v3_default.asm |grep daniel
8191c08: 6e61642f 2f6c6569 6b726f57 3458502f /daniel/Work/PX4
81add14: 696e6164 572f6c65 2f6b726f 2d345850 daniel/Work/PX4-
81dcc88: 696e6164 572f6c65 2f6b726f 2d345850 daniel/Work/PX4-
81f18f8: 0801d3c3 6d6f682f 61642f65 6c65696e ..../home/daniel
从上面可以看到一些与文件路径相关的内容,可能是__FILE__
或者环境变量引入的内容。
3.3 方法三
在方法一或二的基础上,再增加同样的编译路径,确保输出编译结果的一致性。
4. 总结
总体来说,通过以下三点,基本上能够使用传统的md5sum进行对比。
- 固定编译时间点
export SOURCE_DATE_EPOCH=1700000000
- 固定编译相对路径
5. 参考资料
【1】PX4开源软件框架简明简介
【2】PX4开源工程结构简明介绍
【3】PX4开发环境搭建–模拟器编译及QGroundControl & RC遥控模拟配置