Директории-шаблоны и слои хранения

Обновлено 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.

См. также