عربيالفرنسيةالإسبانية

Ad


OnWorks فافيكون

makepp_rules - عبر الإنترنت في السحابة

قم بتشغيل makepp_rules في مزود استضافة OnWorks المجاني عبر Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت

هذا هو الأمر makepp_rules الذي يمكن تشغيله في مزود الاستضافة المجانية OnWorks باستخدام إحدى محطات العمل المجانية المتعددة على الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت

برنامج:

اسم


makepp_rules - كيف تخبر makepp ببناء شيء ما

الوصف


?: &,
-,
@, B: : build_cache،
: build_check، D: :إرسال، E: : env، I: "ignore_error"،
:يشمل، L: :آخر فرصة، M: ماكيبيرل N: "noecho"، P: : محلل ،
"بيرل"، S: :إمضاء

القاعدة هي ما يخبر makepp بكيفية إنشاء ملف أو فئة من الملفات. يدعم Makepp ملفات
نفس قواعد بناء جملة تطبيقات أخرى من صنع ، بالإضافة إلى بعض الإضافات الخاصة به.

القاعدة لها الشكل العام

target_expression :ependency_expression [: وسيطات اختيارية]
الإجراءات

قد لا تحتوي قائمة الأهداف على أي متغيرات تلقائية (باستثناء "$ (foreach)"). ال
قد تحتوي قائمة التبعية على متغيرات تلقائية فقط تشير إلى الهدف (على سبيل المثال ،
"$ (output)" أو "$ (outputs)" أو مرادفاتهما). قد يحتوي الإجراء على أي تلقائي
المتغيرات.

إذا قرر makepp أن القاعدة بحاجة إلى التنفيذ ، فسيتم تنفيذ كل سطر من القاعدة
بالتتابع ، وإذا أرجع أي حالة حالة غير صفرية ، فلن يتم تنفيذ الباقي (و
makepp يحبط مع حدوث خطأ ما لم تحدد الخيار "-k" في سطر الأوامر.)
يجب أن يتكون كل إجراء من سطر واحد فقط. إذا كان الإجراء طويلاً جدًا للكتابة بشكل ملائم على ملف
سطر واحد ، يمكنك تقسيمه إلى عدة أسطر ووضع شرطة مائلة للخلف للإشارة إلى أن ملف
يجب دمج عدة أسطر في سطر واحد.

من أجل التمييز بين الإجراءات والقاعدة التالية ، يجب زيادة المسافة البادئة للإجراء
من الخط الذي يحتوي على الأهداف والتبعيات. على عكس التطبيقات الأخرى لـ
make، makepp لا يهتم حقًا بمدى المسافة البادئة لها أو ما إذا كنت تستخدم أحرف الجدولة
بدلا من الفراغات. للحفاظ على التوافق مع الإصدارات السابقة مع الطراز التقليدي ، القواعد
يستخدم makepp لتحديد متى تنتهي الإجراءات وتكون القاعدة التالية معقدة نوعًا ما:

· يجب وضع مسافة بادئة لسطر الإجراء الأول أكثر من السطر الذي يحتوي على الهدف.

· إذا تم وضع مسافة بادئة للخط بواسطة حرف جدولة واحد أو 8 مسافات أو أكثر ، فيتم اعتباره
خط العمل.

سطر فارغ أو سطر تعليق بحرف "#" في الهامش الأيمن ينتهي بـ
القاعدة ، ما لم تكن المسافة البادئة للسطر التالي غير الفارغ أكثر من 8 مسافات (أو أكثر من واحدة
التبويب).

· إذا تم وضع مسافة بادئة للسطر بنفس مقدار أو أكثر من سطر الإجراء الأول ، فسيكون كذلك
يعتبر خط عمل إضافي.

هناك عدد قليل من عناصر العمل الخاصة:

& يجب أن يتبع هذا الرمز اسم أمر وأي عدد من الوسائط. صدَفَة
لم يتم فهم بناء الجملة بشكل كامل هنا ، فقط علامات اقتباس مفردة ومزدوجة وخط مائل للخلف
شخصيات داخل ، كما في جميع أنحاء makepp. يؤدي اسم الأمر إما إلى وظيفة
"ج_اسم" ليتم استدعاؤها مع السلاسل المتبقية كوسيطات. إذا كانت هذه الوظيفة يمكن
غير موجود ، هذا مطابق لاستدعاء "run" من كتلة "perl".

هذا يسمح باستدعاء أمر مضمن أو موفر من قبل makefile أو خارجي بكفاءة.
تم اختيار البادئة "&" لأنها دالة استدعاء في Perl ، ولأن
في البداية كان هذا غير قانوني في شركة شل.

$ (ROOT) / تضمين /٪. h:٪ .h
& ln $ (إدخال) $ (إخراج)

noecho
@ عادة ، تتم طباعة كل أمر shell أثناء تنفيذه. ومع ذلك ، إذا كانت الكلمة الأولى
من الإجراء "noecho" (أو إذا بدأ بالحرف "@") ، ثم الأمر
لم تتم طباعته. على سبيل المثال،

٪ .o:٪ .cxx
noecho $ (LIBTOOL) --mode = ترجمة $ (CC) -c $ (إدخال)

هذا يعني أنه عند تنفيذ الأمر libtool ، لا تتم طباعته. (ليبتول
عادةً ما يطبع نفسه الأمر المعدل الذي ينفذه ، لذا فهو مكرر
اطبعها مرتين.)

