Служител на Red Hat представи системата за изграждане Goals. Издание на GNU Make 4.2

Ричард Джоунс (Richard WM Jones), автор libguestfs, работещ в компанията Red Hat, представи нова утилита за изграждане Goals, насочена към отстраняване на недостатъците и проблемите в утилитата make, запазвайки общата простота и разбираемост на скриптовете. Утилитата make е проектирана през 1976 г. и има редица концептуални недостатъци, които Goals планира да отстрани, без да променя общата концепция.
Изходен код на Goals разпространява под лиценз GPLv2+.

Решавани проблеми:

  • Поддръжка само на една тактика за разрешаване на зависимости – "инструкцията за изграждане се изпълнява, ако целевият файл липсва или е по-стар от някоя от зависимостите". В Goals планира да се реализират и други тактики, като проверка на наличието на URL, сравняване на времето на изменение с произволен файл, оценка на изграждането на пакета в Koji, сравняване на контролни суми, стартиране на тестови набори с селективно пропускане на тестове.
  • При обработката на целите за изграждане утилитата make не разделя файловете и имената на правилата и, следователно, липсва проверка дали при изпълнение на правилото файлът, който трябва да бъде създаден, всъщност ще бъде създаден. Например, ако при наличие на правило с име "test", което стартира скриптове с тестове, случайно се създаде файл с име "test", тестовете спират да бъдат изпълнявани, тъй като make ще сметне, че целта е изградена и не изисква изпълнение на действия (за заобikоляване на проблема в 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“ {
    LAGS < -o %@
    }

Други характеристики на Goals:

  • Опционална поддръжка за задаване на произволни имена и параметри:

    goal all = : „target“

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

    goal compile (имя) =
    «%name.o» : «%name.c», «dep.h» { LAGS -c $^ -o $@ }

  • Два режима на изпълнение: режим make за съпоставяне на цели за сглобяване с имена на файлове (например, файл „foo.o“ съответства на цел „%name.o“), и режим на директно стартиране на компилация:

    goal all = : link

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

    goal compile (имя) =
    «%name.o» : «%name.c», «dep.h» { LAGS -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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster