Distccベースandroid分散コンパイル環境の構築

5978 ワード

Ditscc分散コンパイル環境の構築については,ネット上にも多くの文章があるが,基本的には時代遅れである.だから多くの文章を見て、多くの回り道を歩いて、最後にやっと1本の正しい環境の構築のステップを整理して、しかもzeroconfを実現することができます.本論文では,負荷等化の実現には関与しない.
本明細書で説明する環境の構築はUbuntu 12.04 64 bitに基づいており、androidバージョンは4.1である(他のバージョンの推定も同様).Androidコンパイル環境の構築については後述しませんが、できるだけ公式ドキュメントを参照してください.https://source.android.com/source/initializing.html
1.Distccの概要
Distccは,C,C++などのプログラムのコンパイルタスクをネットワーク内の複数のホストに配信するプログラムである.Distccの動作原理は:GCCコンパイルC/C++構築1つのexecualbleは4つの段階に分けられる:前処理:.c到i,ccでアセンブリを完了する:.i到s,ccでコンパイルを完了する:.s到o,asによってリンクを完了する:.o実行可能ファイルまでcollect 2で完了し、第3段階が効率のボトルネックである.distccはコンパイラドライブです.「gcc-c」フェーズでは、前処理出力を指定したサーバアレイに配布し、結果を収集します.GNU Makeの”−j”並列コンパイルはdistccを利用してコンパイルを加速させることができる.distcc自体は実際にはコンパイルプロセスに関与せず、コンパイラのフロントエンドにすぎない.コンパイラに分散プロパティを追加し、一部の管理と簡単な負荷分散機能に参加します.distccはローカルで前処理を完了し(gcc-Eを使用してヘッダファイル、マクロの展開を完了)、結果をクラスタ内のワークホストに送り、ワークホストでコンパイルを完了し(gcc-cを使用)、コンパイル結果を送り返し、最後にローカルでリンクを行う.distcc分散コンパイラは、distcc:クライアントでコンパイルタスクをコンパイルホストdistcdに配布する:コンパイルホストdistcdデーモンプロセスを起動してコンパイルタスクを受信し、コンパイル結果を返す2つの部分を含むことができる.
2.Distccのインストール
回り道をしたくないなら、やめてください.
sudo apt-get install distcc

いないでhttps://code.google.com/p/distcc/downloads/listここでインストールパッケージをダウンロードします.この2つの方法でインストールすると、コンパイルホストでコンパイルエラーが発生し、ほとんどのタスクがローカルでコンパイルされました.これでは意味がない.
私がお勧めする方法は、
svn checkout http://distcc.googlecode.com/svn/trunk/ distcc-read-only

コードcheckoutを降りて自分でコンパイルします.コードを手に入れた後、INSTALLファイルをよく読んでください.中には詳しくて、ネット上の他のdistcc環境を紹介している文章よりも優れています.もちろんandroidはクロスコンパイルに関連しています.違います.コンパイル先インストールパッケージをスムーズに作成するには、INSTALLドキュメントに記載されているように、以下の依存関係をインストールします.
sudo apt-get install gcc make python python-dev binutils-dev alien libavahi-client-dev

debインストールパッケージをコンパイルするにはalienをインストールします.Ubuntu 12.04はzeroconfをサポートしており、psで見ることができますが、avahi-daemonが実行していますが、zeroconfをサポートするインストールパッケージをコンパイルするにはlibavahi-client-dev依存をインストールする必要があります.zeroconfが何なのかは後述しません.万事そろっているのはmakeだけで、以下を実行します.
./autogen.sh
./configure --with-avahi
sudo make deb

with-avahiパラメータはbuildから出たパケットがzeroconfをサポートしていることを示します.すべてがうまくいけば、ソースコードのpackagingディレクトリの下でbuildからのインストールパッケージdistcc_を手に入れます.3.2rc1-1_amd64 distcc-server_3.2rc1-1_amd 64インストール:
dpkg -i distcc_3.2rc1-1_amd64 distcc-server_3.2rc1-1_amd64

注意:zeroconfを実現するために、私は最初に仮想マシンと本機で実験をして、以下のように構成を続けた後、ホストを見つけることができます.同じ環境で別のパソコンに構築されているのに、zeroconfはそのパソコンが見つからない.私はavahi-discoverを使ってDistributed Compilerの下のすべてのホストを見て、確かに見ることができます.これはzeroconfの実装プログラムavahiがこのホストを見つけることができることを示しており、distccはavahiを利用してホストを探すことができ、理論的にも見つけることができるはずだ./var/log/syslogファイルを追跡し続け、次の行に似ています.
(daemon_proc) Browsing for 'x86_64-unknown-linux-gnu_4.4.3_distcc._tcp'.

