Директории-шаблоны и слои хранения
Обновлено 5 ноября 2026
Шаблоны образуют дерево, и само дерево — часть описания: директория может быть шаблоном и нести общие условия для всего, что внутри.
Директория как шаблон
Свойства директории описываются в файле .calculate_directory внутри неё. Это обычный заголовок, одна строка (или несколько с переносом через \):
/var/calculate/templates/merge/.calculate_directory
# Calculate append=skip env=install ac_install_merge==on
Заголовок директории наследуется всеми шаблонами внутри: им не нужно повторять env= или ac_*-условия, если они общие. Это основной способ не раздувать заголовки. С path= есть ловушка: он работает, только когда директория сама участвует в наложении (без append=skip). Каталог с append=skip из цепочки выпадает — вместе со своим path=, так что файл без собственного path= попадёт туда, куда его направит имя оставшейся цепочки директорий.
Директории доступны те же параметры, что и файлам, но набор уже: append=, path=, name=, link=, chmod=, chown=, mirror, subvolume, autoupdate, env=, module=, merge=, postmerge=, rebuild=, restart=, start=, stop=. format=, comment=, symbolic, protected, force, run=, exec= в директории не применяются.
Для директории допустимы append=join|remove|skip|clear, а append=replace — только вместе с link= (см. ниже):
- append=skip — директория не переносится в систему (обычно нужно именно это); вместе с ней в путь результатов не попадает и её path=;
- append=clear — очистить содержимое конфигурационной директории;
- append=remove — удалить директорию;
- append=join вместе с link= — перенести в созданную директорию содержимое другой.
link= на директории сочетается только с append=join или append=replace (при replace файлы цели удаляются перед копированием).
Лишние директории
Директория без .calculate_directory не является ошибкой, но и правила для неё нет: утилиты создадут её в системе. Если вы кладёте шаблоны в новую поддиректорию, не забудьте # Calculate append=skip — иначе вместе с настройкой в /etc или в домашней директории появится каталог-«мусор», а при наложении от непривилегированного пользователя движок попытается ещё и изменить его владельца. У директории первого уровня в пользовательском хранилище /var/calculate/templates одного append=skip мало: там же нужна и переменная действия (# Calculate append=skip env=install ac_install_merge==on), иначе молча пропустится всё поддерево. Внутри репозиторных слоёв переменная действия задаётся каталогом события, поэтому там достаточно append=skip.
Именование директорий: <категория>/<пакет>
В директориях настройки пакета (N_ac_install_merge, N_ac_install_unmerge, N_ac_install_patch, …) структура обязана соответствовать пакету:
2_ac_install_merge/
└── sys-libs/
└── ncurses-6.1/
├── .calculate_directory
└── ncurses.sh
Имя директории пакета задаёт связь с пакетом: функции merge(), mergepkg(), pkg() без аргументов берут категорию и имя пакета из пути, отбрасывая префиксы сортировки и версии (05-, -4.6). Присутствие версии в имени — способ привязать шаблон к диапазону версий.
Слои хранения и приоритет
Шаблоны лежат в нескольких «слоях», имена слоёв соответствуют подключённым репозиториям. На реальной системе это выглядит так:
/usr/libexec/calculate/cl-variable --value cl_template_data
calculate:/var/db/repos/calculate/profiles/templates,distros:/var/db/repos/distros/profiles/templates,local:/var/calculate/templates,remote:/var/calculate/remote/templates
- Слои репозиториев (calculate, distros, …) — каталоги profiles/templates подключённых репозиториев. Их создаёт и обновляет дистрибутив: редактировать их нельзя, при следующей синхронизации изменения исчезнут.
- local — /var/calculate/templates, пользовательский слой. Именно сюда кладут свои шаблоны.
- remote — /var/calculate/remote/templates: шаблоны, полученные от сервера Calculate (используется в доменной конфигурации).
- clt — шаблоны-переопределения, лежащие рядом с настраиваемым файлом в /etc с расширением .clt.
Шаблон, оказавшийся в двух слоях с одинаковым адресом (path + + name + + link), выигрывает по приоритету слоя: пользовательский слой перекрывает репозиторий, поэтому переопределить системный шаблон можно, не трогая сам файл.
При настройке выбирается, какие слои участвуют, параметром -T/--templates:
cl-core-setup -n baselayout -T calculate,distros,local
Возможные значения фиксированы: calculate, distros, local, remote, clt и none. Это не имена любых подключённых репозиториев: репозиторий gentoo тоже подключён, но как слой шаблонов не существует, и -T gentoo утилита отвергает. Для настройки профиля пользователя слой clt не участвует.
Порядок внутри дерева
Директории первого уровня задают действие своим заголовком, а не именем: переменная ac_* (или cl_name==) обязана быть в .calculate_directory этого уровня, иначе поддерево молча пропустится. Соглашение N_ac_<действие> нужно для другого: директории обходятся в лексикографическом порядке, поэтому цифра в начале имени задаёт последовательность наложения, а не участвует в выборе действия. Внутри события тот же порядок работает и для файлов: цифровые префиксы (05-rebuild_openrc) — способ задать очерёдность, а не часть имени пакета. Какие бывают действия и кто их включает — в Кто и когда налагает шаблоны.
Если одному файлу нужно несколько правок из разных мест, их можно разложить по файлам, отсортированным по имени: они применятся в алфавитном порядке в пределах одной директории.
Инструмент, который сам пишет шаблоны: cl-kernel
Почти все утилиты шаблоны только накладывают. cl-kernel (пакет sys-apps/calculate-toolkit, скрипт на bash, ставится в /usr/sbin/cl-kernel) делает и то, и другое: он собирает ядро, а ваши изменения конфигурации превращает в обычный шаблон в пользовательском хранилище — /var/calculate/templates/kernel/.
Как это устроено:
- при первом запуске создаётся /var/calculate/templates/kernel/.calculate_directory с заголовком
# Calculate env=install ac_install_patch==on append=skip— переменная действия у директории первого уровня плюс append=skip, чтобы сам каталог не появился в системе; - имя шаблона строится по серии ядра:
10-config-<архитектура>-<MAJOR.MINOR>(для пакетов вида*-sources—10-<имя>-<архитектура>-<MAJOR.MINOR>), поэтому закрепление относится к конкретной версии и не мешает остальным; - в заголовке шаблона — формат и привязка:
# Calculate format=kernel name=.config os_install_arch_machine==<архитектура>&&merge(<категория>/<пакет>)>=<версия>; - содержимое шаблона — только разница между базовой конфигурацией (
make defconfig, уже с наложенными шаблонами) и тем, что получилось у вас: добавленные опции спискомCONFIG_…=…, удалённые — с!перед именем. Формат kernel объединяет, а не переписывает: опции, которых в шаблоне нет, остаются в файле как были; - прежний шаблон той же серии не удаляется, а переезжает в /var/calculate/templates/kernel/backup с заголовком
# Calculate cl_action==skip— остаётся под рукой и при этом не накладывается.
Польза в том, что настройка ядра перестаёт быть частью одной собранной системы. Шаблон переживает переустановку пакета, обновление серии и пересборку: каждый раз он накладывается на свежую базовую конфигурацию. Так же получает итоговый .config и сам cl-kernel: он вызывает cl-core --method core_patch с --pkg-name, --pkg-category, --pkg-version и --pkg-path, указывающим на каталог-дубль, где лежит базовый .config — без сборки ядра. Если запускать этот проход вручную для другого пакета, убедитесь, что для него вообще есть шаблоны действия ac_install_patch: иначе каталог-дубль останется пустым, и это не ошибка, а отсутствие подходящих шаблонов. Общий способ посмотреть результат заранее — в предпросмотре шаблона.
Чтобы перенести закрепление на другие машины, каталог kernel кладут в оверлей (profiles/templates/kernel/) и распространяют как пакет: тогда одинаковые ядра на разных машинах собираются из одного и того же набора шаблонов. Справку по самой утилите читайте на странице о ядре, исходники — в calculate-toolkit.
См. также
- Синтаксис шаблона — параметры заголовка.
- Жизнь файла после шаблона — кому принадлежит созданный файл.
- Шаблон молча не сработал — где смотреть, какой слой участвует.