RPM-MACROS(7)

الاسم
rpm-macros - معالج وحدات ماكرو RPM

موجز

  التعريف
%الاسم المتن

%الاسم([الخيارات]) المتن

  التوسيع
%الاسم

%الاسم [الخيارات] [المعطيات]

%{الاسم}

%{الاسم [الخيارات] المعطيات}

%{الاسم:المعطى}

%{?الاسم}

%{?الاسم:القيمة-إذا-عُرِّف}

%{!?الاسم:القيمة-إذا-لم-يُعرَّف}

%(أمر-الصدفة)

%[التعبير]

%[التعبير ? القيمة-إذا-صحيح : القيمة-إذا-خطأ]

%{lua:كود-lua}

الوصف

يمتلك RPM معالج وحدات ماكرو مدمج وقوي. الاستخدامات الرئيسة لوحدات الماكرو هي الضبط والوظائف المساعدة الأخرى لـ RPM نفسه، وكأداة مساعدة في التحزيم في ملفات المواصفات (spec files).

بالإضافة إلى استبدال النص البسيط، يدعم معالج الماكرو التسهيلات التالية:
•   وحدات ماكرو وسيطية تشبه الدوال مع معالجة الخيارات والمعطيات ووحدات ماكرو آلية ومُعرَّفة من قِبل المستخدم ذات نطاق محلي
•   توسيع الصدفة
•   توسيع التعبير
•   توسيع Lua لمعالجة Lua المضمنة
•   وحدات ماكرو مدمجة متنوعة لمعالجة السلاسل النصية والتفاعل مع نظام التشغيل

صيغة تعريف وحدات الماكرو البسيطة هي:

    الاسم المتن

تُزال كل المساحات البيضاء المحيطة بـ المتن. قد يتكون الاسم من حروف وأرقام وشرطة سفلية (_)، ويجب ألا يقل طوله عن حرفين. يُوسَّع (أو يُعاد توسيع) المتن عند كل استدعاء للماكرو. أسماء وحدات الماكرو وخياراتها حساسة لحالة الأحرف.

انظر وحدات الماكرو الوسيطية للتعرف على متغير الماكرو الأكثر تقدماً مع معالجة الخيارات والمعطيات.

يمكن تعريف وحدات الماكرو عبر ملفات rpm-macrofile(5)، وإدارتها بالكامل باستخدام أساسيات الماكرو %define و %global و %undefine، وسطر أوامر RPM الموصوف في rpm-common(8) والواجهة البرمجية (C، بايثون، Lua).

باستثناء تلك المعرفة داخل وحدات الماكرو الوسيطية، تكون وحدات الماكرو دائماً عامة النطاق.

وحدات ماكرو RPM مكدسة، أي عند إعادة تعريف ماكرو موجود بالفعل، فإنه يظلل التعريف السابق بدلاً من استبداله، وإلغاء تعريف ماكرو يؤدي فقط إلى إزالة التعريف العلوي، مما يؤدي إلى تنشيط تعريف الماكرو السابق.

لاحظ أن هذا الدليل يصف فقط محرك معالج الماكرو نفسه. في نظام عادي مبني على RPM، هناك عدد هائل من وحدات الماكرو الأخرى المعرفة من خلال ملفات rpm-macrofile(5) والتي لن تُغطى هنا.

توسيع
لتوسيع ماكرو، ضع % أمامه. تُدعم عدة أشكال:

%الاسم
    توسيع الماكرو الاسم.

%{الاسم}
    توسيع الماكرو الاسم، مع السماح بوضعه بجوار نص آخر (مشابه لـ ${ENV} في الصدفة).

%الاسم [الخيارات] [المعطيات]
    توسيع الماكرو الوسيطي/المدمج الاسم، باستخدام الخيارات والمعطيات المحللة حتى نهاية السلسلة أو السطر الجديد التالي.

    يمكن استخدام -- لفصل الخيارات عن المعطيات.

%{الاسم [الخيارات] [المعطيات]}
    توسيع الماكرو الوسيطي/المدمج الاسم، باستخدام الخيارات والمعطيات المحللة حتى علامة الإغلاق }. يسمح بالاستخدام بجوار نص آخر.