تجاهل الخطأ
- عادةً ، إذا قام أمر shell بإرجاع حالة غير صفرية ، فسيتم إحباط makepp بسبب
فشل الأمر. ومع ذلك ، تقوم بعض البرامج بتعيين الحالة بشكل غير صحيح عند الإنهاء ، أو
قد يكون هناك خطأ ليس فادحًا حقًا ولا يجب إجهاضه بالكامل
التحويل البرمجي. يمكنك أن تجعل makepp يتجاهل حالة الإرجاع بتحديد
"ignore_error" كالكلمة الأولى في سطر الأوامر (أو "-" كالحرف الأول).
على سبيل المثال،

$ (توزيع زائف):
ignore_error rm -r my_program - $ (VERSION) # تخلص من الرسائل غير المرغوب فيها السابقة.
& mkdir my_program - $ (VERSION)
& cp $ (FILES) my_program - $ (VERSION)
tar cf my_program - $ (VERSION) .tar my_program - $ (VERSION)

يقوم هذا الأمر بإنشاء دليل ، ونسخ مجموعة من الملفات فيه ، ثم يضع
كل شيء في ملف القطران للتوزيع. إنها فكرة جيدة أن تقوم بتنظيف ملف
المحتويات السابقة للدليل ، إذا كان هناك أي شيء سابقًا ، وهذا هو
ما الذي يفعله السطر الأول. قد تفشل "rm" ، ولكن يتم تجاهل حالة الإرجاع الخاصة بها.

بيرل
ماكيبيرل
هذا هو في الأساس نفس بيان perl ، ولكن يتم تنفيذه في كل مرة عندما
تشغيل القاعدة ، وليس عند قراءة makefile. الصيغة الأولى هي لغة Perl
رمز ، بينما يقوم المتغير الثاني بتمرير العبارة أولاً من خلال متغير Make-style
توسيع.

للحصول على احتمالين لوضع تقويمات الجسم ، انظر الشرح في
"perl_perlcode" في makepp_statements. لاحظ أن البديل الثالث موضح هناك
لا يوجد معنى هنا ، لأنه يجب وضع مسافة بادئة لجميع خطوط الإجراءات. يجب عليك الإشارة
فشل في تصريحات بيرل ، من خلال تسميته "يموت".

وفقًا للقاعدة ، يتم حاليًا تقييم عبارات Perl في عملية فرعية مشتركة ، باستثناء
شبابيك. هذا يعني أن لديهم حق الوصول للقراءة فقط إلى أي متغيرات makefile. بل هو أيضا
العملية التي تنفذ إجراءات غير لغة Perl. لذا فإن استدعاء exec أو الخروج سوف يربك
makepp. لكن هذا قد يتغير في المستقبل. للحصول على طريقة فعالة للاتصال بـ Perl
البرامج النصية ، راجع العنصر السابق "&" أو "تشغيل".

$ (نسخة زائفة):
noecho perl {{# $ (target) & $ (VERSION) من Perl:
طباعة "This is" .f_target (). "$ VERSION \ n"؛
}}
صدى يمكنك مزج هذا مع أوامر شل
-makeperl {print "This is $ (target) $ (VERSION) \ n"}

هناك عدة أنواع مختلفة من القواعد ، لكل منها أغراض مختلفة.

صريح قوانيـن
الهدف 1 الهدف 2: التبعية 1 التبعية 2 ...
الإجراءات التي يتعين القيام بها

هذا النحو يحدد ذلك من أجل عمل أي منهما target1 or target2، كل الملفات
التبعية 1, التبعية 2، وما إلى ذلك ، يجب أن يكون قد تم بالفعل. ثم الإجراءات المعطاة
نفذتها القذيفة لجعل الأهداف.

القاعدة الصريحة الأولى في الملف هي الهدف الافتراضي ، ويتم إجراؤها إذا لم تحدد
أي أهداف في سطر الأوامر.

على عكس برامج الصنع التقليدية ، عادة ما تفترض makepp أن استدعاء واحد للعمل
يجعل جميع الأهداف (ما لم تكن هناك تبعيات). على سبيل المثال ، دعاء واحد
من yacc ينشئ كلا الملفين الناتج لهذه القاعدة:

علامة التبويب ytab.c y.tab.h: المحلل اللغوي
$ (YACC) -d parser.y

لاحظ أن تطبيقات make الأخرى ليس لديها مفهوم لأمر واحد
إنتاج ملفات إخراج متعددة ، وبالتالي عندما تحدد أهدافًا متعددة ، فإنهم سيفعلون ذلك
تنفيذ القاعدة مرة واحدة لكل هدف. سيعود Makepp إلى هذا السلوك إذا كان يبدو
هذا هو makefile على الطراز القديم. على وجه التحديد ، سيتم تنفيذ القاعدة مرة واحدة لكل هدف ،
بدلاً من مرة واحدة فقط بشكل عام ، إذا كان كل ما يلي صحيحًا:

· يذكر إجراء القاعدة المتغير التلقائي $ @. (المرادفات "$ (output)" أو
لا تؤدي "$ (target)" إلى تشغيل هذا السلوك.)

· لا يذكر إجراء القاعدة المتغير التلقائي "$ (outputs)" (أو مرادفه
"$ (الأهداف)").

· هذه ليست قاعدة نمطية ، ولا توجد فقرة واحدة لكل منها.

على سبيل المثال،

كل تثبيت اختبار:
لـ subdir بـ $ (SUBDIRS) ؛ do cd $$ subdir && $ (MAKE) $ @ ؛ قرص مضغوط ..؛ منتهي

هو مصطلح شائع في makefiles ، ويدعمه makepp. (لاحظ أنه لا يجب عليك استخدام ملفات
إنشاء متكرر في أي ملفات makefiles جديدة تكتبها - استخدم العبارة "load_makefile" ، أو
تحميل makefile ضمني بدلاً من ذلك.)

