Synology DSMのパッケージのクロスコンパイルとビルド

私の新しい職場では、SynologyとQNAPのメーカーのNASで製品を発売する仕事がありました。 製品は、C ++ 11、Boost、およびQt5を使用してC ++で記述されています。 無料のWeb開発者がいないため、インターフェイスはWtで記述されており、WakeでアセンブリにCMakeを使用しています。 カットの下には、この動物園のアセンブリと簡単なパッケージの作成があります。





主な情報源は、公式DSM開発者ガイドです

一般的な用語でツールチェーンとの作業(インストール、オープンソースプロジェクトのコンパイル、パッケージ化)を説明します。 なぜなら DS 114のバジェットバージョンを購入しました。これには、Marvell Armada 370とボンネットの下にあるDSM 5.2ファームウェアバージョンがあり、すべてがアームの下に組み立てられます。



環境を準備するには、 パッケージツールキットを使用します 。これは、 Synology Open Source Projectプロジェクトページからダウンロードできます さまざまな価格カテゴリのデバイスにはさまざまなプロセッサが搭載されているため、いくつかのツールセットをダウンロードする必要があるため、これはもう少し便利です。

詳細については、NASのCPUの種類のページをご覧ください。



パッケージツールキットを解凍する

$ mkdir -p ~/synology/toolkit

$ tar xvf pkgscripts.tgz -C ~/synology/toolkit









環境とツールを引き出す

$ cd ~/synology/toolkit/pkgscripts/

$ sudo ./EnvDeploy -v 5.2 -p armada370









ブースト



Boostは驚くほど簡単です。 ファイル〜/ user-config.jamに記述します

using gcc : arm : arm-marvell-linux-gnueabi-g++ ;







収集:

 $ ./bootstrap.sh --prefix=/home/dmitry/synology/toolkit/build_env/ds.armada370-5.2/usr/local/arm-marvell-linux-gnueabi/arm-marvell-linux-gnueabi/libc $ export PATH=~/synology/toolkit/build_env/ds.armada370-5.2/usr/local/arm-marvell-linux-gnueabi/bin:$PATH $ ./b2 toolset=gcc-arm link=static threading=multi install
      
      





Webtoolkit



CMakeを構成するには、 toolchain-file toolchain-arm-marvell.cmakeを使用します

 SET(CMAKE_SYSTEM_NAME Linux) SET(CMAKE_SYSTEM_VERSION 1) SET(CMAKE_C_COMPILER /home/dmitry/synology/toolkit/build_env/ds.armada370-5.2/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabi-gcc) SET(CMAKE_CXX_COMPILER /home/dmitry/synology/toolkit/build_env/ds.armada370-5.2/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabi-g++) SET(CMAKE_LINKER /home/dmitry/synology/toolkit/build_env/ds.armada370-5.2/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabi-ld.gold) SET(CMAKE_FIND_ROOT_PATH /home/dmitry/synology/toolkit/build_env/ds.armada370-5.2/usr/local/arm-marvell-linux-gnueabi/arm-marvell-linux-gnueabi/libc) SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
      
      





次:

 $ tar xvf wt-3.3.4.tar.gz $ cd wt-3.3.4 $ mkdir build $ cd build $ cmake -DCMAKE_TOOLCHAIN_FILE=~/toolchain-arm-marvell.cmake \ -DCMAKE_BUILD_TYPE=Release \ -DSHARED_LIBS=OFF \ -DCMAKE_INSTALL_PREFIX=/home/dmitry/synology/toolkit/build_env/ds.armada370-5.2/usr/local/arm-marvell-linux-gnueabi/arm-marvell-linux-gnueabi/libc \ .. $ make $ make install
      
      





私がパッケージ化する例をコンパイルしています:

 $ cd examples/composer $ make
      
      





受信したファイルを確認します。

 $ file Home.wt Home.wt: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, BuildID[sha1]=228a30c3dab0572993e41468aa0862fc93e11487, not stripped
      
      





