Супрацоўнік Red Hat прадставіў зборачную сістэму Goals. Выпуск GNU Make 4.2

Рычард Джонс (Richard WM Jones), аўтар libguestfs, які працуе ў кампаніі Red Hat, прадставіў новую зборачную ўтыліту Мэтаў, накіраваную на ліквідацыю недахопаў і праблем ва ўтыліце make пры захаванні агульнай прастаты і зразумеласці сцэнарыяў. Утыліта make праектавалася ў 1976 году і мае шэраг канцэптуальных недапрацовак, у Goals плануецца ўхіліць гэтыя недапрацоўкі, не змяняючы агульнай канцэпцыі.
Зыходны код Goals распаўсюджваецца пад ліцэнзіяй GPLv2+.

Вырашаныя праблемы:

  • Падтрымка толькі адной тактыкі дазволу залежнасцяў – «зборачная інструкцыя запускаецца, калі мэтавы файл адсутнічае, ці ён старэйшы за адну з залежнасцяў». У Goals плануецца рэалізаваць і іншыя тактыкі, такія як праверка наяўнасці URL, параўнанне часу змены з любым файлам, ацэнка зборкі пакета ў Коджы, параўнанне кантрольных сум, запуск тэставых набораў з выбарачным пропускам тэстаў.
  • Пры апрацоўцы зборачных мэт утыліта make не падзяляе файлы і імёны правіл, і, як следства, адсутнічае праверка таго, што пры запуску правіла сапраўды будзе створаны файл, стварэнне якога заяўлена. Напрыклад, калі пры наяўнасці правіла з імем "test", які запускае скрыпты з тэстамі, выпадкова будзе створаны файл з імем "test", то тэсты перастануць выклікацца, бо make палічыць, што мэта сабрана і не патрабуе выканання якія-небудзь дзеянняў (для абыходу праблемы ў make можна паказаць дырэктыву ".PHONY: test"). Goals відавочна падзяляе файлы і імёны правілаў.

    Супрацоўнік Red Hat прадставіў зборачную сістэму Goals. Выпуск GNU Make 4.2

  • Праблема з прадастаўленнем толькі аднаго параметра для зборачных інструкцый.

    Супрацоўнік Red Hat прадставіў зборачную сістэму Goals. Выпуск GNU Make 4.2

    У Goals прапануецца выкарыстоўваць адвольны лік найменных параметраў. Напрыклад, можна асобна вылучыць з імя прыкмета адладкавага файла:

    Супрацоўнік Red Hat прадставіў зборачную сістэму Goals. Выпуск GNU Make 4.2

  • Праблемы ўзаемадзеяння з shell-інтэрпрэтатарам. Напрыклад, неабходнасць кантраляваць экранаванне прабелаў у імёнах файлаў і каталогаў, марнаванне рэсурсаў на запуск асобнага shell-інтэрпрэтатара пры выкананні кожнай каманды, падвойная трактоўка знака "$" (выкарыстоўваецца як у shell, так і ў make), улік водступаў.

    Паказаныя праблемы вырашаюцца ў Goals выкарыстаннем знака "%" замест "$" для зборачных зменных ("$" застаецца толькі для shell), ужываннем парсера LALR(1), Які патрабуе апраўляць шляхі і імёны файлаў двукоссі і вылучаць фігурнымі дужкамі блокі з кодам. Увесь блок каманда запускаецца ў адным экзэмпляры каманднай абалонкі, а ўсярэдзіне блока дапушчаецца адвольнае фарматаванне кода, без прывязкі да адмысловых прабелаў.

    было:
    target: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    стала:
    "target": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Іншыя асаблівасці Goals:

  • Апцыянальная падтрымка задання адвольных імён і параметраў:

    goal all = : "target"

    goal link =
    "target" : "foo.o", "bar.o" { … }

    goal compile (name) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Два рэжыму запуску: рэжым make для супастаўлення зборачных мэт з імёнамі файлаў (напрыклад, файл "foo.o" адпавядае мэты "%name.o"), і рэжым прамога запуску кампіляцыі:

    goal all = : link

    goal link =
    "target" : "foo.o", compile ("bar") { … }

    goal compile (name) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Тактыка зборкі вызначаецца спецыяльнымі правіламі, пры дапамозе якіх можна вызначаць неабходнасць перазборкі зборачнай мэты. Калі ажыццяўляецца прывязка да наяўнасці файла, тое гэта відавочна вызначаецца праз якая адпавядае прыкмета («target» для імя правіла і *file(«target») для праверкі файла).

    "target" : "foo.o", "bar.o" { … }

    *file("target") : *file("foo.o"), *file("bar.o") { … }

  • Распрацоўнік можа вызначаць адвольныя прыкметы зборачных тактык. Прыкмета "*file" вызначана па змаўчанні (@{…} паказвае на падаўленне вываду, а "exit 99" сігналізуе аб неабходнасці перазборкі):

    tactic *file (filename) = @{
    test -f %filename || exit 99
    for f in %

    Крыніца: opennet.ru

Дадаць каментар