إذا كنت ترغب في تنفيذ نفس القاعدة مرة واحدة لكل هدف (على سبيل المثال ، لأن الأهداف
لديك أوامر مماثلة) ، يُفضل استخدام قاعدة نمط (انظر أدناه) أو ملف
شرط "foreach". على سبيل المثال ، إذا كنت تستخدم برنامج تكوين تقليدي ، فستكتب:

ا ب ت ث:
do_something لإنشاء $ @> $ @

في makepp ، ربما تريد كتابته على النحو التالي:

$ (foreach): foreach abcd
do_something لبناء $ (output)> $ (output)

متصنع الأهداف

A متصنع الهدف هو هدف لن يكون موجودًا بالفعل في نظام الملفات ؛ انه فقط
طريقة لجعل makepp لبناء بعض الأهداف وربما تنفيذ بعض الأوامر الإضافية.

الهدف الزائف النموذجي هو "الكل" ، والذي يستخدم عادة لإحداث كل ما يمكن أن يكون
بنيت ليتم بناؤها ، مثل هذا:

الكل: prog1 prog2 subdir / prog3 subdir2 / libmine.a
@ & صدى "تم كل شيء!"

إذا قمت بكتابة "makepp all" ، أو إذا وضعت الكل كأول هدف صريح في ملف makefile الخاص بك
(وهو أمر نموذجي) واكتب فقط "makepp" ، فسيؤدي ذلك إلى جعل جميع التبعيات
بنيت ، ثم ستطبع "كل شيء!". في هذه المرحلة ، سيبحث makepp عن الملف ./الجميع
وسوف يكتشف أنه غير موجود. سوف يشتكي بصوت عالٍ.

لمنع makepp من توقع الملف ./الجميع للخروج ، عليك أن تخبره أنه ملف
هدف زائف. فقط ضع سطرًا مثل التالي في makefile الخاص بك (لا فرق
أين):

.PHONY: الكل

البديل المكافئ الذي يكون أحيانًا أكثر ملاءمة هو استخدام "$ (phony)"
وظيفة ، مثل هذا:

$ (الكل الزائف): prog1 prog2 subdir / prog3 subdir2 / libmine.a

يمكن أن تشير الأهداف الزائفة في ملف makefile إلى أهداف زائفة في ملف makefile آخر. هذا هو
غالبًا ما يتم ذلك باستخدام الهدف "النظيف" ، مثل هذا:

# makefile المستوى الأعلى:
# الكثير من القواعد والأشياء هنا
# ....
$ (phony clean): subdir1 / تنظيف subdir2 / نظيف
& rm -fm my_program

ثم في الدلائل الفرعية ، قد تقرأ ملفات makefiles على النحو التالي:

# Makefile في دليل فرعي
#...
$ (فوني كلين):
& rm -fm $ (wildcard * .o * .a)

لكن في الوقت الحاضر يمكنك استخدام الأمر "makeppclean" ، بدلاً من الهدف النظيف.

البدل

من الآمن تحديد أحرف البدل في قائمة التبعيات. لا تطابق أحرف البدل الملفات فقط
الموجودة ، ولكن الملفات التي يمكن إنشاؤها وفقًا للقواعد الموجودة في makefile. على سبيل المثال،
لإنشاء مكتبة من جميع ملفات .o في دليل ، يمكنك كتابة هذا:

libmine.a: * .o
& rm -f $ (الإخراج)
ar cr $ (الإخراج) $ (المدخلات)

سيعمل هذا حتى إذا لم يتم إنشاء أي من ملفات ".o" بعد ، لأن makepp's
تتطابق أحرف البدل مع الملفات التي لم توجد بعد ولكن يمكن بناؤها. هذا سوف يلتقط حتى
الملفات التي تم اكتشاف قاعدتها لاحقًا (في نفس ملف makefile أو واحد لم تتم قراءته بعد). في هذا
النقطة الأخيرة تختلف عن وظيفة "wildcard" التي تقتصر على القواعد المعروفة ،
حيث يجب أن تعيد نتيجتها عندما يتم توسيعها.

يدعم Makepp جميع أحرف البدل العادية للقذيفة ("*" و "؟" و "[]"). كما أن لديها ملف
البدل "**" الذي يطابق أي عدد من الأدلة المتداخلة. (سرقت هذه الفكرة
from zsh.) على سبيل المثال ، يطابق "** / *. c" جميع ملفات .c الملفات في شجرة المصدر بأكملها.
يطابق "object / ** / *. o" جميع ملفات .o الملفات الموجودة في أي مكان في الدليل الفرعي الأجسام
أو أي من الدلائل الفرعية الخاصة بها أو أي من الدلائل الفرعية الخاصة بها. لن يتم استخدام حرف البدل "**"
اتبع الروابط اللينة إلى الدلائل على أي مستوى. كما أنها لن تعيد الأهداف الزائفة أبدًا.

ستتجاهل أحرف البدل الخاصة بـ Makepp الملفات أو الدلائل الموجودة ولكن لا يمكن قراءتها. بعد
الكل ، لا يمكن استخدام هذه الملفات في عملية الإنشاء على أي حال. وضع الملفات غير القابلة للقراءة في ملف
الدليل مفيد بشكل أساسي لمنع الاستيراد التلقائي لملف معين من ملف
مستودع.

كان التأكيد الأولي أن هذا آمن. هذا من حيث أنه يعمل سواء
الملفات موجودة بالفعل ، أو تحتاج إلى الإنشاء أولاً. ومع ذلك فهي غير آمنة في المعنى
أنه سيستمر في مطابقة الملفات التي تم إنشاؤها بواسطة makepp ، ولكن لم يعد لها قاعدة (على سبيل المثال
قمت بإزالة .c ملف ، ولكن .o لا يزال الملف موجودًا.) لمنع ذلك ، استخدم ملحق
خيار "- rm-stale".