%{الاسم:المعطى}
    توسيع الماكرو الوسيطي/المدمج الاسم، باستخدام السلسلة بعد : كمعطى وحيد. يسمح بالاستخدام بجوار نص آخر.

ملاحظة: صيغ استدعاء وحدات الماكرو الوسيطية والمدمجة قابلة للتبادل بشكل عام الآن، ولكن قبل الإصدار 4.18، كانت صيغة %{الاسم:المعطى} حصرية لوحدات الماكرو المدمجة.

يمكن الهروب من توسيع الماكرو بوضع % ثانية أمام الماكرو، على سبيل المثال %%{name} ستُوسَّع لتصبح %{name}.

تؤدي محاولة توسيع ماكرو غير معرف إلى التوسع إلى الاستدعاء الحرفي، مثلاً %_undefined تُوسَّع إلى %_undefined. إذا لم يكن هذا مطلوباً، فاستخدم الشروط.

يمكن لتوسعات الماكرو أن تتكرر حتى 64 مستوى.

  توسيع الصدفة
يمكن إجراء توسيع الصدفة باستخدام %(أمر الصدفة). يُوسَّع أمر_الصدفة قبل تنفيذه باستخدام /bin/sh، والذي يصبح خرجه هو توسيع الماكرو. يُحذف السطر الجديد اللاحق.

مثال:
    %(echo aa-bb-cc | tr '-' '.')

  التوسيع المشروط
يدعم معالج الماكرو اختبار ما إذا كان الماكرو مُعرَّفاً أم لا.

%{?الاسم:القيمة}
    يُوسَّع إلى توسيع القيمة إذا كان الاسم مُعرَّفاً، وإلا فإنه يُوسَّع إلى سلسلة نصية فارغة.

%{!?الاسم:القيمة}
    يُوسَّع إلى توسيع القيمة إذا كان الاسم غير مُعرَّف، وإلا فإنه يُوسَّع إلى سلسلة نصية فارغة.

%{?الاسم}
    اختصار لـ %{?الاسم:%{الاسم}}.

لإجراء اختبارات أكثر تعقيداً، استخدم توسيع التعبير أو توسيع Lua. لاحظ أن %if و %ifarch وما شابهها ليست وحدات ماكرو، بل هي توجيهات ملف المواصفات (spec) ولا يمكن استخدامها إلا في ذلك السياق.

لاحظ أنه في RPM >= 4.17، تختبر الشروط في وحدات الماكرو المدمجة ببساطة وجود ذلك الماكرو المدمج، تماماً كما هو الحال مع أي وحدات ماكرو أخرى. في الإصدارات الأقدم، يكون سلوك الشروط على المدمجات غير محدد.

  توسيع التعبير
يمكن إجراء توسيع التعبير باستخدام %[التعبير]. يتكون التعبير من حدود يمكن دمجها باستخدام العوامل.

يدعم RPM ثلاثة أنواع من الحدود:
•   أرقام مكونة من خانات
•   سلاسل نصية محاطة بعلامات اقتباس مزدوجة (مثل "سلسلة-نصية")
•   إصدارات محاطة بعلامات اقتباس مزدوجة مسبوقة بـ v (مثل v"3:1.2-1")

سيقوم RPM بتوسيع وحدات الماكرو عند تقييم الحدود.

يمكنك استخدام العوامل القياسية لدمج الحدود:
•   العوامل المنطقية &&، ||، !
•   عوامل العلاقات !=، ==، <، >، <=، >=
•   العوامل الحسابية +، -، /، *،
•   العامل الثلاثي ? :
•   الأقواس

على سبيل المثال، %[ 3 + 4 * (1 + %two) ] ستُوسَّع إلى 15 إذا كانت %two تُوسَّع إلى 2. تُقارن حدود الإصدار باستخدام خوارزمية مقارنة إصدارات RPM ([الحقبة:]الإصدار[-الإطلاق])، بدلاً من مقارنة السلاسل النصية العادية.

لاحظ أن توسيع %[التعبير] يختلف عن ماكرو %{expr:التعبير}. مع الأخير، تُوسَّع وحدات الماكرو في التعبير أولاً ثم يُقيَّم التعبير (دون إعادة توسيع الحدود). وبالتالي

    rpm --define 'foo 1 + 2' --eval '%{expr:%foo}'

