Distcc/tr

Distcc, derleme görevlerini ağdaki istemcilere yayarak gerçekleştiren bir yazılımdır. Sunucu servisi, istemci servisi  'dir. Ufak bir yapılandırma ile ccache, Portage ve Automake ile uyumlu şekilde çalışabilir.

Eğer distcc'yi yeni bir Gentoo kurulumunda (bootstrap) kullanmak istiyorsanız makalenin ilgili bölümünü okuduğunuza emin olun.

Kurulum
distcc'yi yapılandırmadan önce, tüm makinelere paketini kuralım.

Tüm makinelerdeki gereksinimler
distcc'yi kullanabilmek için ağınızdaki tüm bilgisayarların birbirine yakın GCC sürümlerini kullanması gerekmektedir. Örneğin, 3.3.x (x değişebilir) sürümlerini birlikte kullanmanız problem oluşturmaz ancak 3.3.x ile 3.2.x sürümleri karıştığında derleme veya derlenmiş programların çalışması sırasında problem oluşabilir.

Verify that all systems use the same version of binutils (eselect binutils list) or many packages will fail linking with various errors like text relocation.

Emerge
Distcc giden görevlerin gösterilmesi için bir arayüze sahip. Bu özelliği kullanmak istiyorsanız  bayraklarınıza   eklediğinize emin olun.

yapılandırmasının ardından kurulabilir:

Service
distccd servisinin otomatik olarak başlaması için yapmanız gerekenler, kullandığınız init sistemine bağlı olarak, aşağıdaki gibidir.

OpenRC kullanıyorsanız
dosyasını ihtiyacınıza göre düzenleyin ve  izinlerini yalnızca güvendiğiniz istemcilere verin. Ek güvenlik önlemi olarak hangi istemcilerin dinleneceğini  ile belirleyebilirsiniz. Güvenlik kaygıları için lütfen Distcc güvenlik belgesini inceleyin.

Aşağıdaki örnek 192.168.0.4 ve 192.168.0.5 adreslerinde çalışan istemcilerin çalıştırdığımız distccd servisine erişebilmesine izin verir:

When logging to a file in, create the log and give appropriate permissions:

Şimdi dahil olan tüm bilgisayarlarda distccd servisini başlatalım:

systemd kullanıyorsanız
dosyasını düzenleyin ve izin veirlen istemcileri CIDR formatina göre ekleyin. Örnek olarak:

Or an example with multiple clients and a manually specified log-level

To set the proper environment variables for, place them into. For example,

For workaround, you need to edit distccd.service by running the following command.

This will open up an editor. Change the line with  directive to

Alternatively, you could also write a shell script wrapper for.

Değişikliğin ardından unit dosyalarını yeniden yüklemelisiniz:

Açılışta distcc</tt> servisinin çalışmasını açıp, ardından servisi başlatın:

Dahil olacak istemcileri belirleme
Katılacak istemcileri ayarlamak için distcc-config</tt> komutunu kullanabilirsiniz.

Aşağıdaki örnek istemci listesini inceleyin. Çoğu durumda 1. ve 2. satırların türevleri yeterli olmaktadır. 3. ve 4. satırlardaki kullanımın detayını distcc yardım sayfalarında bulabilirsiniz.

Daha farklı yöntemler kullanabilirsiniz. distcc</tt> yardım sayfalarına ( man distcc ) bakmanızı öneririz.

Bulunduğunuz bilgisayarı da derlemeye dahil etmek istiyorsanız listeye  da eklemeniz gerek. Yavaş bir bilgisayar ise, işlemin genelini yavaşlatacağı için bulundurmamayı seçebilirsiniz.

distcc</tt>'yi örneğin ilk satırında belirtilen bilgisayarları kullanacak şekilde yapılandıralım:

Distcc also supports a pump mode, by invoking the command. This may significantly reduce build time when multiple files are compiled in parallel. It caches preprocessed headers on the server side and, as a result, gets rid of repeated uploading and preprocessing of these header files.

To configure a host for pump mode, add the  suffix to the hosts definitions. Pump mode requires both  and   flags (regardless of the files being C or C++).

