私の新しい職場では、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-d16は
fpu最適化であり、
DISTRO_OPTSはハードフロート/ソフトフロートを担当します。
qplatformdefs.hは 、他のARMの構成の標準です。
configureを呼び出すとき
、以下を渡す必要があります。
- -デバイスarmada370
- -device-option CROSS_COMPILE = arm-marvell-linux-gnueabi-
- -sysroot ... / arm-marvell-linux-gnueabi / arm-marvell-linux-gnueabi / libc
chroot'eで収集conf.sh:
$ 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.wt 、
composer.xml 、
composer.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
Wtで書かれたアプリケーションにリダイレクトする単純なcgiスクリプト。
開始停止状態
アプリケーションの停止を開始します。
結論
Synologyの場合、
ツールチェーンの使用には長所と短所があります。
考えられる利点:
- 必要なシステムライブラリを収集して配置する必要はありません。
- 追加のCPU最適化を有効にできます。
考えられる短所:
- ツールチェーンごとにビルドを行う必要がある場合があります。
QNAP
ツールチェーンは古く、バイパスする必要があることが判明しましたが、それは別の話です。