ستطبع 3. استخدام %[%foo] بدلاً من ذلك سيؤدي إلى خطأ مفاده أن "1 + 2" ليس رقماً.

إن إجراء توسيع الماكرو عند تقييم الحدود له ميزتان. أولاً، يسمح لـ RPM بإجراء معالجة الدائرة القصيرة الصحيحة عند تقييم العوامل المنطقية. ثانياً، لا تؤثر نتيجة التوسع على تحليل التعبير، مثلاً %["%file"] ستعمل حتى لو توسع ماكرو %file إلى سلسلة نصية تحتوي على علامة اقتباس مزدوجة.

أُضيف في: 4.16.0

  توسيع Lua
أقوى طرق توسيع الماكرو هي استخدام مفسر Lua المضمن في RPM:

%{lua:كود-lua}
    تنفيذ كود-LUA باستخدام مفسر Lua المضمن في RPM، والتوسع إلى خرج الدالة print() في الكود.

انظر rpm-lua(7) للتفاصيل.

وحدات الماكرو الوسيطية
وحدات الماكرو الوسيطية هي آلية قوية تسمح ببناء وحدات ماكرو مساعدة تشبه الدوال مع معالجة الخيارات وقبول عدد متغير من المعطيات، تماماً مثل أدوات الصدفة الشائعة.

صيغة تعريف وحدات الماكرو الوسيطية هي:

    الاسم([الخيارات]) المتن

إذا وُجدت الخيارات (أي السلسلة بين الأقواس)، فإنها تُمرر كما هي تماماً إلى getopt(3) لمعالجة argc/argv في بداية استدعاء الماكرو. تُدعم الخيارات القصيرة فقط.

استخدام - كحقل وحيد لـ الخيارات يعطل معالجة خيارات RPM. يسمح هذا لوحدات الماكرو بأن تقرر بالكامل كيفية التعامل مع مدخلاتها، مثلاً إذا كانت معطيات الماكرو تتكون فقط أو غالباً من عناصر تبدأ بـ -، فإن المعالجة المبدئية ستكون عائقاً فقط.

  وحدات الماكرو الآلية
بينما يتم توسيع ماكرو وسيطي، تتوفر وحدات الماكرو الآلية الشبيهة بالصدفة التالية:

الماكرو | الوصف
%0 | اسم الماكرو المُستدعَى
%* | كل الوسائط (على عكس الصدفة shell، لا يشمل أي أعلام عولجت)
%** | كل الوسائط (بما في ذلك أي أعلام عولجت)
%# | عدد الوسائط
%{-f} | في حال وجوده عند الاستدعاء، آخر ظهور للعلم f (العلم والوسيط)
%{-f*} | في حال وجوده عند الاستدعاء، وسيط آخر ظهور للعلم f
%1، %2، ... | الوسائط ذاتها (بعد معالجة getopt(3))

إذا عُطّلت معالجة الخيارات المدمجة باستخدام - في حقل OPTIONS، فلن تتوفر سوى وحدات الماكرو الآلية التالية:

الماكرو | الوصف
%0 | اسم الماكرو المُستدعَى
%*، %** | كل الوسائط
%# | عدد الوسائط
%1، %2، ... | الوسائط ذاتها

تُعرّف وحدات الماكرو الآلية وتُلغى آليًا عند الدخول إلى ماكرو وسائطي والخروج منه.

  الوصول إلى الخيارات
داخل متن الماكرو الوسائطي، توجد عدة تراكيب تسمح باختبار وجود وسائط اختيارية. أبسط تركيب هو %{-f} الذي يتمدد (حرفيًا) إلى -f إذا ذُكر -f عند استدعاء الماكرو. توجد أيضًا أحكام لتضمين نص في حال وجود علم باستخدام %{-f:X}. يتمدد هذا الماكرو إلى (تمدد) X إذا كان العلم موجودًا. الصيغة المنفية، %{!-f:Y}، التي تتمدد إلى (تمدد) Y إذا لم يكن -f موجودًا، مدعومة أيضًا.

  النطاق والرؤية
