table of contents
| RPM-MACROS(7) | Miscellaneous Information Manual | 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) والتي لن تُغطى هنا.
توسيع¶
لتوسيع ماكرو، ضع % أمامه. تُدعم عدة أشكال:
%الاسم
%{الاسم}
%الاسم [الخيارات] [المعطيات]
يمكن استخدام -- لفصل الخيارات عن المعطيات.
%{الاسم [الخيارات] [المعطيات]}
%{الاسم:المعطى}
ملاحظة: صيغ استدعاء وحدات الماكرو الوسيطية والمدمجة قابلة للتبادل بشكل عام الآن، ولكن قبل الإصدار 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}
انظر 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 mypath /usr/bin/mine
%global الاسم[([الخيارات])] المتن
الاختلاف الثاني هو أن المتن يُمدد مرة واحدة وقت التعريف ويصبح التمدد هو متن الماكرو الفعلي. وبذلك، قد يحدث تنفيذ تعليمات برمجية تعسفية وآثار جانبية عند استخدام %global، اعتمادًا على المحتويات ووحدات الماكرو الأخرى المستخدمة في المتن. يمكن أن يكون الأمر الأخير مفيدًا لتجنب تمديدات الماكرو المتكررة والمكلفة إذا كانت القيمة لا تتغير، ولكن كن حذرًا من الآثار الجانبية.
لاحظ أنه بينما يقبل %global تقنيًا حقل OPTIONS، إلا أنه غير مناسب لتعريف وحدات الماكرو الوسائطية بسبب سلوك تمدد المتن.
مثال:
%global snapver 0-0.48.20240616git
%undefine الاسم
مثال:
%undefine mypath
%{load:الملف}
تمدد الماكرو¶
%{expand:المتن}
مثال:
%{expand:%{foo_prefix}%{foo_suffix}}
%{expr:التعبير}
مثال:
%{expr:5*1024}
%{lua:كود-lua}
مثال:
%{lua:for i=65,90 do print(string.char(i)) end}
%{macrobody:الاسم}
مثال:
%{macrobody:_libdir}
عمليات السلاسل النصية¶
%dnl
مثال:
%dnl هذا تعليق على سلوك %{mymacro}
%{gsub السلسلة, النمط, البديل [,N]}
أُضيف في: 4.19.0
مثال:
%{gsub aabbaacc aa dd 1}
%{len:السلسلة}
مثال:
%{len:9bf7da058a7c582878310e75be3d56a5a8b67f95}
%{lower:السلسلة}
مثال:
%{lower:CamelCase}'
%{quote:السلسلة}
مثال:
%myzip -x %{quote:empty spaces.zip}
%{rep السلسلة, N [,الفاصل]}
أُضيف في: 4.19.0
مثال:
%{rep a 5}
%{reverse:السلسلة}
مثال:
%{reverse:tac}
%{shescape:السلسلة}
مثال:
%{shescape:foo's}
%{shrink:السلسلة}
مثال:
%{shrink:aa bb ccc }
%{span:السلسلة}
مثال:
%{span:
%شيء واحد
%شيء آخر
}
%{sub STRING، I، [،J]}
أُضيف في: 4.19.0
مثال:
*%{sub myfile.zip 3 6}*
%{upper:STRING}
مثال:
%{upper:CamelCase}'
عمليات الملفات والمسارات¶
%{basename:PATH}
%{dirname:PATH}
%{exists:PATH}
مثال:
%{exists:%{builddir}/myflag.txt}
%{suffix:PATH}
مثال:
%{suffix:myfile.zip}
%{url2path:URL}
مثال:
%{uncompress:PATH}
مثال:
%{uncompress /my/source.tar.gz}
%{xdg:KIND}
- cache: بيانات غير أساسية خاصة بالمستخدم (مخبأة في خبيئة)
- config: ملفات الضبط الخاصة بالمستخدم
- data: ملفات البيانات الخاصة بالمستخدم
- state: بيانات الحالة الخاصة بالمستخدم
أُضيف: 6.0.0
مثال:
%{xdg config}
معلومات البيئة¶
%getncpus
%{getncpus:KIND}
- total: إجمالي عدد المعالجات المتاحة (مطابق لـ %getncpus)
- proc: عدد المعالجات المتاحة للعمليات
- thread: عدد المعالجات المتاحة للخيوط
تأخذ proc و thread في الحسبان الذاكرة المتاحة، بما في ذلك قيود مساحة العناوين للخيوط.
أُضيف: 4.19.0.
مثال:
%{getncpus proc}
%getconfdir
%{getenv:NAME}
%rpmversion
المخرجات¶
%{echo:STRING}
مثال:
%{echo:Building with foo}
%{warn:STRING}
مثال:
%{warning:Foo is deprecated}
%{error:STRING}
مثال:
%{error:Invalid argument}
%verbose
%{verbose:STRING}
مثال:
%{verbose:-x}
وحدات الماكرو الخاصة بملف المواصفات (spec)¶
%{S:NUMBER}
%{P:NUMBER}
التشخيصات¶
%trace
%dump
%__file_name
%__file_lineno
أمثلة¶
المثال 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}"
rpm --eval "%define unamer %(uname -r)" --eval "%{macrobody:unamer}"
rpmlua
rpmlua -e 'print(macros.defined("_libdir"))'
rpmspec --shell
rpmspec --shell 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 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.
إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.
| 10 أبريل 2026 | RPM 6.0.1 |