Корманди Red Hat системаи монтажи Ҳадафҳоро муаррифӣ кард. Нашри GNU Make 4.2

Ричард В.М. Ҷонс, муаллиф libguestfs, кор дар Red Hat, муаррифӣ кард утилитаи нави васлкунӣ Ҳадафҳои, ба рафъи камбудиҳо ва мушкилот дар истифодаи фоида ва нигоҳ доштани соддагии умумӣ ва фаҳмо будани скриптҳо нигаронида шудааст. Хизматрасонии make дар соли 1976 тарҳрезӣ шудааст ва як қатор камбудиҳои консептуалӣ дорад; Ҳадафҳо барои бартараф кардани ин камбудиҳо бидуни тағир додани консепсияи умумӣ нақша доранд.
Рамзи сарчашмаи ҳадафҳо паҳн мекунад дар доираи GPLv2+ литсензия шудааст.

Проблемахое, ки бояд хал карда шаванд:

  • Дастгирии танҳо як тактикаи ҳалли вобастагӣ - "дастури васлкунӣ иҷро мешавад, агар файли мавриди ҳадаф мавҷуд набошад ё аз яке аз вобастагӣ калонтар бошад." Ҳадафҳо амалӣ кардани тактикаи дигарро ба нақша мегиранд, ба монанди тафтиши мавҷудияти URL, муқоисаи вақти тағирот бо ҳама гуна файл, арзёбии бастаи бастаҳо Коҷӣ, муќоисаи маблаѓњои назоратї, пешбурди парвандањои тестї бо интихоби интихобї аз тестњо.
  • Ҳангоми коркарди ҳадафҳои сохтмон, make файлҳо ва номҳои қоидаҳоро ҷудо намекунад ва дар натиҷа, тафтиш карда намешавад, ки ҳангоми иҷро кардани қоида, файле, ки он эҷод шудааст, воқеан эҷод мешавад. Масалан, агар шумо қоидае бо номи "test" дошта бошед, ки скриптҳоро бо тестҳо иҷро мекунад, файле бо номи "test" тасодуфан эҷод мешавад, пас санҷишҳо дигар даъват карда намешаванд, зеро make ҳисоб мекунад, ки ҳадаф сохта шудааст ва талаб намекунад. ҳар гуна амал (барои ҳалли мушкили дар таҳияшуда, шумо метавонед дастури ".PHONY: санҷиш" -ро муайян кунед). Ҳадафҳо файлҳо ва номҳои қоидаҳоро ба таври возеҳ ҷудо мекунанд.

    Корманди Red Hat системаи монтажи Ҳадафҳоро муаррифӣ кард. Нашри GNU Make 4.2

  • Мушкилот бо пешниҳоди танҳо як параметр барои дастурҳои васлкунӣ.

    Корманди Red Hat системаи монтажи Ҳадафҳоро муаррифӣ кард. Нашри GNU Make 4.2

    Ҳадафҳо ба шумо имкон медиҳанд, ки шумораи ихтиёрии параметрҳои номбаршударо истифода баред. Масалан, шумо метавонед аломати файли дебагро аз ном ҷудо кунед:

    Корманди Red Hat системаи монтажи Ҳадафҳоро муаррифӣ кард. Нашри GNU Make 4.2

  • Мушкилоти ҳамкорӣ бо тарҷумони shell. Масалан, зарурати назорати гурехтани фосилаҳо дар номи файлҳо ва директорияҳо, сарфи захираҳо барои ба кор андохтани тарҷумони ҷабҳаи алоҳида ҳангоми иҷрои ҳар як фармон, тафсири дукаратаи аломати "$" (ҳам дар shell ва ҳам дар make истифода мешавад), бо ба назар гириф-тани ​​чойхо.

    Ин масъалаҳо дар Ҳадафҳо бо истифода аз аломати "%" ба ҷои "$" барои тағирёбандаҳои васлкунӣ ("$" танҳо барои қабат боқӣ мемонад) бо истифода аз таҳлилгар ҳал карда мешаванд. LALR(1), ки аз шумо талаб мекунад, ки роҳҳо ва номи файлҳоро бо нохунакҳо иҳота кунед ва блокҳои кодро бо қавсҳои ҷингила таъкид кунед. Тамоми блоки фармонӣ дар як мисоли қабати фармон оғоз мешавад ва дар дохили блок форматкунии коди худсарона бидуни истинод ба ҷойҳои махсус иҷозат дода мешавад.

    буд:
    ҳадаф: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    шуд:
    "мақсад": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Дигар хусусиятҳои ҳадафҳо:

  • Дастгирии ихтиёрӣ барои муайян кардани номҳо ва параметрҳои ихтиёрӣ:

    ҳадаф ҳама =: "ҳадаф"

    пайванди ҳадаф =
    "мақсад": "foo.o", "bar.o" { ... }

    тартиб додани ҳадаф (ном) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Ду намуди оғозёбӣ: режимро барои мувофиқ кардани ҳадафҳои сохтан бо номи файлҳо созед (масалан, файли "foo.o" ба ҳадафи "%name.o" мувофиқат мекунад) ва режими мураттабсозии мустақим:

    ҳадаф ҳама =: пайванд

    пайванди ҳадаф =
    "target": "foo.o", compile ("bar") { ... }

    тартиб додани ҳадаф (ном) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Тактикаи васлкунӣ бо қоидаҳои махсус муайян карда мешавад, ки метавонанд барои муайян кардани зарурати аз нав васл кардани ҳадафи васлкунӣ истифода шаванд. Агар истинод ба мавҷудияти файл дода шавад, он гоҳ ин ба таври возеҳ тавассути аломати мувофиқ муайян карда мешавад ("ҳадаф" барои номи қоида ва *файл ("ҳадаф") барои тафтиши файл).

    "мақсад": "foo.o", "bar.o" { ... }

    *файл("ҳадаф"): *файл("foo.o"), *файл("bar.o") { ... }

  • Таҳиягар метавонад атрибутҳои худсаронаи тактикаи васлкуниро муайян кунад. Парчами "*файл" бо нобаёнӣ муайян карда мешавад (@{...} қатъ кардани баромадро нишон медиҳад ва "баромад 99" зарурати барқароркуниро нишон медиҳад):

    тактика *файл (номи файл) = @{
    санҷиш -f % номи файл || баромадан 99
    барои f дар %

    Манбаъ: opennet.ru

Илова Эзоҳ