صفحه اصلی arrow مقالات arrow چگونه یک rpm بسازیم
چگونه یک rpm بسازیم چاپ ارسال به دوست
رای کاربران: / 3
ضعیفعالی 
نویسنده hmm   
۰۳ تير ۱۳۸۷
Imageسلام
متن زیر ترجمه  یک مقاله است . به دلیل اینکه این مقاله قسمتی از مقاله کلی تر است از شماره 6 شروع شده . امیدوارم کل مقاله رو هم بموقع ترجمه کنم ولی بنظر میرسه همین قدر برای ایجاد یک rpm کافی باشه ...

6- ساخت rpm

ساخت rpm انصافا خیلی راحت است ، مخصوصا اگر شما قصد داشته باشید که از برنامه خودتون یک rpm بسازید. ما در اینجا فرض میکنم شما طریقه ساختن نرم افزار از روی سورس آنرا میدانید.
روال ساختن یکrpm   به شکل زیر است:
•    گرفتن سورس برنامه ای که فصد ساخت rpm آنرا دارید.
•    ساخت فایل اصلاحی از تغییراتی که میخواهید در rpm تان لحاظ شود.
•    ساخت فایل تنظیمات برای نرم افزارتان.
•    اطمینان از اینکه فایلها در جای صحیح خود قرار دارند.
•    ساخت بسته نرم افزاریتان با استفاده از rpm.
در یک روال عادی ، rpm هم نسخه باینری و هم نسخه سورس را از نرم افزارتان میسازد.

6.1. فایل تنظیمات

ما بحث رو از ساخت فایل تنظیمات آغاز میکنیم . فایل تنظیمات برای ساخت rpm ضروریست. این فایل حاوی توضیحات نرم افزار به همراه دستور العملهای چگونگی ساخت rpm و نیز لیست فایلهای باینری که میبایست نصب شوند را توصیف میکند.
اگر شما میخواهید نام فایل تنظیماتتان استاندار باشد باید به فرمت زیر نامگذاری کنید:
package name-dash-version number-dash-release number-dot-spec
این نامگذاری تضمین میکند که اگر شما چندین نسخه از یک بسته نرم افزاری واحد را هم نصب کرده باشید حداقل هر کدام یک فایل تنظیمات صحیح مربوط به خودشان را دارند.
یک مثال از فایل تنظیمات با نام eject-2.0.2-1.spec  :
Summary: A program that ejects removable media using software control.
Name: eject
Version: 2.0.2
Release: 3
Copyright: GPL
Group: System Environment/Base
Source: http://metalab.unc.edu/pub/Linux/utils/disk-management/eject-2.0.2.tar.gz
Patch: eject-2.0.2-buildroot.patch
BuildRoot: /var/tmp/%{name}-buildroot

%description
The eject program allows the user to eject removable media
(typically CD-ROMs, floppy disks or Iomega Jaz or Zip disks)
using software control. Eject can also control some multi-
disk CD changers and even some devices' auto-eject features.

Install eject if you'd like to eject removable media using
software control.

%prep
%setup -q
%patch -p1 -b .buildroot

%build
make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/man/man1

install -s -m 755 eject $RPM_BUILD_ROOT/usr/bin/eject
install -m 644 eject.1 $RPM_BUILD_ROOT/usr/man/man1/eject.1

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
%doc README TODO COPYING ChangeLog

/usr/bin/eject
/usr/man/man1/eject.1

%changelog
* Sun Mar 21 1999 Cristian Gafton < >
- auto rebuild in the new build environment (release 3)

* Wed Feb 24 1999 Preston Brown < >
- Injected new description and group.

[ Some changelog entries trimmed for brevity.  -Editor. ]



