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, па сам на крају применио то решење.