نمط القواعد
قاعدة النمط هي قاعدة يتم تطبيقها بناءً على بعض الأنماط النصية. هذا معتاد على
تطبيق نفس القاعدة على فئة كاملة من الملفات. الصيغة هي نفسها صيغة GNU
قواعد النمط:

٪ .o:٪ .c
$ (CC) -c $ (المدخلات) -o $ (المخرجات)

هذا يعني أن أي ملف في الدليل الحالي يطابق "* .c" يمكن تحويله إلى
ملف .o المقابل باستخدام الأمر المحدد.

لاحظ أنه قد يتم توفير العديد من تبعيات النمط. على سبيل المثال ، إذا كان لديك xyz.o ملف
يعتمد على المقابل xyz.cpp ملف ، وكذلك في ملف يسمى moc_xyz.cflags التي
يحتوي على خيارات المترجم ، ويمكن التعبير عن ذلك بـ:

٪ .o:٪ .cpp٪ .cflags
$ (CXX) `cat $ (جذع) .cflags` -c $ (مدخلات) -o $ (إخراج)

قد يكون لديك أيضًا عدة أهداف نمطية. على سبيل المثال،

٪ .tab.h٪ .tab.c:٪ .y
yacc -d $ (إدخال)
& mv y.tab.h $ (الجذعية) .tab.h
& mv y.tab.c $ (جذعي) .tab.c

عادةً ما تبحث قواعد النمط عن الملفات الموجودة في الدلائل الحالية فقط. يمكنك القوة
عليهم البحث في الدليل الحالي وجميع الدلائل الموجودة تحته عن طريق الإعداد

makepp_percent_subdirs: = 1

قبل قاعدة النمط الأولى في makefile الخاص بك أو في سطر الأوامر على سبيل المثال.

هناك فرق واضح بين "٪" وحرف البدل "*" ، على الرغم من تطابق كليهما مع أي منهما
السلسلة: يقوم حرف البدل بإرجاع قائمة بالملفات المستخدمة بالكامل في تلك المرحلة. لذا
هذا يعتمد على الجميع .o ملفات قابلة للبناء هنا:

بروغ: * .o
$ (LD) $ (LDFLAGS) $ (المدخلات) -o $ (المخرجات)

لا يمكن تحقيق ذلك عن طريق استبدال "*" بـ "٪" ، لأن الأخير هو واحد تلو الآخر
مطابقة المدخلات بالمخرجات ، وإنتاج قاعدة واحدة داخليًا لكل جذع متطابق.

ساكن النمط القواعد
قاعدة النمط الثابت هي قاعدة نمط يتم تطبيقها فقط على مجموعة محدودة من الملفات:

$ (SPECIAL_MODULES) .o:٪ .o:٪ .cpp
$ (CXX) -c $ (المدخلات) -o $ (المخرجات)

يشير هذا إلى أن قاعدة النمط تنطبق فقط على الملفات الموجودة في "$ (SPECIAL_MODULES) .o".

هذا في الغالب للتوافق مع GNU ؛ قواعد foreach (انظر أدناه) هي أكثر
طريقة قوية لفعل الشيء نفسه.

لكل القواعد
تعد بنية قاعدة النمط أعلاه قوية بما يكفي لدعم جميع الإنشاءات تقريبًا ، ولكن
في بعض الأحيان يكون من الضروري القيام بشيء أكثر تعقيدًا. يوفر Makepp المزيد
بناء جملة قوي: شرط ": foreach" للقاعدة.

target_expression: تعتمد على التعبير: لكل قائمة ملفات
الإجراءات

إن أبسط نوع من قواعد foreach هو مجرد قاعدة نمط يكون تطبيقها مقيدًا
إلى قائمة محددة من الملفات. على سبيل المثال ، افترض أن لديك قاعدة نمط تخبرنا
makepp كيفية تجميع كل شيء .c الملفات. ومع ذلك ، لديك قائمة .c الملفات التي من أجلها
تريد أن تفعل شيئا مختلفا. يمكنك فعل شيء مثل هذا:

# ها هي القاعدة التي تنطبق على كل شيء:
٪ .o:٪ .c
$ (CC) $ (CFLAGS) -c $ (إدخال) -o $ (إخراج)

٪ .o:٪ .c: foreach $ (SPECIAL_MODULES)
$ (CC) $ (SPECIAL_CFLAGS) -c $ (إدخال) -o $ (إخراج)

الاستخدام الأكثر قوة لقواعد foreach يستفيد من حقيقة أن المتغير
يتم تعيين "$ (foreach)" بدوره على كل ملف يطابق قائمة الملفات والهدف و
يتم تقييم تعبيرات التبعية. قد تحتوي قائمة الملفات على أحرف بدل ، وهذه
تطابق حتى الملفات التي لم تكن موجودة بعد ولكن يمكن بناؤها (راجع "أحرف البدل" في
makepp_rules).

هذا بناء جملة غير عملي ولكنه مرن للغاية ، لأن المتغير "$ (foreach)"
قد تظهر بأي شكل من الأشكال في التعبير. أولاً ، لاحظ أن قواعد النمط هي في الواقع أ
حالة خاصة لقواعد foreach ؛ قاعدة النمط

٪ .o:٪ .c
$ (CC) $ (CFLAGS) -c $ (إدخال) -o $ (إخراج)

يعادل بالضبط:

$ (patsubst٪ .c،٪ .o، $ (foreach)): $ (foreach): foreach * .c
$ (CC) $ (CFLAGS) -c $ (إدخال) -o $ (إخراج)

(في الواقع ، تم تحويله إلى ذلك تقريبًا داخليًا.)