Hosts also need to be in:

Optionally, to set the maximum number of threads used by a host, add a forward slash "/" after each host:

The same applies to the command. If the maximum threads number is not specified, it will default to 4.

Portage'ı distcc ile kullanmak
Portage ile distcc</tt> kullanımı kolaydır. Yapmanız gereken distcc</tt> özelliğini açıp, aynı anda yapılacak işlem sayısını artırmaktan ibaret (çünkü distcc</tt> bize bu imkanı sağlıyor).

Ardından  ve   değişkenlerini aşağıdaki gibi düzenlemeniz gerek.

Genel strateji şöyledir
 * değerini toplam (sunucu+istemciler) CPU sayısının iki katına, ve
 * değerini sunucudaki işlemcilerin sayısına ayarlayın

için yapılandırmanıza uygun bir değer kullanmalısınız. Distcc hostları erişilemez durumda veya paket yerel olarak derlenmeliyse (gcc gibi)  bayrağı eklemeniz çok fazla işlem üretilmesini engeller.

Örneğin distccd</tt> çalışan iki tane 4 çekirdekli işlemciye sahip bilgisayara sahipseniz ve sunucu çift çekirdekli ise, gerekli  değişkeni şöyle olabilir:

CFLAGS and CXXFLAGS
dosyasını düzenlerken,  veya   içerisinde -march=native</tt> bulunmadığına dikkat edin. Eğer  değerinde   bulunuyorsa distccd</tt> kodu diğer sunuculara göndermeyecektir. Hedef için uygun -march=</tt> değeri şu komut ile bulunabilir:

Daha fazla bilgi için Inlining -march=native</tt> for distcc sayfasına bakabilirsiniz.

Distcc'yi automake ile kullanmak
Bu işlem genelde Portage yapılandırmasından daha kolaydır. Yapmanız gereken şey  ortam değişkenine  'yi barındıran dizinden  önce  eklemek. Ancak ccache kullanıyorsanız ccache bölümünün ardına yerleştirmeniz gerek:

Bu komutu kullanıcı bazlı veya global  gibi otomatik yüklenen bir dosyaya ekleyip her sisteme girdiğinizde çalışmasını sağlayabilirsiniz.

Ardından normalde  komutu ile iş yaparken,   tarzında (buradaki N bir sayıdır) kullanabilirsiniz. N değeri ağınızın hızına ve işlemci sayınıza göre değişecektir. Size en uyumlu değeri bulmak için deneme yapmanızı tavsiye ederiz.

With ccache
To make Ccache work with, some prerequisites must be fulfilled:
 * Ccache is successfully set up locally
 * Distcc is successfully set up on the desired hosts

The following setup will work as follows:

Configure distccd
In order to let the daemon use, it must masquerade the path  with. Furthermore, when it uses, should use the prefix  :

Additionally must be aware of the environment variables DISTCC_DIR and CCACHE_DIR :

Next, update the environment variables:

Finally, restart the daemon to adapt all changes:

Configure ccache
First, prepare the cache directories:

The second command will create the first level directories from  to,  to  and. The following loop will then look for the first level directories, excluding the current directory  and. It then descends into each of them, creates the second level directories from to  and  to   and goes back to the previous directory , which is.

When the preparation is done, every directory - including the directory itself - must be owned by the user  :

Configure portage
To use with  and, make sure, that both features are enabled and that CCACHE_DIR is set in :

It might be redundant to set CCACHE_DIR here, since it is already defined in, mentioned here. But to make absolutely sure, configure it like that.

Remote
First enable verbose logging by setting  to   in :

After that, restart the daemon to adapt the changes:

Also check, if there are directories in - including the directory  itself - which are not owned by the user   and correct their owner permissions:

Client
Make sure, that the following environment variables are present in the current shell:

After that, navigate to a temporary directory within and compile the example mentioned below:

This will provide a verbose output, while also keeping temporary files receiving from the remote site in by default:

Any occuring error from the remote site are saved in.

If the compilation was successful, the following line will be shown.

On the remote site, it will look like this:

The important part here, is, that any symlink of is a save symlink to.

