Это резюме нескольких связанных блогов. Поскольку мы планируем вернуться со Swift на Objective-C для нашего проекта, сегодня я провел небольшое исследование кеша и взял несколько блогов.

ccache и clang

ccache в основном сидит поверх clang и проверяет, нужна ли компиляция по своему кешу, и вызывает компилятор только тогда, когда предоставляется реальная компиляция.

Как установить?

brew install ccache (у меня не сработало из-за некоторых странных проблем с xls. Я переключился на кеш установки порта, и это сработало.

Как использовать?

Заменить clang -> ccache clang. В Xcode добавьте флаг

CC=ccache /usr/bin/clang

к настройкам проекта. Чтобы быть в безопасности, сначала проверьте наличие ccache:

#!/bin/sh
if type -p ccache >/dev/null 2>&1; then
  export CCACHE_MAXSIZE=10G
  export CCACHE_CPP2=true
  export CCACHE_HARDLINK=true
  export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches
  exec ccache /usr/bin/clang "$@"
else
  exec clang "$@"
fi

Настраиваемые флаги: https://ccache.samba.org/manual.html#_configuration

Предостережения?

Модули Clang не поддерживаются. Swift точно не поддерживается.

Как проверить?

ccache -s

Как настроить ccache?

~/.ccache/ccache.conf









Рассылка

Теперь мы можем быстро строить локально. Как мы можем использовать облако, чтобы сделать сборку еще быстрее? Например, возможно ли распределить процесс компиляции на пул машин и выполнять компоновку только локально? Здесь у нас есть distcc.

Как установить?

brew install distcc

Как это настроить?

  1. Создайте файл ~/.distcc/hosts и поместите туда адреса серверов билдера.
  2. Чтобы запустить демон distcc, выполните следующую команду:
distccd --no-detach --daemon --allow 192.168.0.0/16 --allow 127.0.0.1 --log-stderr --verbose

3. На стороне клиента:

export DISTCC_FALLBACK=0
distcc -c test.c

Ответ демона:

distccd[97259] (dcc_check_client) connection from 127.0.0.1:62993
distccd[97259] (check_address_inet) match client 0x100007f, value 0x100007f, mask 0xffffffff
distccd[97259] (dcc_r_token_int) got DIST00000001
distccd[97259] (dcc_r_token_int) got ARGC00000005
distccd[97259] (dcc_r_argv) reading 5 arguments from job submission
distccd[97259] (dcc_r_token_int) got ARGV00000002
distccd[97259] (dcc_r_token_string) got 'cc'
distccd[97259] (dcc_r_argv) argv[0] = "cc"
distccd[97259] (dcc_r_token_int) got ARGV00000002
distccd[97259] (dcc_r_token_string) got '-c'
distccd[97259] (dcc_r_argv) argv[1] = "-c"
distccd[97259] (dcc_r_token_int) got ARGV00000006
distccd[97259] (dcc_r_token_string) got 'test.c'
distccd[97259] (dcc_r_argv) argv[2] = "test.c"
distccd[97259] (dcc_r_token_int) got ARGV00000002
distccd[97259] (dcc_r_token_string) got '-o'
distccd[97259] (dcc_r_argv) argv[3] = "-o"
distccd[97259] (dcc_r_token_int) got ARGV00000006
distccd[97259] (dcc_r_token_string) got 'test.o'
distccd[97259] (dcc_r_argv) argv[4] = "test.o"
distccd[97259] (dcc_r_argv) got arguments: cc -c test.c -o test.o
distccd[97259] (dcc_scan_args) scanning arguments: cc -c test.c -o test.o
distccd[97259] (dcc_scan_args) found input file "test.c"
distccd[97259] (dcc_scan_args) found object/output file "test.o"
distccd[97259] compile from test.c to test.o
distccd[97259] (dcc_run_job) output file test.o
distccd[97259] (dcc_input_tmpnam) input file test.c
distccd[97259] (dcc_r_token_int) got DOTI000036fc
distccd[97259] (dcc_r_file) received 14076 bytes to file /var/folders/_g/r6syzgbx6ylctp7m45l_shlw000b3h/T//distccd_2ea9329e.i
distccd[97259] (dcc_r_file_timed) 14076 bytes received in 0.000176s, rate 78103kB/s
distccd[97259] (dcc_set_input) changed input from "test.c" to "/var/folders/_g/r6syzgbx6ylctp7m45l_shlw000b3h/T//distccd_2ea9329e.i"
distccd[97259] (dcc_set_input) command after: cc -c /var/folders/_g/r6syzgbx6ylctp7m45l_shlw000b3h/T//distccd_2ea9329e.i -o test.o
distccd[97259] (dcc_set_output) changed output from "test.o" to "/var/folders/_g/r6syzgbx6ylctp7m45l_shlw000b3h/T//distccd_2e47329e.o"
distccd[97259] (dcc_set_output) command after: cc -c /var/folders/_g/r6syzgbx6ylctp7m45l_shlw000b3h/T//distccd_2ea9329e.i -o /var/folders/_g/r6syzgbx6ylctp7m45l_shlw000b3h/T//distccd_2e47329e.o
distccd[97259] (dcc_check_compiler_masq) /usr/bin/cc is a safe symlink to clang
distccd[97259] (dcc_spawn_child) forking to execute: cc -c /var/folders/_g/r6syzgbx6ylctp7m45l_shlw000b3h/T//distccd_2ea9329e.i -o /var/folders/_g/r6syzgbx6ylctp7m45l_shlw000b3h/T//distccd_2e47329e.o
distccd[97259] (dcc_spawn_child) child started as pid97406
distccd[97406] (dcc_new_pgrp) entered process group
distccd[97406] (dcc_increment_safeguard) setting safeguard: _DISTCC_SAFEGUARD=1
distccd[97259] (dcc_collect_child) cc child 97406 terminated with status 0
distccd[97259] (dcc_collect_child) cc times: user 0.000000s, system 0.000000s, 0 minflt, 0 majflt
distccd[97259] (dcc_x_token_int) send DONE00000001
distccd[97259] (dcc_x_token_int) send STAT00000000
distccd[97259] (dcc_x_file) send 0 byte file /var/folders/_g/r6syzgbx6ylctp7m45l_shlw000b3h/T//distcc_2b99329e.stderr with token SERR and compression 69
distccd[97259] (dcc_x_token_int) send SERR00000000
distccd[97259] (dcc_x_file) send 0 byte file /var/folders/_g/r6syzgbx6ylctp7m45l_shlw000b3h/T//distcc_2bc6329e.stdout with token SOUT and compression 69
distccd[97259] (dcc_x_token_int) send SOUT00000000
distccd[97259] (dcc_x_file) send 752 byte file /var/folders/_g/r6syzgbx6ylctp7m45l_shlw000b3h/T//distccd_2e47329e.o with token DOTO and compression 69
distccd[97259] (dcc_x_token_int) send DOTO000002f0
distccd[97259] (dcc_pump_sendfile) decided to use read/write rather than sendfile
distccd[97259] cc test.c on localhost completed ok
distccd[97259] job complete
distccd[97259] (dcc_cleanup_tempfiles_inner) deleted 5 temporary files
distccd[97259] (dcc_job_summary) client: 127.0.0.1:62993 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:51ms cc test.c

Для интеграции с предыдущим скриптом Xcode для ccache используйте этот скрипт:

# Does the hosts file exist and is distcc in the path?
if test -f ~/.distcc/hosts && type -p distcc >/dev/null 2>&1
then
    # Tell ccache to prefix calls to the compiler with 'distcc'
    export CCACHE_PREFIX="distcc"
fi

Сделайте Xcode более мощным сейчас:

defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 24