كمثال لكيفية استخدام جملة ": foreach" حيث لا توجد قاعدة نمط
يكفي ، لنفترض أن لديك البعض .c الملفات التي تم إنشاؤها باستخدام نوع من المعالجات المسبقة
الذي يأخذ كملفات إدخال بامتداد .k امتداد. تريد تجميع هؤلاء .c الملفات ذات الامتداد
مجموعة مختلفة من خيارات الترجمة من المعتاد .c الملفات التي هي مصدر عادي
الملفات. يمكنك فعل شيء مثل هذا:

# حكم لملفات .c العادية:
٪ .o:٪ .c
$ (CC) $ (CFLAGS) -c $ (إدخال) -o $ (إخراج)

# القاعدة لإنشاء ملفات .c من ملفات k:
٪ .c:٪ .k
$ (المعالج) $ (المدخلات)> $ (الإخراج)

# قواعد بناء خاصة لملفات .c التي يتم إنشاؤها من ملفات .k:
$ (foreach:٪. k =٪. o): $ (foreach:٪. c =٪. k): foreach * .k
$ (CC) $ (SPECIAL_CFLAGS) -c $ (إدخال) -o $ (إخراج)

(يستخدم هذا بناء جملة مرجع الاستبدال أكثر إيجازًا قليلاً بدلاً من الاستدعاء
"باتسوبست" صراحة.)

لاحظ أنه إذا كان كل ما تريد فعله هو تغيير قيمة متغير ("CFLAGS" في هذا
case) في بعض الأحيان يكون استخدام المتغيرات الخاصة بالهدف أكثر ملاءمة.

إرث لاحقة القواعد
للتوافق مع الإصدارات السابقة ، يدعم makepp قواعد لاحقة النمط القديم.

.suffix1.suffix2:
الإجراءات

ما يعادل

٪ .suffix2:٪ .suffix1
الإجراءات

ولكن من الصعب تذكرها. (أي لاحقة تأتي أولاً؟) عادةً ، ستظهر القاعدة
في صنع إرث مثل هذا:

.co:
$ (CC) $ (CFLAGS) -c $ *. c -o $ *. o

وهو ما يعادل بالضبط

٪ .o:٪ .c
$ (CC) $ (CFLAGS) -c $ (إدخال) -o $ (إخراج)

متضارب القواعد
عندما يكون هناك أكثر من طريقة لإنشاء ملف ، يستخدم makepp إجراءً بسيطًا لـ
تحديد أي قاعدة لاستخدامها.

· من الخطأ وجود قواعد صريحة متضاربة لبناء ملف.

· قواعد النمط وقواعد foreach مع أحرف البدل لا تتجاوز أبدًا القواعد الصريحة. هكذا
يمكن استخدام القواعد الصريحة لتحديد استثناءات لقواعد النمط. (لاحظ ذلك ببساطة
استخدام جملة ": foreach" لا يجعل شيئًا ما قاعدة نمط. يجب أن يحتوي على ملف
wildcard (مثل "*" أو "؟") كجزء من اسم الملف في عبارة ": foreach". اذا كانت
مجرد قائمة صريحة من الملفات ، يتم التعامل معها كقاعدة صريحة لكل منها
الملفات.)

· عندما تأتي قواعد النمط المتضاربة من ملفات makefiles مختلفة ، فإن القواعد من "الأقرب"
تتجاوز ملفات makefiles القواعد من ملفات makefiles "الأبعد". "أقرب" يعني أن makefile
يقع بالقرب من الهدف في التسلسل الهرمي للدليل (على سبيل المثال ، اسم ملف
الهدف المتعلق بالدليل الذي يتم تشغيل ملف makefile منه أقصر). اذا هذا
لا يميز makefiles ثم القاعدة من makefile الذي يتم تحميله
يستخدم الأحدث.

هذا يعني أنه يمكنك تحديد قاعدة نمط تنطبق على جميع الملفات في ملف
شجرة الدليل بالكامل في ملف makefile ذي المستوى الأعلى فقط ، ولكن بعد ذلك يمكنك تجاوزه
ملف makefile منخفض المستوى. على سبيل المثال ، يمكن أن يحتوي ملف makefile ذي المستوى الأعلى على:

٪ .o:٪ .c: foreach ** / *. c
$ (CC) $ (CFLAGS) -c $ (إدخال) -o $ (إخراج)

ويمكن أن يكون لديك ملف makefile في أحد الدلائل الفرعية يقول:

٪ .o:٪ .c
$ (CC) $ (SPECIAL_CFLAGS) -c $ (إدخال) -o $ (إخراج)

· تُفضل قواعد الأنماط التي لها سلسلة استدلال أقصر على الأنماط الأخرى
قواعد. على سبيل المثال ، إذا كانت لديك القواعد التالية (بناءً على مثال من ملف
نواة لينكس):

٪ .s:٪ .c
$ (CC) -s $ (إدخال) -o $ (إخراج)

٪ .o:٪ .s
$ (AS) $ (input) -o $ (output)

٪ .o:٪ .c
$ (CC) -c $ (المدخلات) -o $ (المخرجات)

إذا احتجنا إلى إنشاء ملف "xyz.o" ، فيمكننا إما إنشاء ملف ".s" الوسيط ثم
قم بتشغيل ذلك خلال المجمع باستخدام أول قاعدتين ، أو يمكننا الانتقال مباشرة إلى a
ملف ".o" باستخدام القاعدة الأخيرة. القاعدة الأخيرة مفضلة لأن هناك عدد أقل
خطوات في سلسلة الاستدلال (واحدة بدلاً من اثنين).

· قواعد النمط لاحقًا في قواعد نمط تجاوز makefile السابقة. (هذا هو
إلى الوراء من جعل جنو.) هذا يعني أنه يجب عليك وضع القواعد العامة الخاصة بك
في وقت سابق ، والقواعد الأكثر تحديدًا لاحقًا. على سبيل المثال،

