本文是从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
为了让大家免受其苦,笔者分享当初下载的方法。再次提醒,这个方法虽然有效,但是很麻烦,有加速通道的同学可跳过本文。
注:
其实方法说来简单,从github下载源码慢且容易失败,那就使用国内的git网站建立镜像仓库,比如码云。它从github下载的速度会快一些,最关键的是,就算慢,也不容易失败。
首先,创建ardupilot的镜像仓库。在码云新建仓库,仓库的名称和路径可不填。
直接选择最底下的导入已有仓库,贴入ardupilot地址。
此时会自动填充仓库的名称和路径,点击创建即可。等其导入完毕,从仓库主页中获取地址。
git clone [email protected]: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 [email protected]:dbw-ardupilot/PX4Firmware.git
命令参数详解:
将子模块,子模块的子模块,子模块的子模块的子模块。。。全部搞下来:
git config --global submodule.DbConnector.url PRIVATE_URL
git config --global submodule.modules/PX4Firmware.url [email protected]:dbw-ardupilot/PX4Firmware.git
git config --global submodule.modules/PX4NuttX.url [email protected]:dbw-ardupilot/PX4NuttX.git
git config --global submodule.modules/uavcan.url [email protected]:dbw-ardupilot/uavcan.git
git config --global submodule.modules/waf.url [email protected]:dbw-ardupilot/waf.git
git config --global submodule.modules/gbenchmark.url [email protected]:dbw-ardupilot/benchmark.git
git config --global submodule.modules/mavlink.url [email protected]:dbw-ardupilot/mavlink.git
git config --global submodule.gtest.url [email protected]:dbw-ardupilot/googletest.git
git config --global submodule.modules/ChibiOS.url [email protected]:dbw-ardupilot/ChibiOS.git
git config --global submodule.dsdl.url [email protected]:dbw-ardupilot/dsdl.git
git config --global submodule.libuavcan/dsdl_compiler/pyuavcan.url [email protected]:dbw-ardupilot/pyuavcan.git
git config --global submodule.mavlink/include/mavlink/v1.0.url [email protected]:dbw-ardupilot/c_library.git
git config --global submodule.src/modules/uavcan/libuavcan.url [email protected]:dbw-ardupilot/libuavcan.git
git config --global submodule.Tools/genmsg.url [email protected]:dbw-ardupilot/genmsg.git
git config --global submodule.Tools/gencpp.url [email protected]:dbw-ardupilot/gencpp.git
git config --global submodule.src/lib/matrix.url [email protected]:dbw-ardupilot/Matrix.git
git config --global submodule.src/lib/DriverFramework.url [email protected]:dbw-ardupilot/DriverFramework.git
git config --global submodule.src/lib/ecl.url [email protected]:dbw-ardupilot/ecl.git
git config --global submodule.pymavlink.url [email protected]:dbw-ardupilot/pymavlink.git
git config --global submodule.cmake_hexagon.url [email protected]:dbw-ardupilot/cmake_hexagon.git
git config --global submodule.test/dspal_tester/cmake_hexagon.url [email protected]:dbw-ardupilot/cmake_hexagon.git
git config --global submodule.dspal.url [email protected]:dbw-ardupilot/dspal.git
git config --global submodule.matrix.url [email protected]:dbw-ardupilot/Matrix.git
现在可以同步子模块了
git submodule update --init --recursive
在前面的标准步骤中提到此脚本,它是官方为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再去执行。执行完,别忘记再切回来。
接下来的操作与之前无异,总结下操作:
笔者在上面贴出了自己的镜像仓库,大家想编译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 [email protected]: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=[email protected]: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=[email protected]:dbw-ardupilot/cmake_hexagon.git