Співробітник 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

Додати коментар або відгук