| CCACHE(1) | CCACHE(1) |
نام (NAME)
ccache - یک حافظهٔ نهان سریع برای کامپایلرهای C/C++
خلاصه دستور (SYNOPSIS)
ccache [ccache options] ccache [KEY=VALUE ...] compiler [compiler options] compiler [compiler options]
شکل نخست، گزینههای شرح دادهشده در بخش گزینههای خط فرمان در ادامه را میپذیرد. شکل دوم کامپایلر را فراخوانی میکند که به صورت اختیاری میتواند از گزینههای پیکربندی به عنوان آرگومانهای KEY=VALUE استفاده کند. در شکل سوم، ccache مطابق آنچه در بخش حالتهای اجرا شرح داده شده است، در نقش کامپایلر ظاهر میشود.
توضیحات (DESCRIPTION)
ابزار Ccache یک حافظهٔ نهان (cache) برای کامپایلر است که با ذخیره کردن نتایج کامپایلهای پیشین و استفادهٔ مجدد از آنها در زمان اجرای دوبارهٔ همان کامپایل، سرعت کامپایل مجدد را بهطور چشمگیری افزایش میدهد.
ابزار Ccache به گونهای طراحی شده است که دقیقاً همان خروجی کامپایلر را در یک کامپایل عادی تولید کند. تنها تفاوتی که باید احساس کنید، زمان ساخت (build) سریعتر است. هرگونه استثنای شناختهشده برای این رفتار در بخش CAVEATS مستند شده است. اگر با موردی مواجه شدید که ccache خروجی متفاوتی نسبت به آنچه انتظار میرفت تولید کرد، لطفاً آن را گزارش دهید.
حالتهای اجرا (RUN MODES)
دو راه برای استفاده از ccache جهت ذخیرهسازی کامپایلها در حافظهٔ نهان وجود دارد:
ccache gcc -c example.c
cp ccache /usr/local/bin/ ln -s ccache /usr/local/bin/gcc ln -s ccache /usr/local/bin/g++
در سیستمهایی که از پیوندهای نمادین پشتیبانی نمیکنند، میتوانید به جای آن ccache را کپی کنید:
cp ccache /usr/local/bin/gcc cp ccache /usr/local/bin/g++
این روش تا زمانی کار میکند که دایرکتوری حاوی پیوندهای نمادین یا نسخههای کپیشدهٔ ccache، پیش از دایرکتوری کامپایلر واقعی (بهطور معمول /usr/bin) در متغیر محیطی PATH شما قرار گرفته باشد.
هشدار (Warning)
روش تغییر چهره بهخوبی کار میکند، اما ممکن است با ابزارهای دیگری که از همین تکنیک استفاده میکنند تداخل داشته باشد. برای اطلاعات بیشتر بخش USING CCACHE WITH OTHER COMPILER WRAPPERS را ببینید.
این گزینههای خط فرمان تنها زمانی اعمال میشوند که ccache را مستقیماً بهصورت “ccache” فراخوانی کنید. هنگامی که ccache در نقش یک کامپایلر عمل میکند (همانطور که در بخش پیشین توضیح داده شد)، باید از گزینههای معمولی کامپایلر استفاده کرده و به مستندات کامپایلر خود مراجعه کنید.
گزینههای عمومی (Common options)
-c, --cleanup
-C, --clear
--config-path PATH
-d, --dir PATH
--dry-run
--evict-namespace NAMESPACE
--evict-older-than AGE
-h, --help
-F NUM, --max-files NUM
-M SIZE, --max-size SIZE
-X LEVEL, --recompress LEVEL
-o KEY=VALUE, --set-config KEY=VALUE
-x, --show-compression
-p, --show-config
--show-log-stats
-s, --show-stats
--stop-storage-helpers
--threads THREADS
-v, --verbose
-V, --version
-z, --zero-stats
--trim-dir PATH
هشدار
از این گزینه برای هرس کردن کَش محلی استفاده نکنید. برای هرس کردن دایرکتوری کَش محلی به یک اندازهٔ مشخص، از CCACHE_MAXSIZE=SIZE ccache -c استفاده کنید.
--trim-max-size SIZE
--trim-method METHOD
atime
mtime
--trim-recompress LEVEL
گزینههای اسکریپتنویسی یا اشکالزدایی (Options for scripting or debugging)
--checksum-file PATH
--extract-result PATH
--format FORMAT
tab
json
-k KEY, --get-config KEY
--hash-file PATH
--inspect PATH
--print-log-stats
--print-stats
--print-version
هنگامی که ccache به عنوان یک کامپایلر اجرا میشود، معمولاً همان گزینههای خط فرمانی را دریافت میکند که کامپایلرِ مورد استفادهٔ شما میگیرد. تنها استثنا در این مورد، گزینهٔ --ccache-skip است. از این گزینه میتوان برای واداشتن ccache به پرهیز از تفسیر گزینهٔ بعدی به هر نحو و ارسال مستقیم و دستنخوردهٔ آن به کامپایلر استفاده کرد.
نکته
گزینهٔ
--ccache-skip در
حال حاضر
تنها به ccache
میگوید که
گزینهٔ
بعدی
را به عنوان
یک گزینهٔ
ویژهٔ
کامپایلر
تفسیر نکند
— این گزینه
همچنان در
هش حالت
مستقیم (direct mode hash)
گنجانده
خواهد شد.
دلیل اهمیت این موضوع این است که ccache باید خط فرمان را تجزیه کرده و مشخص کند چه چیزی نام فایل ورودی و چه چیزی گزینهٔ کامپایلر است، زیرا برای تعیین نام فایل شیء (object file) حاصل (از میان موارد دیگر) به نام فایل ورودی نیاز دارد. روش اکتشافی که ccache هنگام تجزیهٔ خط فرمان استفاده میکند این است که با هر آرگومانی که به عنوان یک فایل وجود داشته باشد، به عنوان نام فایل ورودی برخورد میشود. با استفاده از --ccache-skip میتوانید اجبار کنید که با یک گزینه به عنوان نام فایل ورودی برخورد نشود و در عوض به عنوان یک گزینهٔ خط فرمان به کامپایلر فرستاده شود.
مورد دیگری که --ccache-skip میتواند مفید باشد زمانی است که ccache یک گزینه را به طور ویژه تفسیر میکند در حالی که نباید چنین کند، چرا که آن گزینه برای کامپایلر شما معنایی متفاوت از آنچه ccache میپندارد دارد.
همچنین نگاه کنید به ignore_options.
پیکربندی (CONFIGURATION)
میتوانید رفتار ccache را با استفاده از فایلهای پیکربندی و متغیرهای محیطی سفارشیسازی کنید. گزینههای پیکربندی به ترتیب اولویت زیر پردازش میشوند (بالاترین اولویت در ابتدا):
ccache debug=true compiler_check="%compiler% --version" gcc -c example.c
استثنا: اگر متغیر محیطی CCACHE_CONFIGPATH تنظیم شده باشد، مشخصکنندهٔ تنها فایل پیکربندیای خواهد بود که خوانده میشود (متغیرهای محیطی و تنظیمات خط فرمان همچنان اعمال خواهند شد)..SS "فایل پیکربندی اختصاصی حافظهٔ نهان (Cache-specific configuration file)"
مکان فایل پیکربندی اختصاصی حافظهٔ نهان در سیستمهای غیرویندوزی به این صورت تعیین میشود:
در ویندوز، روش مورد استفاده برای یافتن فایل پیکربندی بدین صورت است:
همچنین برای چگونگی تعیین مکان دایرکتوری حافظهٔ نهان، گزینهٔ پیکربندی cache_dir را ببینید..SS "فایل پیکربندی ویژه دایرکتوری"
دستور Ccache برای یافتن فایل ccache.conf (جدا از فایل پیکربندی ویژه کش که در بالا شرح داده شد) در دایرکتوری کاری فعلی یا هر دایرکتوری والد جستجو میکند. مالک فایل پیداشده باید کاربر مؤثر باشد و فایل نباید برای همه قابل نوشتن باشد؛ در غیر این صورت ccache با یک خطا متوقف خواهد شد. جستجو با رسیدن به موارد زیر متوقف میشود:
بهطور پیشفرض، این فایل نمیتواند «گزینههای ناامن» را تنظیم کند، یعنی گزینههایی که بر تعیین اینکه چه دستورهایی اجرا شوند، چه فایلهایی (بهجز ورودیهای کش) نوشته شوند و از کدام فضای ذخیرهسازی راهدور استفاده شود اثر میگذارند. میتوان با افزودن یک ورودی به safe_dirs، گزینههای ناامن را مجاز کرد.
ساختار مقادیر پیکربندی
تمام مقادیر پیکربندی از بسط متغیرهای محیطی پشتیبانی میکنند. ساختار آن شبیه به ساختار پوسته POSIX است: $VAR یا ${VAR}. هر دو نگارش به مقدار متغیر محیطی VAR بسط مییابند.
دو علامت دلار متوالی ($$) به یک علامت دلار تکی ($) بسط مییابند.
ساختار فایل پیکربندی
فایلهای پیکربندی در قالب سادهٔ “key = value” هستند، یک گزینه در هر خط. خطوطی که با علامت هش (#) آغاز میشوند، توضیح هستند. خطوط خالی و همچنین فاصلههای خالی پیرامون کلیدها و مقادیر نادیده گرفته میشوند. مثال:
# Set maximum cache size to 10 GB: max_size = 10GB
مقادیر چندخطی
مقادیر میتوانند با استفاده از ادامه بر پایهٔ تورفتگی، چند خط را در بر بگیرند. خطوطی که با نویسهٔ فاصله (فاصله یا تب) آغاز میشوند بهعنوان خطوط ادامه در نظر گرفته شده و با یک فاصلهٔ تکی به مقدار قبلی متصل میشوند. توضیحات و خطوط خالی درون یک مقدار چندخطی نادیده گرفته میشوند. برای مثال:
ignore_options = -Wall -Wextra # This is a comment within the value -pedantic # This ends the multi-line value compiler = gcc
این معادل است با:
ignore_options = -Wall -Wextra -pedantic compiler = gcc
مقادیر چندخطی بهویژه برای گزینههایی که چندین مورد را میپذیرند مفید هستند.
مقادیر بولی
برخی از گزینههای پیکربندی مقادیر بولی (یعنی مقادیر درستی) هستند. در یک فایل پیکربندی، چنین مقادیری باید روی رشتهٔ true یا false تنظیم شوند. برای متغیرهای محیطی متناظر، معناشناسی کمی متفاوت است:
هر متغیر محیطی بولی همچنین دارای یک شکل نفیشده است که با CCACHE_NO آغاز میشود. برای نمونه، CCACHE_COMPRESS میتواند برای اجبار فشردهسازی تنظیم شود و CCACHE_NOCOMPRESS میتواند برای اجبار عدم فشردهسازی تنظیم گردد..SS "فهرستهای مسیر (Path lists)"
گزینههایی که فهرستی از مسیرها را تعریف میکنند، ورودیهایشان با ; در Windows و : در سایر سیستمها از یکدیگر جدا میشوند.
گزینههای پیکربندی (Configuration options)
در زیر فهرستی از گزینههای پیکربندی موجود آورده شده است. نام متغیر محیطی متناظر در پرانتز پس از کلید هر گزینهٔ پیکربندی مشخص شده است.
absolute_paths_in_stderr (CCACHE_ABSSTDERR)
base_dir (CCACHE_BASEDIR)
این قابلیت اشتراکگذاری کَش را بین کامپایلها در دایرکتوریهای مختلف امکانپذیر میسازد، حتی اگر پروژه از مسیرهای مطلق استفاده کند. برای جزئیات بیشتر به بخش COMPILING IN DIFFERENT DIRECTORIES_ مراجعه کنید. در صورت خالی بودن (حالت پیشفرض)، هیچ بازنویسی مسیری رخ نمیدهد.
از بهکارگیری / به عنوان دایرکتوری پایه خودداری کنید، چرا که این کار مسیرهای سرایند سیستمی را نیز بازنویسی میکند که معمولاً نتیجهای معکوس دارد.
سناریوی نمونه: Alice در /home/alice/project1/build کار میکند و فرایند کامپایل را به این صورت انجام میدهد:
ccache gcc -I/usr/include/example -I/home/alice/project2/include -c /home/alice/project1/src/example.c
در اینجا آنچه ccache واقعاً برای تنظیمات مختلف base_dir اجرا خواهد کرد آورده شده است:
# Current working directory: /home/alice/project1/build # With "base_dir = /": gcc -I../../../../usr/include/example -I../../project2/include -c ../src/example.c # With "base_dir = /home" or "base_dir = /home/alice": gcc -I/usr/include/example -I../../project2/include -c ../src/example.c # With "base_dir = /home/alice/project1" or "base_dir = /home/alice/project1/src": gcc -I/usr/include/example -I/home/alice/project2/include -c ../src/example.c
اگر Bob همان پروژهها را در /home/bob/stuff ذخیره کند و هر دو کاربر base_dir را روی /home یا /home/$USER تنظیم نمایند، به دلیل یکسان بودن خطوط فرمان بازنویسیشده، از اصابتهای کَش (cache hits) مشترک بهرهمند خواهند شد:
# Current working directory: /home/bob/stuff/project1/build # With "base_dir = /home" or "base_dir = /home/bob": gcc -I/usr/include/example -I../../project2/include -c ../src/example.c
بدون base_dir، به دلیل تفاوت در مسیرهای مطلق، عدم اصابت کَش (cache miss) رخ خواهد داد. با تنظیم base_dir روی /، به دلیل تفاوت در مسیر نسبی به /usr/include/example عدم اصابت کَش پیش میآید. با تنظیم base_dir روی /home/bob/stuff/project1 نیز عدم اصابت رخ میدهد زیرا مسیر به project2 یک مسیر مطلق متفاوت خواهد بود.
هشدار
بازنویسی
مسیرهای
مطلق به
نسبی تا حدی
یک راهکار
شکننده (brittle hack)
است.
این روش در
بسیاری از
موارد به
خوبی کار
میکند،
اما ممکن
است شرایطی
پیش بیاید
که کار مختل
شود. یک مشکل
شناختهشده
این است که
مسیرهای
مطلق در
فایلهای
وابستگی
بازتولید
نمیشوند،
که این امر
میتواند
تشخیص
وابستگی را
در
ابزارهایی
مانند Make و Ninja
به هم بریزد.
در صورت
امکان، از
همان ابتدا
به جای
استفاده از
base_dir از
مسیرهای
نسبی
استفاده
کنید.
cache_dir (CCACHE_DIR)
در سیستمهای غیر Windows، در صورت وجود چنین دایرکتوریای مقدار پیشفرض $HOME/.ccache است؛ در غیر این صورت اگر XDG_CACHE_HOME تنظیم شده باشد $XDG_CACHE_HOME/ccache، وگرنه $HOME/Library/Caches/ccache (در macOS) یا $HOME/.cache/ccache (در سایر سیستمها) خواهد بود.
در Windows، پیشفرض %USERPROFILE%\.ccache است اگر چنین دایرکتوریای وجود داشته باشد، در غیر این صورت %LOCALAPPDATA%\ccache خواهد بود.
هشدار
نسخههای
پیشین ccache به
طور
پیشفرض در
Windows کَش را در
%APPDATA%\ccache
ذخیره
میکردند.
این امر
میتواند
منجر به
انتقال
فایلهای
حجیم کَش از
طریق شبکه
در
محیطهای
دامنهای (domain)
و مشکلات
مشابه شود.
لطفاً این
دایرکتوری
را برای
دایرکتوریهای
کَش بررسی
کرده و
آنها یا کل
دایرکتوری
را حذف
کنید، یا
آنها را به
دایرکتوری
%LOCALAPPDATA%\ccache
منتقل
نمایید.
همچنین بخش Cache-specific configuration file را ببینید.
ceiling_dirs (CCACHE_CEILING_DIRS)
ceiling_markers (CCACHE_CEILING_MARKERS)
compiler (CCACHE_COMPILER or (منسوخشده) CCACHE_CC)
compiler_check (CCACHE_COMPILERCHECK)
content
mtime
none
string:value
a command string
%compiler% -v
%compiler% -dumpmachine; %compiler% -dumpversion
باید اطمینان حاصل کنید که دستور مشخصشده تا حد امکان سریع باشد زیرا برای هر بار فراخوانی ccache یک بار اجرا خواهد شد.
شناسایی کامپایلر با استفاده از یک دستور در صورتی مفید است که بخواهید از عدم اصابتهای کَش در شرایطی که کامپایلر بازسازی شده اما تغییر نکرده است، جلوگیری نمایید.
حالت دیگر زمانی است که کامپایلر (از دید ccache) در واقع کامپایلر واقعی نبوده بلکه یک پوششدهندهٔ دیگر کامپایلر (compiler wrapper) است — در این صورت، روش پیشفرض mtime مقدار mtime و اندازهٔ پوششدهندهٔ دیگر را هش میکند، بدین معنا که ccache قادر به تشخیص ارتقای کامپایلر نخواهد بود. بنابراین استفاده از یک دستور مناسب برای شناسایی کامپایلر امنتر است، اما کُندتر نیز خواهد بود؛ از این رو باید در صورت امکان، ادامهٔ استفاده از روش mtime در ترکیب با گزینهٔ prefix_command را مد نظر قرار دهید. بخش USING CCACHE WITH OTHER COMPILER WRAPPERS را ببینید.
compiler_type (CCACHE_COMPILERTYPE)
auto
clang
clang-cl
gcc
icl
icx
icx-cl
msvc
nvcc
qcc
other
compression (CCACHE_COMPRESS یا CCACHE_NOCOMPRESS، بخش Boolean values در بالا را ببینید)
فشردهسازی با استفاده از الگوریتم Zstandard انجام میشود. این الگوریتم به اندازهٔ کافی سریع است و دلیل چندانی برای غیرفعال کردن فشردهسازی جهت دستیابی به عملکرد بیشتر وجود ندارد. یک استثنا زمانی است که کَش روی یک سیستم فایل فشردهشده قرار دارد، که در این حالت مسلماً فشردهسازی انجامشده توسط ccache تکراری و زائد است.
در صورت فعال بودن شبیهسازی فایل (گزینهٔ file_clone) یا پیوند سخت (گزینهٔ hard_link)، فشردهسازی غیرفعال خواهد شد.
compression_level (CCACHE_COMPRESSLEVEL)
معناشناسی compression_level:
> 0
< 0
0 (پیشفرض)
برای اطلاعات بیشتر مستندات Zstandard https://facebook.github.io/zstd را ببینید.
debug (CCACHE_DEBUG یا CCACHE_NODEBUG، بخش Boolean values در بالا را ببینید)
debug_dir (CCACHE_DEBUGDIR)
به عنوان مثال، اگر debug_dir روی /example تنظیم شده باشد، دایرکتوری کاری فعلی /home/user باشد و فایل شیء build/output.o باشد، گزارش اشکالزدایی در /example/home/user/build/output.o.ccache-log نوشته خواهد شد. همچنین بخش CACHE DEBUGGING را ببینید.
debug_level (CCACHE_DEBUGLEVEL)
depend_mode (CCACHE_DEPEND یا CCACHE_NODEPEND، بخش Boolean values در بالا را ببینید)
direct_mode (CCACHE_DIRECT یا CCACHE_NODIRECT، بخش Boolean values در بالا را ببینید)
disable (CCACHE_DISABLE یا CCACHE_NODISABLE، بخش Boolean values در بالا را ببینید)
همچنین میتوان با افزودن رشتهٔ ccache:disable در یک کامنت درون 4096 بایت نخست فایل سورس کد، ccache را برای یک فایل سورس کد مشخص غیرفعال کرد.
extra_files_to_hash (CCACHE_EXTRAFILES)
file_clone (CCACHE_FILECLONE یا CCACHE_NOFILECLONE، بخش Boolean values در بالا را ببینید)
فایلهای ذخیرهشده از طریق شبیهسازی را نمیتوان فشرده کرد، بنابراین در صورت فعال بودن این گزینه احتمالاً اندازهٔ کَش به میزان چشمگیری بزرگتر خواهد بود. با این حال، بسته به مورد کاربرد، عملکرد ممکن است بهبود یابد.
برخلاف گزینهٔ hard_link، استفاده از file_clone کاملاً امن است، اما همهٔ سیستمهای فایل از این ویژگی پشتیبانی نمیکنند. برای چنین سیستمهای فایلی، ccache به کپی کردن معمولی (یا پیوندهای سخت در صورت فعال بودن hard_link) بازمیگردد.
hard_link (CCACHE_HARDLINK یا CCACHE_NOHARDLINK، بخش Boolean values در بالا را ببینید)
فایلهای ذخیرهشده از طریق پیوندهای سخت را نمیتوان فشرده کرد، بنابراین در صورت فعال بودن این گزینه به احتمال قوی اندازهٔ کَش به طرز چشمگیری بزرگتر خواهد بود. با این حال، بسته به مورد کاربرد، کارایی ممکن است بهبود پیدا کند.
هشدار
این گزینه را فعال نکنید مگر اینکه از این نکات آگاه باشید:
hash_dir (CCACHE_HASHDIR یا CCACHE_NOHASHDIR، بخش Boolean values در بالا را ببینید)
دلیل گنجاندن CWD در هش به طور پیشفرض، جلوگیری از بروز مشکل در ذخیرهسازی دایرکتوری کاری فعلی در اطلاعات اشکالزدایی یک فایل شیء است، که میتواند باعث شود ccache فایل شیء کَششدهای را بازگرداند که دایرکتوری کاری در اطلاعات اشکالزدایی آن به اشتباه تنظیم شده است.
اگر برایتان مهم نیست که CWD در اطلاعات اشکالزدایی ممکن است نادرست باشد، میتوانید این گزینه را غیرفعال کنید تا هنگام کامپایل یک سورس کد یکسان در دایرکتوریهای متفاوت، اصابتهای کَش دریافت نمایید.
ignore_headers_in_manifest (CCACHE_IGNOREHEADERS)
ignore_options (CCACHE_IGNOREOPTIONS)
inode_cache (CCACHE_INODECACHE یا CCACHE_NOINODECACHE، بخش Boolean values در بالا را ببینید)
نکته
پشتیبانی از ویژگی کَش اینود در Windows آزمایشی است. در Windows مقدار پیشفرض false است.
keep_comments_cpp (CCACHE_COMMENTS یا CCACHE_NOCOMMENTS، بخش Boolean values در بالا را ببینید)
libexec_dirs (CCACHE_LIBEXEC_DIRS)
log_file (CCACHE_LOGFILE)
اگر روی syslog تنظیم شود، ccache به جای فایل، گزارشها را با استفاده از syslog() ثبت میکند. اگر از rsyslogd استفاده میکنید، میتوانید موردی مانند این را به /etc/rsyslog.conf یا فایلی درون /etc/rsyslog.d اضافه کنید:
# log ccache to file :programname, isequal, "ccache" /var/log/ccache # remove from syslog & ~
max_files (CCACHE_MAXFILES)
max_size (CCACHE_MAXSIZE)
msvc_dep_prefix (CCACHE_MSVC_DEP_PREFIX)
msvc_utf8 (CCACHE_MSVC_UTF8)
namespace (CCACHE_NAMESPACE)
به عنوان مثال، اگر از یک کَش محلی یکسان برای چندین پروژهٔ مجزا استفاده میکنید، میتوانید برای هر کدام یک رشتهٔ فضای نام منحصربهفرد اختصاص دهید. این امر به شما امکان میدهد در صورت متوقف کردن کار بر روی یک پروژهٔ خاص، ورودیهای کَش متعلق به آن را حذف کنید.
path (CCACHE_PATH)
pch_external_checksum (CCACHE_PCH_EXTSUM یا CCACHE_NOPCH_EXTSUM، بخش Boolean values در بالا را ببینید)
prefix_command (CCACHE_PREFIX)
prefix_command_cpp (CCACHE_PREFIX_CPP)
read_only (CCACHE_READONLY یا CCACHE_NOREADONLY، بخش Boolean values در بالا را ببینید)
اگر به این دلیل از این گزینه استفاده میکنید که دایرکتوری ccache شما فقطخواندنی است، باید temporary_dir را تنظیم نمایید چرا که در غیر این صورت ccache در ایجاد فایلهای موقت با شکست مواجه خواهد شد. همچنین ممکن است مایل باشید stats را روی false بگذارید تا ccache حتی برای بهروزرسانی فایلهای آمار تلاشی نکند.
read_only_direct (CCACHE_READONLY_DIRECT یا CCACHE_NOREADONLY_DIRECT، بخش Boolean values در بالا را ببینید)
recache (CCACHE_RECACHE یا CCACHE_NORECACHE، بخش Boolean values در بالا را ببینید)
remote_only (CCACHE_REMOTE_ONLY یا CCACHE_NOREMOTE_ONLY، بخش Boolean values در بالا را ببینید)
remote_storage (CCACHE_REMOTE_STORAGE)
مثالها:
remote_storage = file:/shared/nfs/directory+` remote_storage = file:///shared/nfs/one read-only file:///shared/nfs/two remote_storage = file:///Z:/example/windows/folder remote_storage = http://example.com/cache remote_storage = redis://example.com
نکته
در
نسخههای
پیشین ccache،
این گزینه
secondary_storage (CCACHE_SECONDARY_STORAGE)
نامیده
میشد که
هنوز هم
میتواند
به عنوان یک
نام مستعار
به کار رود.
reshare (CCACHE_RESHARE یا CCACHE_NORESHARE، بخش Boolean values در بالا را ببینید)
response_file_format (CCACHE_RESPONSE_FILE_FORMAT)
auto
posix
windows
safe_dirs (CCACHE_SAFE_DIRS)
مقادیر مجاز فهرست: * با هر دایرکتوری مطابقت دارد. یک مسیر مطلق که با /* خاتمه یابد با تمام زیردایرکتوریهای (در هر عمقی) زیر آن مسیر منطبق است. یک مسیر مطلق که به /* ختم نشود تنها با همان دایرکتوری مطابقت دارد.
sloppiness (CCACHE_SLOPPINESS)
clang_index_store
اثر: گزینههای -index-store-path و -index-unit-output-path را هنگام هش کردن نادیده میگیرد.
بدهبستان: نمایه (Index) در صورت اصابت کَش به درستی بهروزرسانی نخواهد شد.
file_stat_matches
اثر: از برچسبهای زمانی فایل به جای محتوا برای اعتبارسنجی کَش استفاده میکند.
بدهبستان: ممکن است تغییرات محتوا با برچسبهای زمانی یکسان نادیده گرفته شوند.
file_stat_matches_ctime
اثر: در صورت فعال بودن file_stat_matches، زمان تغییر وضعیت (ctime) را نادیده میگیرد.
بدهبستان: ممکن است برخی از تغییرات سیستم فایل از دست بروند.
gcno_cwd
اثر: دایرکتوری فعلی را هنگام ایجاد فایلهای .gcno نادیده میگیرد (-ftest-coverage). همچنین در صورت استفاده از -fprofile-abs-path، هش کردن دایرکتوری کاری فعلی را غیرفعال میسازد.
بدهبستان: اطلاعات دایرکتوری در فایلهای پوشش کد ممکن است نادرست باشد.
نکته
روی --coverage بیتأثیر است (زیرا متضمن -fprofile-arcs است).
incbin
اثر: امکان کَش کردن فایلهای حاوی دستورات .incbin را فراهم میکند.
بدهبستان: تغییرات در فایلهای باینری ضمیمهشده شناسایی نخواهد شد.
include_file_ctime
اثر: هنگام بررسی تغییرات اخیر، زمان تغییر وضعیت فایل را نادیده میگیرد.
بدهبستان: ممکن است تغییرات اخیر در فایلهای سورس نادیده گرفته شوند.
include_file_mtime
اثر: هنگام بررسی تغییرات اخیر، زمان ویرایش فایل را نادیده میگیرد.
بدهبستان: ممکن است ویرایشهای اخیر در فایلهای سورس نادیده گرفته شوند.
ivfsoverlay
اثر: گزینهٔ سیستم فایل مجازی -ivfsoverlay را نادیده میگیرد.
بدهبستان: ممکن است تغییرات مربوط به VFS شناسایی نشوند.
locale
اثر: متغیرهای محیطی locale را نادیده میگیرد (LANG، LC_ALL، LC_CTYPE، LC_MESSAGES).
بدهبستان: پیامهای هشدار کامپایلر ممکن است بین ساختهای کَششده و تازه تفاوت داشته باشند.
modules
اثر: هنگام استفاده از ماژولهای C++ امکان کَش کردن را فراهم میآورد.
بدهبستان: ممکن است تغییرات در وضعیت درونی ماژول تشخیص داده نشود.
برای جزئیات بیشتر بخش C++ MODULES را ببینید.
pch_defines
اثر: بررسی دستورات #define در سرایندهای از پیشکامپایلشده را آسانتر میگیرد.
بدهبستان: ممکن است برخی از تغییرات در تعاریف ماکرو شناسایی نشوند.
برای جزئیات بیشتر بخش PRECOMPILED HEADERS را ببینید.
random_seed
اثر: مقادیر تصادفی seed را در هش کامپایل نادیده میگیرد.
بدهبستان: ساختها ممکن است کاملاً بازتولیدپذیر نباشند.
system_headers
اثر: در حالت مستقیم تنها سرایندهای غیر سیستمی را ردیابی میکند.
بدهبستان: تغییرات سرایندهای سیستمی را که بر کامپایل اثر میگذارند تشخیص نمیدهد.
محدودیتها: تنها برای کامپایلرهای مشابه GCC پشتیبانی میشود (نه MSVC). سرایندهای سیستمی همچنان در حالت پیشپردازنده بررسی میشوند.
همچنین گزینهٔ ignore_headers_in_manifest را ببینید.
time_macros
اثر: ماکروهای __DATE__، __TIME__ و __TIMESTAMP__ را در سورس کد نادیده میگیرد.
بدهبستان: مقادیر زمانی در خروجی متعلق به کامپایل کَششده خواهند بود.
stats (CCACHE_STATS یا CCACHE_NOSTATS، بخش Boolean values در بالا را ببینید)
stats_log (CCACHE_STATSLOG)
نکته
سطرهایی در گزارش آمار که با علامت هش (#) آغاز میشوند، کامنت هستند.
temporary_dir (CCACHE_TEMPDIR)
نکته
در
نسخههای
پیشین ccache،
مقدار CCACHE_TEMPDIR
باید روی
همان سیستم
فایلِ مسیر
CCACHE_DIR قرار
میداشت،
اما این
محدودیت
برطرف شده
است.
umask (CCACHE_UMASK)
برای غیرفعالکردن کامل ccache برای همهٔ فراخوانیها، disable = true (CCACHE_DISABLE=1) را تنظیم کنید. همچنین میتوانید با افزودن رشتهٔ ccache:disable در یک توضیح (کامنت) در ۴۰۹۶ بایت نخست فایل، ccache را برای یک فایل کد منبع خاص غیرفعال کنید. در حالت اخیر، شمارندهٔ آماری Ccache disabled افزایش خواهد یافت.
پشتبانههای ذخیرهسازی دوردست (REMOTE STORAGE BACKENDS)
گزینهٔ remote_storage به شما امکان میدهد ccache را برای استفاده از یک یا چند پشتبانهٔ ذخیرهسازی دوردست پیکربندی کنید. بهطور پیشفرض، دایرکتوری محلی حافظهٔ پنهان واقع در cache_dir در ابتدا و ذخیرهسازی دوردست در اولویت بعدی پرسوجو میشوند، اما میتوان remote_only را روی true تنظیم کرد تا ذخیرهسازی محلی غیرفعال شود. توجه داشته باشید که شمارندههای آماری حافظهٔ پنهان همچنان در دایرکتوری محلی حافظهٔ پنهان نگهداری خواهند شد — پشتبانههای ذخیرهسازی دوردست تنها نتایج کامپایل و مانیفستها را ذخیره میکنند.
فرایند کمکی ذخیرهسازی (Storage helper process)
ccache میتواند یک فرایند محلی کمکی ذخیرهسازیِ طولانیزیست (که جداگانه نصب میشود) برای مدیریت ارتباط با ذخیرهسازی دوردست ایجاد کند. کمکیهای ذخیرهسازی برای بهرهوری اتصالات دوردست را باز نگه میدارند و پس از مدتی عدم فعالیت خاتمه مییابند. برای فهرستی از کمکیهای شناختهشده، Storage helpers https://ccache.dev/storage-helpers.html را ببینید.
برنامهٔ کمکی ذخیرهسازی ccache-storage-<scheme> نام دارد، که در آن <scheme> بخش طرحوارهٔ یک URL است، مانند https. این برنامه میتواند در این مکانها قرار گیرد (به ترتیب اولویت):
اگر برنامه پیدا نشود، ccache در صورت دردسترس بودن به یکی از پشتبانههای توکار (builtin) بازمیگردد؛ در غیر این صورت ccache با یک خطا خارج میشود.
ساختار پیکربندی (Configuration syntax)
یک پشتبانهٔ ذخیرهسازی دوردست با یک URL مشخص میشود و میتواند به دنبال آن فهرستی از ویژگیها (key=value) و صفتهای سفارشی (@key=value) که با نویسههای فاصلهساز (whitespace) از هم جدا شدهاند قرار گیرد. نبود =value کوتاهنوشتی برای تنظیم مقدار روی true است. در صورتی که مقادیر شامل نویسههای %، | یا نویسههای فاصلهساز باشند، باید بهصورت percent-encoded https://en.wikipedia.org/wiki/Percent-encoding باشند. برای سازگاری با نسخههای قدیمیتر ccache، با نویسههای | مانند فاصله رفتار میشود.
ویژگیها (Properties)
مثالها:
مهلتهای زمانی را میتوان با پسوند ms (میلیثانیه)، s (ثانیه)، m (دقیقه)، h (ساعت) یا d (روز) مشخص کرد..SS "ویژگیهای سفارشی (Custom attributes)"
ویژگیهای سفارشی در قالب @key=value مختص پیادهسازی هر storage helper هستند. برای آگاهی از ویژگیهای دردسترس به مستندات backend مراجعه کنید. مثالها:
تعامل فضای ذخیرهسازی (Storage interaction)
جدول زیر تعامل میان فضای ذخیرهسازی محلی و دوردست را هنگام یافتشدن (hit) و یافتنشدن (miss) در حافظهٔ نهان در صورتی که remote_only برابر false باشد (که پیشفرض است) شرح میدهد:
| فضای ذخیرهسازی محلی | فضای ذخیرهسازی دوردست | آنچه رخ میدهد |
| یافتنشدن (miss) | یافتنشدن (miss) | کامپایل، نوشتن در محلی، نوشتن در دوردست[1] |
| یافتنشدن (miss) | یافتشدن (hit) | خواندن از دوردست، نوشتن در محلی |
| یافتشدن (hit) | - | خواندن از محلی، بدون نوشتن در دوردست[2] |
[1] مگر
اینکه
فضای
ذخیرهسازی
دوردست
دارای
ویژگی
read-only=true باشد.
[2] مگر اینکه
فضای
ذخیرهسازی
محلی طوری
تنظیم شده
باشد که
موارد
یافتشده
در حافظهٔ
نهان را با
گزینهٔ reshare
به اشتراک
بگذارد.
اگر remote_only برابر true باشد:
| فضای ذخیرهسازی محلی | فضای ذخیرهسازی دوردست | آنچه رخ میدهد |
| - | یافتنشدن (miss) | کامپایل، نوشتن در دوردست، بدون نوشتن در محلی |
| - | یافتشدن (hit) | خواندن از دوردست، بدون نوشتن در محلی |
قالب URL: file:DIRECTORY یا file://[HOST]DIRECTORY
این پشتبند دادهها را به صورت فایلهای مجزا در یک ساختار دایرکتوری زیر DIRECTORY ذخیره میکند، مشابه (اما نه یکسان) با ذخیرهسازی کَش محلی. یک کاربرد رایج برای این پشتبند، اشتراکگذاری کَش در یک دایرکتوری NFS است. DIRECTORY باید با یک اسلش آغاز شود. HOST میتواند رشتهای خالی یا localhost باشد. در Windows، همچنین HOST میتواند نام سروری باشد که یک پوشهٔ اشتراکی را میزبانی میکند.
مهم
ccache
هیچگونه
پاکسازی
در فضای
ذخیرهسازی
انجام
نخواهد داد
— این کار
باید
از روشهای
دیگر انجام
شود، به
عنوان مثال
با اجرای
دورهای
ccache --trim-dir.
مثالها:
ویژگیهای اختیاری:
پیشفرض subdirs است.
قالب URL: crsh:IPC_ENDPOINT
این بکاند به یک فرایند دستیار ذخیرهسازی ccache (CRSH) که در حال حاضر در حال اجرا است و روی IPC_ENDPOINT (مسیر سوکت یونیکس یا پایپ نامگذاریشدهٔ ویندوز) گوش میدهد، متصل میشود. کاربرد این بخش عمدتاً هنگام توسعه یا اشکالزدایی یک دستیار ذخیرهسازی، یا در برپاسازیهای خاصی است که برنامهٔ دستیار به صورت خارجی اجرا و مدیریت میشود.
مثالها:
بکاند ذخیرهسازی HTTP
هشدار
پشتیبانی توکار از پروتکل HTTP منسوخ شده است و در نسخهٔ بعدی ccache (که صرفاً رفع باگ نباشد) حذف خواهد شد. به جای آن از یک دستیار ذخیرهسازی راه دور استفاده کنید.
قالب URL: http://HOST[:PORT][/PATH]
این بکاند دادهها را در یک سرور سازگار با HTTP ذخیره میکند. متدهای HTTP مورد نیاز شامل GET، PUT و DELETE هستند.
مهم
برنامه ccache هیچگونه پاکسازیای روی فضای ذخیرهسازی انجام نخواهد داد — این کار باید به روشهای دیگر انجام شود، به عنوان مثال با اجرای دورهای ccache --trim-dir.
نکته
پروتکل HTTPS پشتیبانی نمیشود.
توصیه
برای
نکاتی
پیرامون
نحوهٔ
راهاندازی
سرور HTTP جهت
استفاده با
ccache،
راهنمای
راهاندازی
ذخیرهسازی
HTTP https://ccache.dev/howto/http-storage.html را
ببینید.
مثالها:
ویژگیهای اختیاری:
نکته
برای این که این قابلیت کار کند ممکن است لازم باشد اعتبارسنجی مقادیر action cache را در سرور غیرفعال کنید، زیرا مدخلهای ccache مقادیر معتبر فرادادهٔ نتیجهٔ کنش (action result) نیستند.
مقدار پیشفرض subdirs است.
هشدار
پشتیبانی داخلی از پروتکل Redis منسوخ شده است و در نسخهٔ بعدی غیر رفعباگ (non-bug-fix) ccache حذف خواهد شد. در عوض از یک دستیار ذخیرهسازی دوردست (remote storage helper) استفاده کنید.
قالبهای URL:
redis://[[USERNAME:]PASSWORD@]HOST[:PORT][/DBNUMBER]
redis+unix:SOCKET_PATH[?db=DBNUMBER]
redis+unix://[[USERNAME:]PASSWORD@localhost]SOCKET_PATH[?db=DBNUMBER]
این پشتبند دادهها را در یک کارساز Redis https://redis.io (یا سازگار با Redis) ذخیره میکند. پیادهسازیهایی هم برای ذخیرهسازی مبتنی بر حافظه و هم مبتنی بر دیسک وجود دارد. مقدار پیشفرض PORT برابر 6379 و مقدار پیشفرض DBNUMBER برابر 0 است.
نکته
برنامهٔ ccache
هیچگونه
پاکسازی
در فضای
ذخیرهسازی
Redis انجام
نخواهد
داد، اما
میتوانید
تخلیهٔ
حافظه بر
اساس LRU را
پیکربندی
کنید
https://redis.io/topics/lru-cache.
راهنمایی
برای
نکاتی
دربارهٔ
برپاسازی
کارساز Redis
جهت
استفاده به
همراه ccache، به
نحوهٔ
برپاسازی
ذخیرهسازی
Redis https://ccache.dev/howto/redis-storage.html
مراجعه
کنید.
راهنمایی
میتوانید با استفاده از ویژگی shards که در بخش REMOTE STORAGE BACKENDS شرح داده شده است، خوشهای (کلاستری) از کارسازهای Redis را برپا کنید.
مثالها:
بهطور پیشفرض، ccache محدودیتی ۵ گیگابایتی (5 GB) برای مجموع اندازه فایلها در کَش دارد و هیچ محدودیتی برای تعداد فایلها در نظر نمیگیرد. شما میتوانید با استفاده از گزینههای خط فرمان -M/--max-size و -F/--max-files محدودیتهای متفاوتی را تنظیم کنید. برای مشاهده اندازه کَش و محدودیتهای پیکربندیشده فعلی (علاوه بر آمارهای گوناگون دیگر) از گزینه -s/--show-stats استفاده کنید.
پاکسازی میتواند به دو روش مختلف آغاز شود: خودکار و دستی.
پاکسازی خودکار (Automatic cleanup)
پس از ذخیره یک نتیجه کامپایل جدید در کَش محلی، اگر مقدار max_size یا max_files فراتر رفته باشد، ccache یک پاکسازی خودکار را آغاز میکند. این پاکسازی، مدخلهای کَش را بر اساس زمان تغییر (mtime) فایلهای درون کَش و با ترتیبی تقریبی بر اساس LRU (کمتر اخیراً استفادهشده) حذف میکند. به همین دلیل، ccache زمان تغییر (mtime) فایلهای کَش خواندهشده در هنگام اصابت به کَش (cache hit) را بهروزرسانی میکند تا آنها را به عنوان مواردی که اخیراً استفاده شدهاند علامتگذاری کند.
به دلایل کارایی، هنگام آغاز پاکسازی خودکار تنها مدخلهای موجود در زیرمجموعهای از کَش بررسی میشوند؛ بنابراین قدیمیترین مدخلها لزوماً همیشه ابتدا حذف نمیشوند، اما رفتار کلی برنامه در طول زمان به الگوریتم LRU بسیار نزدیک است.
پاکسازی دستی (Manual cleanup)
برای وادار کردن به پاکسازی کل کَش، دستور ccache --cleanup را اجرا کنید. این کار اطلاعات اندازه کَش را دوباره محاسبه کرده و تضمین میکند که اندازه کَش از max_size و max_files فراتر نرود.
توجه داشته باشید که همانطور که در بخش پاکسازی خودکار در بالا ذکر شد، هیچ تضمینی وجود ندارد که فقط قدیمیترین مدخلها بیرون انداخته شوند. برای پاکسازی و حذف بر اساس سن، از دستور ccache --evict-older-than AGE استفاده کنید.
فشردهسازی کَش (CACHE COMPRESSION)
بهطور پیشفرض، ccache تمام دادههای کَششده را با استفاده از الگوریتم Zstandard http://zstd.net (zstd) در سطح فشردهسازی ۱ فشرده میکند. این الگوریتم بهاندازهای سریع است که فرایند فشردهسازی بهندرت بر کارایی تأثیر میگذارد. ممکن است تنها زمانی مایل به غیرفعالسازی فشردهسازی باشید که کَش شما روی یک فایلسیستم از پیش فشردهشده ذخیره شده باشد، جایی که فشردهسازی ccache تکراری و زائد خواهد بود.
برای جزئیات پیکربندی، compression و compression_level را ببینید.
برای نمایش اطلاعات فشردهسازی از ccache --show-compression استفاده کنید. نمونه خروجی:
Total data: 14.8 GB (16.0 GB disk blocks) Compressed data: 11.3 GB (30.6% of original size) Original size: 36.9 GB Compression ratio: 3.267 x (69.4% space savings) Incompressible data: 3.5 GB
نکات:
میتوانید با استفاده از ccache --recompress دادههای کَششده را با سطوح فشردهسازی متفاوت مجدداً فشرده کنید. تنها فایلهایی که سطح فشردهسازی متفاوتی نسبت به مقدار هدف دارند مجدداً فشرده خواهند شد.
آمار کَش (CACHE STATISTICS)
دستور ccache --show-stats خلاصهای از آمارها شامل اندازه کَش، پاکسازیها (تعداد پاکسازیهای انجامشده، چه بهصورت ضمنی به دلیل رسیدن به حد نصاب اندازه کَش و چه به دلیل فراخوانیهای صریح ccache -c)، نرخ اصابت (hit rate) کلی، نرخ اصابت برای حالتهای مستقیم/پیشپردازششده (direct/preprocessed)، و نرخ اصابت برای فضای ذخیرهسازی محلی و از راه دور را نمایش میدهد.
شمارندههای آماری در طول فرایند ساخت توسط خود ccache استفاده نمیشوند. این بدان معناست که میتوانید بدون تأثیر گذاشتن بر فرایند ساخت، هر زمان که بخواهید با استفاده از ccache --zero-stats آنها را بازنشانی کنید. به عنوان مثال، میتوانید پیش از یک ساخت آنها را بازنشانی کنید تا ccache --show-stats تنها نتایج حاصل از همان ساخت خاص را خلاصه کند. همچنین میتوانید پیش از شروع ساخت، stats_log را تنظیم کرده و سپس ccache --show-log-stats را اجرا کنید تا آمارهای مربوط به آن ساخت خاص را مشاهده نمایید. این روش به شمارندههای آماری اجازه میدهد تا به ردیابی کل طول عمر کَش ادامه دهند و همزمان اطلاعات تفصیلی مربوط به هر ساخت را نیز در اختیارتان بگذارند. یکی دیگر از مزایای stats_log این است که آمارها را بدون تداخل ناشی از سایر ساختهای همزمانی که به همان کَش دسترسی دارند جمعآوری میکند.
این خلاصه همچنین شامل شمارندههایی با عنوان “Errors” و “Uncacheable” است که حاصلجمع شمارندههای جزئیتر هستند. برای مشاهده آن شمارندههای تفصیلی، از پرچم -v/--verbose استفاده کنید. حالت پرگو (verbose) میتواند شمارندههای زیر را نشان دهد:
| شمارنده (Counter) | توضیحات (Description) |
| Autoconf compile/link | کامپایل یا پیوند غیرقابل کَششدن توسط یک آزمون Autoconf. |
| Bad compiler arguments | آرگومان نامعتبر یا بدقواره کامپایلر، مانند نبود مقدار برای گزینهای از کامپایلر که به آرگومان نیاز دارد، یا ناتوانی در خواندن فایلی که توسط آرگومان گزینه کامپایلر مشخص شده است. |
| Called for linking | کامپایلر برای پیوند دادن (linking) فراخوانی شده بود، نه کامپایل. ابزار ccache تنها از کامپایل یک تکفایل پشتیبانی میکند؛ یعنی فراخوانی کامپایلر با گزینه -c برای تولید یک فایل شیء (object file) از یک فایل منبع واحد. |
| Called for preprocessing | کامپایلر برای پیشپردازش فراخوانی شده بود، نه کامپایل. |
| Ccache disabled | ابزار ccache توسط رشته ccache:disable در فایل کد منبع غیرفعال شده بود. |
| Could not use modules | پیششرطهای استفاده از ماژولهای ++C برآورده نشدند. |
| Could not use precompiled header | پیششرطهای استفاده از سرآیندهای پیشکامپایلشده برآورده نشدند. |
| Could not read or parse input file | یک فایل ورودی قابل خواندن یا تجزیه نبود (برای جزئیات گزارش اشکالزدایی را ببینید). |
| Could not write to output file | امکان نوشتن در مسیر خروجی تعیینشده با -o وجود نداشت. |
| Compilation failed | فرایند کامپایل با شکست مواجه شد. هیچ نتیجهای در کَش ذخیره نشد. |
| Compiler check failed | برنامه بررسی کامپایلر که توسط compiler_check (CCACHE_COMPILERCHECK) مشخص شده بود شکست خورد. |
| Compiler output file missing | یکی از فایلهایی که انتظار میرفت توسط کامپایلر تولید شود پس از کامپایل یافت نشد. |
| Compiler produced empty output | فایل خروجی کامپایلر (معمولاً یک فایل شیء) پس از کامپایل خالی بود. |
| Could not find the compiler | کامپایلری که باید اجرا شود پیدا نشد. |
| Error hashing extra file | شکست در خواندن فایلی که توسط extra_files_to_hash (CCACHE_EXTRAFILES) مشخص شده بود. |
| Forced recache | از CCACHE_RECACHE برای بازنویسی یک نتیجه موجود استفاده شد. |
| Input file modified during compilation | یک فایل ورودی در حین کامپایل تغییر یافت. |
| Internal error | خطای غیرمنتظره داخلی، مثلاً به دلیل بروز مشکل در خواندن/نوشتن کَش. |
| Missing cache file | یک فایل بهطور غیرمنتظرهای در کَش وجود نداشت. این مورد تنها در موقعیتهای نادری رخ میدهد، مثلاً هنگامی که یک نمونه از ccache در شرف دریافت فایلی از کَش است در حالی که نمونه دیگری آن فایل را در حین پاکسازی کَش حذف کرده است. |
| Multiple source files | کامپایلر برای کامپایل همزمان چند فایل منبع در یک نوبت فراخوانی شده بود. این کار توسط ccache پشتیبانی نمیشود. |
| No input file | هیچ فایل ورودیای به کامپایلر مشخص نشده بود. |
| Output to stdout | به کامپایلر دستور داده شده بود که با استفاده از -o - خروجی خود را در خروجی استاندارد بنویسد. این کار توسط ccache پشتیبانی نمیشود. |
| Preprocessing failed | پیشپردازش کد منبع با استفاده از گزینه -E کامپایلر با شکست مواجه شد. |
| Unsupported code directive | کدی مانند دستور اسمبلی .incbin یافت شد. این مورد توسط ccache پشتیبانی نمیشود. |
| Unsupported compiler option | یک گزینه کامپایلر که توسط ccache پشتیبانی نمیشود یافت شد. |
| Unsupported environment variable | یک متغیر محیطی که توسط ccache پشتیبانی نمیشود تنظیم شده بود. |
| Unsupported source encoding | فایل منبع (یا یک سرآیند واردشده) دارای کدبندی پشتیبانینشده است. ccache در حال حاضر برای MSVC در صورتی که msvc_utf8 مقدار true داشته باشد، به کد منبع با کدبندی UTF-8 نیاز دارد. |
| Unsupported source language | یک زبان منبع، مثلاً مشخصشده با -x، توسط ccache پشتیبانی نمیشود. |
ابزار ccache تشخیص میدهد چه زمانی کد مشابهی را کامپایل میکنید و از خروجیهای از پیش ذخیرهشده دوباره استفاده میکند. این کار با ایجاد یک هش یکتا (“هش ورودی” یا “input hash”) از اطلاعات گوناگونی که بر کامپایل اثرگذارند انجام میشود. هنگامی که دوباره با همان هش مواجه شود، ccache میتواند تمام خروجیهای درست کامپایلر را از حافظه موقت (cache) بازیابی و ارائه کند.
برای هشکردن، ccache از BLAKE3 https://blake3.io, یک الگوریتم هش رمزنگارانه سریع، استفاده میکند. برای تضمین یکپارچگی دادهها، دادههای کَششده با مجموع مقابلهای XXH3 https://xxhash.com محافظت میشوند تا خرابی دادهها تشخیص داده شود.
ابزار ccache دو راهبرد برای جمعآوری اطلاعاتی که جهت ایجاد کلیدهای جستجوی کَش استفاده میشوند دارد:
حالت مستقیم عموماً سریعتر است زیرا از بار اضافی اجرای پیشپردازنده جلوگیری میکند.
هنگامی که حالت مستقیم نتیجهای در کَش پیدا نکند (cache miss)، ccache به حالت پیشپردازنده بازمیگردد؛ مگر اینکه depend mode فعال باشد. در depend mode، حتی در صورت عدم یافتن در کَش، ccache هرگز پیشپردازنده را اجرا نمیکند. برای جزئیات بیشتر، The depend mode را ببینید.
اطلاعات هششده مشترک (Common hashed information)
اطلاعات زیر همیشه در هش گنجانده میشوند:
حالت پیشپردازنده (The preprocessor mode)
در حالت پیشپردازنده، هش از اطلاعات مشترک و موارد زیر تشکیل میشود:
بر اساس این هش، نتیجه کامپایل ذخیرهشده را میتوان مستقیماً در کَش جستجو کرد..SS "حالت مستقیم (The direct mode)"
در حالت مستقیم، هش از اطلاعات مشترک و موارد زیر تشکیل میشود:
بر اساس این هش، ساختار دادهای به نام “manifest” در کَش جستجو میشود. این مانیفست شامل موارد زیر است:
سپس محتویات فعلی فایلهای include هش شده و با اطلاعات موجود در مانیفست مقایسه میشوند. در صورت وجود تطابق، ccache نتیجهٔ کامپایل را میداند. در صورت عدم تطابق، ccache به اجرای پیشپردازنده بازمیگردد. خروجی پیشپردازنده برای یافتن فایلهای include خواندهشده پردازش میشود. سپس مسیرها و مجموعهای هش آن فایلهای include به همراه اطلاعات مربوط به نتیجهٔ کامپایل تولیدشده در مانیفست ذخیره میشوند.
نکتهای در مورد حالت مستقیم وجود دارد: فایلهای سرآیندی که توسط کامپایلر استفاده شدهاند ثبت میشوند، اما فایلهای سرآیندی که استفاده نشدهاند، اما در صورت وجود داشتن استفاده میشدند، ثبت نمیشوند. برای کاهش این مشکل، ccache وجود دایرکتوریهای مشخصشده با -I و موارد مشابه را در زمان کامپایل ثبت میکند که اکثر موارد را مدیریت میکند. با این حال، هنگامی که ccache بررسی میکند آیا نتیجهای میتواند از کَش برداشته شود یا خیر، در حال حاضر نمیتواند با دقت ۱۰۰٪ بررسی کند که آیا وجود یک فایل سرآیند جدید باید نتیجه را باطل کند یا خیر. در عمل، استفاده از حالت مستقیم در اکثریت قاطع موارد ایمن است.
در صورت برقراری هر یک از موارد زیر، حالت مستقیم غیرفعال خواهد شد:
اگر حالت وابستگی فعال باشد، ccache بههیچوجه از پیشپردازنده استفاده نخواهد کرد. هَش استفادهشده برای شناسایی نتایج در حافظه نهان (کَش) بر پایه هش حالت مستقیم توضیح دادهشده در بالا، بهعلاوه اطلاعات مربوط به فایلهای include خواهد بود که از فهرست وابستگی ایجادشده توسط MSVC با /showIncludes، یا فایل وابستگی تولیدشده توسط سایر کامپایلرها با -MD یا -MMD خوانده میشود.
مزایا:
معایب:
در صورت برقراری هر یک از شرایط زیر، حالت وابستگی غیرفعال خواهد شد:
مدیریت فایلهای منبع تازه ایجادشده (HANDLING OF NEWLY CREATED SOURCE FILES)
اگر زمان آخرین تغییر (mtime) یا زمان تغییر وضعیت (ctime) فایل منبع یا یکی از فایلهای include برابر با (یا جدیدتر از) زمان فراخوانی ccache باشد، ccache عملکرد کش کردن را بهطور کامل غیرفعال میکند. این کار به عنوان یک اقدام ایمنی برای جلوگیری از شرایط رقابتی (race condition، پایینتر را ببینید) انجام میشود. در عمل، این موضوع تنها هنگام استفاده از سیستمهای فایلی با دقت تفکیک زمانی (timestamp granularity) بسیار پایین مشکلساز است. میتوانید sloppiness را روی include_file_ctime,include_file_mtime تنظیم کنید تا از این اقدام ایمنی صرفنظر شود.
برای اطلاع، شرایط رقابتی ذکرشده در بالا شامل مراحل زیر است:
برای پی بردن به اینکه ccache دقیقاً چه اطلاعاتی را هش میکند، میتوانید حالت اشکالزدایی را از طریق گزینه پیکربندی debug یا با تنظیم CCACHE_DEBUG در محیط فعال کنید. این کار هنگامی که در حال بررسی علت عدم اصابت کَش (cache hit) هستید میتواند مفید باشد. توجه داشته باشید که کارایی کمی کاهش خواهد یافت.
هنگامی که حالت اشکالزدایی فعال باشد، ccache تا پنج فایل اضافی در کنار فایل شیء (object file) ایجاد میکند:
| نام فایل | سطح اشکالزدایی | توضیحات |
| <objectfile>.<timestamp>.ccache-input-c | 2 | ورودی باینری هششده توسط هر دو حالت مستقیم (direct mode) و حالت پیشپردازنده (preprocessor mode). |
| <objectfile>.<timestamp>.ccache-input-d | 2 | ورودی باینری که تنها توسط حالت مستقیم هش شده است. |
| <objectfile>.<timestamp>.ccache-input-p | 2 | ورودی باینری که تنها توسط حالت پیشپردازنده هش شده است. |
| <objectfile>.<timestamp>.ccache-input-text | 2 | نسخه متنی ترکیبی، خوانا برای انسان و قابل مقایسه (diffable) از سه فایل فوق. |
| <objectfile>.<timestamp>.ccache-log | 1 | لاگ مربوط به این فایل شیء. |
قالب برچسب زمانی به صورت <year><month><day>_<hour><minute><second>_<microsecond> است.
اگر تنها به فایل لاگ نیاز دارید، گزینه debug_level (متغیر محیطی CCACHE_DEBUGLEVEL) را روی 1 تنظیم کنید.
در صورتی که debug_dir (متغیر محیطی CCACHE_DEBUGDIR) تنظیم شده باشد، فایلهای فوق به جای قرارگیری در کنار فایل شیء، با مسیرهای مطلق و کامل در آن دایرکتوری نوشته خواهند شد.
در حالت مستقیم، ccache از هش ۱۶۰ بیتی BLAKE3 روی دادههای “ccache-input-c” + “ccache-input-d” (که در آن + به معنای الحاق است) استفاده میکند، در حالی که در حالت پیشپردازنده از دادههای “ccache-input-c” + “ccache-input-p” استفاده میشود.
فایل “ccache-input-text” یک نسخه متنی ترکیبی از سه فایل ورودی باینری است. این فایل سه بخش دارد (“COMMON”، “DIRECT MODE” و “PREPROCESSOR MODE”) که به نوبه خود شامل حاشیهنویسیهایی هستند که مشخص میکنند چه نوع دادهای در ادامه میآید.
برای اشکالزدایی اینکه چرا برای یک فایل شیء با اصابت کَش مورد انتظار مواجه نمیشوید، میتوانید مراحل زیر را دنبال کنید:
هنگام کامپایل یک کد منبع یکسان در دایرکتوریهای مختلف، اگر مسیرهای مطلق بخشی از هش ورودی شوند، ccache اغلب نمیتواند نتایج ذخیرهشده در حافظه موقت را به اشتراک بگذارد. این مسیرها در موارد زیر ظاهر میشوند:
برای فعال کردن اشتراکگذاری حافظه موقت در دایرکتوریهای ساخت مختلف برای ساختهای اشکالزدایی (با استفاده از -g)، مسیرهای اشکالزدایی را نرمالسازی کنید؛ برای مثال با گزینه GCC به شکل -fdebug-prefix-map=$PWD=. (نگاشت دایرکتوری جاری به نسبی) یا -fdebug-compilation-dir=. (تنظیم دایرکتوری کامپایل). یا به عنوان جایگزین، hash_dir را روی false تنظیم کنید (که هش کردن دایرکتوری را غیرفعال میکند).
برای ساختهایی با مسیرهای مطلق، base_dir را روی یک دایرکتوری والد مشترک تنظیم کنید. Ccache پیش از هش کردن، مسیرهای مطلق زیر این دایرکتوری را به مسیرهای نسبی تبدیل خواهد کرد.
برای مثال، اگر پروژهها در /home/user/projects قرار دارند، base_dir را روی /home/user/projects یا صرفاً /home/user تنظیم کنید.
هدرهای از پیش کامپایلشده (PRECOMPILED HEADERS)
برنامه ccache پشتیبانی محدودی از هدرهای از پیش کامپایلشده (PCH) در GCC و Clang دارد.
پیکربندی لازم:
عیبیابی:
در حال حاضر Ccache از ماژولهای استاندارد C++20 پشتیبانی نمیکند.
با این حال، پشتیبانی محدودی از “Clang modules” (گزینهٔ -fmodules) با این شرایط وجود دارد:
نحوه کارکرد آن به این صورت است:
نکته
حالت پیشپردازنده (preprocessor mode) اطلاعات کافی را برای پشتیبانی ماژول در depend mode فراهم نمیکند. هنگام استفاده از حالت پیشپردازنده، Clang اطلاعات کافی جهت امکان هش کردن فایلهای module.modulemap را ارائه نمیدهد.
اشتراکگذاری کَش محلی (SHARING A LOCAL CACHE)
گروهی از توسعهدهندگان میتوانند با به اشتراکگذاری یک دایرکتوری کَش محلی، نرخ برخورد کَش (cache hit rate) را افزایش دهند. برای به اشتراکگذاری یک کَش محلی بدون عوارض جانبی ناخواسته، باید شرایط زیر برقرار باشد:
find $CCACHE_DIR -type d | xargs chmod g+s
دلیل اجتناب از حالت پیوند سخت (hard link mode) این است که پیوندهای سخت عوارض جانبی ناخواستهای ایجاد میکنند؛ زیرا تمام پیوندها به یک فایل کَششده در برچسب زمانی تغییر (timestamp) آن فایل مشترک هستند. این امر موجب میشود در سیستمهای ساخت مبتنی بر برچسب زمانی، هر زمان که کاربر دیگری به یک فایل موجود پیوند دهد، وابستگیهای کاذب فعال شوند. معمولاً کاربران متوجه خواهند شد که کتابخانهها و فایلهای باینری آنها بدون دلیل مشخصی مجدداً پیوند (relink) داده میشوند.
همچنین ممکن است بخواهید مطمئن شوید که یک دایرکتوری پایه (base directory) بهدرستی تنظیم شده باشد، همانطور که در بخشهای قبلی توضیح داده شد..SH "اشتراکگذاری کَش روی NFS (SHARING A CACHE ON NFS)"
امکان قرار دادن دایرکتوری کَش روی یک سیستم فایل NFS (یا سیستمهای فایل مشابه) وجود دارد، اما به یاد داشته باشید که:
یک ترفند این است که temporary_dir را روی دایرکتوری در میزبان محلی تنظیم کنید تا از ترافیک NFS برای فایلهای موقت جلوگیری شود.
توصیه میشود هنگام استفاده از کَش مشترک، از نسخه یکسان سیستمعامل استفاده شود. اگر نسخههای سیستمعامل متفاوت باشند، احتمالاً فایلهای include سیستم تفاوت خواهند داشت و نرخ اصابت کَش (cache hit) میان سیستمها بسیار کم یا صفر خواهد بود. یک راه برای بهبود نرخ اصابت کَش در این وضعیت، تنظیم sloppiness روی system_headers به منظور نادیده گرفتن سرآیندهای سیستم است.
یک جایگزین برای قرار دادن دایرکتوری اصلی کَش روی NFS، راهاندازی کَش فایل ذخیرهسازی از راه دور (remote storage file cache) است.
استفاده از CCACHE با سایر پوششهای کامپایلر (USING CCACHE WITH OTHER COMPILER WRAPPERS)
روش توصیهشده برای ترکیب ccache با سایر پوششهای کامپایلر (مانند “distcc”) این است که اجازه دهید ccache پوشش کامپایلر را اجرا کند. این کار با تعریف prefix_command انجام میشود، برای نمونه با تنظیم متغیر محیطی CCACHE_PREFIX به نام پوشش (مانند distcc). در این صورت ccache هنگام اجرای کامپایلر، دستور مشخصشده را پیشوند خط فرمان قرار میدهد. برای تعیین چندین دستور پیشوند، prefix_command را به فهرستی از دستورها که با فاصله از هم جدا شدهاند تنظیم کنید.
مگر اینکه compiler_check را روی دستور مناسبی تنظیم کرده باشید (توضیحات مربوط به این گزینه پیکربندی را ببینید)، توصیه نمیشود از قالب ccache anotherwrapper compiler args به عنوان دستور کامپایل استفاده کنید. همچنین توصیه نمیشود از تکنیک ماسکگذاری (masquerading) برای پوشش کامپایلر دیگر استفاده شود. دلیل این است که بهطور پیشفرض، ccache در هر دو حالت به جای کامپایلر واقعی، mtime و اندازه پوشش دیگر را هش میکند، که این یعنی:
نکته جزئی دیگر این است که اگر از prefix_command استفاده شود، ccache هنگام اجرای پیشپردازنده (preprocessor)، پوشش دیگر را فراخوانی نخواهد کرد که این امر کارایی را افزایش میدهد. اگر میخواهید هنگام پیشپردازش نیز پوشش دیگر فراخوانی شود (معمولاً با افزودن -E)، میتوانید از prefix_command_cpp استفاده کنید.
هشدارها (CAVEATS)
عیبیابی (TROUBLESHOOTING)
عمومی (General)
برای درک اقداماتی که ccache انجام میدهد، میتوانید لاگگیری اشکالزدایی را با تنظیم debug روی true یا استفاده از متغیر محیطی CCACHE_DEBUG=1 فعال کنید. برای جزئیات بخش CACHE DEBUGGING را ببینید.
همچنین میتوانید از ccache -s برای مشاهده نرخهای اصابت کَش، دلایل عدم اصابت (miss reasons) و سایر معیارهای کارایی استفاده کنید.
کارایی (Performance)
ابزار ccache بهگونهای طراحی شده است که با حداقل پیکربندی به خوبی کار کند، اما میتوانید کارایی را بیش از این بهینهسازی کنید:
برای نظارت بر اثربخشی کَش، خروجی ccache -s را قبل و بعد از ساختها مقایسه کنید تا مشکلات را شناسایی نمایید.
اگر مقدار “preprocessed cache hits” به جای “direct cache hits” افزایش یابد، ccache در حال بازگشت به حالت کندتر پیشپردازنده است. دلایل این موضوع عبارتند از:
اگر کدهای یکسان منجر به اصابت کَش نمیشوند، برخی از دلایل احتمالی عبارتند از:
شمارندههای خطای متداول:
باید توجه داشت که ccache در برابر مشکلات عمومی ذخیرهسازی آسیبپذیر است. اگر یک فایل شیء معیوب به هر دلیلی وارد کَش شود، مسلماً معیوب باقی خواهد ماند. برخی از دلایل احتمالی برای ایجاد فایلهای شیء نادرست عبارتند از: سختافزار معیوب (دیسک درایو، کنترلکنندهٔ دیسک، حافظه و غیره)، درایورها یا سیستمهای فایل دارای باگ، یک prefix_command نامناسب یا لفاف کامپایلر (compiler wrapper). در صورت بروز این مشکل، سادهترین راه برای رفع آن به این ترتیب است:
یک راهکار جایگزین این است که در صورت عدم تمایل به نگهداری سایر نتایج کَششده، کل کَش را با دستور ccache -C پاک کنید.
تاکنون هیچ مشکلی مبنی بر تولید بازتولیدپذیر فایلهای شیء خراب توسط ccache گزارش نشده است. این بدان معنا نیست که چنین اتفاقی هرگز رخ نمیدهد، بنابراین اگر با موردی تکرارپذیر مواجه شدید، لطفاً آن را گزارش دهید.
اطلاعات بیشتر (MORE INFORMATION)
قدردانیها، اطلاعات فهرست پستی، دستورالعملهای گزارش باگ، کد منبع و موارد دیگر را میتوانید در وبسایت ccache بیابید: https://ccache.dev.
نویسندگان (AUTHORS)
برنامهٔ ccache در ابتدا توسط Andrew Tridgell نوشته شد و در حال حاضر توسط Joel Rosdahl توسعه یافته و نگهداری میشود. برای مشاهدهٔ فهرست مشارکتکنندگان به AUTHORS.txt یا AUTHORS.html و https://ccache.dev/credits.html مراجعه کنید.
| 2026-09-04 | Ccache 4.14 |