すなわち,distccがavahiを介してホストを探す場合,ホストとgccのバージョンは一致するように要求されるが,実際にはgccの小バージョンが一致しないことはコンパイル結果に影響を及ぼさない.断固としてコードを変更します.cファイルの中:
......
# if (dcc_get_gcc_version(version, sizeof(version)) &&
# dcc_get_gcc_machine(machine, sizeof(machine))) {
#
# dcc_make_dnssd_subtype(stype, sizeof(stype), version, machine);
# } else {
rs_log_warning("Warning, failed to get CC version and machine type.
"); strncpy(stype, DCC_DNS_SERVICE_TYPE, sizeof(stype)); stype[sizeof(stype)-1] = 0; # } ......

このようにdistccがホストを探す場合、パラメータは「_distcc._tcp」になります.このように修正するのは少なくとも私の側でOKです
3.distccの構成
関連するプロファイルは主に「/etc/distcc/」フォルダの下client.allowの内容は
#  192.168.* IP          
192.168.0.0/16

androidソースパッケージprebuiltsの下のコンパイルツールを指定ディレクトリ:/usr/local/distcc/prebuilts/commandsの変更にコピーします.allow.shの内容は:
numwords=1
allowed_compilers="
/usr/bin/cc
/usr/bin/c++
/usr/bin/c89
/usr/bin/c99
/usr/bin/gcc
/usr/bin/g++
/usr/bin/*gcc-*
/usr/bin/*g++-*
/usr/local/distcc/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi*
/usr/local/distcc/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/bin/i686-linux*
"
......

新しく追加された2行の内容が本当に存在することを保証してください.そうしないと、サービス側でコンパイルエラーが発生します.
「/etc/distcc/」フォルダの下にあるhostsファイルの内容は、次のとおりです.
localhost
+zeroconf

zeroconfが見つけられるIPは1つのセグメントにしか一致しないようなので、自分でファイルに他のIPアドレスを追加し続けることができます.
「/etc/init.d/」フォルダの下にあるdistccファイルの内容は、次のとおりです.
......
OPTIONS="--zeroconf --log-file=/var/log/distccd.log --daemon --stats --job-lifetime=1200"
USER=distcc
PROG="distccd"
PIDFILE=/var/run/$PROG.pid
EXEC="/usr/bin/distccd"
......

「--zeroconf--log-file=/var/log/distcd.log」パラメータはzeroconfとlogをサポートするためです.最後にdistccdを再起動
sudo /etc/init.d/distcc reload

以上の手順が完了すると、サービス側の構成がほぼ完了します(クライアントもそれらの構成を行います).クライアントがdistccコンパイルを開始するには、次の手順に進む必要があります.
4.androidのdistccコンパイル構成
以下はandroidがdistccコンパイルタスクを正常に起動するために必要な条件を述べただけで、多くの変更は優雅ではありません.
まずコンパイル前に
export PATH=/usr/bin/distcc:$PATH

環境変数への書き込みは推奨されません
「build/core/combo」フォルダの下TARGET_linux-arm.mkファイル:
......
ifeq ($(strip $(TARGET_TOOLS_PREFIX)),)
TARGET_TOOLCHAIN_ROOT := /usr/local/distcc/prebuilts/gcc/$(HOST_PREBUILT_TAG)/arm/arm-linux-androideabi-4.6
TARGET_TOOLS_PREFIX := $(TARGET_TOOLCHAIN_ROOT)/bin/arm-linux-androideabi-
endif
......

select.mkファイル:
......
include $(BUILD_COMBOS)/$(combo_target)$(combo_os_arch).mk

$(combo_target)CC := distcc $($(combo_target)CC)
$(combo_target)CXX := distcc $($(combo_target)CXX)
......

最後にコンパイルを開始
. ./build/envsetup.sh
lunch
make -jN

すぐ
5.distccコンパイルタスクを監視distccはdistcmon-textを持参し、テキスト化監視を開始できる
#3     
distccmon-text 3

distcmon-gnomeを使用してグラフィックスモニタを起動することもできます
sudo apt-get install distccmon-gnome
distccmon-gnome &

すぐ