بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
شرح تحزيم سكربت بايثون (rpm) .
سأقوم بتحزيم سكربت بايثون مع ملف README و ملف الرخصة الخاص به , عملية التحزيم ستكون بسيطة جدا لا يوجد بناء من المصدر ولن أستخدم setup.py install المعتادة في بايثون فقط عملية نقل الملفات لمكانها الذي أريده , هذا الدرس سيكون جيد كبادية ربما لاحقا أكتب عن هذا الامر بشكل متدرج .
هذا الموضوع يعتمد بشكل أساسي على هذين الموضوعين ولن تفهم عن ماذا أتكلم إذا لم تقرأهم بشكل جيد وأنا أعلم أنه قد يكون صعب الفهم لاكن سأحاول تبسيط اﻷمر قدر الإمكان الموضوع موجه للذي لديه معرفة جيد بأوامر لينكس وشجرة الملفات الخاصة به وهو امر قد يكون مربك قليلا حتى انه أرهقني بالكتاية.
https://arfedora.blogspot.com/2016/09/rpm.html
https://arfedora.blogspot.com/2017/09/rpm.html
مقدمة :
لأقوم بتحزيم أي شيء أحتاج ان اعرف هذه الأشياء :
1-رابط تنزيل مصدر البرنامج .
2-معلومات عن البرنامج مثل رخصته رقم إصداره تعريف عنه رابط موقعه الرسمي ..إلخ .
3-أحتاج ان أعرف الحزم التي توفر الأشياء الضرورية لعملية البناء أي كما ذكرت في المواضيع التي ذكرتها سابقا BuildRequires ,لاكن في هذا الشرح لن نحتاج هذا.
4-أحتاج أن أعرف الحزم التي توفر الأشياء التي سيحتاجها البرنامج أثناء عمله أي Requires .
5-أحتاج أن أعرف كيف تتم عملية البناء , إن كان الامر فقط يحتاج نقل أشياء لمكانها الصحيح مثل تحزيم ثيمات أو أيقونات أو صور خلفية للشاشة wallpapers وهنا مجرد نقل ملفات لمكانها الصحيح ,أو إن إحتاج الأمر عملية بناء من خلال make و غيرها وطبعا ممكن الإثنين معا .
6-قد أحتاج أحيانا ذكر أوامر ليتم تنفيذها بعد التثبيت الحزمة أو بعد التحديث أو بعد حذف الحزمة ,لاكن في هذا الشرح لن نحتاج هذا.
لنبدأ ساضع الصورة وأسفلها الشرح .
في مجلد rpmbuild لدينا هذه المجلدات.
1-مجلد SOURCES سنضع داخله الملفات المصدرية للبرنامج المراد تحزيمه .
2-مجلد BUILD أثناء التحزيم وفي أول مرحلة prep% سيتم فك الضغط عن الملف المصدري إلى هذا المجلد ثم الدخول عليه من خلال cd ثم إذا حددنا أي امر في مرحلة prep% سيتم تنفيذه في هذا المجلد .
3-مجلد BUILDROOT سيحتوي هذا المجلد مجلد أخر بإسم البرنامج ثم داخله إذا صح التعبير محاكي لشجرة ملفات لينكس أي أين سيتم نقل الملفات لنفترض مثلا
home/youcef/rpmbuid/BUILDROOT/myprogram-x86_64-03/usr/bin/myprogram.py/
ستتوضح الامور أثناء الشرح في الأسفل .
4-مجلد RPMS سيحتوي الحزم النهائية إن كانت noarch أو x86_64 أو غيرها.
5-SRPMS سيحتوي الحزم المصدرية src.rpm سبق وتكلمت عنها.
6-مجلد SPECS سنضع داخله ملفات spec التي سبق وتكلمت عنها .
هذا رابط السكربت الذي ساقوم بتحزيمه دخلت عليه وأخذت بعص المعلومات .
1-رخصة البرنامج .
2-إسمه .
3-رقم إصداره.
4-تعريف بسيط عنه .
5-رابط الموقع الرسمي للبرنامج أو السكربت .
دخلت على مجلد SPECS وقمت بإنشاء ملف spec بإسم البرنامج ملاحظة سيتم إنشاء ملف spec بقالب جاهز مسبقا ثم نقوم نحن بالتعديل عليه .
نستخدم أي محرر نصوص انا إستخدمت gedit .
هذا هو ملف spec قبل التعديل عليه .
نحصل على رابط الملف المصدري للبرنامج وهو ملف مضغوط .
نقوم بالتعديل على ملف spec .
1-رقم إصدار البرنامج .
2-رقم الإطلاق بالنسبة ل {dist}% سيتم تعويضها على حسب رقم إصدار فيدورا الذي تعمل منه مثلا إذا كنت تعمل من فيدورا 27 سيتم تعويض {dists}% ب f27 ستظهر f27 في إسم الحزمة النهائية ,بالنسبة لمعنى release تعريبها إطلاق أي رقم الإطلاق أي لنفترض قمت بتحزيم برنامج رقم إصداره 10 ثم إكتشفت انك إرتكبت خطأ في التحزيم أو وجدت علة في البرنامج وتم توفير patch لحل المشكلة لذات الإصدار وسبق ورفعت الحزمة على المستودع الخاص بك هنا تحتاج إصلاح التحزيم أو ترقيع البرنامج وتحزيمه من جديد ,وعندها تقوم بزيادة رقم release بواحد لأنه لا يمكنك أن تغير رقم إصدار البرنامج من نفسك ,أنت فقط تقوم بتغير رقم الإطلاق وعندها مدير الحزم سيعرف ان هناك حزمة ثانية بذات الإصدار لها رقم إطلاق أعلى وسيتم تحديث الحزمة لأخر رقم إطلاق متوفر.
3-تعريف قصير .
4-الرخصة .رابط فيه الرخص الحرة المقبولة من فيدورا رابط طبعا أنت غير ملزم بها إذا لم تكن تتحزم بشكل رسمي في فيدورا.
5-الرابط الرسمي للبرنامج .
6-رابط الملف المصدر وممكن إسم الملف المصدري فقط.
7-هنا ممكن وضع تعريف أطول لاكني إكتفيت بهذا ,ونسيت أن أضع نقطة في أخر الفقرة على عكس Summary كان يجب ان أضع نقطة .
الأن من موقع البرنامج حصلت على الحزم التي يحتاجها ملاحظة إسم الحزم قد يختلف من توزيعة لأخرى ,إذا صح التعبير خاصة بين الدبيانيات والريدهاتيات , إذا كان مذكور فقط أسماء الحزم لدبيان مثلا أو أبونتو ممكن البحث في مدير الحزم عن شيء قريب منهم وقد يكونو ذات الإسم يعني على حسب على العموم من خلال dnf ممكن إستخدام search و info للتعرف على أسماء الحزم وعملها.
ملاحظة قمت بحذف BuildRequires لأن كما ذكرت سابقا لن نحتاجها لهذا البرنامج .
اﻷن أمر أو ماكرو autosetup% سيقوم بفك الضغط عن الملف المصدري الذي سيكون موجود في مجلد SOURCES إلى مجلد BUILD ثم سيقوم بالدخول على مجلد BUILD ثم مجلد بإسم البرنامج زائد علامة ناقص زائد رقم الإصدار أي إفتراضيا سيدخل على مثلا
home/youcef/rpmbuild/BUILD/linux-tor-browser-installer-0.3 أي أنه سيفترض ان في الملف المصدر المضغوط هناك مجلد بهذا الإسم لاكن الأمر لا يكون هكذا دائما أحيانا يكون بإسم مختلف لهذا ممكن تنزيل الملف المصدري والدخول عليه والتأكد من الإسم إذا لم يكن بصيغة الإسم زائد علامة ناقص زائد رقم الإصدار ممكن إستخدام خيار n- وتحديد الإسم بدقة طبعا لن نحتاج الأمر في هذا الموضوع فقط وضعته كمثل وطبعا هناك خيارات أخرى لن أذكرها الان حتى لا يطول الشرح أكثر.
كل سطر يبدأ بعلامة # هو تعليق لن يأخذ به .
1 و 2 من خلال التعليقات وضحت ما ذكرته سابقا عن فك الضغط عن الملف المصدري و...إلخ
3 و 4 في مرحلة prep% يمكن القيام ببعض التعديلات مثل ترقيع البرامج patch أو حذف شيء إعادة تسمية ...إلخ وهنا أردت إعادة تسمية ملف السكربت من خلال امر mv المعروف للجميع ,كل شيء ممكن أن تكتبه بالترمينال يمكنك ان تكتبه هنا لتنفيذه على العموم {name}% سيتم تعويضها تلقائيا بإسم السكربت المذكور في Name ,لماذا قمت بهذا وهل يمكن كتابة إسم البرنامج بشكل مباشر ؟ الجواب هكذا أفضل في حال قمت لاحقا بتغير إسم السكربت يكفي أن أغيره في Name ونعم ممكن كتابة الإسم بشكل مباشر.
ملاحظة بما أن السكربت سيعمل على أي معمارية أضفت سطر BuildArch: noarch و {version}% سيتم تعويضها برقم الإصدار الموجود في Version .
مرحلة install% .
الأن كما ذكرت سابقا سيتم في مجلد BUILDROOT إنشاء شيء مثل محاكي لشجرة الملفات في لينكس ثم سأقوم بنقل الملفات إلى مكانها الصحيح في هذا المحاكي .
1 و 2 للتأكد أني لا أعمل على شيء موجود مسبقا سيقوم هذا الأمر بحذف المجلد الذي بداخله المحاكي إن وجد.
3 و 4 داخل هذا المحاكي قمت من خلال أمر mkdir بإنشاء مجلد usr/bin/ ال {bindir_}% ستعوض ب usr/bin/ بالمناسبة كان بإمكاني بكل بساطة كتابة usr/bin/ إلى جانب {buildroot}% .
5 و 6 من خلال أمر install وهو شيء ممكن إستخدامه من خلال الترمينال بشكل عادي أي أنه ليس شيء خاص بالتحزيم بشكل حصري بل هو أمر مثل أمر cp لاكن ممكن النقل وتحديد الصلاحيات نلاحظ صلاحيات 755 (لا ننسى اننا داخل المجلد الذي يحتوي الكود المصدري بعد فك الضغط عنه ) .
مرحلة files% .
1 و 2 هذه ماكرو خاصة ستنقل ملفات الوثائق و ملف الرخصة إلى مكانها الصحيح وهي ماكرو توفر الكثير من الجهد يكفي ذكر أسمائهم لا ننسى أن هذه الملفات موجودة مع الكود المصدر .
3 و 4 نصرح أن هناك ملف بهذا المسار لا ننسى ان {name}% سيتم تعويضها بإسم السكربت الموجود في Name و {bindir_}% سيتم تعويضها ب usr/bin/ طبعا أيضا كان بالإمكان كتابة المسار بشكل مباشر .
5-وضعت تعليق أني قمت بتحزيم الأولي لفيدورا 27 طبعا هذا تعليق للمحزم يمكننا أن نضع ما نراه مناسب لاكن الأفضل ان يدل على المضمون .
عملية التحزيم سبق وذكرتها في المواضيع التي وضعت رابطها أول هذا الموضوع .
في حال تثبيت هذه الحزمة هذه هي الملفات ومساراتها نلاحظ ملفات ال doc أي الوثائق مثل ملف README و ملف الرخصة كيف تم إعداداهم ونقلهم إلى مكانهم الصحيح من دون تدخل منا ونلاحظ مسار السكربت في usr/bin/ .
قمت بالتثبيت والتشغيل بعض النظر عن عمل السكربت إذا كان ناجح أو لا لأن بعض الأخوة جربوه ولم ينجح انا عملته للدول التي حجبت روابط tor browser لاكن يبدو أنه لا يعمل بشكل صحيح وصعب إصلاحه لأني احتاج أن اجرب فعلا وبشكل متكرر حتى أنجح وروابط tor غير محجوبة في لبنان .
أخر ملاحظات :
الافضل تثبيت برنامج rpmlint ثم من خلاله نقوم بتفحص ملف spec قبل علمية التحزيم وتفحص الحزم النهائية بعد عملية التحزيم يمكننا تجاهل الملاحظات التي تظهر لاكن ما يهمنا عدم وجود أخطاء errors.
sudo dnf install rpmlint
rpmlint ~/rpmbuild/SPECS/linux-tor-browser-installer.spec
rpmlint ~/rpmbuild/SRPMS/linux-tor-browser-installer-0.3-1.fc27.src.rpm
rpmlint ~/rpmbuild/RPMS/noarch/linux-tor-browser-installer-0.3-1.fc27.noarch.rpm
يمكننا ان نعرف ماهي هذه الماكرو من خلال شيء كهذا أظن سبق وذكرت الامر في المواضيع القديمة لاكن لا بأس أن أعيد ذكرها .
في حال قمنا بتغير الإصدار أو رقم الإطلاق الأفضل أن نضيف تعليق جديد يذكر بشكل موجز ماهي التغيرات وإسم المحزم وبريده و التاريخ ممكن تسهيل الأمر مثلا من خلال هذا الأمر وضعت إسمي وبريدي و تعليق صغير يشرح مثلا أن هذا التعديل لإصلاح علة وهذا رقم العلة على http://bugzilla.redhat.com طبعا هذا إذا كانت تحزم بشكل رسمي في مشروع فيدورا لاكن لا بأس من ذكر بعض هذه الأشياء هناك الكثير من الشروط لتقبل منها مثلا إسم الحزمة وسياسة فيدورا من حبث البرمجيات الحرة والكثير من التفاصيل المذكروة بالتفصيل في وثائق فيدورا .
rpmdev-bumpspec --userstring "youcef sourani <youssef.m.sourani@gmail.com>" --comment "Release 2 Fix Bug #4565" linux-tor-browser-installer.spec
أخيرا أمر rpmbuild ليس هو الوحيد المستخدم لبناء الحزم هناك أشياء أخرى أكثر تقدما مثل mock وغيره ,لهذا في الأدوات الأخرى قد تختلف الأمور قليلا مثل أماكن المجلدات مثل SOURCES و BUILDROOT و...إلخ لاكن مبدأ التحزيم واحد وقد تختلف بعض التفاصيل الصغيرة من توزيعة لأخرة مثلا في Mageia لا يوجد ماكرو {dist}% يوجد شيء مشابه نسيته بالتحدد لاكن يعوض بشيء كهذا magi5 mag6 أو شيء كهذا بدل f26 f27 الخاصة بفيدورا ...إلخ وبالإضافة لأمر rpmbuild قد يكون لكل توزيعة اداة خاصة إضافية لاكن كما ذكرت المبدأ هو هو .