6.2. عنوان
عنوان شامل چندین فیلد است که شما میبایست آنها را مقدار دهی کنید این فیلد ها شامل:
o    Summary: شرح یک خطی از بسته نرم افزاریتان
o    Name: نام rpmای که قصد ساخت آنرا دارید (میبایست کاراکتری باشد)
o    Version: نسخه rpmای که قصد ساخت آنرا دارید
o    Release:این فیلد نشانگر شماره انتشار برای نسخه های مشابه میباشد ( برای مثال اگر شما بسته نرم افزاری خود را ساختید و پس از ساخت لازم دانستید که تغییرات اندکی به آن بدهید و بسته را دوباره بسازید میبایست شماره release آن 2 تعیین کنید)
o    Copyright:این خط میگوید که حق التالیف بسته شما چگونه خواهد بود و شما میتوانید چیزهایی شبیه به GPL, BSD, MIT, public domain, distributable و یا commercial. را  قید کنید.
o    Group:این خط به برنامه های نصاب سطح بالا (از فبیل Red Hat's gnorpm ) ساختار برنامه های ویژه را  میگوید. شما میتوانید آخرین شرح ساختار ها را از /usr/doc/rpm*/GROUPS بیابید . ساختار درختی این گروه معمولا چیزی شبیه به زیر است:

Amusements/Games
Amusements/Graphics
Applications/Archiving
Applications/Communications
Applications/Databases
Applications/Editors
Applications/Emulators
Applications/Engineering
Applications/File
Applications/Internet
Applications/Multimedia
Applications/Productivity
Applications/Publishing
Applications/System
Applications/Text
Development/Debuggers
Development/Languages
Development/Libraries
Development/System
Development/Tools
Documentation
System Environment/Base
System Environment/Daemons
System Environment/Kernel
System Environment/Libraries
System Environment/Shells
User Interface/Desktops
User Interface/X
User Interface/X Hardware Support

o     Source:این فیلد مشخص میکند محل اصلی انتشار کجا میباشد. و در مواقعیکه  شما میخواهید دوباره سورس را بگیرید و یا نسخه های بعدی را چک کنید استفاده میشود

نکته: نام فایلی که در سیستم خودتان قرار دارد میبایست با نام فایل همانند باشد(برای مثال فایل راکه  دانلود کرده اید را تغییر نام ندهید). همچنین شما میتواند بیش از یک محل را برای دانلود مشخص نمایید چیزی مشابه زیر:

Source0: blah-0.tar.gz
Source1: blah-1.tar.gz
Source2: fooblah.tar.gz


این فایلها باید در شاخه SOURCES وجود داشته باشد (ساختار شاخه ها در ادامه بحث گفته خواهد شد)

o    Patch:محلی که شما میتوانید نسخه اصلاحی را اگر لازم داشتید دوبار دریافت نمایید.
نکته:نام فایل میبایست همانند نام فایل اصلاحیتان باشد و شاید شما نیز خواسته باشید چنیدین فایل اصلاحی داشته باشید که میتوانید چیزی شبیه زیر را تعریف کنید

Patch0: blah-0.patch
Patch1: blah-1.patch
Patch2: fooblah.patch


این فایلها نیز باید در شاخه SOURCES وجود داشته باشند

o    BuildRoot : این خط به شما اجاز میدهد شاخه ای شبیه به root برای ساخت بسته نرم افزاریتان داشته باشید . شما میتوانید از این شاخه برای تست بسته نرم افزاریتان قبل از نصب بروی سیستمتان کمک بگیرید.

o    %description : این خط  از آیتم های عنوان نیست . ولی برای نتیجه عنوان میبایست مقدار دهی شود و شما به حداقل یک description برای بسته یا بسته هایتان نیاز دارید و این آیتم یک آیتم چند خطی برای توصیف کلی بسته نرم افزاریتان میباشد.
6.3. Prep
این قسمت دومین بخش از فایل تنظیمات میباشد.این بخش برای سورس های آماده ساخت استفاده میشود.شما در اینجا باید هر چیزی را که  patch و setup برای دستور make لازم دارند را تهیه کنید.
نکته : هر کدام از قسمتهای این بخش یک شل اسکریپ اجرایی هستند. شما میتوانید یک شل  اسکریپت ساده را بنویسید و قبل از تگ prep% بگذارید تا از حالت فشرده خارج شده و اصلاحات لازم را در سورس شما اعمال نماید.هرجند ما یک ماکروهایی برای راحتی شما نوشته ایم.
اولین این ماکروها setup% است.
ساده ترین فرم (بدون option های خط دستور) میباشد بطوریکه سورس را از حالت فشرده خارج نموده و وارد شاخه سورس خواهد شد . این ماکرو همجنین optionهای زیر را نیز دارد:

o    -n name : باید یک نام برای ساخت شاخه مربوطه معرفی کنید . پیش فرض $NAME-$VERSION میباشد. نوع دیگری که میتوانید استفاده کنید $NAME, ${NAME}${VERSION} یا هر چیز دیگری که tar فایل اصلی میتواند استفاده کند میباشد . (بخاطر داشته باشید که متغیرهایی که در اینجا با $ شروع میشوند واقعاْ متغیر های قابل دسترس درون فایل تنظیمات نیستند بلکه آنها را در اینجا برای سادگی کار قرار دادیم و شما میبایست نام واقعی با نسخه واقعی را معرفی کنید نه یک متغییر).

o    -c ساخت یک شاخه و رفتن به مسیر مربوطه قبل از بازگشایی
o    -b بازگشایی سورس قبل از رفتن به مسیر مربوطه(با سویچ -c همزمان نمیتوان بکار برد) . فقط برای مواقعی که شما چندین فایل سورس دارید مفید خواهد بود.
o    -a بازگشایی سورس بعد از رفتن به مسیر مربوطه
o    -t بصورت پیش فرض نادیده گرفته میشود مگر آنکه با سوپیچ های -a یا -b استفاده گردد و برای زمانی مفید خواهد بود که شما چندید سورس  را دارید.
o    -d عدم حذف شاخه مربوطه قبل از بازگشایی. و برای مواقعی مفید است که شما بخواهید چندین ماکروی ستاپ را داشته باشید .

ماکروی بعدی patch% میباشد . این ماکرو به شما کمک میکند بصورت خودکار اصلاحیه های مورد نظرتان را بروی سورس اعمال نمایید و دارای فرامین زیر است:

o    بدون سویچ : اعمال اصلاحیه از طرق فایل اصلاحیه معرفی شده
o    -p مشخص کردن تعداد شاخه ها برای صدور دستور patch(1)
o    شما همچنین میتوانید بجای صادر کردن فرمان %patch # -P از %patch# استفاده نمایید.
o    -b extension دخیره فایل اصلی در قالب filename.extension قبل از اعمال اصلاحیه.

این تمام ماکروهایی بود که نیاز داشتید.شما همچنین میتوانید فایلهای نصبی دیگری هم که لازم دارید را در قالب یک شل اسکریپت فراخوانی نمایید.هرچیزی که شما قبل از ماکروی build% بنویسید( در ادامه توضیح داده خواهد شد) توسط شل اجرا خواهد شد.

6.4. Build
درواقع ماکروی خاصی در این قسمت وجود ندارد . فقط شما باید دستوراتی که برای ساخت سورسی که اخیرا باز شده لازم است را صادر نموده، اصلاح کرده و وارد شاخه مربوطه شوید.این قسمت فقط دستورات را به شل منتقل میکند.بنابراین هر دستور معتبر شل میتواند اینجا قرار گیرد(همراه با توضیحات).

نکته : مسیر جاری به بالاترین سطح در شاخه سورس منتقل خواهد شد .بنابراین این را به خاطر بسپارید تا اگر لازم داشتید با دستور cd  به زیر شاخه ها منتقل شوید.

متغیر RPM_OPT_FLAGS با مقداری که درون /usr/lib/rpm/rpmrc وجود دارد مقدار دهی خواهد شد. پس مقدار آنرا نگاه کنید تا مطمن شوید مقدار مناسبی برای سیستم شما تنطیم شده(که در اکثر مواقع درست میباشد)است و یا از این متغیر در فایل تنظیمات خود استفاده نکنید . این مورد اختیاری است.

6.5. Install
 این بخش نیز ماکروی خاصی ندارد . بصورت ساده شما فقط دستوراتی که جهت نصب بسته لازم دارید را اینجا قرار میدهید.اگر شما میخواهید make install را بروی بسته خود اجرا کنید . آنرا اینجا قراردهید وگر نه شما فایل make file را معرفی میکنید تا make install را اجرا کند و یا شما میتوانید با دستورات شل اینکار را انجام دهید . حتما به این موضوع توجه داشته باشید که باید در بالاترین سطح شاخه سورس کد قرار داشته باشید.
در اینجا متغیر RPM_BUILD_ROOT برای تنظیم کردن مسیر Buildroot در دسترس میباشد . استفاده از  Buildroot اختیاری است ولی ما قویا آنرا پیشنهاد میکنیم . زیرا سیستم تان را از بهمریختگی با نرم افزارهایی که در دیتابیس rpm وجود ندارد جدا میکند.(ساخت rpm آنرا در دیتابیس قرار نمیدهد . بلکه شما باید rpm باینری را نصب کنید)
6.6. حذف فایلهای موقت
این یک ایده خوبی است که مطمئن باشید شاخه نصب شما قبل از مراحل نصب حتی برای چندمین بار بازهم تمیز و خالی است. ماکروی clean% در این مورد به شما کمک خواهد کرد. شما میتوانید دستورات مناسب را در ادامه این ماکرو قرار دهید.

6.7. اجرای دستوراتی قبل وبعد از نصب / عزل بسته
شما میتوانید اسکریپتهایتان را در ایجا قرار دهید تا در شروع یا پایان نصب/عزل برنامه تان اجرا گردد.یکی از کارهای اصلی که میتوانید انجام دهید صدور دستور idconfig بعد از نصب یا عزل برنامه تان میباشد. انواع ماکروهای این قسمت:

pre% : اسکریپتهای قبل از نصب در اینجا قرار میگیرد.
post% : اسکریپتهای بعد از نصب در اینجا قرار میگیرد.
preun% : اسکریپتهای قبل از عزل در اینجا قرار میگیرد.
postun% : اسکریپتهای بعد از عزل در اینجا قرار میگیرد.

محتویات این قسمتها باید فقط در قالب شل اسکریپت باشند.اگرچه شما به #!/bin/sh نیازی ندارید.

6.8. Files
این قسمت معرفی فایلهای اجرایی بسته شماست.rpm راهی برای فهمیدن اینکه کدام فایل اجرایی بعد از make install نصب شود را ندارد.بعضی ها پیشنهاد میکنند از دستور find قبل و بعد از نصب استفاده کنیم. ولی در یک سیستم چند کاربره بدلیل امکان ایجاد فایل توسط کاربری دیگر در هنگام فرآیند نصب این روش قابل اتکا نخواهد بود.

چندین ماکرو برای کارهای خاصی در اینجا وجود دارد که ما آنها را شرح میدهیم:

o    doc% : این ماکرو برای شناساندن فایل مستندات سورسی است که شما میخواهید همراه باینری تان نصب کنید.مستندات میبایست در مسیر /usr/doc/$NAME-$VERSION-$RELEASE نصب شوند.شما میتوانید چنید فایل مستند را معرفی نمایید.

o    config% : برای شناساندن فایل تنظیمات مورد استفاده قرار میگیرد.این فایل محلق شده شبیه sendmail.cf, passwdو غیره است. اگر شما بعداً بسته ای که شامل فایل تنظیمات است را عزل کنید هر فایلی که تغییر نکرده باشد حذف و هر فایلی که تغییر کرده باشد با یک پسوند .rpmsave که به آن افزوده میشود تغییر نام میگردد.شما میتوانید چنیدین فایل را معرفی کنید.

o    dir%: معرفی یک شاخه برای شروع مراحل نصب .بصورت پیش فرض اگر شما لیست شاخه ها را بدون این ماکرو معرفی کنید همه چیز در این شاخه ها بعداً جزء قسمتی از بسته نصبی شما خواهد شد.

o    defattr% :شما میتوانید با این ماکرو ویژگی (attribute) فایلها را بصورت پیش فرض معرفی نمایید. این ویژگیها (mode, owner, group) باید با مقادیر در مبنای هشت معرفی گردند (شبیه با دستور chmod) . عبارت owner به نام کاربری مالک اشاره دارد و همچنین group به گروهی که شما میخواهید فایلها به آن مقید شوند اشاره میکند.

o    files -f% <نام فایل>: شمامیتوانید با استفاده از این ماکرو فایلی که خود شامل اسامی فایلها با پسوندهایشان هست را معرفی نمایید.

اخطار: اگر شما تصادفاً شاخه /usr/bin را معرفی کنید بسته باینری شما شامل تمام فایلهای موجود در این شاخه خواهد شد.

6.9. ثبت لیست تغییرات انجام شده
این قسمت شامل لیست تعییراتی است که روی بسته شما اعمال گردیده است. اگر شما میخواهید rpm موجودتان را تغییر دهید این ایده خوبی است که لیست تغییراتی که انجام داده اید را داشته باشید.
فرمت آن بسیار ساده است . هر ورودی را با * شروع کنید که به دنبال آن تاریخ – نام و آدرس ایمیلتان میباشد. تاریخ میبایست چیزی شبیه به فرمت زیر باشد:
date +"%a %b %d %Y"

منبع : http://www.rpm.org/RPM-HOWTO/build.html
آخرین بروز رسانی ( ۰۵ تير ۱۳۸۷ )
<قبل   بعد>