٪ .o:٪ .c # قاعدة التجميع العامة.
عمل

خاص _٪. o: خاص _٪. c # قاعدة خاصة للملفات ذات الامتداد
إجراء مختلف # "special_" البادئة.

قاعدة الخيارات
في بعض الأحيان يكون من الضروري توفير خيارات إضافية لتعديل كيفية تنفيذ makepp لملف
قاعدة. يتم تحديد هذه الخيارات كـ ": optionname value" ، إما على السطر الذي يحتوي على
التبعيات ، أو في السطر التالي.

قد يتيح لك توفير الخيارات في سطور منفصلة إمكانية استخدامها
makefile مع makepp والطراز التقليدي. على سبيل المثال،

الهدف: التبعيات
: التوقيع target_newer
الإجراءات

سيعمل بشكل جيد مع إصدار يونكس التقليدي ، لأنه يفسر سطر ": التوقيع"
كأمر قذيفة ، والأمر الذي يبدأ بنقطتين لا يفعل شيئًا.

: build_cache / المسار / إلى / بناء / ذاكرة التخزين المؤقت
الهدف: التبعيات
: build_cache / put / cache / files / over / there
الإجراءات

يحدد المسار إلى ذاكرة التخزين المؤقت للبناء لاستخدامها في الملفات التي تنتجها هذه القاعدة. هذا
يتجاوز تأثير عبارة "build_cache" أو الأمر "--build-cache"
خيار الخط ، إن وجد ، لهذه القاعدة. راجع makepp_build_cache للحصول على تفاصيل حول build
مخابئ.

إذا حددت "لا شيء" بدلاً من المسار ، فإنك تقوم بتعطيل ذاكرة التخزين المؤقت للبناء لهذا الغرض
قاعدة خاصة. يمكن أن يكون هذا مفيدًا لتجنب إهدار مساحة القرص على الملفات التي تمتلكها
تعلم أنها ليست مفيدة للتخزين المؤقت ، إما لأنك متأكد جدًا من أنها لن تكون كذلك أبدًا
إعادة استخدامها أو لأنها مبنية بسرعة كبيرة بحيث لا يستحق تخزينها مؤقتًا.

: build_check طريقة البناء
الهدف: التبعيات
: build_check target_newer
الإجراءات

هذا يخبر makepp بالخوارزمية التي يجب استخدامها لتحديد ما إذا كانت الأهداف بحاجة إلى إعادة بناء.
راجع makepp_build_check لمزيد من التفاصيل. هذا يتجاوز تأثير
عبارة "build_check" أو خيار سطر الأوامر "--build-check-method" ، إن وجد ، لـ
هذه القاعدة.

: env متغير
أضف تبعية لقيم متغيرات البيئة المسماة. إذا كان أي منهم
تختلف عن البنية السابقة ، عندئذٍ تعتبر الأهداف قديمة ، إذا كان
طريقة build_check تملي ذلك. (جميع طرق فحص الإنشاء المضمنة باستثناء ملفات
target_newer احترم هذا.)

قد يكون VARIABLE من النموذج "filename in PATH_VARIABLE" (بين علامتي اقتباس) ، وفي هذه الحالة
تعتبر الأهداف قديمة إذا كان الدليل الأول من الفاصلة بين نقطتين
تختلف قيمة PATH_VARIABLE التي يوجد بها اسم الملف عن الإنشاء الأخير.
يمكن استخدام هذا لتجنب إعادة بناء الأهداف عند تغيير PATH_VARIABLE في ملف
طريقة غير ذات صلة.

:إرسال أمر
قم بتضمين كل إجراء من عمليات shell (لكن ليس إجراءات Perl أو أوامر Perl) في "sh -c '...'"
وابدأه بالأمر ، لكن افترض أن الهدف لا يعتمد على الأمر.
يكون هذا مفيدًا إذا كنت تريد إرسال إجراءات إلى نظام انتظار الوظائف ، ولكن النتيجة هي
يفترض أن تكون مستقلة عن معلمات قائمة الانتظار ، وكذلك عما إذا كانت قائمة الانتظار
يستخدم النظام على الإطلاق.

:يشمل file_or_pattern
تختلف القاعدة حسب المترجم:

٪ .o:٪ .c
: تشمل٪ .d: التوقيع ج
دول مجلس التعاون الخليجي -MD -c ...

٪ .o:٪ .c
: include٪ .u: التوقيع C # تستخدم IBM لاحقة مختلفة
XLC -M -ج ...

sub تعتمد على {# تحويل أحاديث Microsoft إلى تنسيق مفيد
ق / \ $ / \ $ \ $ / ز ؛
s / (ملاحظة: بما في ذلك الملف: *)؟ (. +؟) \ r؟ \ n / $ 1؟ "'$ 2'": "" ".f_output ()." ': "/ e؛
}
٪ .o:٪ .c
: تشمل٪ .d: التوقيع ج
cl -show يتضمن -c ...> $ (ساق). د
& sed & تعتمد على -o + <$ (ساق). د

يمكن لبعض المجمعين (icc Intel مثل مجلس التعاون الخليجي أعلاه ، أو xlc من IBM) إنتاج التبعية
الملفات على الطاير. أي ، بينما يقومون بالتجميع ، يكتبون ملف makefile يمكن لـ makepp
يشمل. الميزة على ماسح makepp هو أنه مضمون بنسبة 100٪
صحيح ، حيث قد نقترب فقط.

