群晖交叉编译记录(编译subversion)
前言
由于群晖套件商店里的svn为1.9.7版本,不支持权限设置时路径使用通配符。查阅资料发现自1.10版本开始才支持。故需要编译1.10+的svn版本。
当前的群晖型号为x86_64架构,试着在deepin os V20虚拟机上编译了高版本的svn,但是复制到群晖却不能使用,提示glic版本过低。群晖DSM 6.2.3系统自带的glibc版本为2.20,而deepin V20自带的版本为2.25,因此编译出来的svn也需要2.25版本的glic。
最后可以得出结论,若直接编译,只有两个完全一样的系统编译的软件才会一定通用。内核版本、动态库版本差异等都会影响到最终能否复制到另一个系统使用。
若要解决上面这个问题,那么就要用到交叉编译了。
交叉编译环境
群晖ds918+
虚拟机deepin os v20(交叉编译使用)
首先去下载目标机器对应的toolchain(就是用来编译目标平台的程序的编译工具套装,gcc、g++、ld和库啥的)。
在群晖的开发工具下载首页,进入DMS相应版本的目录里,比如我的是6.2.3版本,进去最新的DSM 6.2 Tool Chains
,然后可以看到有很多对应着不同处理器的压缩包,找和你CPU对应的版本。
可以通过ls /sys/module下面的文件找到CPU平台的代号。
可以看到我这台群晖对应的CPU平台为apollolake。
然后后面是Linux内核版本,和cpu架构,这两个可以通过uname命令查看。
uname -a Linux Fluxworks_NAS 4.4.59+ #25426 SMP PREEMPT Wed Jul 8 03:21:29 CST 2020 x86_64 GNU/Linux synology_apollolake_918+
因此我下载了这个版本的工具包。 DSM 6.2.2 Tool Chains/Intel x86 Linux 4.4.59 (Apollolake)/apollolake-gcc493_glibc220_linaro_x86_64-GPL.txz
tar -xf apollolake-gcc493_glibc220_linaro_x86_64-GPL.txz # cd x86_64-pc-linux-gnu/bin # ls x86_64-pc-linux-gnu-addr2line x86_64-pc-linux-gnu-cc x86_64-pc-linux-gnu-elfedit x86_64-pc-linux-gnu-gcc-ar x86_64-pc-linux-gnu-gprof x86_64-pc-linux-gnu-nm x86_64-pc-linux-gnu-ranlib x86_64-pc-linux-gnu-strip x86_64-pc-linux-gnu-ar x86_64-pc-linux-gnu-c++filt x86_64-pc-linux-gnu-g++ x86_64-pc-linux-gnu-gcc-nm x86_64-pc-linux-gnu-ld x86_64-pc-linux-gnu-objcopy x86_64-pc-linux-gnu-readelf x86_64-pc-linux-gnu-as x86_64-pc-linux-gnu-cpp x86_64-pc-linux-gnu-gcc x86_64-pc-linux-gnu-gcc-ranlib x86_64-pc-linux-gnu-ld.bfd x86_64-pc-linux-gnu-objdump x86_64-pc-linux-gnu-size x86_64-pc-linux-gnu-c++ x86_64-pc-linux-gnu-ct-ng.config x86_64-pc-linux-gnu-gcc-4.9.3 x86_64-pc-linux-gnu-gcov x86_64-pc-linux-gnu-ldd x86_64-pc-linux-gnu-populate x86_64-pc-linux-gnu-strings 可以看到gcc相关的可执行程序,这时候可以验证一下下的程序对不对,运行一个试试。 然后把bin目录添加到PATH让系统能够找到你的工具链 # export PATH=$PATH:你的工具包的目录/x86_64-pc-linux-gnu/bin
这样基本环境就ok了,剩下的就是编译你需要的程序。
编译subversion
首先下载到svn源码。
https://github.com/apache/subversion/releases
从这可以下载到。这里我下载的1.10.6,而不是最新的1.14.0。
解压下载到的源码,可以看到源码文件。
通过查看源码内文档可知。./get-deps.sh可以得到编译所需要的其他包。(包括apr、apr-util、serf、zlib、sqlite等)
运行./get-deps.sh即可在源码根目录下载到所需的包。
oboth@oboth-PC:/data/home/oboth/Desktop/subversion-1.10.6$ ls aclocal.m4 apr-util BUGS build.conf CHANGES config.log config.status configure.ac gen-make.opts get-deps.sh INSTALL LICENSE Makefile.in README sqlite-amalgamation tools zlib apr autogen.sh build build-outputs.mk COMMITTERS config.nice configure doc gen-make.py googlemock libtool Makefile NOTICE serf subversion win-tests.py
1、编译apr
cd apr ./configure --prefix=/volume1/@appstore/SVN/usr --host=x86_64-pc-linux-gnu #其中host就是目标机器平台了,这个对应着工具链bin目录下文件共有的前缀,比如前面ls命令输出的那些gcc之类的,x86_64-pc-linux-gnu是它们的前缀。 #这里文件的安装目录参照了群晖本身svn的安装目录路径,便于直接拷贝过去使用。
当然类似这样也是可以的:
#./configure --prefix=/opt/SVN/apr --host=x86_64-pc-linux-gnu
make make install
2、编译apr-util
cd ../apr-util ./configure --prefix=/volume1/@appstore/SVN/usr/lib/apr-util-1 --host=x86_64-pc-linux-gnu make && make install
3、编译zlib
cd ../zlib ./configure --prefix=/home/oboth/Desktop/zlib make make install
4、编译svn
cd .. ./configure --prefix=/volume1/@appstore/SVN --with-apr=/volume1/@appstore/SVN/usr --with-apr-util=/volume1/@appstore/SVN/usr/lib/apr-util-1 --with-lz4=internal --with-utf8proc=internal --host=x86_64-pc-linux-gnu --with-expat=/volume1/@appstore/SVN/usr/lib/apr-util-1/include:/volume1/@appstore/SVN/usr/lib/apr-util-1/lib:expat -with-zlib=/home/oboth/Desktop/zlib
make make install
至此,subversion交叉编译完成。
将编译得到的/volume1/@appstore/SVN目录内的文件拷贝至群晖系统中的/volume1/@appstore/SVN目录中。测试svn、svnserve命令执行正常。
#svnserve --version svnserve, version 1.10.6 (r1863367) compiled Aug 6 2020, 14:33:02 on x86_64-pc-linux-gnu Copyright (C) 2019 The Apache Software Foundation. This software consists of contributions made by many people; see the NOTICE file for more information. Subversion is open source software, see http://subversion.apache.org/ The following repository back-end (FS) modules are available: * fs_fs : Module for working with a plain file (FSFS) repository. * fs_x : Module for working with an experimental (FSX) repository.
交叉编译完成。
最后
其他软件包交叉编译也几乎这些步骤。
比如sshpass编译:
cd sshpass-1.06 ./configure --prefix=/home/oboth/Desktop/sshpass --host=x86_64-pc-linux-gnu make make install
最后将/home/oboth/Desktop/sshpass目录下的文件拷贝到群晖系统中的/usr/local目录即可。
################$ sshpass -h Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters -f filename Take password to use from file -d number Use number as file descriptor for getting password -p password Provide password as argument (security unwise) -e Password is passed as env-var "SSHPASS" With no parameters - password will be taken from stdin -P prompt Which string should sshpass search for to detect a password prompt -v Be verbose about what you're doing -h Show help (this screen) -V Print version information At most one of -f, -d, -p or -e should be used
########################$ which sshpass
/usr/local/bin/sshpass