Also, on the remote site, there should be the cached file in, assuming, the example with its filename was copied from this wiki article. Generally, one can monitor the ccache size using, while compiling.

Testing distcc with ccache using emerge
Check, if necessary environment variables are present for the current shell, see here and that was configured properly, see here.

To produce some cached files on the remote site, one can compile small packages like  and   on the client:

Future usage
Make sure, that the following environment variables are always set in the desired shell:

distcc'yi bootstrap ile (sıfır kurulumda) kullanmak
distcc</tt>'yi sıfır kurulumda kullanmak bazı ek adımlar gerektirir.

Adım 1: Portage'ı yapılandırın
Distcc'yi yapılandırmak için  komutunu çalıştırın. Aşağıdaki komutta  ile başlayan yerleri DistCC derlemesine katılan cihazların IP adresi veya hostname adresi ile değiştirin:

Kurulum oturumunda  değişkeninin de güncellenmesi gerekmekte:

Adım 2: Distcc kurulumu
paketini kurun:

Adım 3: Distcc'yi yapılandırma
Distcc'yi yapılandırmak için  komutunu çalıştırın. Aşağıdaki komutta  ile başlayan yerleri DistCC derlemesine katılan cihazların IP adresi veya hostname adresi ile değiştirin:

Distcc artık sıfırdan kuruluma hazır! Kuruluma devam edebilirsiniz. Ancak emerge @system</tt> komutunun ardından emerge distcc</tt> komutunu çalıştırıp tüm gerekli bağımlılıkların yüklendiğinden emin olun.

Distcc Ekstraları
Distcc</tt> uygulamasının bazı özellikleri ve yardımcı uygulamaları bulunmakta.

Distcc İzleme Araçları
Distcc iki tane izleme aracı ile gelmekte. Bunlardan metin tabanlı olanı. İlk kez kullanıyorsanız biraz kafa karıştırıcı olabilir ancak kullanımı kolaydır. Eğer herhangi bir parametre vermezseniz bir defa, herhangi bir numara -örneğin - verirseniz her   saniyede bir çalışacaktır.

Diğer izleme aracı da yalnızca    bayrağı açıksa kurulacaktır. GTK+ temelli, X ortamında çalışan sevimli bir uygulamadır. Gentoo'da, kafa karışıklığını önlemek için bu uygulamaya <tt>distccmon-gui</tt> (orijinal ismi <tt>distccmon-gnome</tt>'dur).

Portage'ın <tt>distcc</tt> kullanımını ölçmek için:

değişkenini ortam değişkenleriyle ayarlamak için bir ipucu:

Ardından ortam değişkenlerini güncelleyin:

Ardından grafiksel uygulamayı başlatabilirsiniz:

Cross-Compiling (Çapraz derleme)
Cross-compiling (çapraz derleme), derleme işlemini kullandığınız işlemci mimarisinden farklı bir mimaride çalışması için yaptığınız duruma verilen addır. Yani Athlon (i686) işlemci ile K6-2 (i586) için veya Sparc işlemci ile ppc için derleme yapmak gibi. Bu konuya Distcc/Cross-Compiling|DistCC Cross-compiling Belgesinde]] değinilmiştir.

Adım 1: Portage'ı Yapılandırın
Send the public key to each compilation node:

Yeni bilgisayarı Gentoo Linux CD'si ile başlatıp kurulum dökümanlarındaki adımlardan bootstrap'a kadar gelin. (Bootstrap için detaylı bilgiyi buradan bulabilirsiniz.) Ardından portage'ı distcc kullanmak için yapılandırın:

Fix the file ownership as follows:

To set up the hosts  and , run:

Finally, tell which SSH binary to use:

It is not necessary to run the initscript on the hosts when  communicates via SSH.

Reverse SSH
As an alternative to distcc's built-in SSH solution, a compiling server can connect to the distcc client via SSH, redirecting the client's distcc TCP port to the compiling server. There is no need for password-less SSH keys on the client.

Note that distcc uses as a literal keyword for special purpose so that  has to be used instead. For multiple compiling servers each needs its own port redirection on the client (e.g. 127.0.0.1:4000, 127.0.0.1:4001 etc). Assert that IP addresses and ports are listed in on the client.

