config.h и redo

12.03.2023

Ко је радио са suckless програмима сигурно зна да се они подешавају изменом заглавља config.h. На пример, комбинације тастера се у програму dwm задају преко низа keys[]:

static const Key keys[] = {
        /* modifier                     key        function        argument */
        { MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
        { MODKEY|ShiftMask,             XK_Return, spawn,          {.v = termcmd } },
/* итд. */

У suckless програмима, иницијално се датотека са подешавањима добија копирањем датотеке config.def.h, која служи као шаблон. Датотека config.h се на крају укључи из изворног кода, па он може директно да користи дефиниције подешавања.

Ова конвенција није природна за систем за изградњу redo. Да би се представило копирање датотеке config.def.h у датотеку config.h, потребно је да redo датотеку config.h забележи као тзв. „генерисану датотеку“. Међутим, чим је корисник измени, она то престаје да буде. Уколико се потом покрене redo, он ће се жалити:

redo: config.h - you modified it; skipping

и увек ће сматрати да одредишта која зависе од ње морају да се наново изграде. Ово не ствара никакав проблем у погледу крајњег резултата, али је сувишно и представља непотребно губљење ресурса.

Једино решење које за сада видим као сврсисходно је да се уведе „посредник“, датотека _config.h, која би била генерисана копирањем датотеке config.h сваки пут када се покрене redo, и којој би се затим одредио статус „свежине“ наредбама

redo-always
redo-stamp <$3

Овај систем сам тренутно применио у мојим програмима који користе redo.

Додатак 2023-03-15: Током дискусије на redo групи, сазнао сам за постојање наредбе redo-ifcreate, која се може употребити уместо идиома redo-always+redo-stamp да се посредничка датотека _config.h изграђује само када се измени config.h, па сам на крају применио то решење.


Generated by slweb © 2020-2024 Strahinya Radich.