بشكل عام، تملك وحدات الماكرو نطاقًا عامًا، بغض النظر عن مكان وكيفية تعريفها. ومع ذلك، فإن وحدات الماكرو المعرفة داخل وحدات ماكرو وسائطية تملك نطاقًا غير عام كما يلي:
•   وحدات الماكرو الآلية تملك نطاقًا محليًا، أي أنها مرئية فقط على مستوى استدعاء الماكرو نفسه
•   وحدات الماكرو المحلية التي يُعرفها المستخدم تملك نطاقًا متداخلاً، أي أنها مرئية على مستوى استدعاء الماكرو نفسه وما دونه

بمعنى آخر، لا يمكن لماكرو وسائطي رؤية خيارات أو وسائط ماكرو آخر، لكن يمكن الوصول إلى ماكرو محلي عرّفه المستخدم في ماكرو مُستدعٍ داخل المُستدعَى (أو المُستدعَيْن).

لتعريف ماكرو عام داخل ماكرو وسائطي، يجب استخدام %global بدلاً من %define. لاحظ أيضًا أنه بما أن مثل هذا الماكرو قد يشير إلى وحدات ماكرو أخرى مرئية فقط في النطاق الحالي، فإن %global يُمدد متن الماكرو مرة واحدة عند وقت التعريف.

  اتفاقية الاستدعاء
عند تمديد ماكرو وسائطي، تُستخدم اتفاقية الاستدعاء التالية:
1.  تُمدد أي وسائط للماكرو على مستوى استدعاء المُستدعَى
2.  تُعالج أي خيارات للماكرو
3.  تُعدّ وحدات الماكرو الآلية للخيارات والوسائط
4.  يُمدد متن الماكرو تكراريًا
5.  تُنبذ جميع وحدات الماكرو المعرفة على مستوى الاستدعاء هذا

وحدات الماكرو المدمجة
يدعم RPM وحدات الماكرو المدمجة التالية لعمليات متنوعة. لا يمكن إلغاء تعريف وحدات الماكرو المدمجة أو تجاوزها.

ملاحظة: يُستخدم نمط %{name:arg} هنا لأنه الأكثر توافقًا مع الإصدارات القديمة ولا يتطلب اقتباسًا للمسافات البيضاء، ولكن يمكن استبداله عمومًا بأشكال التمدد الأخرى أيضًا. المدمجات التي تأخذ وسائط متعددة يجب أن تستخدم أنماطًا أخرى، كما هو موضح أدناه.

  التلاعب بالماكرو
تُستخدم أساسيات الماكرو للتلاعب بالماكرو في ملفات المواصفات ووحدات الماكرو الأخرى. لاحظ أن كل هذه العمليات تعمل على اسم الماكرو دون بادئة حرف %.

%define الاسم[([الخيارات])] المتن
    هذه هي الطريقة الرئيسة لتعريف وحدات الماكرو. يُعد %define دائمًا تصريحيًا بالكامل: لا يحدث تمدد للماكرو، وليس له آثار جانبية. تكون وحدات الماكرو المعرفة به في نطاق عام، ما لم يحدث التعريف داخل ماكرو وسائطي.

    مثال:
        %define mypath /usr/bin/mine

%global الاسم[([الخيارات])] المتن
    أساسية %global متطابقة في البنية مع %define، ولكن لها اختلافان سلوكيان بالغا الأهمية: كما يوحي اسمها، فإن الماكرو المعرف باستخدام %global يملك دائمًا نطاقًا عامًا بغض النظر عن مكان استخدامه.

    الاختلاف الثاني هو أن المتن يُمدد مرة واحدة وقت التعريف ويصبح التمدد هو متن الماكرو الفعلي. وبذلك، قد يحدث تنفيذ تعليمات برمجية تعسفية وآثار جانبية عند استخدام %global، اعتمادًا على المحتويات ووحدات الماكرو الأخرى المستخدمة في المتن. يمكن أن يكون الأمر الأخير مفيدًا لتجنب تمديدات الماكرو المتكررة والمكلفة إذا كانت القيمة لا تتغير، ولكن كن حذرًا من الآثار الجانبية.

    لاحظ أنه بينما يقبل %global تقنيًا حقل OPTIONS، إلا أنه غير مناسب لتعريف وحدات الماكرو الوسائطية بسبب سلوك تمدد المتن.

    مثال:
        %global snapver 0-0.48.20240616git