يعمل هذا الخيار على تسخير ذلك بطريقة خاصة: إذا لم يكن الملف موجودًا ، على سبيل المثال
عادةً في البناء الأول ، يحدث المسح العادي. لكن إذا كان الملف موجودًا ، فلا
يحدث المسح (ولهذا السبب نحدد توقيعًا ذكيًا أعلاه - لا يسقط المسح
العودة إلى الافتراضي البكم للطابع الزمني والحجم). بدلا من ذلك يتضمن الملف ، من قبل
تنفيذ القاعدة. بعد تنفيذ القاعدة بنجاح ، فإنها تنسى كل شيء
اقرأ في المرة الأولى ، نظرًا لأن الملف قد يكون قديمًا. بدلا من ذلك يقرأ
الملف مرة أخرى ، إذا تم تغييره ، للحصول على معلومات بناء محدثة.

تحذير: هذا غير موثوق بطبيعته. يتم إنتاج ملف التبعية بواسطة ملف
القاعدة التي هي تبعية. من ناحية أخرى ، يعرف المترجم كل شيء
إنها تضمنت فرعية داخلية ، والتي يتجاهلها makepp عادة. هذه موثوقية
ميزة فقط في الحالة التي يعمل فيها تصحيح المترجم على إصلاح التضمينات الفرعية فقط. ال
السعر هو أن makepp ينتهي بالبحث في العديد من الملفات ، الأمر الذي يستغرق وقتًا.

هناك مشكلة عند إزالة العبارة "#include" و الملف المقابل:
سيظل مذكورًا في ملف التبعية من المرة الأخيرة ، عندما كان
ضروري. في مثل هذه الحالة يجب عليك تحرير ملف التبعية لإزالة التبعية
التي لم تعد قابلة للتنفيذ.

لا يمكن استخدام هذه الميزة مع ذاكرة التخزين المؤقت للبناء بسبب إحضار ملف من هناك
يتطلب معرفة كل شيء عن الملف. لكن ملف التبعية يعتمد على هؤلاء
تتعلم ملفات makepp عن طريق قراءتها. مثل هذه التبعية الدائرية ليست عادة
ممكن في نظام بناء موثوق. هذا استثناء لأنه بعد إعادة البناء
وإعادة قراءة ملف التبعية كل شيء صحيح مرة أخرى.

إذا قمت ببناء مستودعاتك ، فسيقوم makepp بالتقاط ملف التبعية من ملف
المستودع الأول الذي يحتوي على واحد. هذا على عكس الملفات الأخرى ، حيث يأخذ الملف الأول
بالتوقيع المتوقع. هذا أفضل من بناء مخابئ ، حيث لعدم وجود
التوقيع ، لا يمكنه حتى العثور على الملف.

:آخر فرصة
قم بتمكين قاعدة مفتوحة ، مثل

٪ .foo foo٪ .bar:: last_chance
& صدى $ @ -o $ @
& cp $ (النواتج)

لأن قاعدة مثل هذه يمكن أن تولد عددًا لا نهائيًا من الأهداف ،
لن يتطابق هدف هذه القاعدة مع وظيفة $ (wildcard) أو قاعدة النمط ما لم يكن
هناك شيء آخر قد وضع القاعدة بالفعل من خلال الإشارة إلى الهدف على وجه التحديد.
علاوة على ذلك ، إذا تم تحديد "--rm-stale" ، فسيتم ترك هدف من السابق
سيظهر تشغيل makepp قديمًا إذا كانت الطريقة الوحيدة لبنائه هي عبر قاعدة الفرصة الأخيرة
التي لم يتم زرعها للهدف حتى الآن ، وهو سلوك مرغوب فيه لأن
سوف يفشل البناء بشكل أكثر اتساقًا عندما يعتمد بشكل خاطئ على حرف بدل
أهداف المباراة من تشغيل سابق.

الغرض من خيار ": last_chance" هو لفت الانتباه إلى السلوك الخاص لملف
حكم فيما يتعلق مطابقة أحرف البدل.

: محلل محلل
هذا يخبر makepp بكيفية تحليل الأمر لاكتشاف (تضمين) الملفات. عادة،
يخمن makepp كيفية القيام بذلك بناءً على الكلمات الموجودة في الأمر نفسه (راجع
makepp_scanning للحصول على التفاصيل). ومع ذلك ، إذا كانت تخمينات makepp خاطئة ، فقد ترغب في ذلك
أشر صراحة إلى المحلل اللغوي ، مثل هذا:

٪ .o:٪ .abc
: محلل c_compilation
العمل هنا

يؤدي هذا إلى إجراء makepp نفس التحليل والمسح الضوئي الذي يقوم به لـ C / C ++
بناء الأوامر ، حتى لو لم يتعرف على الإجراء كتجميع C.

يعتمد المحلل اللغوي الافتراضي على الأمر. إذا لم تحدد خيار ": parser" ،
ثم يتم فحص الكلمة الأولى من كل أمر. على سبيل المثال للترجمة أو الارتباط
الأمر ، سيستخدم makepp المحلل اللغوي "c_compilation" ؛ أو إذا كان الأمر يشبه
متغير جنو ، "gcc_compilation". إذا لم يتم العثور على محلل ، فإنه يستخدم المحلل اللغوي "بلا". ل
مزيد من التفاصيل حول هذا ، أو إذا كنت تريد كتابة المحلل اللغوي الخاص بك أو تغيير makepp's
موزعي افتراضي ، راجع makepp_scanning.

لاحظ أن هذا ينطبق على كل أمر في القاعدة ، والذي قد لا يكون ما تريده:

٪ .o:٪ .c: مترجم c المحلل اللغوي
echo "Building $ (output)"
ههههههههههههههههههههههههههههههههههه ...

سيؤدي هذا أيضًا إلى تفسير "الصدى" كمترجم واستنتاج حجته "البناء"
mymodule.o 'كاعتماد ضمني. سيؤدي ذلك إلى الشكوى من ذلك
لا يعرف كيف يبني مثل هذا الملف. في هذه الحالة ستكون أفضل حالاً مع
"register_parser". هناك تجد تفسيرا كيف محلل يمكن أن تعطى إما كملف
classname أو كاسم وظيفة.

