群晖交叉编译记录(编译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

 

posted @ 2020-08-06 16:46  書劍飄零  阅读(2118)  评论(0编辑  收藏  举报