%undefine الاسم
    لاحظ أن %undefine يقوم فقط بسحب تعريف الماكرو من المكدس، لذا فإن استخدامه لا يضمن عدم تعريف الاسم بعد استدعاء %undefine عليه. لا يمكن إلغاء تعريف وحدات الماكرو الآلية والمدمجة.

    مثال:
        %undefine mypath

%{load:الملف}
    حمل ملف rpm-macrofile(5). (أُضيف في: 4.12.0)

    مثال:
        %{load:/some/dir/macros.foo}

  تمدد الماكرو
%{expand:المتن}
    مدد المتن كما لو كان متن ماكرو. مفيد لزيادة المداورة، مثل تمديد اسم ماكرو مُركّب من ماكروين أو أكثر.

    مثال:
        %{expand:%{foo_prefix}%{foo_suffix}}

%{expr:التعبير}
    مدد التعبير. انظر Expression expansion. (أُضيف في: 4.15.0)

    مثال:
        %{expr:5*1024}

%{lua:كود-lua}
    تمدد إلى مخرجات LUA-CODE باستخدام مفسر Lua المدمج. انظر Lua expansion.

    مثال:
        %{lua:for i=65,90 do print(string.char(i)) end}

%{macrobody:الاسم}
    تمدد إلى المتن الحرفي للماكرو الاسم. (أُضيف في: 4.16.0)

    مثال:
        %{macrobody:_libdir}

  عمليات السلاسل النصية
%dnl
    انبذ حتى السطر التالي (دون تمديد أي شيء). يُعد %dnl هو الطريقة الموصى بها للتعليق على الأشياء في ملفات المواصفات لأنه يعمل في كل مكان ويعطل معالجة الماكرو لهذا السطر. (أُضيف في: 4.15.0)

    مثال:
        %dnl هذا تعليق على سلوك %{mymacro}

%{gsub السلسلة, النمط, البديل [,N]}
    استبدل كل (أو أول N إذا أُعطيت) حالات ظهور النمط في السلسلة بواسطة البديل.

    أُضيف في: 4.19.0

    مثال:
        %{gsub aabbaacc aa dd 1}

%{len:السلسلة}
    تمدد إلى طول السلسلة. (أُضيف في: 4.19.0)

    مثال:
        %{len:9bf7da058a7c582878310e75be3d56a5a8b67f95}

%{lower:السلسلة}
    تمدد إلى السلسلة بأحرف صغيرة. (أُضيف في: 4.19.0)

    مثال:
        %{lower:CamelCase}'

%{quote:السلسلة}
    اقتبس الوسائط لتمرير السلاسل الفارغة والسلاسل التي تحتوي على مسافات بيضاء مدمجة كوسائط ماكرو وسائطية. (أُضيف في: 4.14.0)

    مثال:
        %myzip -x %{quote:empty spaces.zip}

%{rep السلسلة, N [,الفاصل]}
    تمدد إلى سلسلة نصية هي عبارة عن دمج لـ N نسخة من السلسلة، مفصولة بـ الفاصل (إذا حُدد).

    أُضيف في: 4.19.0

    مثال:
        %{rep a 5}

%{reverse:السلسلة}
    اعكس سلسلة نصية. (أُضيف في: 4.19.0)

    مثال:
        %{reverse:tac}

