Red Hat-ի աշխատակիցը ներկայացրել է Goals հավաքման համակարգը։ GNU Make 4.2-ի թողարկում

Ռիչարդ Վ.Մ. Ջոնս, հեղինակ libguestfsԱշխատում է Red Hat-ում, ներկայացրեց նոր հավաքման կոմունալ Նպատակները, որի նպատակն է վերացնել make-ի օգտակարության թերություններն ու խնդիրները՝ միաժամանակ պահպանելով սցենարների ընդհանուր պարզությունն ու հասկանալիությունը: Make utility-ը նախագծվել է 1976 թվականին և ունի մի շարք հայեցակարգային թերություններ, Goals-ը նախատեսում է վերացնել այդ թերությունները՝ չփոխելով ընդհանուր հայեցակարգը:
Նպատակների սկզբնական կոդը տարածվում է լիցենզավորված GPLv2+-ով:

Լուծման ենթակա խնդիրներ:

  • Կախվածության լուծման միայն մեկ մարտավարության աջակցություն. «հավաքման հրահանգը գործարկվում է, եթե թիրախային ֆայլը բացակայում է կամ ավելի հին է, քան կախվածություններից մեկը»: Նպատակները նախատեսում են իրականացնել այլ մարտավարություններ, ինչպիսիք են URL-ի առկայությունը ստուգելը, փոփոխման ժամանակները համեմատելը ցանկացած ֆայլի հետ, գնահատել փաթեթի կառուցումը: Կոջի, ստուգիչ գումարների համեմատություն, թեստային դեպքերի վարում թեստերի ընտրովի բաց թողնելով:
  • Կառուցման թիրախները մշակելիս make-ը չի առանձնացնում ֆայլերը և կանոնների անունները, և արդյունքում չի ստուգվում, որ կանոն գործարկելիս իրականում կստեղծվի այն ֆայլը, որը նա պնդում է, որ ստեղծվել է: Օրինակ, եթե դուք ունեք կանոն, որը կոչվում է «test», որը գործարկում է սկրիպտները թեստերով, պատահաբար ստեղծվել է «test» անունով ֆայլ, ապա թեստերն այլևս չեն կանչվի, քանի որ make-ը համարում է, որ թիրախը կառուցված է և չի պահանջում. ցանկացած գործողություն (Make-ի խնդիրը լուծելու համար կարող եք նշել «.PHONY: test» հրահանգը): Նպատակները հստակորեն առանձնացնում են ֆայլերը և կանոնների անունները:

    Red Hat-ի աշխատակիցը ներկայացրել է Goals հավաքման համակարգը։ GNU Make 4.2-ի թողարկում

  • Հավաքման հրահանգների համար միայն մեկ պարամետր տրամադրելու խնդիր:

    Red Hat-ի աշխատակիցը ներկայացրել է Goals հավաքման համակարգը։ GNU Make 4.2-ի թողարկում

    Նպատակները թույլ են տալիս օգտագործել կամայական թվով անվանված պարամետրեր: Օրինակ, դուք կարող եք առանձին հանել վրիպազերծման ֆայլի նշանը անունից.

    Red Hat-ի աշխատակիցը ներկայացրել է Goals հավաքման համակարգը։ GNU Make 4.2-ի թողարկում

  • Պատյանների թարգմանչի հետ շփվելու խնդիրներ: Օրինակ՝ ֆայլերի և գրացուցակների անուններում բացատների վերահսկման անհրաժեշտությունը, յուրաքանչյուր հրամանի կատարման ժամանակ առանձին կեղևի թարգմանիչ գործարկելու համար ռեսուրսների վատնում, «$» նիշի կրկնակի մեկնաբանություն (օգտագործվում է և՛ shell-ում, և՛ make-ում), հաշվի առնելով խորշերը.

    Այս խնդիրները լուծվում են Goals-ում՝ օգտագործելով «%» խորհրդանիշը «$»-ի փոխարեն հավաքման փոփոխականների համար («$»-ը մնում է միայն կեղևի համար), օգտագործելով վերլուծիչ։ LALR (1), որը պահանջում է, որ դուք շրջապատեք ուղիները և ֆայլերի անունները չակերտներով և ընդգծեք կոդերի բլոկները գանգուր փակագծերով: Ամբողջ հրամանի բլոկը գործարկվում է հրամանի վահանակի մեկ օրինակում, և բլոկի ներսում թույլատրվում է կամայական կոդի ձևաչափում, առանց հատուկ բացատների հղումների:

    էր.
    թիրախ՝ foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Դարձավ՝
    «թիրախ»: «foo.o», «bar.o» {
    %CC %CFLAGS %< -o %@
    }

Նպատակների այլ առանձնահատկություններ.

  • Ընտրովի աջակցություն կամայական անուններ և պարամետրեր նշելու համար.

    նպատակ բոլորը = «թիրախ»

    նպատակի հղում =
    "target": "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 $@ }

  • Հավաքման մարտավարությունը որոշվում է հատուկ կանոններով, որոնք կարող են օգտագործվել հավաքման թիրախը նորից հավաքելու անհրաժեշտությունը որոշելու համար: Եթե ​​հղում է կատարվում ֆայլի առկայությանը, ապա դա բացահայտորեն որոշվում է համապատասխան նշանի միջոցով («թիրախ» կանոնի անվան համար և *file («թիրախ») ֆայլը ստուգելու համար):

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

    *file("թիրախ"): *file("foo.o"), *file("bar.o") {...}

  • Մշակողը կարող է սահմանել հավաքման մարտավարության կամայական հատկանիշներ: «*file» դրոշը սահմանված է լռելյայնորեն (@{...} ցույց է տալիս ելքի ճնշումը, իսկ «ելք 99»-ը ազդարարում է վերակառուցման անհրաժեշտության մասին).

    մարտավարություն *ֆայլ (ֆայլի անուն) = @{
    թեստ -f %ֆայլի անուն || Ելք 99
    f-ի համար %-ով

    Source: opennet.ru

Добавить комментарий