Qt5



Qtソースディレクトリで、 qtbase / mkspecs / devicesに移動します

内容を含むディレクトリarmada370を作成します

qmake.conf

 include(../common/linux_device_pre.conf) QMAKE_INCDIR += $$[QT_SYSROOT]/usr/include QMAKE_LIBDIR += $$[QT_SYSROOT]/lib QMAKE_CC = $${CROSS_COMPILE}gcc QMAKE_CXX = $${CROSS_COMPILE}g++ QMAKE_LINK = $${CROSS_COMPILE}g++ QMAKE_LINK_SHLIB = $${CROSS_COMPILE}g++ QMAKE_AR = $${CROSS_COMPILE}ar cqs QMAKE_OBJCOPY = $${CROSS_COMPILE}objcopy QMAKE_NM = $${CROSS_COMPILE}nm -P QMAKE_STRIP = $${CROSS_COMPILE}strip QMAKE_CFLAGS += -march=armv7-a -mfpu=vfpv3-d16 QMAKE_CXXFLAGS += $$QMAKE_CFLAGS DISTRO_OPTS += hard-float QT_QPA_DEFAULT_PLATFORM = eglfs include(../common/linux_arm_device_post.conf) load(qt_config)
      
      





-mfpu = vfpv3-d16fpu最適化であり、 DISTRO_OPTSはハードフロート/ソフトフロートを担当します。

qplatformdefs.hは 、他のARMの構成の標準です。

configureを呼び出すとき、以下を渡す必要があります。



chroot'eで収集
conf.sh:

 #!/bin/bash CFG='' CFG+=' -opensource' CFG+=' -confirm-license' CFG+=' -v' CFG+=' -static' CFG+=' -device armada370' CFG+=' -make libs' CFG+=' -device-option CROSS_COMPILE=/usr/local/arm-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabi- ' CFG+=' -sysroot /usr/local/arm-marvell-linux-gnueabi/arm-marvell-linux-gnueabi/libc' CFG+=' -release' CFG+=' -nomake tools' CFG+=' -nomake examples' CFG+=' -no-compile-examples' CFG+=' -no-dbus' CFG+=' -no-gui' CFG+=' -no-widgets' CFG+=' -qt-sql-sqlite' CFG+=' -D QT_NO_GRAPHICSVIEW' CFG+=' -D QT_NO_GRAPHICSEFFECT' CFG+=' -D QT_NO_STYLESHEET' CFG+=' -D QT_NO_STYLE_CDE' CFG+=' -D QT_NO_STYLE_CLEANLOOKS' CFG+=' -D QT_NO_STYLE_MOTIF' CFG+=' -D QT_NO_STYLE_PLASTIQUE' CFG+=' -no-qml-debug' CFG+=' -no-alsa' CFG+=' -no-cups' CFG+=' -no-dbus' CFG+=' -no-directfb' CFG+=' -no-evdev' CFG+=' -no-gtkstyle' CFG+=' -no-kms' CFG+=' -no-libudev' CFG+=' -no-linuxfb' CFG+=' -no-mtdev' CFG+=' -no-nis' CFG+=' -no-pulseaudio' CFG+=' -no-sm' CFG+=' -no-xcb' CFG+=' -no-xcb-xlib' CFG+=' -no-xinerama' CFG+=' -no-xinput2' CFG+=' -no-xkb' CFG+=' -no-xrender' CFG+=' -no-icu' CFG+=' -no-use-gold-linker' CFG+=' -no-eglfs' CFG+=' -no-cups' CFG+=' -no-fontconfig' CFG+=' -no-sse2' CFG+=' -no-sse3' CFG+=' -no-sse4.1' CFG+=' -no-avx' CFG+=' -no-opengl' cd qtbase ./configure $CFG "$@"
      
      







 $ sudo chroot ~/synology/toolkit/build_env/ds.armada370-5.2/ $ cd /root/qt-everywhere-opensource-src-5.5.0/ $ ./conf.sh $ cd qtbase $ make $ make install
      
      