Testing
To test, write a simple Hello distcc program and run in verbose mode to see if it communicates properly.

Next, turn on verbose mode, compile the program using and link the generated object file into an executable:

There should be a bunch of output about finding its configuration, selecting the host to connect to, starting to connect to it, and ultimately compile. If the output does not list the desired hosts, check the configuration.

Finally, ensure the compiled program works properly. To test each host, enumerate each compile host in the hosts file.

If a problem occurs while using, then this section might help in resolving the problem.

ERROR: failed to open
As of January 22nd, 2015 emerging fails to create the proper file in. This apparently only effects version 3.1-r8 of distcc. This bug is in the process of being corrected (see ). It is possible to work around this by manually creating the log file, giving it proper ownership, and restarting the distccd daemon:

Next update the path of the  configuration file in  to the  directory created in the step before:

Finally, restart the distccd service:

-march=native
GCC 4.3.0 sürümünden itibaren derleyici  parametresi ile işlemcinizin türünü ve kullanılması gereken derleme seçeneklerini otomatik olarak tanımlayabiliyor. Bu durum  gibi farklı işlemcileri aynı anda kullanan bir sistem için problem oluşturmakta. Bu sebeple  kullanırken   veya   değerlerinizde   or   kullanmayın.

Distcc Ekstraları
Rust package is known to cause excessive IO utilization as --local-load is ignored and --jobs is usually too high for local build resources. A package.env needs to be provisioned with non-distcc MAKEOPTS values to workaround this behaviour.

Distcc İzleme Araçları
Distcc iki tane izleme aracı ile gelmekte. Bunlardan metin tabanlı olanı. İlk kez kullanıyorsanız biraz kafa karıştırıcı olabilir ancak kullanımı kolaydır. Eğer herhangi bir parametre vermezseniz bir defa, herhangi bir numara -örneğin N- verirseniz her N saniyede bir çalışacaktır.

Diğer izleme aracı da  bayraklarınızda   veya   açık durumda ise derlenecek olan, GTK+ temelli grafiksel arayüzdür. Diğer dağıtımlarda genellikle  ismiyle bilinen bu arayüz Gentoo'da karışıklığa sebep olmamak için   ismindedir.

It is also possible to set the CC and CXX variables in to the values list in the command above.

veya  için:

Heed the following warning:

See the CFLAGS and CXXFLAGS section and Inlining  for distcc for more information.

Network is unreachable
Due to network restrictions introduced by the feature, you may run into this issue. Since contradicts with this security feature, you have to disable it:

Get more output from emerge logs
It is possible to obtain more logging by enabling verbose mode. This is accomplished by adding DISTCC_VERBOSE to :

The verbose logging can then be found in.

Keep in mind that the first invocation visible in  isn’t necessary the first  call during a build process. For example a build server can get a one-minute backoff period during the configuration stage when some checks are performed using a compiler ( sets a backoff period when compilation on a remote server failed, it doesn’t matter whether it failed on local machine or not).

Dig into the directory to investigate such situations. Find other logs, or call explicitly from within the working directory.

Another interesting variable to use is DISTCC_SAVE_TEMPS. When set, it saves the standard output/error from a remote compiler which, for Portage builds, results in files in the directory.

Failed to create directory /dev/null/.cache/ccache/tmp: Not a directory
This error can be discovered from the standard error output file in the server if you set DISTCC_SAVE_TEMPS. It only occurs when using with.

Likely, it is because CCACHE_DIR is not properly set, or not passed correctly to. will then default to as its cache folder. However, is run by  under user distcc, which is a non-login account. See systemd section and With ccache section for setting CCACHE_DIR.

Portage build failing with errors that are apparently not connected with distcc at all
When builds are failing with errors that do not seem to be connected to distcc, but the build works with FEATURES="-distcc", it has been reported that builds sometimes fail because of DISTCC_VERBOSE=1. Try the build with DISTCC_VERBOSE=0.

External resources

 * Inlining  for distcc
 * Distcc on Github
 * Distcc homepage