%{shescape:السلسلة}
    ضع السلسلة بين علامتي اقتباس مفردتين مع هروب للاستخدام في الصدفة shell. (أُضيف في: 4.18.0)

    مثال:
        %{shescape:foo's}

%{shrink:السلسلة}
    قلم المسافات البيضاء البادئة واللاحقة من السلسلة، واختزل المسافات البيضاء المتوسطة إلى مسافة واحدة. (أُضيف في: 4.14.0)

    مثال:
        %{shrink:aa  bb   ccc   }

%{span:السلسلة}
    سلسلة نصية كما هي، مفيدة لتغليف وحدات ماكرو متعددة الأسطر. (أُضيفت: 6.0.0)

    مثال:
        %{span:
        	%شيء واحد
        	%شيء آخر
        }

%{sub STRING، I، [،J]}
    توسيع إلى سلسلة فرعية من STRING تبدأ عند I وتستمر حتى J. يمكن أن تكون I و J سالبتين للفهرسة من نهاية السلسلة. إذا غابت J، فيُفترض أنها تساوي -1 (أي نهاية السلسلة).

    أُضيف في: 4.19.0

    مثال:
        *%{sub myfile.zip 3 6}*

%{upper:STRING}
    توسيع STRING إلى أحرف كبيرة. (أُضيفت: 4.19.0)

    مثال:
        %{upper:CamelCase}'

  عمليات الملفات والمسارات
%{basename:PATH}
    نظير ماكرو basename(1).

    مثال:
        %{basename:/some/dir/file.suf}

%{dirname:PATH}
    نظير ماكرو dirname(1).

    مثال:
        %{dirname:/some/dir/file.suf}

%{exists:PATH}
    اختبار وجود الملف، يتوسع إلى 1/0. (أُضيف: 4.18.0)

    مثال:
        %{exists:%{builddir}/myflag.txt}

%{suffix:PATH}
    التوسع إلى جزء اللاحقة من اسم الملف.

    مثال:
        %{suffix:myfile.zip}

%{url2path:URL}
    تحويل العنوان (URL) إلى مسار محلي.

    مثال:
        %{url2path:http://rpm.org/not/there}

%{uncompress:PATH}
    التوسع إلى أمر لإخراج المعطى PATH إلى المخرج القياسي، مع فك الضغط حسب الحاجة.

    مثال:
        %{uncompress /my/source.tar.gz}

%{xdg:KIND}
    التوسع إلى مسارات دليل XDG الأساسي. القيم المدعومة لـ KIND هي:
    •   cache: بيانات غير أساسية خاصة بالمستخدم (مخبأة في خبيئة)
    •   config: ملفات الضبط الخاصة بالمستخدم
    •   data: ملفات البيانات الخاصة بالمستخدم
    •   state: بيانات الحالة الخاصة بالمستخدم

    أُضيف: 6.0.0

    مثال:
        %{xdg config}

  معلومات البيئة
%getncpus
    التوسع إلى عدد المعالجات المتاحة. (أُضيف: 4.15.0)

%{getncpus:KIND}
    التوسع إلى عدد المعالجات المتاحة، القيم المدعومة لـ KIND هي
    •   total: إجمالي عدد المعالجات المتاحة (مطابق لـ %getncpus)
    •   proc: عدد المعالجات المتاحة للعمليات
    •   thread: عدد المعالجات المتاحة للخيوط

    تأخذ proc و thread في الحسبان الذاكرة المتاحة، بما في ذلك قيود مساحة العناوين للخيوط.

    أُضيف: 4.19.0.

    مثال:
        %{getncpus proc}

%getconfdir
    التوسع إلى دليل RPM "الرئيس" (عادةً /usr/lib/rpm).

%{getenv:NAME}
    نظير ماكرو getenv(3).

    مثال:
        %{getenv:HOME}

%rpmversion
    التوسع إلى نسخة RPM التي تعمل حالياً.

  المخرجات
%{echo:STRING}
    طباعة STRING إلى المخرج القياسي للعملية.

    مثال:
        %{echo:Building with foo}

%{warn:STRING}
    طباعة STRING مسبوقة بـ "warning: " إلى الخطأ القياسي للعملية.

    مثال:
        %{warning:Foo is deprecated}

%{error:STRING}
    طباعة STRING مسبوقة بـ "error: " إلى الخطأ القياسي للعملية ووضع علامة خطأ في معالج الماكرو.

    مثال:
        %{error:Invalid argument}

%verbose
    التوسع إلى 1/0 فيما إذا كان RPM في الوضع المُسهب أم لا. (أُضيف: 4.17.1)

%{verbose:STRING}
    التوسع إلى STRING إذا كان RPM في الوضع المُسهب، وإلى سلسلة فارغة إذا لم يكن. (أُضيف: 4.17.1)

    مثال:
        %{verbose:-x}

  وحدات الماكرو الخاصة بملف المواصفات (spec)
%{S:NUMBER}
    التوسع إلى اسم الملف لـ المصدر (Source) المحددة بـ NUMBER. ‏%{S:n} تكافئ %{SOURCEn}.

%{P:NUMBER}
    التوسع إلى اسم الملف لـ الرقعة (Patch) المحددة بـ NUMBER. ‏%{P:n} تكافئ %{PATCHn}.

  التشخيصات
%trace
    تبديل طباعة معلومات التنقيح قبل/بعد التوسيع.

%dump
    طباعة جدول وحدات الماكرو النشطة (أي غير المغطاة).

%__file_name
    التوسع إلى اسم الملف الحالي (في حال تحليل ملف). (أُضيف: 4.15)

%__file_lineno
    التوسع إلى رقم السطر الحالي في الملف الحالي (في حال تحليل ملف). (أُضيف: 4.15)

أمثلة

  المثال 1. تعريف ماكرو بسيط
تعريف ماكرو mylib إلى مسار نسبي لماكرو %{_libdir} في ملف مواصفات:

    %define mylib %{_libdir}/mine

  المثال 2. تعريف ماكرو وسيطي
تعريف ماكرو وسيطي myhelper ينفذ البرنامج المحدد بواسطة %myprog مع معطاه الأول ويمرر الخيار --some-opt إليه دائماً، وبالإضافة إليه الخيار --xtra إذا تلقى الماكرو الخيار -x نفسه:

    %define myhelper(x) %{myprog} --some-opt %{?-x:--xtra} %{1}

  المثال 3. تعريف ماكرو يستخدم توسيع الصدفة
تعريف الماكرو %today الذي يتوسع إلى التاريخ الحالي بتنسيق YYMMDD عبر استدعاء أداة الصدفة date(1). لاحظ رمز % الثاني اللازم لهروب معطيات date(1):

    %define today %(date +%%y%%m%%d)

  المثال 4. تعريف ماكرو شرطياً
تعريف الماكرو mypath إذا لم يكن معرفاً مسبقاً:

    %{!?mypath: %define mypath /some/where}

  المثال 5. التوسع الشرطي
يتوسع إلى 1 إذا كان use_foo معرفاً، و 0 خلاف ذلك:

    %{?use_foo:1}%{!?use_foo:0}

  المثال 6. التعبيرات
حساب 5 * 1024:

    %[5 * 1024]

توسيع إلى true أو false حرفيًا بناءً على شرط:

    %[1 < 2 ? "true" : "false"]

مقارنة الإصدارات، مع التوسيع إلى 1 أو 0 عند الصحة/الخطأ:

    %[ v"3.1.0-1" < v"1.0~alpha-2" ? 1 : 0]

يتوسع إلى 1 إذا توسع %aa إلى 5، وإلا فإنه يتوسع إلى 2:

    %[ "%{aa}" == "5" ? 1 : 2]

تنقيح
بعض الأدوات المفيدة للعمل مع الماكرو واستكشاف أخطائه وإصلاحها:

rpm --eval "القيمة"
    توسيع القيمة على سطر الأوامر.

rpm --define "aa 11" --eval "%aa"
    تعريف وتقييم ماكرو على سطر الأوامر.

rpm --eval "%global unamer %(uname -r)" --eval "%{macrobody:unamer}"
    تعريف وفحص متن الماكرو باستخدام %global على سطر الأوامر.

rpm --eval "%define unamer %(uname -r)" --eval "%{macrobody:unamer}"
    تعريف وفحص متن الماكرو باستخدام %define على سطر الأوامر.

rpmlua
    تشغيل صدفة تفاعلية في بيئة Lua المضمنة.

rpmlua -e 'print(macros.defined("_libdir"))'
    باستخدام مفسر Lua المضمن في شكل مستقل، اطبع 1/0 لمعرفة ما إذا كان الماكرو _libdir معرفًا أم لا.

rpmspec --shell
    تشغيل صدفة تفاعلية في بيئة الماكرو.

rpmspec --shell telnet.spec
    تشغيل صدفة تفاعلية في بيئة الماكرو بعد تحليل telnet.spec.

انظر أيضًا
rpm(8) rpm-common(8) rpm-macrofile(5) rpm-config(5) rpm-lua(7) rpmspec(1) rpmlua(1)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.