Π‘ΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΠΊ 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 посчитаСт, Ρ‡Ρ‚ΠΎ Ρ†Π΅Π»ΡŒ собрана ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ выполнСния ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ дСйствий (для ΠΎΠ±Ρ…ΠΎΠ΄Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² 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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