:إمضاء طريقة التوقيع
الهدف: التبعيات
: توقيع md5
الإجراءات

هذا يخبر makepp بالخوارزمية التي يجب استخدامها لتحديد ما إذا كانت التبعيات قد تغيرت.
راجع makepp_signatures لمزيد من التفاصيل. طرق التوقيع المضمنة مع
توزيع makepp هي "عادي" أو "md5" أو "C" أو "c_compilation_md5" و
"كائن_مشترك". هذا يتجاوز أي أسلوب توقيع محدد بـ "-m" أو
خيارات سطر الأوامر "--signature-method" ، أو باستخدام بيان "التوقيع".

ملصقات خاصة الأحرف
يمكن لـ Makepp دعم أسماء الملفات التي تحتوي على أحرف خاصة مثل النقطتين أو المسافة.
لنفترض ، على سبيل المثال ، أنك تريد إنشاء ملف يسمى "a: thing" من ملف "b: thing".
لا يمكنك كتابة القاعدة بهذه الطريقة:

أ: الشيء: ب: الشيء # هذا خطأ نحوي
& قطة $ (إدخال) -o $ (إخراج)

لأن makepp لن يعرف أي النقطتين تفصل الأهداف عن التبعيات وأيها
جزء من أسماء الملفات. بدلاً من ذلك ، ضع الاسم بين علامتي اقتباس ، مثل هذا:

"أ: شيء": "ب: شيء"
& قطة $ (إدخال) -o $ (إخراج)

الآن القاعدة لا لبس فيها.

صيغة اقتباس Makepp تشبه إلى حد بعيد صيغة shell. يمكنك ، على سبيل المثال ، استخدام واحد
علامات الاقتباس بدلاً من علامات الاقتباس المزدوجة ، أو يمكنك الهروب من الأحرف الخاصة بشرطة مائلة للخلف:

أ \: الشيء: "ب: الشيء"
& قطة $ (إدخال) -o $ (إخراج)

افترض ، على سبيل المثال ، أن اسم الملف الخاص بك هو "" "!؛ \ $". الآن لماذا تريد مثل هذا اسم الملف
لا أعلم ، ولكن إليك عدة طرق يمكنك من خلالها تحديدها (والقشرة):

\ '' "!؛ \ $$ '
"'\"!؛ \\ $$ "

انتبه إلى متى تقتبس شرائط makepp وعندما تفعل الصدفة. ينظر Makepp في
يقتبس فقط في الحالات التالية:

· في عائلة الاختبارات "ايفيق"

· قبل وبعد حكم القولون

· في أمر makepp المدمج

في وظيفة تتعلق بالملفات

على عكس الصدفة ، لا توسع makepp علامات الاقتباس أثناء إسنادها إلى متغير. هكذا
القواعد التالية متطابقة:

FILE = "اسم به مسافات"
x: = $ (print $ (FILE)) # فقط للتحقق من أن الاقتباسات لا تزال موجودة
$ (FILE): # علامات اقتباس حول ملف واحد تم تجريده بواسطة makepp
& echo hello -o $ (FILE) # اقتباسات حول ملف واحد تم تجريده بواسطة makepp
صدى هناك >> $ (FILE) # يقتبس حول ملف واحد جردته شركة شل
"اسم بمسافات":
& صدى مرحبًا -o'name مع مسافات '
صدى هناك >> '$ (output)' # تم تجريد علامات الاقتباس أعلاه ، قم بإضافتها مرة أخرى

لاحظ أنه (على عكس Shell) المتغيرات التي تبدأ بـ "$" يتم توسيعها حتى داخل المتغيرات الفردية
يقتبس. لا يمكن حماية علامات الدولار بعلامات الاقتباس أو الخطوط المائلة للخلف. للحصول على حرفيا
علامة الدولار ، استخدم علامة الدولار المزدوجة ، على سبيل المثال ،

$ (الكل زائف):
@ & صدى هذه علامة الدولار: $$
@ for val في abcd ؛ فعل صدى $$ val؛ منتهي

بشكل عام ، يجب أن تكون قادرًا على التعامل مع أي شخصية خاصة تقريبًا عن طريق الاقتباس منها
بطريقة ما. يتضمن ذلك المسافات وأحرف التحكم وما إلى ذلك. ومع ذلك ، كن على علم بذلك في
يعد تجريد تعليق makepp في الوقت الحاضر أمرًا بسيطًا إلى حد ما ، وأي أحرف "#"
مسبوقة بمسافة بيضاء سيتم تفسيرها على أنها تعليقات بغض النظر عن كيفية اقتباسها.

عندما يتم وضع اسم الهدف أو التبعية في متغير تلقائي مثل "$ (الإخراج)" ، إذن
يتم تجريد علامات الاقتباس وأي خطوط مائلة عكسية. هذا يعني أنك إذا كنت تريد الرجوع إلى
اسم الملف في الإجراءات ، ربما يتعين عليك اقتباسه مرة أخرى ، مثل هذا:

"اسم ملف به مسافات":
صدى "محتويات خاصة"> "$ @"

إذا لم تضع علامات الاقتباس حول $ @ ، فستشاهد الصدفة الأمر

صدى "محتويات خاصة"> اسم ملف به مسافات

الذي يكتب السلسلة "محتويات خاصة اسم ملف مع مسافات" إلى الملف المسمى a.
هذا هو على الارجح ليس ما تريد.

استخدم makepp_rules عبر الإنترنت باستخدام خدمات onworks.net


خوادم ومحطات عمل مجانية

قم بتنزيل تطبيقات Windows و Linux

أوامر لينكس

Ad