Red Hat-ийн ажилтан Зорилго угсралтын системийг танилцуулав. GNU Make 4.2 хувилбар

Ричард В.М. Жонс, зохиолч libguestfs, Red Hat-д ажилладаг, танилцуулав шинэ угсралтын хэрэгсэл Зорилго, скриптийн ерөнхий энгийн, ойлгомжтой байдлыг хадгалахын зэрэгцээ маркийн хэрэглээний дутагдал, бэрхшээлийг арилгахад чиглэгддэг. Make utility нь 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 хувилбар

  • Бүрхүүлийн орчуулагчтай харилцах асуудал. Жишээлбэл, файл, лавлах нэрийн хоосон зайг хянах хэрэгцээ, команд бүрийг гүйцэтгэхдээ тусдаа бүрхүүлийн орчуулагч ажиллуулахад нөөцийн дэмий үрэх, "$" тэмдэгтийн давхар тайлбар (бүрхүүл болон make-д хоёуланд нь ашиглагддаг), догол мөрийг харгалзан үзнэ.

    Эдгээр асуудлыг Зорилтуудад угсралтын хувьсагчдад "$"-ын оронд "%" тэмдгийг ("$" нь зөвхөн бүрхүүлд үлдэнэ) ашиглан задлан шинжлэгч ашиглан шийддэг. LALR(1), энэ нь таныг зам болон файлын нэрийг хашилтаар хүрээлж, кодын блокуудыг буржгар хаалтаар тодруулахыг шаарддаг. Командын блок бүхэлдээ командын бүрхүүлийн нэг тохиолдлоор нээгддэг бөгөөд блок дотор тусгай орон зайд хамаарахгүйгээр дурын кодыг форматлахыг зөвшөөрдөг.

    Энэ нь:
    зорилтот: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Энэ болсон:
    "target": "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", эмхэтгэх ("bar") { ... }

    зорилго эмхэтгэх (нэр) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Угсралтын тактикийг тусгай дүрмээр тодорхойлдог бөгөөд угсралтын зорилтыг дахин угсрах хэрэгцээг тодорхойлоход ашиглаж болно. Хэрэв файл байгаа эсэхийг холбосон бол энэ нь харгалзах тэмдгээр тодорхой тодорхойлогдоно ("Дүрмийн нэрний зорилт" ба файлыг шалгах * файл ("зорилт").

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

    *файл("зорилтот"): *файл("foo.o"), *файл("bar.o") { ...}

  • Хөгжүүлэгч нь угсралтын тактикийн дурын шинж чанаруудыг тодорхойлж болно. "*file" туг нь анхдагчаар тодорхойлогддог (@{...} нь гаралтыг дарах, "гарц 99" нь дахин бүтээх шаардлагатайг илтгэнэ):

    тактик *файл (файлын нэр) = @{
    тест -f % файлын нэр || 99 гар
    f хувьд %

    Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх