Red Hat-ի աշխատակիցը ներկայացրել է Goals հավաքման համակարգը։ GNU Make 4.2-ի թողարկում
Ռիչարդ Վ.Մ. Ջոնս, հեղինակ libguestfsԱշխատում է Red Hat-ում, ներկայացրեց նոր հավաքման կոմունալ Նպատակները, որի նպատակն է վերացնել make-ի օգտակարության թերություններն ու խնդիրները՝ միաժամանակ պահպանելով սցենարների ընդհանուր պարզությունն ու հասկանալիությունը: Make utility-ը նախագծվել է 1976 թվականին և ունի մի շարք հայեցակարգային թերություններ, Goals-ը նախատեսում է վերացնել այդ թերությունները՝ չփոխելով ընդհանուր հայեցակարգը:
Նպատակների սկզբնական կոդը տարածվում է լիցենզավորված GPLv2+-ով:
Կախվածության լուծման միայն մեկ մարտավարության աջակցություն. «հավաքման հրահանգը գործարկվում է, եթե թիրախային ֆայլը բացակայում է կամ ավելի հին է, քան կախվածություններից մեկը»: Նպատակները նախատեսում են իրականացնել այլ մարտավարություններ, ինչպիսիք են URL-ի առկայությունը ստուգելը, փոփոխման ժամանակները համեմատելը ցանկացած ֆայլի հետ, գնահատել փաթեթի կառուցումը: Կոջի, ստուգիչ գումարների համեմատություն, թեստային դեպքերի վարում թեստերի ընտրովի բաց թողնելով:
Կառուցման թիրախները մշակելիս make-ը չի առանձնացնում ֆայլերը և կանոնների անունները, և արդյունքում չի ստուգվում, որ կանոն գործարկելիս իրականում կստեղծվի այն ֆայլը, որը նա պնդում է, որ ստեղծվել է: Օրինակ, եթե դուք ունեք կանոն, որը կոչվում է «test», որը գործարկում է սկրիպտները թեստերով, պատահաբար ստեղծվել է «test» անունով ֆայլ, ապա թեստերն այլևս չեն կանչվի, քանի որ make-ը համարում է, որ թիրախը կառուցված է և չի պահանջում. ցանկացած գործողություն (Make-ի խնդիրը լուծելու համար կարող եք նշել «.PHONY: test» հրահանգը): Նպատակները հստակորեն առանձնացնում են ֆայլերը և կանոնների անունները:
Հավաքման հրահանգների համար միայն մեկ պարամետր տրամադրելու խնդիր:
Նպատակները թույլ են տալիս օգտագործել կամայական թվով անվանված պարամետրեր: Օրինակ, դուք կարող եք առանձին հանել վրիպազերծման ֆայլի նշանը անունից.
Պատյանների թարգմանչի հետ շփվելու խնդիրներ: Օրինակ՝ ֆայլերի և գրացուցակների անուններում բացատների վերահսկման անհրաժեշտությունը, յուրաքանչյուր հրամանի կատարման ժամանակ առանձին կեղևի թարգմանիչ գործարկելու համար ռեսուրսների վատնում, «$» նիշի կրկնակի մեկնաբանություն (օգտագործվում է և՛ shell-ում, և՛ make-ում), հաշվի առնելով խորշերը.
Այս խնդիրները լուծվում են Goals-ում՝ օգտագործելով «%» խորհրդանիշը «$»-ի փոխարեն հավաքման փոփոխականների համար («$»-ը մնում է միայն կեղևի համար), օգտագործելով վերլուծիչ։ LALR (1), որը պահանջում է, որ դուք շրջապատեք ուղիները և ֆայլերի անունները չակերտներով և ընդգծեք կոդերի բլոկները գանգուր փակագծերով: Ամբողջ հրամանի բլոկը գործարկվում է հրամանի վահանակի մեկ օրինակում, և բլոկի ներսում թույլատրվում է կամայական կոդի ձևաչափում, առանց հատուկ բացատների հղումների:
նպատակը կազմել (անուն) =
"%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }
Գործարկման երկու ռեժիմ՝ ստեղծելու ռեժիմ՝ կառուցման թիրախները ֆայլերի անուններին համապատասխանելու համար (օրինակ՝ «foo.o» ֆայլը համապատասխանում է «%name.o» թիրախին), և ուղղակի կոմպիլյացիայի ռեժիմ.
նպատակը կազմել (անուն) =
"%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }
Հավաքման մարտավարությունը որոշվում է հատուկ կանոններով, որոնք կարող են օգտագործվել հավաքման թիրախը նորից հավաքելու անհրաժեշտությունը որոշելու համար: Եթե հղում է կատարվում ֆայլի առկայությանը, ապա դա բացահայտորեն որոշվում է համապատասխան նշանի միջոցով («թիրախ» կանոնի անվան համար և *file («թիրախ») ֆայլը ստուգելու համար):
Մշակողը կարող է սահմանել հավաքման մարտավարության կամայական հատկանիշներ: «*file» դրոշը սահմանված է լռելյայնորեն (@{...} ցույց է տալիս ելքի ճնշումը, իսկ «ելք 99»-ը ազդարարում է վերակառուցման անհրաժեշտության մասին).
մարտավարություն *ֆայլ (ֆայլի անուն) = @{
թեստ -f %ֆայլի անուն || Ելք 99
f-ի համար %-ով