MacPorts distfiles 机制替代 Git 子模块
虽然最理想的情况是所有依赖的项目都分别打包到不同的 port,但不同包对同一个依赖项目可能有不兼容的要求。OpenSSL、Boost 这种基础包可以通过拆包来解决兼容问题,例如 Boost 在 MacPorts 就打包了 boost169
、boost171
、boost173
等等很多个版本,但这也要求所有这些子包的使用方都要对编译 flags 进行修改,才能让编译器找到正确版本的依赖,导致整个过程非常复杂,维护也非常耗费时间。
一般使用方不多的库不会有分版本的 subport,为了提供一个小众软件要求的版本实现多版本并存有点得不偿失。此时如果项目的构建系统本来就把依赖 vendor 到 Git 子模块里,我们就可以通过 distfiles 的手段把依赖库的源代码拉下来放到子模块的文件夹里。通过 master_sites
、distfiles-append
、github 1.0
等关键字进行组合搜索可以找到 macports-ports 中可以参考的方案,最终效果如下。
PortGroup github 1.0
PortGroup meson 1.0
github.setup joshkunz ashuffle 3.13.3 v
github.tarball_from archive
master_sites ${github.master_sites}:ashuffle
distfiles ${distname}${extract.suffix}:ashuffle
...
# BEGIN abseil (requires C++17 build)
set abseil_project abseil-cpp
set abseil_version 20211102.0
master_sites-append https://github.com/abseil/${abseil_project}/archive/${abseil_version}:abseil
distfiles-append ${abseil_project}-${abseil_version}${extract.suffix}:abseil
checksums-append ${abseil_project}-${abseil_version}${extract.suffix} \
rmd160 bca4a16eaab1602cdc7ace8dd1ff82467b71b59e \
sha256 dcf71b9cba8dc0ca9940c4b316a0c796be8fab42b070bb6b7cab62b48f0e66c4 \
size 1884080
post-extract {
foreach submodule [list subprojects/absl:${abseil_project}] {
set submodule_target [lindex [split ${submodule} :] 0]
set submodule_package [lindex [split ${submodule} :] 1]
delete ${worksrcpath}/${submodule_target}
move {*}[glob ${workpath}/${submodule_package}-*] ${worksrcpath}/${submodule_target}
}
}
# END abseil