パッケージング





パッケージの拡張子はspkで、ファイルアーカイブから表されます。 最小パッケージの構造の形式は次のとおりです。



INFO-パッケージの説明を含むテキストファイル:

スクリプト -パッケージのインストール/削除のさまざまな段階で実行されるスクリプト、およびデーモン起動スクリプト。

package.tgz-実行可能ファイル、ライブラリ、リソースなどを含む圧縮アーカイブ



コンパイルされたcomposer.skpパッケージの構造は次のとおりです。



composer.wtcomposer.xmlcomposer.css 、およびpaperclip.pngはWtの例から取られたものであり、興味の対象ではありません。



情報


 package="composer" displayname="Mail composer" version="1.0.0" arch="armada370" description="This example implements a GMail-like mail composer and shows among other things how to upload files asynchronously, showing a cross-browser upload progress bar and with support for multiple files." maintainer="Wt" dsmuidir=ui
      
      





dsmuidirは/ volumeX / @ appstore / [パッケージ名] / [dsmuidir]から/ usr / syno / sinoman / webman / 3rdparty / [パッケージ名]へのリンクを自動的に作成するために必要なオプション変数です。 / volumeX / @ appstore / [パッケージ名] 、ここでX = 1,2..Nは、インストールされたアプリケーションが配置されるパスです。 / usr / syno / synoman / webman / 3rdparty / [パッケージ名] DSM UIに統合するためのパス。



config


DSM UIに統合するには、ディレクトリ/ usr / syno / synoman / webman / 3rdparty / [パッケージ名]を作成し、おおよその内容の構成ファイルを配置する必要があります。

 { ".url": { "eu.webtoolkit.composer": { "type": "url", "allUsers": true, "title": "Mail composer", "desc":"This example implements a GMail-like mail composer and shows among other things how to upload files asynchronously, showing a cross-browser upload progress bar and with support for multiple files.", "icon":"composer_{0}.png", "url": "3rdparty/composer/index.cgi" } } }
      
      





composer_ {0} .png-プレースホルダーはcomposer_48.png / composer_64.png / composer_72.png / composer_256.pngに置き換えられます。

url-アプリケーションをクリックすると、新しいウィンドウで開くhtml / cgiへのパス。 / usr / syno / synoman / webman / 3rdparty / [パッケージ名] html、js、css、cgi、imagesで許可されています。 しかし、phpのスリップは機能しませんでした。



index.cgi


 #!/bin/sh if [ `ifconfig | grep bond0 | awk '{print $1}'` ] then IP_ADDR=`ifconfig bond0 | grep "inet addr" | awk '{print $2}' | awk -F: '{print $2}'` else IP_ADDR=`ifconfig eth0 | grep "inet addr" | awk '{print $2}' | awk -F: '{print $2}'` fi echo Location: http://$IP_ADDR:8585 echo "" exit
      
      





Wtで書かれたアプリケーションにリダイレクトする単純なcgiスクリプト。



開始停止状態


 #!/bin/sh case $1 in start) ${SYNOPKG_PKGDEST}/composer.wt --docroot=${SYNOPKG_PKGDEST} --approot=${SYNOPKG_PKGDEST} --http-address=0.0.0.0 --http-port=8585 & exit 0 ;; stop) pkill composer.wt exit 0 ;; restart) exit 0; ;; status) if [ "$?" = "0" ]; then exit 0 else exit 1 fi ;; log) exit 0 ;; esac
      
      





アプリケーションの停止を開始します。



結論





Synologyの場合、 ツールチェーンの使用には長所と短所があります。

考えられる利点:



考えられる短所:





QNAP ツールチェーンは古く、バイパスする必要があることが判明しましたが、それは別の話です。



All Articles