本文是从Ardupilot移植经验分享(1)中拆分出来,因为原文的篇幅太长了。本文中有时会提到“前面的步骤”、“之前”,这指的都是前一篇文章。
在国内访问github的速度是受到限制的,下载大型工程时,容易失败。有加速通道的同学,就不必看了。
ardupilot是一个大型且复杂的工程,这使下载问题更加严重。为什么这么说呢,因为ardupilot除了其自身源码之外,还依赖很多子模块。
以3.5.7版本为列,先通过ardupilot源码根目录下的.gitmodules文件,查看其直接依赖的子模块。
$ cat .gitmodules
[submodule "modules/PX4Firmware"]
path = modules/PX4Firmware
url = git://github.com/ArduPilot/PX4Firmware.git
[submodule "modules/PX4NuttX"]
path = modules/PX4NuttX
url = git://github.com/ArduPilot/PX4NuttX.git
[submodule "modules/uavcan"]
path = modules/uavcan
url = git://github.com/ArduPilot/uavcan.git
[submodule "modules/waf"]
path = modules/waf
url = git://github.com/ArduPilot/waf.git
[submodule "modules/gbenchmark"]
path = modules/gbenchmark
url = git://github.com/google/benchmark.git
[submodule "modules/mavlink"]
path = modules/mavlink
url = git://github.com/ArduPilot/mavlink
[submodule "gtest"]
path = modules/gtest
url = git://github.com/ArduPilot/googletest
看似不多,然而子模块也可能依赖一批模块,即孙子模块。比如PX4Firmware依赖的子模块:
$ cat modules/PX4Firmware/.gitmodules
[submodule "mavlink/include/mavlink/v1.0"]
path = mavlink/include/mavlink/v1.0
url = git://github.com/mavlink/c_library.git
[submodule "src/modules/uavcan/libuavcan"]
path = src/modules/uavcan/libuavcan
url = git://github.com/UAVCAN/libuavcan.git
[submodule "Tools/genmsg"]
path = Tools/genmsg
url = https://github.com/ros/genmsg.git
[submodule "Tools/gencpp"]
path = Tools/gencpp
url = https://github.com/ros/gencpp.git
[submodule "src/lib/matrix"]
path = src/lib/matrix
url = https://github.com/PX4/Matrix.git
[submodule "src/lib/DriverFramework"]
path = src/lib/DriverFramework
url = https://github.com/PX4/DriverFramework.git
[submodule "src/lib/ecl"]
path = src/lib/ecl
url = https://github.com/PX4/ecl.git
这还没完,这些子模块还有依赖的模块,最多的套了4层,就不一一列举了。如果说每个工程下载成功的概率是90%,那20个工程(模块)一起成功的概率是12%。并且,当某个工程失败时,短时间内下载往往还是失败。
0.
9
20
=
0.12
0.9^{20}=0.12
0.920=0.12
为了让大家免受其苦,笔者分享当初下载的方法。再次提醒,这个方法虽然有效,但是很麻烦,有加速通道的同学可跳过本文。
注:
- 笔者以3.5.7版本为例进行讲解,如果你想跟着笔者体验下操作,可使用下面提到的镜像仓库。若是想下载官方最新源码,请根据下面叙述的方法自行制作镜像。因为笔者制作的镜像是2年前的,后续并没有更新。
- 下面介绍的码云和github操作类似,这里只讲关键步骤。笔者下载时用的都是git协议而非https,需要配置ssh-key。这些都是git基础操作,不了解的自行搜索哈。
其实方法说来简单,从github下载源码慢且容易失败,那就使用国内的git网站建立镜像仓库,比如码云。它从github下载的速度会快一些,最关键的是,就算慢,也不容易失败。
下载ardupilot
首先,创建ardupilot的镜像仓库。在码云新建仓库,仓库的名称和路径可不填。
直接选择最底下的导入已有仓库,贴入ardupilot地址。
此时会自动填充仓库的名称和路径,点击创建即可。等其导入完毕,从仓库主页中获取地址。
git clone git@gitee.com:dbw-ardupilot/ardupilot.git
看看,这速度是不是要起飞了。
不要高兴的太早,这才刚刚开始,仅仅是下载了ardupilot自己的工程。还记得那20多个子模块吗,都得自己建立镜像。
创建子模块的镜像仓库
如果你要编译的不是master,则需要切换到目标分支。
git checkout -b Copter-3.5-test Copter-3.5.7
git工程跟踪子模块,是通过其根目录下的.gitmodules文件实现,之前贴出了ardupilot和PX4Firmware的.gitmodules,里面有很多submodule,每一个代表一个子模块,比如ardupilot跟踪了PX4Firmware。
[submodule "modules/PX4Firmware"]
path = modules/PX4Firmware
url = git://github.com/ArduPilot/PX4Firmware.git
path是一个相对路径,指明下载后存放的位置。url记录了子模块的git地址。使用之前的方法制作镜像仓库。
怎样让ardupilot工程下载我们的镜像而不是官方仓库呢?修改.gitmodules是下下之策,因为当你切换到别的分支时,.gitmodules又变为之前的内容。笔者推荐git config来添加配置项:
git config --global submodule.modules/PX4Firmware.url git@gitee.com:dbw-ardupilot/PX4Firmware.git
命令参数详解:
- –global指明添加的是全局配置。与全局相对的是本地配置,就是记录在仓库里面的配置,在别的仓库就失效了。
- 配置的名称是submodule.modules/PX4Firmware.url,格式为submodule. n a m e name name.url,这个 n a m e name name是[submodule “modules/PX4Firmware”]中双引号中的内容。
- 配置的值为git地址。
将子模块,子模块的子模块,子模块的子模块的子模块。。。全部搞下来:
git config --global submodule.DbConnector.url PRIVATE_URL
git config --global submodule.modules/PX4Firmware.url git@gitee.com:dbw-ardupilot/PX4Firmware.git
git config --global submodule.modules/PX4NuttX.url git@gitee.com:dbw-ardupilot/PX4NuttX.git
git config --global submodule.modules/uavcan.url git@gitee.com:dbw-ardupilot/uavcan.git
git config --global submodule.modules/waf.url git@gitee.com:dbw-ardupilot/waf.git
git config --global submodule.modules/gbenchmark.url git@gitee.com:dbw-ardupilot/benchmark.git
git config --global submodule.modules/mavlink.url git@gitee.com:dbw-ardupilot/mavlink.git
git config --global submodule.gtest.url git@gitee.com:dbw-ardupilot/googletest.git
git config --global submodule.modules/ChibiOS.url git@gitee.com:dbw-ardupilot/ChibiOS.git
git config --global submodule.dsdl.url git@gitee.com:dbw-ardupilot/dsdl.git
git config --global submodule.libuavcan/dsdl_compiler/pyuavcan.url git@gitee.com:dbw-ardupilot/pyuavcan.git
git config --global submodule.mavlink/include/mavlink/v1.0.url git@gitee.com:dbw-ardupilot/c_library.git
git config --global submodule.src/modules/uavcan/libuavcan.url git@gitee.com:dbw-ardupilot/libuavcan.git
git config --global submodule.Tools/genmsg.url git@gitee.com:dbw-ardupilot/genmsg.git
git config --global submodule.Tools/gencpp.url git@gitee.com:dbw-ardupilot/gencpp.git
git config --global submodule.src/lib/matrix.url git@gitee.com:dbw-ardupilot/Matrix.git
git config --global submodule.src/lib/DriverFramework.url git@gitee.com:dbw-ardupilot/DriverFramework.git
git config --global submodule.src/lib/ecl.url git@gitee.com:dbw-ardupilot/ecl.git
git config --global submodule.pymavlink.url git@gitee.com:dbw-ardupilot/pymavlink.git
git config --global submodule.cmake_hexagon.url git@gitee.com:dbw-ardupilot/cmake_hexagon.git
git config --global submodule.test/dspal_tester/cmake_hexagon.url git@gitee.com:dbw-ardupilot/cmake_hexagon.git
git config --global submodule.dspal.url git@gitee.com:dbw-ardupilot/dspal.git
git config --global submodule.matrix.url git@gitee.com:dbw-ardupilot/Matrix.git
现在可以同步子模块了
git submodule update --init --recursive
install-prereqs-ubuntu.sh
在前面的标准步骤中提到此脚本,它是官方为Debian/Ubuntu系统提供的一键安装编译调试环境的脚本,会下载一些python库和编译器。从官方的源下载会比较慢,比如下载编译器预计6个小时。。。
所以,我们要手工加个速。在执行install-prereqs-ubuntu.sh前,做两件事情。
修改pip源,即~/.pip/pip.conf,若文件不存在,则创建一个
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
下载编译器,详见“编译老版本“一节。
最后,别忘了install-prereqs-ubuntu.sh在3.5.7是不存在的,得切换回master再去执行。执行完,别忘记再切回来。
加速方法小结
接下来的操作与之前无异,总结下操作:
- 创建ardupilot镜像仓库,下载到本地。
- 切换到目标分支(如果需要的话),创建子模块镜像仓库,添加全局配置。
- git submodule update --init --recursive
- 修改pip源,下载编译器。
- 在master分支上运行安装脚本install-prereqs-ubuntu.sh
- 编译
遗漏了一些子模块
笔者在上面贴出了自己的镜像仓库,大家想编译3.5.7版本代码是没问题的。不过笔者并不推荐最终在3.5.7上开发,大家掌握了方法后,最好是在最新代码上进行移植。新的代码功能更多,性能更好。这也就意味着要自己去创建镜像仓库。在创建众多子模块的镜像仓库时,如果漏了几个,最终下载失败,补创镜像站后,有一个额外的操作。
比如下载时报错了:
fatal: clone of 'https://github.com/ATLFlight/cmake_hexagon.git' into submodule path '/mnt/g/ardupilot/src/ardupilot/modules/PX4Firmware/src/lib/DriverFramework/cmake/cmake_hexagon' failed
发现是DriverFramework所依赖的cmake_hexagon被遗漏了。
创建镜像并添加配置:
git config --global submodule.cmake_hexagon.url git@gitee.com:dbw-ardupilot/cmake_hexagon.git
若此时再次尝试下载,可能还是会失败。
git submodule update --init --recursive
进入到DriverFramework目录查看相关配置会发现,居然有两条配置,一条指向github,一条指向自己的镜像。
$ cd modules/PX4Firmware/src/lib/DriverFramework
$ git config --list | grep submodule.cmake_hexagon.url
submodule.cmake_hexagon.url=git@gitee.com:dbw-ardupilot/cmake_hexagon.git
submodule.cmake_hexagon.url=https://github.com/ATLFlight/cmake_hexagon.git
这是因为,在上次下载时,还没添加全局配置。git使用.gitmodules文件中的内容创建了局部配置,就如C语言一样,局部配置优先级更高。需要删除局部配置。保持在DriverFramework目录中:
$ git config --unset submodule.cmake_hexagon.url
再次检查,发现只有全局配置了。
$ git config --list | grep submodule.cmake_hexagon.url
submodule.cmake_hexagon.url=git@gitee.com:dbw-ardupilot/cmake_hexagon.git