• ساخت RPM - شروع سریع. ما یک بسته RPM را با دست خودمان جمع آوری می کنیم. یک بسته rpm را از منابع ایجاد می کنیم

    اما اغلب اتفاق می افتد که شما نیاز به ساخت یک بسته با گزینه های لازم (فعال کردن پشتیبانی از mysql، postgresql یا cyrus-sasl2 و غیره) دارید که در بسته rpm ارائه شده در دیسک توزیع نیستند. راه برون رفت از این وضعیت این است که بسته خود را بسازید.

    برای آسان‌تر ساختن بسته‌های rpm، بسته‌ای وجود دارد که به‌ویژه برای این منظور طراحی شده است - rpm-build.

    # rpm -qi rpm-build نام: rpm-build جابه‌جایی‌ها: (غیرقابل تغییر) نسخه: 4.3.3 فروشنده: CentOS انتشار: 7_nonptl تاریخ ساخت: دوشنبه 21 فوریه 2005 20:21:52 تاریخ نصب: Sat 09 Apr 2005 14:57 ساخت میزبان: guru.build.karan.org گروه: توسعه/ابزار منبع RPM: rpm-4.3.3-7_nonptl.src.rpm اندازه: 1576124 مجوز: GPL امضا: DSA/SHA1، یکشنبه 27 فوریه 2005 00: 36:59، شناسه کلید a53d0bab443e1821 بسته بندی: کارانبیر سینگ

    همانطور که از توضیحات مشخص است، این بسته شامل مجموعه ای از اسکریپت ها و برنامه هایی است که برای ساخت بسته ها طراحی شده اند.

    به منظور مونتاژ هر بسته، ابتدا باید به اصطلاح دانلود کنید. منابع ساخت پکیج معمولا فایل هایی با پسوند src.rpm هستند. گاهی اوقات، مانند مورد courier-imap، یک فایل مشخصات در کد منبع گنجانده می شود.

    سایت www.rpmfind.net برای جستجوی بسته های rpm و src.rpm بسیار مناسب است. به عنوان مثال، ما بسته مورد نیاز خود را پیدا کردیم - postfix، ماهی مرکب و غیره. ما بلافاصله می توانیم بفهمیم که چه بسته هایی برای ساخت آن مورد نیاز است. در اینجا صفحه اطلاعات بسته استاندارد برای postix و squid وجود دارد. همچنین شامل یک چک‌سوم برای تأیید صحت بسته است.

    پس از دریافت منابع و بررسی صحت آنها، باید بسته مناسب را نصب کنیم.

    # rpm -ivh postfix-2.2.8-1.2.src.rpm 1:postfix ############################################################ ###########

    پس از انجام این عملیات، سورس های postfix و تمامی قطعات لازم و همچنین اسکریپت ها در /usr/src/redhat/SOURCES/ و فایل spec (دستورالعمل ساخت بسته rpm) در /usr/src/ نصب شدند. redhat/SPECS/.

    # ls /usr/src/redhat/SOURCES/ pflogsumm-1.1.0.tar.gz postfix-etc-init.d-postfix postfix-2.1.1-config.patch postfix-hostname-fqdn.patch postfix-2.1.1 -obsolete.patch postfix-large-fs.patch postfix-2.1.5-aliases.patch postfix-pam.conf postfix-2.2.5-cyrus.patch postfix-sasl.conf postfix-2.2.8.tar.gz README- Postfix-SASL-RedHat.txt postfix-alternatives.patch # ls /usr/src/redhat/SPECS/ postfix.spec

    این محل فایل پیش فرض هنگام نصب src.rpm است. در اصل، نام پوشه ها برای خود صحبت می کنند.

    و بنابراین، برای شروع ساخت بسته، باید به پوشه حاوی فایل spec رفته و دستور زیر را اجرا کنید.

    # cd /usr/src/redhat/SPECS/ # rpmbuild -ba --target=i686 postfix.spec پلتفرم های ساخت: i686 ساخت برای پلت فرم i686 در حال اجرا (%prep): /bin/sh -e /var/tmp/rpm -tmp.82019 + umask 022 + cd /usr/src/redhat/BUILD + umask 022 + cd /usr/src/redhat/BUILD + rm -rf postfix-2.2.8 + /bin/gzip -dc /usr/src /redhat/SOURCES/postfix-2.2.8.tar.gz + tar -xf - + STATUS=0 + "[" 0 -ne 0 "]" + cd postfix-2.2.8 ++ /usr/bin/id - u + "[" 0 = 0 "]" + /bin/chown -Rhf root . ++ /usr/bin/id -u + "[" 0 = 0 "]" + /bin/chgrp -Rhf root . + /bin/chmod -Rf a+rX,u+w,g-w,o-w. + echo "Patch #1 (postfix-2.1.1-config.patch):" Patch #1 (postfix-2.1.1-config.patch): + Patch -p1 -b --پسوند .config -s ... ... ... ضبط شده توسط: /usr/src/redhat/SRPMS/postfix-2.2.8-1.2.src.rpm ضبط شده توسط: /usr/src/redhat/RPMS/i686/postfix-2.2.8-1.2 .i686 .rpm ضبط شده توسط: /usr/src/redhat/RPMS/i686/postfix-pflogsumm-2.2.8-1.2.i686.rpm اجرا شده (%clean): /bin/sh -e /var/tmp/rpm- tmp.73987 + umask 022 + cd /usr/src/redhat/BUILD + cd postfix-2.2.8 + /bin/rm -rf /var/tmp/postfix-buildroot + exit 0

    از آخرین خطوط می بینید که بسته rpm تمام شده postfix-2.2.8-1.2.i686.rpm نامیده می شود و در پوشه /usr/src/redhat/RPMS/i686/ ذخیره می شود، زیرا هنگام ساخت بسته ما مشخص کردیم. کلید --target=i686.

    مونتاژ واقعی نباید مشکلی ایجاد کند. اما اگر بخواهیم بسته ای با گزینه های خودمان بسازیم، مثلا پشتیبانی mysql یا sasl2 و غیره را فعال کنیم، چه؟ برای این منظور، باید فایل مشخصات را ویرایش کنید.

    بیایید بخشی از فایل مشخصات postfix را بررسی کنیم، لازم به ذکر است که postfix یک فایل مشخصات غیر استاندارد دارد.

    به عنوان مثال، ما می خواستیم postfix را با پشتیبانی MySQL بسازیم، برای انجام این کار، در همان ابتدا %define MYSQL 0 را به %define MYSQL 1 تغییر می دهیم و دوباره دستور را اجرا می کنیم.

    # rpmbuild -ba --target=i686 postfix.spec پلتفرم‌های ساخت: i686 Build for i686 خطای پلتفرم: وابستگی‌های ساخت برآورده نشده: mysql-devel مورد نیاز برای postfix-2.2.8-1.2.i686

    او برای ما می نویسد که برای ساخت آن باید بسته mysql-devel را نصب کنیم. لطفاً توجه داشته باشید که نسخه مشخص نشده است، به این معنی که می توانید هر نسخه ای را که postfix پشتیبانی می کند یا بسته مورد نیاز خود را نصب کنید.

    اگر از مبدا می‌سازید، باید به تنهایی دریابید که برای ساختن یک پکیج به چه بسته‌هایی نیاز است. این یکی از مزایای ساختن از src.rpm در مقایسه با tar.gz یا tar.bz2 است.

    بسته مناسب را نصب کنید

    # rpm -ivh MySQL-devel-4.1.9-0.i386.rpm در حال آماده سازی... ############################ ### ############### 1:MySQL-devel ############################ ### #############

    و اسمبلی postfix را دوباره راه اندازی می کنیم. این بار می بینیم که تمام پکیج های لازم برای ساخت نصب شده اند و اکنون فقط باید منتظر بمانیم تا بیلد به پایان برسد.

    # rpmbuild -ba --target=i686 postfix.spec پلتفرم‌های ساخت: i686 ساخت برای پلتفرم i686 در حال اجرا (%prep): /bin/sh -e /var/tmp/rpm-tmp.86320 + umask 022 + cd /usr /src/redhat/BUILD + umask 022 + cd /usr/src/redhat/BUILD + rm -rf postfix-2.2.8 ... ... ... ضبط شده در: /usr/src/redhat/SRPMS/postfix - 2.2.8-1.2.src.rpm نوشته شده توسط: /usr/src/redhat/RPMS/i686/postfix-2.2.8-1.2.i686.rpm نوشته شده توسط: /usr/src/redhat/RPMS/i686/postfix -pflogsumm- 2.2.8-1.2.i686.rpm در حال اجرا (%clean): /bin/sh -e /var/tmp/rpm-tmp.52381 + umask 022 + cd /usr/src/redhat/BUILD + cd postfix -2.2. 8 + /bin/rm -rf /var/tmp/postfix-buildroot + خروج 0

    ما تمام بسته را مونتاژ کرده ایم، اکنون باید آن را نصب کنیم و از زندگی لذت ببریم.

    # rpm -ivh /usr/src/redhat/RPMS/i686/postfix-2.2.8-1.2.i686.rpm در حال آماده سازی... #################### ############################################################## ### ###################

    برای درک بهتر، اجازه دهید به ساخت squid نگاهی بیندازیم، که ساختار فایل مشخصات استانداردتری دارد. مثل همیشه ابتدا src.rpm را نصب کنید و فراموش نکنید که اندازه و checksum را بررسی کنید.

    # rpm -ivh squid-2.5.STABLE11-2.src.rpm 1:squid ############################### ### ###########

    به صورت زیر می توانید تمام کلیدهای ممکن را پیدا کنید.

    # cd /usr/src/redhat/SPECS # rpmbuild --bp squid.spec # cd ../BUILD/squid-2.5.STABLE11/ # ./configure --help استفاده: پیکربندی گزینه ها: پیکربندی: --cache-file =نتایج آزمایش حافظه پنهان FILE در FILE --کمک به چاپ این پیام --no-create فایل های خروجی ایجاد نشود --آرام، --بی صدا پیام های «بررسی...» چاپ نشود --site-file=FILE از FILE به عنوان استفاده کنید فایل سایت --version نسخه ای از autoconf را که پیکربندی دایرکتوری و نام فایل ها را ایجاد کرده است: --prefix=PREFIX نصب فایل های مستقل از معماری در PREFIX --exec-prefix=EPREFIX نصب فایل های وابسته به معماری در EPREFIX --bindir=DIR فایل های اجرایی کاربر در DIR --sbindir=DIR فایل های اجرایی مدیریت سیستم در DIR --libexecdir=قابل اجراهای برنامه DIR در DIR --datadir=DIR داده های مستقل از معماری فقط خواندنی در DIR --sysconfdir=DIR داده های تک ماشینی فقط خواندنی در DIR --sharedstatedir=داده های مستقل از معماری قابل تغییر DIR در DIR --localstatedir=داده های تک ماشینی قابل تغییر DIR در DIR --libdir=کتابخانه های کد شی DIR در DIR --includedir=DIR فایل های هدر C در DIR --oldincludedir=DIR فایل‌های هدر C برای غیر gcc در DIR --infodir=مستندات اطلاعات DIR در DIR --mandir=مستندات DIR man در DIR --srcdir=DIR منابع را در DIR بیابید --program-prefix=PREFIX Preend PREFIX به نام برنامه های نصب شده --program-suffix=SUFFIX الحاق SUFFIX به نام برنامه های نصب شده --program-transform-name=PROGRAM اجرای sed PROGRAM روی نام برنامه های نصب شده نوع میزبان: --build=BUILD configure for building on BUILD --host=Host configure for HOST --target=TARGET پیکربندی برای TARGET ویژگی ها و بسته ها: --disable-FEATURE شامل FEATURE نیست (همانطور --enable-FEATURE=no) --enable-FEATURE[=ARG] شامل FEATURE --with-PACKAGE[= ARG] استفاده از PACKAGE --without-PACKAGE از PACKAGE استفاده نکنید (همانطور --with-PACKAGE=نه) --x-includes=DIR X شامل فایل ها در DIR هستند --x-libraries=DIR X فایل های کتابخانه در DIR هستند --فعال کردن و --با گزینه های شناسایی شده: --disable-dependency-tracking سرعت ساخت های یکباره را افزایش می دهد --enable-dependency-tracking استخراج کننده های وابستگی آهسته را رد نکنید --فعال کردن-حالت نگهدارنده فعال کردن قوانین و وابستگی ها مفید نیستند (و گاهی گیج کننده) برای نصب کننده معمولی --enable-dlmalloc[=LIB] بسته malloc را توسط داگ لی --enable-gnuregex کامپایل کنید و از آن استفاده کنید. تا زمانی که دلیلی برای استفاده از این گزینه ندارید، نباید آن را فعال کنید. این فایل کتابخانه معمولاً فقط در ویندوز و جعبه های یونیکس بسیار قدیمی که کتابخانه regex خود را ندارند مورد نیاز است. --enable-xmalloc-statistics نمایش آمار malloc در صفحه وضعیت --enable-carp فعال کردن پشتیبانی CARP --enable-async-io[=N_THREADS] مخفف --with-aufs-threads=N_THREADS --with-pthreads -- enable-storeio=ufs,aufs --with-aufs-threads=N_THREADS تعداد رشته های کارگر را برای ذخیره اشیاء aufs تنظیم کنید. --with-pthreads استفاده از POSIX Threads --with-aio از POSIX AIO --with-dl استفاده از پیوند پویا --enable-storeio="فهرست ماژول ها" پشتیبانی از لیست ماژول های I/O ذخیره شده را ایجاد کنید. پیش فرض فقط ساخت ماژول ufs است. برای لیستی از ماژول های موجود یا بخش راهنمای برنامه نویسان به src/fs مراجعه کنید
    برای جزئیات در مورد نحوه ساخت ماژول فروشگاه سفارشی خود
    --فعال کردن-هپ-جایگزینی
    گزینه سازگاری با عقب. لطفا استفاده کنید
    در عوض دستورالعمل جدید --enable-removal-policies.
    --enable-removal-policies="فهرست خط مشی ها"
    ایجاد پشتیبانی برای لیست سیاست های حذف.
    پیش فرض فقط ساخت ماژول lru است.
    برای مشاهده لیست ماژول های موجود به src/repl مراجعه کنید
    راهنمای برنامه نویسان بخش 9.9 برای جزئیات در مورد چگونگی
    برای ایجاد خط مشی سفارشی خود
    --enable-icmp پینگ ICMP را فعال کنید
    --enable-delay-pools برای محدود کردن استفاده از پهنای باند، استخرهای تاخیر را فعال کنید
    --enable-useragent-log ورود به سیستم هدر User-Agent را فعال کنید
    --enable-referer-log ورود به سیستم هدر Referer را فعال کنید
    -disable-wccp غیر فعال کردن پروتکل هماهنگی کش وب
    --enable-kill-parent-hack
    کشتن والدین در هنگام خاموش شدن
    --enable-snmp نظارت بر SNMP را فعال کنید
    --enable-cachemgr-hostname[=نام میزبان]
    cachemgr.cgi را پیش فرض این میزبان قرار دهید
    --enable-arp-acl فعال کردن استفاده از لیست های ARP ACL (آدرس اتر)
    --enable-htcp پروتکل HTCP را فعال کنید
    --enable-ssl پشتیبانی از دروازه ssl را با استفاده از OpenSSL فعال کنید
    --with-openssl[=پیشوند]
    با کتابخانه های OpenSSL کامپایل کنید. مسیر به
    کتابخانه ها و سرصفحه های توسعه OpenSSL
    نصب می تواند مشخص شود اگر خارج از
    دایرکتوری های استاندارد سیستم
    --enable-forw-via-db پایگاه داده Forw/Via را فعال کنید
    --enable-cache-digests از Cache Digests استفاده کنید
    به http://www.squid-cache.org/FAQ/FAQ-16.html مراجعه کنید
    --enable-default-err-language=lang
    زبان پیش فرض را برای صفحات خطا انتخاب کنید (نگاه کنید به
    دایرکتوری خطاها)
    --enable-err-languages="lang1 lang2.."
    زبان هایی را برای نصب انتخاب کنید. (همه خواهند بود
    به طور پیش فرض نصب شده است)
    --with-coss-membuf-size اندازه COSS membuf (پیش‌فرض 1048576 بایت)
    --enable-poll به جای select() poll() را فعال کنید. معمولا نظرسنجی
    بر انتخاب ترجیح داده می شود، اما configure knows poll
    در برخی از سکوها خراب است. اگر فکر می کنید که هستید
    هوشمندتر از اسکریپت پیکربندی، ممکن است فعال کنید
    نظرسنجی با این گزینه
    --disable-poll استفاده از poll() را غیرفعال کنید.
    - غیرفعال کردن-http-تخلفات
    این به شما امکان می دهد کدهایی را که شناخته شده است حذف کنید
    مشخصات پروتکل HTTP را نقض کنید.
    --enable-ipf-transparent
    با استفاده از تغییر مسیر آدرس شبکه IP-Filter.
    --enable-pf-transparent
    پشتیبانی از پروکسی شفاف برای سیستم ها را فعال کنید
    با استفاده از تغییر مسیر آدرس شبکه PF.
    --enable-linux-netfilter
    فعال کردن پشتیبانی از پروکسی شفاف برای لینوکس 2.4.
    --with-large-files پشتیبانی از فایل های بزرگ (لاگ ها و غیره) را فعال کنید.
    --enable-large-cache-files
    پشتیبانی از فایل های کش بزرگ (> 2 گیگابایت) را فعال کنید.
    هشدار: فرمت کش روی دیسک با این گزینه تغییر می کند
    --with-build-environment=model
    محیط ساخت برای استفاده به طور معمول یکی از
    POSIX_V6_ILP32_OFF32 32 بیتی
    POSIX_V6_ILP32_OFFBIG 32 بیتی با پشتیبانی از فایل های حجیم
    POSIX_V6_LP64_OFF64 64 بیت
    اشاره گرها و فایل های بزرگ POSIX_V6_LPBIG_OFFBIG
    XBS5_ILP32_OFF32 32 بیت (قدیمی)
    XBS5_ILP32_OFFBIG 32 بیتی با پشتیبانی از فایل های حجیم
    XBS5_LP64_OFF64 64 بیت (قدیمی)
    اشاره گرها و فایل های بزرگ XBS5_LPBIG_OFFBIG
    پیش فرض پیش فرض برای سیستم عامل شما
    --enable-leakfinder
    کد نشت یابی را فعال کنید. فعال کردن این به تنهایی
    هیچ کاری نمی کند؛ شما همچنین باید منبع را تغییر دهید
    کد برای استفاده از توابع یافتن نشت. شاید
    فقط برای هکرها مفید است.
    -غیرفعال کردن-ident-lookups
    این به شما امکان می دهد کدهایی را که کار می کنند حذف کنید
    جستجوهای شناسایی (RFC 931).
    --disable-internal-dns این مانع از ارسال مستقیم Squid و
    دریافت پیام های DNS، و در عوض فعال می کند
    فرآیندهای قدیمی "dnsserver" خارجی.
    --enable-truncate این از truncate() به جای unlink() استفاده می کند
    حذف فایل های کش کوتاه می دهد کمی
    بهبود عملکرد، اما ممکن است مشکلاتی ایجاد کند
    هنگام استفاده با ورودی/خروجی غیرهمگام Truncate بیشتر استفاده می کند
    فایل سیستم inodes از unlink..
    - غیرفعال کردن-بررسی نام میزبان
    Squid به طور پیش‌فرض هر نام میزبان را با آن رد می‌کند
    کاراکترهای عجیب و غریب در نام آنها برای مطابقت با آنها
    استانداردهای اینترنت اگر با این موافق نیستید
    می توانید از این سوئیچ برای خاموش کردن هر یک از آنها استفاده کنید
    بررسی می کند، مشروط بر اینکه حل کننده استفاده شده توسط
    Squid چنین نام های میزبانی را رد نمی کند
    ممکن است نیاز به شرکت در بسترهای آزمایشی برای
    نام های دامنه بین المللی
    --enable-underscores Squid به طور پیش فرض هر نام میزبانی را با _ رد می کند
    به نام آنها مطابق با استانداردهای اینترنت باشد.
    اگر با این موافق نیستید، ممکن است اجازه دهید
    نام میزبان با استفاده از این سوئیچ، به شرطی که
    کتابخانه حل‌کننده در میزبانی که Squid در آن اجرا می‌شود
    _ در نام هاست را رد نمی کند...
    --enable-auth="فهرست ماژول های طرح احراز هویت"
    ایجاد پشتیبانی برای لیست طرح های احراز هویت.
    پیش فرض ایجاد پشتیبانی برای طرح پایه است.
    برای مشاهده لیست ماژول های موجود به src/auth مراجعه کنید یا
    برنامه‌نویسان طرح‌های احراز هویت بخش را راهنمایی می‌کنند
    برای جزئیات در مورد نحوه ساخت طرح احراز هویت سفارشی خود
    مدول
    --enable-auth-modules = "لیست کمک کنندگان"
    نام مستعار سازگاری با عقب برای
    --enable-basic-auth-helpers
    --enable-basic-auth-helpers="لیست کمک کنندگان"
    این گزینه کدام طرح اصلی proxy_auth را انتخاب می کند
    کمکی برای ساخت و نصب به عنوان بخشی از عادی
    فرآیند ساخت برای لیست موجود
    کمک کنندگان دایرکتوری helpers/basic_auth را می بینند.
    --enable-ntlm-auth-helpers="فهرست یاران"
    این گزینه کدام کمک کننده های ntlm proxy_auth را انتخاب می کند
    برای ساخت و نصب به عنوان بخشی از ساخت معمولی
    روند. برای فهرستی از کمک‌کنندگان موجود را ببینید
    فهرست helpers/ntlm_auth.
    --enable-digest-auth-helpers="فهرست یاران"
    این گزینه احراز هویت طرح خلاصه را انتخاب می کند
    کمکی برای ساخت و نصب به عنوان بخشی از ساخت عادی
    فهرست helpers/digest_auth.
    --enable-ntlm-fail-open فعال کردن NTLM fail open، جایی که کمکی با شکست مواجه می شود
    یکی از مراحل احراز هویت می تواند به ماهی مرکب اجازه دهد
    همچنان کاربر را احراز هویت می کند.
    --enable-external-acl-helpers="لیست کمک کنندگان"
    این گزینه انتخاب می کند که کدام helperهای external_acl را انتخاب کند
    ساخت و نصب به عنوان بخشی از ساخت معمولی
    روند. برای فهرستی از کمک‌کنندگان موجود، به آدرس زیر مراجعه کنید
    فهرست helpers/external_acl.
    --with-samba-sources=/path/to/samba-source-tree
    مسیری که فایل های منبع صحیح سامبا می توانند در آن باشند
    در هنگام ساخت کمک‌کننده‌های بادگیر پیدا شد. (پیش فرض به
    از کپی های داخلی هدرهای Samba-2.2.7 استفاده کنید)

    Disable-unlinkd از unlinkd استفاده نکنید
    --enable-stacktraces ردیابی خودکار تماس را در خطاهای مهلک فعال کنید
    --enable-x-accelerator-vary
    پشتیبانی از X-Accelerator-Vary را فعال کنید
    هدر HTTP. می توان برای نشان دادن استفاده کرد
    واریانس در یک تنظیم شتاب دهنده
    معمولاً همراه با کدهای دیگر استفاده می شود
    که هدرهای HTTP سفارشی را به درخواست ها اضافه می کند.
    --with-maxfd=N لغو حداکثر تعداد توصیفگرهای فایل. مفید
    اگر به عنوان کاربر دیگری که دارای امتیاز نیست بسازید
    برای استفاده از تعداد توصیفگرهای پرونده که می خواهید
    در نتیجه باینری برای پشتیبانی

    پس از یافتن کلید مورد نیاز، آن را به %configure اضافه کنید. برای مثال می خواهیم ماهی مرکب را با پشتیبانی ssl بسازیم. از راهنما مشخص کردیم که برای این کار باید دو کلید --enable-ssl و --with-openssl را اضافه کنیم. ما تغییرات مناسب را انجام می دهیم

    فایل را ذخیره کرده و شروع به ساختن کنید.

    # rpmbuild -ba --target=athlon squid.spec پلتفرم های ساخت: athlon ساخت برای پلتفرم athlon در حال اجرا (%prep): /bin/sh -e /var/tmp/rpm-tmp.59199 + umask 022 + سی دی / usr /src/redhat/BUILD + cd /usr/src/redhat/BUILD + rm -rf squid-2.5.STABLE11 + /usr/bin/bzip2 -dc /usr/src/redhat/SOURCES/squid-2.5.STABLE11. tar .bz2 ......... دروازه SSL با استفاده از OpenSSL فعال است
    با استفاده از اجرای OpenSSL MD5
    ... ... ... ضبط شده توسط: /usr/src/redhat/SRPMS/squid-2.5.STABLE11-2.src.rpm ضبط شده توسط: /usr/src/redhat/RPMS/athlon/squid-2.5. STABLE11- 2.athlon.rpm Running(%clean): /bin/sh -e /var/tmp/rpm-tmp.7322 + umask 022 + cd /usr/src/redhat/BUILD + cd squid-2.5.STABLE11 + rm - rf /var/tmp/squid-2.5.STABLE11-root + exit 0 Execute(--clean): /bin/sh -e /var/tmp/rpm-tmp.7322 + umask 022 + cd /usr/src /redhat /BUILD + rm -rf squid-2.5.STABLE11 + خروج 0

    ما تمام ماهی مرکب را با موفقیت مونتاژ کردیم، اکنون تنها چیزی که باقی مانده نصب یا به روز رسانی آن است.

    ابتدا، بیایید بفهمیم که برای ساخت یک بسته rpm چه چیزی باید روی سیستم باشد. بسته rpm-build باید نصب شود. بدون آن، دستور rpmbuild در دسترس نخواهد بود. همراه با آن، تعدادی از بسته های مورد استفاده در هنگام مونتاژ به عنوان وابستگی عرضه می شود. در وابستگی های ساخت پکیج در ROSE معمولاً مرسوم نیست که کامپایلر C/C++ را مشخص کنید؛ به همین دلیل دیر یا زود به بسته های gcc و gcc-c++ نیاز خواهید داشت.همه وابستگی های دیگر باید توسط خود بسته درخواست شوند. . البته، اشتباهاتی وجود دارد، و در طول فرآیند مونتاژ متوجه می شوید که چیزی را از دست داده اید، اما این معمولاً بسیار نادر است و مهم نیست.

    پکیج RPM دقیقا چیست؟ بسته های RPM به بسته های منبع - src.rpm و بسته های آماده نصب - %(arch).rpm تقسیم می شوند. بسته‌های src.rpm حاوی tarball اصلی (منبع برنامه)، هر منبع دیگر، بخش‌ها و مهمترین فایل مشخصاتی است که فرآیند ساخت را کنترل می‌کند. همه این فایل ها در یک آرشیو cpio بسته بندی می شوند. وقتی سعی می کنید با استفاده از مدیریت فایل mc به بسته src.rpm دسترسی پیدا کنید، آن را خواهید دید. بسته همچنین حاوی تعدادی فایل با اطلاعات است.

    بسته‌های %(arch).rpm حاوی یک آرشیو cpio با فایل‌هایی هستند که پس از نصب، در دایرکتوری‌ها، فایل‌های اطلاعاتی و اسکریپت‌های نصب مناسب توزیع می‌شوند.

    همچنین ممکن است آن را بدون کد منبع پیدا کنید. آنها معمولاً برای برنامه‌های اختصاصی ایجاد می‌شوند که نمی‌توانند در توزیع گنجانده شوند (هیچ کد منبع وجود ندارد و باینری به نحوی نیاز به بازسازی دارد یا صرفاً با مجوز از قرار دادن آن در آینه‌های توزیع منع شده است). داخل این بسته معمولاً فقط یک فایل مشخصات وجود دارد و باینری دانلود می شود و در صورت لزوم در حین نصب بسته اصلاح می شود (مثلاً در یک پست اسکریپت که در ادامه به آن پرداخته خواهد شد).

    بسته ها را می توان از هر کاربری جمع آوری کرد. انجام این کار به صورت روت توصیه نمی شود، زیرا این احتمال وجود دارد که ریشه قسمت نصب، دایرکتوری / باشد و سپس دستور rm -rf %(buildroot) همه چیز را در جهان از بین ببرد. همچنین این اتفاق می افتد که “ بسته‌های crooked” نصب را به درستی انجام نمی‌دهند و آن را نه در یک فهرست موقت، بلکه مستقیماً در جایی در %(_prefix) (/usr) قرار می‌دهند، برخی از فایل‌ها از بین می‌روند، البته این کار بر روی عملکرد تأثیری نخواهد داشت. بسته بندی روی این دستگاه

    چه کاری باید انجام شود تا بتوان بسته ها را از زیر یک کاربر معمولی جمع آوری کرد؟ ابتدا باید یک فایل دایرکتوری rpmbuild در دایرکتوری خانگی خود با ساختار زیر ایجاد کنید:

    ~/rpmbuild |-- BUILD |-- BUILDROOT |-- RPMS | |-- i586 | |-- x86_64 | `-- noarch |-- منابع |-- SPECS `-- SRPMS

    باید دایرکتوری های BUILD , RPMS , SOURCES , SPECS , SRPMS را به صورت دستی ایجاد کنید، زیر شاخه های دایرکتوری RPMS باید بسته به معماری به طور خودکار در حین ساخت ایجاد شوند.

    در ROSE مرسوم نیست که سازنده و فروشنده بسته را در فایل های مشخصات بنویسید. این مقادیر به طور خودکار توسط سیستم ساخت ABF تنظیم می شوند. ABF همچنین به طور خودکار بسته های کامپایل شده را با کلید مخزن مربوطه امضا می کند. بنابراین در اینجا به این موضوعات نمی پردازیم.

    حالا بیایید ببینیم مهمترین فایل بسته rpm یعنی فایل spec چیست. مثلا از بسته stardict بگیریم. این بسته برای یادگیری بسیار مناسب است، زیرا حاوی چندین تاربال (منبع برنامه بسته بندی شده در تار) است، چندین بسته به دست می آید و چیزی به نام نمودار وجود دارد. معمولاً فایل مشخصات هم نام خود بسته (stardict.spec) است. با این حال، می‌توانید یک نسخه بسته (stardict-2.spec) را اضافه کنید، که اگر می‌خواهید از چندین شاخه از برنامه‌ها پشتیبانی کنید، مفید است. حتی می توانید نام دیگری به آن بدهید، اما این، به زبان ساده، ناخوشایند است.

    بنابراین، محتویات فایل stardict.spec در زیر آورده شده است. ما بلافاصله بعد از بخش‌های خاصی نظرات را وارد می‌کنیم، اما اگر همه بلوک‌ها را در یک فایل ترکیب کنید، یک stardict.spec کامل دریافت خواهید کرد.

    فایل مشخصات شامل بخش ها و سربرگ است:

    خلاصه: فرهنگ لغت StarDict نام: stardict نسخه: 2.4.8 انتشار: 4 مجوز: GPL URL: گروه: رابط کاربری/رومیزی منبع0: %(name)-%(version).tar.bz2 Source1: %(name)-tools- %(version).tar.bz2 Patch0: %(name)-2.4.8-desktop.patch

    خلاصه- توضیح مختصری از بسته، نام- نام، نسخه- نسخه، رهایی- رهایی. سه تگ آخر با تعاریف کلان %(name) , %(version) , %(release) مطابقت دارد. آنها اغلب بعدا استفاده می شوند. نامو نسخهمعمولاً همان نام تربال است. اگر آنها متفاوت باشند، در اصل جای نگرانی نیست، اما در برخی از مکان های فایل مشخصات باید از روش های غیر استاندارد استفاده کنید. اگر پکیج را از cvs، svn و غیره مونتاژ می کنید، توصیه می شود در همان ابتدای فایل یک تعریف ماکرو %define date 20070422 (در این قالب، می توانید حدس بزنید چرا) و تگ Release را تعریف کنید. به شرح زیر است:

    انتشار: 0.git%(تاریخ).4

    منبع*- متن های منبع، تاربال ها، فقط فایل ها. در این مثال دو تاربول با برنامه های مختلف وجود دارد که مونتاژ را بسیار پیچیده تر می کند. فایل های معمولی مانند تنظیمات را می توان به سادگی با استفاده از دستور install در قسمت %%install کپی کرد. یک نحو ساده دارد، -m mask_as_chmod را نصب کنید. همچنین می توانید با استفاده از آن دایرکتوری ایجاد کنید. در مثال ما از آن استفاده نمی شود، اما می توانید در مورد انسان بیشتر بخوانید.

    پچ- وصله ها، اصلاحاتی که شما یا شخص دیگری برای این بسته منتشر کرده اید. مرسوم نیست که کد منبع خود برنامه را تغییر دهید و سپس آن را در یک تربال بپیچید. استفاده از وصله ها مرسوم است. می توانید آنها را به صورت زیر انجام دهید. تاربال اصلی را از بسته بندی خارج کنید، برای ما stardict-2.4.8 خواهد بود، سپس stardict-2.4.8 را در stardict-2.4.8.orig کپی کنید. پس از آن، کد موجود در دایرکتوری stardict-2.4.8 را تغییر دهید، از آن خارج شوید و دستور diff -ur stardict-2.4.8.orig stardict-2.4.8 > stardict-2.4.8-patch_name.patch را صادر کنید. همانطور که می بینید، قبل از اضافه شدن پچ، %(name)-%(نسخه) بسته وجود دارد. در خود فایل spec باید نام پچ را بدون تعریف ماکرو بنویسید. حداقل یک نسخه، مطمئنا. در غیر این صورت، زمانی که نسخه بسته را به روز می کنید، نسخه پچ تعریف شده توسط ماکرو %(version) را به روز می کنید و ممکن است پچ بدون هیچ تغییری برای نسخه جدید برنامه مناسب باشد. اگر در حین ساخت، پچ نمی تواند اعمال شود، باید برای این نسخه از برنامه دوباره ساخته شود، یا در قسمت %setup غیرفعال شود.

    در فایل های مشخصات بسته های بسیاری از توزیع ها، همچنین می توانید در هدر تعریف BuildRoot را بیابید - دایرکتوری که ساخت در آن انجام می شود. در ROSE این تعریف ضروری نیست، نام BuildRoot به طور خودکار تولید می شود.

    BuildRequires: libgnomeui-devel >= 2.2.0 BuildRequires: scrollkeeper BuildRequires: gettext Requires(post): GConf2 Requires(post): scrollkeeper Requires(postun): scrollkeeper

    BuildRequires بخشی است که در آن بسته هایی که برای ساخت برنامه ما لازم است نوشته می شوند، با کاما از هم جدا می شوند یا با فاصله از هم جدا می شوند. می‌توانید آنها را از برخی فایل‌های README و INSTALL دریافت کنید (اگرچه به ندرت چیز مفیدی در این مورد وجود دارد)، از فرآیند پیکربندی (معمولاً اسکریپت پیکربندی در حال حاضر) و از خود فرآیند ساخت (گاهی اوقات پیکربندی چیزی را از دست می‌دهد و اسمبلی متوقف می‌شود. ).

    Requires - این بخش حاوی بسته‌ها یا فایل‌هایی است (!) که این بسته در هنگام نصب به آنها نیاز دارد. هنگام ساخت، وابستگی ها به طور خودکار شامل تمام کتابخانه های مورد نیاز بسته ما می شوند، اما می توانید بسته ها را به صورت دستی نیز مشخص کنید. Rpm همچنین به طور خودکار وابستگی های perl، python، mono و برخی دیگر را ثبت می کند (البته همه این وابستگی ها نه در فایل spec بلکه در خود بسته نوشته شده است). اگر نیازی به ثبت خودکار وابستگی ندارید، باید یک AutoReq جدید: بدون برچسب به فایل مشخصات اضافه کنید. معمولاً هنگام ساخت برنامه های اختصاصی تجویز می شود، زیرا rpm وابستگی های داخلی را از برنامه کامپایل شده اضافه می کند.

    مثال ما از ساختارهای Requires(post) و Requires(postun) برای وابستگی ها در اسکریپت های نصب و حذف استفاده می کند. در اصل، یک Requires ساده کافی است. در اینجا چیز زیادی برای اظهار نظر وجود ندارد. فقط این است که خود StarDict در حین کار به این وابستگی ها نیاز ندارد. آنها فقط در هنگام نصب و حذف مورد نیاز هستند.

    چندین تگ مفید دیگر وجود دارد که در اینجا استفاده نمی شود.

    ارائه می دهد: title1، title2

    نام هایی غیر از %(name) که این بسته به آنها پاسخ خواهد داد. نشان دادن اینکه آیا نام یک بسته را تغییر داده اید یا خیر، راحت است، اما بسته های دیگر همچنان به نام قدیمی بستگی دارند.

    منسوخ شده: name1, name2

    بسته های مشخص شده را هنگام نصب بسته فعلی حذف می کند. انگار می گویند این پکیج جایگزین موارد مشخص شده (از نظر کارکرد، مجموعه فایل ها و ...) می شود. می توانید از نام ساخت و ساز استفاده کنید< . Тут вы должны сами понимать, что к чему.

    تضادها: عنوان1، عنوان2

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

    پیشنهاد می کند: title1، title2

    - نرموابستگی ها بسته هایی هستند که قابلیت های اضافی را به یک بسته معین اضافه می کنند (مثلاً کدک های یک پخش کننده رسانه)، اما شما می توانید بدون آنها انجام دهید.

    دوره: عدد

    معمولاً یا اصلاً نشان داده نمی شود یا برابر با 0 است. ماهیت این پارامتر این است. اجازه دهید بسته ما stardict هنوز نسخه داشته باشد 2.4.8 و همچنین یک قدیمی تر وجود دارد 2.4.5 . بنابراین اگر stardict 2.4.5 دارای %(epoch) باشد 1 و برای 2.4.8 - 0 ، سپس بسته 2.4.5 همیشه جدیدتر از 2.4.8 خواهد بود. این چیزی است که RPM هنگام نصب به شما می گوید. اگر بخواهید به نسخه قبلی برگردید، این پارامتر مناسب است (البته، اگر همه چیز را در یک مخزن عمومی قرار دهید و همه چیز را از طریق urpmi یا rpmdrake بگیرید. برای نیازهای "خانه"، پارامتر rpm --force مناسب است). اگر تگ Epoch: 0 تعریف شده باشد، بسته بر بسته ای با تگ Epoch تعریف نشده اولویت خواهد داشت.

    BuildArch: معماری

    معماری که بسته ما تحت آن مونتاژ خواهد شد. اگر این گزینه مشخص نشده باشد، بسته برای معماری فعلی ساخته می شود. به طور معمول این گزینه به منظور ساخت یک بسته معماری مشخص می شود noarch، یعنی بسته ای که حاوی باینری نیست.

    ExclusiveArch:architectural1 architecture2

    معماری هایی که این پکیج را می توان برای آنها مونتاژ کرد. معمولاً هنگام مونتاژ ماژول ها برای هسته استفاده می شود.

    اینجا جایی است که هدر به پایان می رسد و بخش های جداگانه شروع می شود.

    %description StarDict یک فرهنگ لغت بین المللی است که برای محیط GNOME نوشته شده است. دارای ویژگی های قدرتمندی مانند "تطبیق الگوی به سبک گلوب"، "اسکن کلمه انتخابی"، "جستجوی فازی" و غیره است.

    توضیحات بسته اصلی، بسته با نام %(name)

    %package tools خلاصه: StarDict-Editor نیاز دارد: %(name) = %(version)-%(release) گروه: رابط کاربری/رومیزی

    در اینجا یک بسته جدید ایجاد می کنیم که نام آن %(name)-tools خواهد بود. اگر نیاز دارید که بسته را چیزی کاملاً متفاوت بنامید، باید این کار را انجام دهید، برای مثال، به این صورت: %package -n tools-stardict . نسخه بسته جدید از تگ Version گرفته شده است. به Requires توجه کنید. این شامل یک وابستگی به بسته اصلی stardict است. اگر %(epoch) داشت، باید مشخص شود مورد نیاز: %(name)-%(دوران):%(نسخه)-%(انتشار). در غیر این صورت به سادگی قادر به نصب این بسته نخواهید بود.

    %description tools یک ابزار ساده برای StarDict.

    توضیحات بسته دوم

    %prep %setup -q -a1 %patch0 -p1

    بخش %prep آماده سازی برای مونتاژ را آغاز می کند. %setup منابع را باز می کند. گزینه -qخروجی باز کردن بایگانی را نشان نمی دهد. گزینه -a1برای بازکردن %(SOURCE1) , دومین تاربول داخل(!) دایرکتوری تاربول اول استفاده می شود. بر این اساس، عدد نشان دهنده شماره SOURCE است. این پارامتر نیز گاهی اوقات استفاده می شود ، سپس تاربال دوم در همان دایرکتوری اول باز می شود. بر این اساس، اگر ما یک تربال داشته باشیم، پس گزینه ها , استفاده نمی شوند.

    اگر اولین دایرکتوری شما در تاربال نامی متفاوت از %(name)-%(نسخه داشته باشد، آنگاه rpm نمی تواند به طور خودکار وارد این فهرست شود. در این صورت باید %setup را کمی تغییر دهید. اگر در بایگانی stardict-2.4.8.tar.bz2 اولین دایرکتوری به عنوان مثال، به سادگی stardict نامگذاری شده باشد، به این صورت خواهد بود:

    %setup -q -n %(name) -a1

    بلافاصله پس از باز کردن بسته، قبل از %patch، در صورت لزوم می‌توانید فایل‌ها را کپی کنید یا هر برنامه‌ای را برای تغییر منابع اجرا کنید. فرض کنید فایل Russification را کپی کنید یا کد منبع را با sed تصحیح کنید. فقط cp، sed یا چیز دیگری را اینجا صدا کنید. ریشه در اینجا دایرکتوری است که اولین tarball در آن باز شده است (متغیر $RPM_BUILD_DIR مسئول آن است، اما بسیار به ندرت استفاده می شود).

    با استفاده از %patch وصله ها اعمال می شوند. اگر همانطور که در بالا نوشتیم یک پچ ساخته اید، همیشه پارامتر را خواهید داشت -p1. پارامتر نیز اغلب استفاده می شود -b .patch_name، برای ایجاد یک نسخه پشتیبان.

    %build pushd %(name)-tools-%(نسخه) %configure %make popd %configure %make

    بخش %build جایی است که بسته ساخته می شود. به pushd و popd توجه کنید. با این دستورات از دایرکتوری دوم tarball حرکت کرده و از آن خارج می شویم. این دایرکتوری ریشه پس از فشار دادن خواهد بود. بعد از دستور popd به دایرکتوری اولین تربال برمی گردیم. بر این اساس، اگر یک منبع دارید، دیگر نیازی به استفاده از این دستورات ندارید.

    از آنجایی که ما دو برنامه در یک بسته داریم، پیکربندی %configure را دو بار اجرا می کنیم و دو بار می سازیم. اگر بسته با استفاده از ابزارهای خودکار پیکربندی شده باشد، ماکرو %configure اسکریپت پیکربندی را از ریشه tarball بدون بسته بندی اجرا می کند. معمولاً پارامترهای زیادی دارد، آنها را می توان از خط فرمان با استفاده از ./configure --help مشاهده کرد. پس از %configure می توانید پارامترهای مورد نیاز خود را مشخص کنید. توجه داشته باشید که فراخوانی %configure و ./configure متفاوت است. در حالت اول، دایرکتوری های صحیح برای نصب (و همچنین پارامترهای استاندارد) به پیکربندی کننده منتقل می شود، در دوم - دایرکتوری های پیش فرض.

    پس از یک پیکربندی موفقیت آمیز، اسمبلی رخ می دهد، یعنی %make macro، که فرمانی به همین نام را با برخی پارامترهای اضافی فراخوانی می کند (به ویژه، در ماشین های چند پردازنده، موازی موازی استفاده می شود - گزینه -j).

    اگر بسته از ابزارهای خودکار استفاده نمی کند، %configure و شاید %make نیازی به استفاده نباشد؛ برای ساخت، فایل README و INSTALL را بخوانید. ROSA همچنین دارای ماکروهایی برای موقعیت‌های دیگر است - برای مثال %cmake برای ابزار ساخت با همین نام.

    هنگامی که ساخت با موفقیت به پایان رسید، بخش %install وارد عمل می شود.

    %install pushd %(name)-tools-%(version) %makeinstall_std popd %makeinstall_std %find_lang %(name)

    %%find_lang، فایل های محلی سازی را جستجو کنید. پارامتر آن نام فایل هایی است که پس از نصب در دایرکتوری قرار خواهند گرفت %(buildroot)/usr/share/locale/*/LC_MESSAGES/*.mo. این معمولاً با %(name) مطابقت دارد. اگر اینطور نیست، نام دیگری بنویسید.

    در بسیاری از فایل های مشخصات، ممکن است متوجه شوید که دستور rm -rf %(buildroot) یا rm -rf $RPM_BUILD_ROOT در همان ابتدای بخش %install و همچنین بخش %clean با همان خطوط اجرا می شود. در ROSE مدرن نیازی به این کار نیست، چنین تمیزکاری به طور خودکار انجام می شود.

    %preun %preun_uninstall_gconf_schemas %(name)

    بخش هایی برای اسکریپت های نصب به طور کلی، چندین مورد از آنها وجود دارد. %pre - قبل از نصب، %post - بعد از نصب، %preun - قبل از حذف، %postun - بعد از حذف اجرا شد. در مثال ما، حذف، طرحواره های Gconf را حذف می کند. در اینجا فرض می کنیم که تنها یک طرحواره در بسته وجود دارد و نام آن با نام بسته یکسان است. لطفاً توجه داشته باشید که برای حذف طرحواره ها ما یک ماکرو ویژه می نامیم. این ماکرو توسط rpmbuild ROSA به مجموعه ای از دستورات ضروری شل گسترش می یابد که در واقع طرحواره را حذف می کند. نصب طرحواره ها هنگام نصب بسته به طور خودکار با استفاده از محرک های فایل RPM انجام می شود.

    هر بسته ممکن است اسکریپت های خاص خود را داشته باشد، بنابراین باید مستندات را نیز مطالعه کنید. اگر هیچ اسکریپتی برای عملکرد صحیح مورد نیاز نیست، این بخش ها نباید استفاده شوند. شما می توانید از اسکریپت های bash در این بخش ها (درست مانند هر بخش دیگر) استفاده کنید.

    در قسمت %files باید مشخص کنیم که کدام فایل باید بسته بندی شود. همه فایل ها باید مشخص شوند، در غیر این صورت rpmbuild فایل های بسته نشده را گزارش می دهد.

    گزینه یک فایل حاوی لیستی از فایل های پردازش شده مشخص شده است. در مورد ما، این فایل شامل مسیرهای فایل های محلی سازی است. شما در اصل می توانید فایل خود را بسازید و آن را درج کنید.

    از تعاریف ماکرو ویژه برای تعریف دایرکتوری ها استفاده می شود.

    • %(_prefix) - /usr
    • %(_sysconfdir) - /etc
    • %(_bindir) - /usr/bin
    • %(_datadir) - /usr/share
    • %(_libdir) - /usr/lib یا /usr/lib64 بسته به عمق بیت سیستم
    • %(_lib) - /lib یا /lib64 به ترتیب
    • %(_libexecdir) - /usr/libexec
    • %(_includedir) - /usr/unclude
    • %(_mandir) - /usr/share/man
    • %(_sbindir) - /usr/sbin
    • %(_localstatedir) - /var .
    • %(systemd_libdir) - /usr/lib/systemd
    %files -f %(name).lang %defattr(-, root, root) %doc نویسندگان در حال کپی کردن README NEWS %(_sysconfdir)/gconf/schemas/stardict.schemas %(_bindir)/stardict %(_bindir)/stardict -ویرایشگر %(_libdir)/bonobo/servers/GNOME_Stardict.server %(_datadir)/applications/*.desktop %(_datadir)/stardict %(_datadir)/locale/*/LC_MESSAGES/* %(_datadir)/pixmaps/stardict .png %(_datadir)/gnome/help/%(name)/* %(_datadir)/idl/GNOME_Stardict.idl %(_datadir)/omf/* %doc %(_mandir)/man?/*

    %doc فایل ها را به عنوان سند علامت گذاری می کند. خط سوم فایل های مشخص شده را در دایرکتوری کپی می کند %(_datadir)/doc/%(name)-%(نسخه). به‌طور پیش‌فرض، فایل‌های بسته rpm متعلق به روت خواهند بود و حقوق دسترسی root مانند مراحل نصب خواهد بود. اگر نیاز به تغییر دارد، از ساختار %defattr استفاده کنید.

    % فایل ابزار %(_bindir)/stardict-editor

    همینطور برای بسته stardict-tools. اگر آن را tools-stardict می نامیدند، %files به این شکل خواهد بود:

    %files -n tools-%(name).

    آخرین مورد در فایل spec %changelog است. در Changelog تغییرات بسته نسبت به نسخه قبلی را نشان می دهید. نحو آن تقریباً به صورت زیر است.

    %changelog * یکشنبه 22 آوریل 2007 نام شما - 2.4.8-4 - به روز رسانی وصله دسکتاپ

    تعاریف کلان

    اکنون زمان آن رسیده است که نگاه دقیق تری به ماکروها و متغیرها بیندازیم. فرض کنید در حال ساخت یک بسته از SVN هستیم، در این مورد معمولاً تاریخ بازبینی در انتشار گنجانده شده است. در همان ابتدای فایل spec باید متغیر تاریخ را تعریف کنید:

    %define date 20070612

    همانطور که می بینیم، تعریف کلان %define وظیفه تعریف متغیرها را بر عهده دارد. اکنون، در هر جایی از فایل spec، می‌توانیم از متغیر خود به شکل %(date) استفاده کنیم (پرانتز لازم نیست، اما در ROSE مرسوم است که متغیرها را در براکت قرار دهیم و تعاریف کلان را نگیریم؛ تشخیص آن آسان‌تر است. آنها از این طریق). به عنوان مثال، تعریف پارامترهای اصلی چیزی شبیه به این خواهد بود:

    نسخه: 0.5 انتشار: 0.svn%(تاریخ).3

    لطفا توجه داشته باشید که تاریخ قبل از 0. ، و پس از تاریخ - یک عدد، که در صورت لزوم برای افزایش انتشار افزایش می یابد. چرا این کار انجام می شود؟ بالاخره چه زمانی نسخه نهایی منتشر می شود (در مورد ما - 0.5 )، ویرایش را می توان حذف کرد و به سادگی در نسخه نوشت 1 . در عین حال به معنای واقعی کلمه 1 بزرگتر از هر خطی که با آن شروع می شود 0 ، و بسته جدیدتر از بسته های پیش از انتشار ساخته شده از نسخه های SVN در نظر گرفته می شود.

    یک تعریف کلان بسیار محبوب ساخت و ساز است

    %if شرط action1 %alse action2 %endif

    یا فقط %if بدون %else . ایده ساده است، اگر شرط %if درست باشد، عمل 1 اجرا می شود، در غیر این صورت action2 اجرا می شود.

    بیایید بگوییم که دوباره در حال جمع آوری چیزی از SVN هستیم. معمولاً در داخل بایگانی، اگر از SVN باشد، به جای دایرکتوری %(name)-%(version)، به سادگی %(name) را نشان می دهند (بایگانی sim-0.9.5.tar.bz2 دارای یک دایرکتوری سیم است، از آنجایی که نسخه نهایی sim ​​0.9.5 است وجود ندارد. نسخه نهایی sim-0.9.5 را به عنوان اولین دایرکتوری خود خواهد داشت. برای جلوگیری از بازنویسی هر بار فایل مشخصات، می توانید تعاریف ماکرو زیر را ایجاد کنید:

    %define svn 1 ... %prep %if %(svn) %setup -q -n %(name) %else %setup -q %endif

    اگر متغیر svn تعریف نشده باشد، قسمت بعد از %else از اسکریپت اجرا می شود. همچنین می توانید از یک شرط سخت گیرانه استفاده کنید (نقل قول ها را فراموش نکنید):

    %define svn 1 ... %prep %if "%(svn)" == "1" %setup -q -n %(name) %else %setup -q %endif

    در داخل تمام بخش‌های فایل مشخصات، می‌توانیم از هر دستور لینوکس، بدون هیچ زنگ و سوتی استفاده کنیم، اما در هدر فایل، این کار چندان ساده نیست. به عنوان مثال، باید نسخه فایرفاکس را برای یک بسته (مثلا epiphany) تعیین کنیم و آن را به بخش Requires: اضافه کنیم. شبیه این خواهد شد:

    مورد نیاز: فایرفاکس = %(rpm -q فایرفاکس --qf "%%(نسخه)")

    لطفا توجه داشته باشید که دستور خارجی در %() (تقریباً مانند bash - $()) اجرا می شود و در فایل spec باید دو علامت % در پارامترها قرار دهید. به این ترتیب می توانید هر دستور لینوکس را فراخوانی کنید، به عنوان مثال، برای تعیین نسخه هسته.

    یکی دیگر از تعریف های معروف ماکرو، ساختار %ifarch .. %endif است. اگر معماری با معماری مشخص شده بعد از %ifarch مطابقت داشته باشد، برخی اقدامات انجام می شود. معماری ها در i386، i486، i586، i686، i?86، x86_64، و البته، برخی دیگر که احتمالاً با آنها برخورد نخواهید کرد، ارائه می شوند.

    همانطور که در بالا ذکر شد، در تمام بخش های فایل spec می توانید از هر دستور شل، از جمله for، while، if و غیره استفاده کنید.

    ساخت پکیج

    حالا بیایید مستقیماً به مونتاژ بسته بپردازیم. منابع و وصله ها باید در دایرکتوری SOURCES و فایل spec باید در دایرکتوری SPECS باشد. بعد از این باید دستور را صادر کنید:

    فایل مشخصات Rpmbuild -ba

    پس از این، بسته ساخته می شود (یا ساخته نمی شود، اما با خطا می افتد) و بسته های باینری در زیر شاخه های دایرکتوری RPMS ظاهر می شوند و منبع در دایرکتوری SRPMS ظاهر می شود.

    خیلی اوقات، درست قبل از تکمیل ساخت، rpmbuild پیامی در مورد فایل‌های یافت شده اما بسته نشده نمایش می‌دهد. این بدان معنی است که شما آنها را در بخش %files قرار نداده اید. فقط باید آنها را در آنجا اضافه کنید. اگر نمی‌خواهید این فایل‌ها در بسته قرار بگیرند، می‌توانید از یکی از روش‌های زیر استفاده کنید:

    • یک تعریف ماکرو به بخش %files اضافه کنید
    %exclude file_path/file
    • یک تعریف ماکرو به ابتدای فایل مشخصات اضافه کنید
    %define_unpackaged_files_terminate_build 0

    اگر نیاز دارید که فقط باینری یا فقط منبع بسازید، به جای آن -باباید استفاده شود -bbو -لیسانسبه ترتیب. از جمله پارامترهای مفید rpmbuild می توان به آن اشاره کرد -تمیز(همه زباله ها را حذف کنید) -rmsource(منابع را از دایرکتوری SOURCE حذف کنید) و -target=معماری(یک بسته برای یک معماری خاص بسازید).

    شما همچنین می توانید اسکریپت ها را فقط در یک بخش خاص اجرا کنید. ما در اینجا چنین پارامترهایی را شرح نمی دهیم، ببینید مرد در دقیقه ساخت.

    ساخت یک بسته RPM از بسته ای که قبلاً روی سیستم نصب شده است

    گاهی اوقات شرایطی پیش می‌آید که بسته‌ای از قبل روی سیستم نصب شده است (شاید در یک سیستم بسیار قدیمی) و شما واقعاً می‌خواهید با آن یک دور در دقیقه دریافت کنید، اما ذخیره نشده است. همچنین ممکن است بخواهید به سرعت بسته ای را با فایل های پیکربندی که مطابق با نیازهای شما اصلاح شده اند جمع آوری کنید.

    برای حل این مشکل باید از ابزار rpmrebuild استفاده کنید. این ابزار که در bash نوشته شده است، در مخزن مشارکت ROSA موجود است.

    کار با آن فوق العاده آسان است. شما فقط باید دستور را صادر کنید:

    Rpmrebuild نصب شده package_name

    اگر فایلی تغییر کرده باشد، به شما اطلاع داده می شود، اما روند ساخت قطع نمی شود.

    Rpmrebuild تعداد زیادی پارامتر دارد، به عنوان مثال، می توانید انتشار بسته، تغییرات، اسکریپت ها، بخش های Requires، توضیحات بسته و موارد دیگر را تغییر دهید. شما حتی می توانید به سادگی فایل مشخصات را تغییر دهید، که اسکریپت خودش تولید می کند. درست است که کمی ترسناک خواهد بود، اما باز هم بهتر از هیچ است.

    تمام پارامترها را می توان با استفاده از آن مشاهده کرد

    RpmRebuild -- help

    تمام راهنماهایی که در اینترنت پیدا کردم در بیشتر موارد به دو نوع تقسیم می شوند:
    - ترجمه اسناد (که همچنان به شما توصیه می کنم آن را بخوانید، زیرا مقاله من تنها بخشی از اطلاعاتی را که در آینده به آن نیاز خواهید داشت پوشش می دهد)
    - دستورالعمل های مختصری در مورد نحوه اجرای rpmbuild زمانی که همه چیز را داریم.
    من شخصاً با نیاز به ساخت یک بسته از منبعی مواجه شدم که هیچ چیز با آن وجود نداشت و مهمتر از همه، یک فایل مشخصات که از آن بسته ساخته شود. در نتیجه، ما فایل مشخصات خود را برای ساخت بسته می نویسیم و بلافاصله تنظیمات خود را در آنجا اضافه می کنیم (این موضوع نیز به خوبی پوشش داده نشده است).

    من یک بسته از منابع ffmpeg برای AirVideoServer خواهم ساخت که قبلاً آن را به عنوان توضیح دادم. من حامی نصب برنامه ها از طریق آن در توزیعی هستم که از یک مدیر بسته استفاده می کند، به همین دلیل است که در CentOS ساختن نرم افزار از منبع را دوست ندارم. به همین دلیل تصمیم گرفتم همه چیز را در کیسه برای خودم جمع کنم. مونتاژ Lame ضروری (همراه با فایل های مشخصات موجود است) و x264 (شما می توانید پس از خواندن این مقاله خودتان یک فایل مشخصات برای آن بنویسید) نباید در آینده برای شما مشکل ایجاد کند.

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

    یام نصب gcc gcc-c++ automake autoconf libtool yasm nasm ncurses-devel git ftp rpmdevtools

    حالا بیایید یک کاربر خاص ایجاد کنیم

    کاربر rpmbuild را اضافه کنید

    و بیایید زیر آن برویم

    Su - rpmbuild

    بیایید دستور را اجرا کنیم

    Rpmdev-setuptree

    به طوری که ساختار دایرکتوری لازم را برای ساخت ما مستقر می کند
    و اکنون می توانیم مستقیماً به مونتاژ برویم.
    ما به خود منبع نیاز داریم

    Wget http://inmethod.com/airvideo/download/ffmpeg-for-2.4.5-beta7.tar.bz2

    آن را باز کنید

    Tar -xjf ffmpeg-for-2.4.5-beta7.tar.bz2

    بیایید فایل پیکربندی را با محتویات در کنار آن قرار دهیم:

    Nano airvideoserver.conf path.ffmpeg = /usr/bin/ffmpeg رمز عبور = subtitles.encoding = utf-8 subtitles.font = پوشه های Verdana = فیلم ها:/home/share/films

    بیایید فایل سرور را از اینجا دانلود کنیم:

    Wget http://inmethod.com/airvideo/download/linux/alpha6/AirVideoServerLinux.jar

    و اسکریپت init:

    Nano AirVideoServer #!/bin/bash #chkconfig: - 80 20 #شرح: سرور AirVideo # کتابخانه تابع منبع. . /etc/rc.d/init.d/functions PREFIX_DIR=/usr/local/AirVideo مورد "$1" در شروع) echo -n "شروع سرور AirVideo: " daemon java -jar $(PREFIX_DIR)/AirVideoServerLinux.jar $( PREFIX_DIR)/properties.conf > /dev/null 2>&1 & [ $? -eq 0 ] && موفقیت || پژواک شکست ;; stop) echo -n "توقف سرور AirVideo: " killproc java echo ;; وضعیت) وضعیت جاوا ;; راه اندازی مجدد | بارگذاری مجدد) $0 توقف ; شروع $0 ;; *) echo "Usage: airvideo (شروع|توقف|وضعیت|بارگیری مجدد|راه اندازی مجدد» خروج 1 ;; esac

    اکنون می توانیم به نوشتن فایل مشخصات خود برای اسمبلی ادامه دهیم.
    ابتدا سرفصل های مختلف را داریم. نام بسته، نسخه و نسخه مهم هستند؛ آنها تعیین می کنند که منبع قبل از اسمبلی در کدام دایرکتوری مستقر شود. در Source1، Source2 و Source3 ما 3 فایل اضافی، پیکربندی، سرور و اسکریپت init را نشان می‌دهیم که باید هنگام ساخت به بسته اضافه شوند.

    نام: ffmpeg نسخه: 2.4.5 انتشار: beta7 خلاصه: ffmpeg برای مجوز سرور AirVideo: آدرس GPL: http://inmethod.com/airvideo/ منبع: http://inmethod.com/airvideo/download/ffmpeg-for-2.4 .5-beta7.tar.bz2 Source1: airvideoserver.conf Source2: AirVideoServer Source3: AirVideoServerLinux.jar BuildRoot: %(_tmppath)/%(name)-for-%(version)-%(release)

    %description ابزار و کتابخانه برای رمزگذاری جریان های ویدیویی H264/AVC برای AirVideoServer.

    بخش %prep مسئول دستورات لازم برای شروع ساخت است، به طوری که من نگران تغییر نام دایرکتوری برای قالب نباشم - من فقط از سوئیچ -n برای نشان دادن محل قرارگیری منابع بدون بسته بندی استفاده می کنم.

    %prep %setup -n /home/rpmbuild/rpmbuild/BUILD/ffmpeg/

    بخش %build مسئول مونتاژ مستقیم منبع است؛ می‌توانید کلیدها را به کلیدهایی که نیاز دارید تغییر دهید، مانند مونتاژ و نصب معمولی از منابع:

    %build ./configure \ --prefix="%(_prefix)" \ --bindir="%(_bindir)" \ --libdir="%(_libdir)" \ --enable-pthreads \ --disable-shared \ --enable-static \ --enable-gpl \ --enable-libx264 \ --enable-libmp3lame

    بخش %install حاوی دستوراتی برای نصب فایل‌های بسته در سیستم است؛ در اینجا ما باید محل نصب فایل پیکربندی، سرور و اسکریپت init خود را نیز مشخص کنیم.

    %install %(__rm) -rf %(buildroot) %(__make) install DESTDIR="%(buildroot)" mkdir -p $RPM_BUILD_ROOT/usr/local mkdir -p $RPM_BUILD_ROOT/usr/local/AirVideo/ install -m 644 %(SOURCE1) $RPM_BUILD_ROOT/usr/local/AirVideo/ install -m 644 %(SOURCE2) $RPM_BUILD_ROOT/etc/init.d نصب -m 644 %(SOURCE3) $RPM_BUILD_ROOT/usr/local/AirVide

    بیایید زباله ها را پاک کنیم و ldconfig را اجرا کنیم

    % پاک %(__rm) -rf %(buildroot) %post -p /sbin/ldconfig %postun -p /sbin/ldconfig

    دستورات در بخش %files لیستی از فایل ها و دایرکتوری ها را مشخص می کند که با ویژگی های مناسب باید از درخت ساخت در بسته rpm کپی شوند و پس از نصب این بسته در سیستم هدف کپی شوند.

    % فایل %defattr(-,root,root,-) %doc COPYING* اعتبارات README* %(_bindir)/avconv %(_bindir)/avprobe %(_bindir)/avserver %(_bindir)/ffmpeg /usr/include/* /usr/lib64/* /usr/share/avconv/* /usr/local/AirVideo/airvideoserver.conf /etc/init.d/AirVideoServer /usr/local/AirVideo/AirVideoServerLinux.jar

    %doc ماکرو فایل های اسناد، حق چاپ و موارد دیگر را علامت گذاری می کند.
    با این فایل مشخصات ما آماده است، اکنون باید خود اسمبلی را اجرا کنیم

    Rpmbuild -bb ffmpeg/ffmpeg.spec

    پس از مونتاژ موفقیت آمیز بسته، پس از تکمیل، در دایرکتوری RPMS/_architecture_/ بسته ffmpeg-2.4.5-beta7.x86_64.rpm خود را خواهیم داشت که اکنون می تواند در هر ماشینی آپلود و مستقر شود.

    امیدوارم این کتابچه راهنمای کوچک به شما کمک کند تا بسته های خود را برای نصب، با فایل های پیکربندی خودتان جمع آوری کنید، که بعداً زندگی شما را آسان تر می کند.

    بسیاری از پروژه های ما از کتابخانه های منبع باز استفاده می کنند. وقتی توسعه برای یک پلتفرم خاص انجام می‌شود، جمع‌آوری کتابخانه‌های یکسان از منبع هر بار که یک توسعه‌دهنده جدید به پروژه می‌پیوندد، فایده‌ای ندارد. به‌علاوه، نصب کتابخانه‌ها به‌عنوان یک شکل بد در نظر گرفته می‌شود، زیرا سیستم با فایل‌های «یتیم» که هیچ اطلاعاتی در پایگاه داده مدیر بسته RPM ندارند مسدود شده است.

    به عنوان یک راه حل، پیشنهاد می شود بسته های RPM را از کتابخانه های کامپایل شده جمع آوری کنید و آنها را در یک مخزن واحد ذخیره کنید که در دسترس همه توسعه دهندگان باشد. در زیر دستورالعمل ها و نکاتی برای مونتاژ بسته ها آمده است.

    دستورالعمل ها بر اساس مثال Red Hat Enterprise Linux 6 خواهد بود، اما با تغییرات جزئی می توان آن را برای سایر توزیع ها تطبیق داد. به عنوان مثال، ما یک بسته از کتابخانه zeromq خواهیم ساخت.

    قبل از ساخت پکیج

    اولین کاری که باید قبل از مونتاژ انجام دهید این است که مطمئن شوید بسته مورد نیاز توسط شخص دیگری قبل از شما مونتاژ نشده باشد. اغلب منابعی مانند rpmfind.net و rpm.pbone.net می توانند آنچه شما نیاز دارید را پیدا کنند. اما اگر نسخه مورد نیاز کتابخانه پیدا نشد یا اسمبلی برای پلتفرم شما وجود نداشت، باید خودتان بسته را بسازید.

    rpmbuild

    بسته ها با استفاده از ابزار جمع آوری می شوند rpmbuild. قبل از استفاده از آن، باید محیط ساخت را پیکربندی کنید. بیایید درخت دایرکتوری لازم را ایجاد کنیم، به عنوان مثال، در دایرکتوری ~/rpmbuild:

    $ mkdir ~/rpmbuild $ mkdir ~/rpmbuild/(ساخت، ساخت، RPMS، منابع، مشخصات، SRPMS)

    ما یک فایل پیکربندی برای ابزار rpmbuild ایجاد می کنیم تا بداند درخت دایرکتوری ایجاد شده در کجا قرار دارد:

    $ echo "%_topdir %(echo $HOME)/rpmbuild" >~/.rpmmacros

    rpmbuildهنگام راه اندازی، فایل های بسته را در دایرکتوری ~/rpmbuild/BUILDROOT/ جستجو می کند<имя_пакета>. بیایید با استفاده از zeromq به عنوان مثال بفهمیم که بسته های RPM چه نامیده می شوند:

    zeromq-3.2.4-1.rhel6.x86_64.rpm

    • zeromq - در واقع نام نرم افزار بسته بندی شده.
    • 3.2.4 - نسخه نرم افزار;
    • 1.rhel6 - شماره ساخت بسته (شماره انتشار) - چند بار این نسخه نرم افزار در یک بسته rpm کامپایل شده است. پسوند rhel6 یا el6 معمولاً توسط بسته های Red Hat Enterprise Linux 6 استفاده می شود.
    • x86_64 - معماری پردازنده ای که نرم افزار برای آن کامپایل شده است.

    به کاراکترهای جداکننده فیلدهای نام بسته توجه کنید. آنها باید دقیقاً مانند مثال باشند.

    بنابراین، یک دایرکتوری برای zeromq در BUILDROOT ایجاد کنید:

    $ mkdir ~/rpmbuild/BUILDROOT/zeromq-3.2.4-1.rhel6.x86_64

    ساخت کتابخانه

    البته قبل از ساخت بسته باینری، باید خود کتابخانه را کامپایل کنید. اگر کتابخانه از سیستم ساخت ابزار خودکار گنو استفاده می کند، معمولاً با دستورات زیر انجام می شود:

    $ ./configure $ make

    اکنون کتابخانه را در دایرکتوری که در BUILDROOT ایجاد کرده ایم نصب می کنیم:

    $ make install DESTDIR="$HOME/rpmbuild/BUILDROOT/zeromq-3.2.4-1.rhel6.x86_64"

    پارامتر DESTDIR همیشه در makefiles پردازش نمی شود. برای مثال، qmake فایل‌هایی را ایجاد می‌کند که این گزینه را نادیده می‌گیرند. اگر کتابخانه از یک سیستم ساخت غیر از ابزارهای خودکار گنو استفاده می کند، کتابچه راهنمای مربوطه را بخوانید تا ببینید چه پارامترهایی باید در طول ساخت برای نصب کتابخانه در فهرست مشخص شده ارسال شوند.

    فایل مشخصات برای ساخت بسته

    علاوه بر درخت فایل بایگانی شده، بسته های RPM اطلاعات فرااطلاعاتی را در مورد بسته ذخیره می کنند. هنگام ساخت، باید در فایل spec که در پوشه ~/rpmbuild/SPECS قرار دارد، مشخص شود. بیایید به نمونه فایل zmq.spec برای کتابخانه zeromq نگاه کنیم:

    نام: zeromq نسخه: 3.2.4 انتشار: 1.rhel6 خلاصه: کتابخانه نرم افزار برای برنامه های کاربردی سریع و مبتنی بر پیام بسته بندی: سازمان من گروه: محیط سیستم/کتابخانه ها مجوز: LGPLv3+ با استثنائات %شرح هسته پیام رسانی سبک 0MQ کتابخانه ای است که رابط های سوکت استاندارد را با ویژگی هایی که به طور سنتی توسط محصولات میان افزار پیام رسانی تخصصی ارائه می شود، گسترش می دهد. سوکت‌های 0MQ انتزاعی از صف‌های پیام ناهمزمان، الگوهای پیام‌رسانی متعدد، فیلتر کردن پیام (اشتراک‌ها)، دسترسی یکپارچه به پروتکل‌های انتقال چندگانه و موارد دیگر را ارائه می‌کنند. این بسته شامل کتابخانه مشترک ZeroMQ برای نسخه های 3.x است. %post /sbin/ldconfig %postun /sbin/ldconfig %files %defattr(-,root,root) /usr/lib64/libzmq.so.3 /usr/lib64/libzmq.so.3.0.0 % بسته توسعه خلاصه: فایل های توسعه برای گروه zeromq3: توسعه/کتابخانه ها مورد نیاز: %(name) = %(نسخه)-%(انتشار) %description devel بسته zeromq3-devel شامل کتابخانه ها و فایل های سرصفحه برای توسعه برنامه هایی است که از zeromq3 3.x استفاده می کنند. %defattr(-,root,root) /usr/include /usr/share /usr/lib64/pkgconfig /usr/lib64/libzmq.so /usr/lib64/libzmq.a /usr/lib64/libzmq.a/

    در ابتدای فایل، حداقل مجموعه ای از فیلدها با اطلاعات مربوط به بسته نشان داده شده است. از مقادیر سه فیلد اول ( نام, نسخه, رهایی) با نام بسته تشکیل می شود، بنابراین مهم است که مقادیر صحیح در آنجا مشخص شود. اگر مقادیر با نام دایرکتوری با درخت فایل بسته در حال ساخت مطابقت نداشته باشد، rpmbuild یک خطا ایجاد می کند. رشته مجوزهمچنین مورد نیاز است - بدون آن، rpmbuild از ساخت بسته خودداری می کند.

    هدف بخش ٪شرحبه طور مشخص. بخش ها ٪پستو %postunحاوی اسکریپت هایی است که به ترتیب پس از نصب فایل های بسته بر روی سیستم و پس از حذف فایل های بسته از سیستم اجرا می شوند. اگر بسته کتابخانه‌های پویا (.so) را در فهرست‌های غیراستاندارد نصب کند (یعنی نه /lib، /usr/lib، /lib64 یا /usr/lib64) مفید است. در این مورد، بسته باید یک فایل پیکربندی برای ldconfig ارائه کند و آن را در /etc/ld.so.conf.d نصب کند. تیم ldconfigکش لودر پویا را به روز می کند و تمام کتابخانه های موجود در فهرست های مشخص شده در فایل های پیکربندی را به آن اضافه می کند.

    در بخش ٪فایل هالیستی از فایل هایی را که در rpm بسته بندی شده اند را مشخص می کند. بخشنامه %defattrویژگی های فایل پیش فرض را در فرمت مشخص می کند:

    %defattr(, , ,

    )

    به عنوان مثال "644" برای rw-r--r-- مشخص شده است. صفت

    ممکن است حذف شود. به جای ویژگی هایی که نباید برای فایل های نصب شده تغییر کنند، می توانید یک خط فاصله تعیین کنید. دایرکتوری های مشخص شده در بخش ٪فایل ها، به همراه تمام محتویات آنها در بسته بندی قرار می گیرد.

    بعد جالب ترین قسمت می آید. در واقع دو نوع بسته RPM کتابخانه ای وجود دارد. برخی شامل خود فایل‌های کتابخانه پویا هستند که برای عملکرد برنامه‌هایی که با این کتابخانه‌ها مرتبط هستند ضروری هستند. به عنوان مثال، بسته zeromq-3.2.4-1.rhel6.x86_64.rpm تنها دو فایل را ارائه می دهد: /usr/lib64/libzmq.so.3.0.0 و یک پیوند نمادین به آن، /usr/lib64/libzmq.so .3. نوع دیگری از بسته حاوی فایل های مورد نیاز برای توسعه برنامه ها با استفاده از کتابخانه ارائه شده است. پسوند "-devel" به نام چنین بسته هایی اضافه می شود، به عنوان مثال zeromq-devel-3.2.4-1.el6.x86_64.rpm. این بسته‌ها معمولاً حاوی هدرهای C/C++، اسناد، کتابخانه‌های ثابت (.a) هستند و به بسته‌های نوع اول وابسته هستند.

    در فایل مشخصات بالا، دستورالعمل % بستهبه شما این امکان را می دهد که یک بسته "کودک" با یک اجرا rpmbuild بسازید. مقادیر فیلد سرصفحه بسته فرزند از والد به ارث می رسد، اما می توان آنها را نادیده گرفت. رشته نیاز داردیک وابستگی اضافی به بسته والد مشخص می کند. به آن بخش توجه کنید ٪فایل هابسته zeromq-devel حاوی فایل /usr/lib64/libzmq.so است. این یک پیوند نمادین به فایل واقعی کتابخانه پویا است. هنگام ساختن یک برنامه با استفاده از کتابخانه، توسط پیوند دهنده ld مورد نیاز است زیرا به دنبال فایل های کتابخانه پویا می گردد که با "lib" شروع شده و با ".so" ختم می شوند.

    مونتاژ

    قبل از مونتاژ دو نکته را باید در نظر داشت.
    ابتدا، اگر بسته با موفقیت ساخته شود، rpmbuild دایرکتوری BUILDROOT را پاک می کند. بنابراین، در هر صورت، یک نسخه پشتیبان از فایل های بسته بندی شده تهیه کنید.
    دوم: هرگز پکیج هایی با امتیازات روت نسازید. توضیح می دهد که چرا نمی توان این کار را انجام داد.

    اکنون همه چیز برای ساخت بسته آماده است. rpmbuild را اجرا کنید:

    $ cd ~/rpmbuild/SPECS $ rpmbuild -bb zmq.spec

    پارامتر -bb به معنای ساخت باینری است، یعنی یک بسته باینری بسازید. علاوه بر بسته های باینری، بسته های کد منبع نیز وجود دارد، اما در اینجا به آنها پرداخته نمی شود.

    در صورت موفقیت آمیز بودن، بسته rpm حاصل در پوشه RPMS ذخیره می شود.

    اگر نمی‌دانید در فیلدهای هدر فایل مشخصات برای کتابخانه در حال بسته‌بندی چه بنویسید، می‌توانید بسته RPM را برای توزیع دیگری از منابع بالا بگیرید و ببینید در آنجا چه می‌نویسند:

    $ دور در دقیقه -qip package.rpm

    در اینجا "q" به معنای "حالت پرس و جو"، "i" - دریافت اطلاعات در مورد بسته، "p" - دریافت اطلاعات در مورد فایل بسته مشخص شده (بدون این گزینه، اطلاعات بسته نصب شده بر روی سیستم در صورت نصب به دست می آید. ) .

    اگر نمی دانید کدام فایل به بسته توسعه و کدام به بسته کتابخانه تعلق دارد، اما هر دو بسته را برای توزیع دیگری دارید، می توانید درخت فایل های ارائه شده توسط این بسته را در دایرکتوری فعلی باز کنید:

    $ rpm2cpio package.rpm | cpio -di

    ابزار rpm2cpio آرشیو cpio ذخیره شده در بسته rpm را در خروجی استاندارد می نویسد. ابزار cpio یک بایگانی دریافت شده از ورودی استاندارد را باز می کند. پارامتر "i" حالت باز کردن بسته بندی را روشن می کند و "d" دایرکتوری های لازم را ایجاد می کند.

    با استفاده از گزینه "f" می توانید ببینید که یک بسته چه فایل هایی را بدون باز کردن بسته بندی ارائه می دهد:

    $ rpm -qfp package.rpm

    جمع

    با بسته بندی کتابخانه های استفاده شده در RPM، می توانید همکاران خود را از بارگیری منابع نسخه مورد نیاز کتابخانه در هر بار نجات دهید، آنها را از مشکلات در هنگام مونتاژ نجات دهید (اگر، برای مثال، نیاز به اعمال نوعی پچ در منابع کتابخانه دانلود شده) و به طور کلی فرآیند افزودن کتابخانه به پروژه را یکسان می کند. این مقاله تمام پیچیدگی‌های مونتاژ بسته‌ها و نوشتن فایل‌های مشخصات (مانند جداسازی فایل‌های پیکربندی، اسناد و غیره) را توضیح نمی‌دهد، اما برای مونتاژ بسته‌های کتابخانه، به طور کلی، این کار ضروری نیست.

    توجه!اقدامات مندرج در بندهای 1 و 4 این دستورالعمل با حقوق اداری (ریشه) انجام می شود!

    1. بسته های لازم برای فرآیند ساخت را نصب کنید

    # apt-get install rpm-build

    2. بسته src.rpm نرم افزار مورد نیاز که نیاز به مونتاژ دارد را نصب کنید

    بسته src.rpm نرم افزار مورد نیازی که می سازیم را پیدا کرده و دانلود می کنیم و آن را نصب می کنیم (از کاربر!):

    $ rpm -ipack_name_with_version.src.rpm

    در این حالت، منابع (کد منبع) بسته در ~/RPM/SOURCES و مشخصات در ~/RPM/SPECS قرار خواهند گرفت.
    در دسترس بودن کد منبع نرم افزار و مشخصات، به عنوان مثال. شرح فرآیند ساخت، شرط لازم و کافی برای ساخت یک بسته دور در دقیقه (یا بازسازی، به عنوان مثال، یک بسته از یک شاخه جدیدتر برای یک بسته قدیمی) است.

    3. مونتاژ بسته

    بیایید شروع به مونتاژ کنیم، این کار با دستور انجام می شود:

    $ rpm -ba --target (i586|x86_64) ~/RPM/SPECS/spec_name of the_required_package_for_build.spec

    در این مورد، بسته به معماری که پکیج برای آن ساخته شده است، باید براکت ها را گسترش داد.

    بسته های کامپایل شده در ~/RPM/RPMS قرار خواهند گرفت.

    توجه داشته باشید:

    می‌توانید بسته را بدون نصب (باز کردن بسته‌بندی) به این شکل بازسازی کنید:

    $ rpmbuild --rebuild --target (i586/x86_64)package_name_with_version.src.rpm

    در این مورد، بسته به معماری که پکیج برای آن ساخته شده است، براکت ها نیز ضروری است.

    توجه داشته باشید:در مورد پردازنده‌هایی که به خانواده x86_64 تعلق ندارند، علامت «--target i586» اختیاری است (بیلد بدون آن کار می‌کند، اما کامپایلر بسته‌ای را دقیقاً متناسب با نوع پردازنده شما می‌سازد و نام بسته نیز می‌سازد. با نام بسته های برانچ متفاوت است، به عنوان مثال، xxx.athlon.rpm یا xxx.pentium4.rpm). عدم وجود پارامتر "--target i586" در هنگام مونتاژ به هیچ وجه تضمین نمی کند که بسته کامپایل شده به این روش می تواند روی رایانه دیگری با پردازنده متفاوت نصب شود. اگر مونتاژ تحت یک سیستم 64 بیتی (در یک پردازنده 64 بیتی با سیستم 64 بیتی نصب شده) انجام شود، کلید "--target x86_64" معنای خود را از دست می دهد و اصلاً نیازی به تنظیم آن نیست.

    توجه داشته باشید:اگر دور در دقیقهاز ماکروهای یافت نشد مانند این شکایت می کند: «خطا: ماکرو %groupadd یافت نشد» یا «خطا: ماکرو %مجوز پیدا نشد»، سپس نصب یکی از بسته‌های rpm-build-* در سیستم می‌تواند کمک بیشتری کند. اسمبلی پکیج که در واقع یک وابستگی اضافی برای ساختن (بازسازی) پکیج شماست و مسئول تخصیص مقادیر مورد نیاز به این ماکروهای بسیار ناپیدا است.

    4. نصب وابستگی های اسمبلی

    اگر بسته srpm دارید که برای ساخت آن نیاز به نصب وابستگی دارید، می توانید با اجرای دستور زیر این کار را انجام دهید:

    # apt-get build-dep package_name_version.src.rpm

    اگر بسته srpm وجود نداشته باشد و مشخصات و کد منبع جداگانه وجود داشته باشد، تقریباً 100٪ از ساخت بلافاصله کار نخواهد کرد - در همان ابتدای خروجی، کنسول بسته هایی را نشان می دهد که باید قبل از نصب روی سیستم نصب شوند. ساخت می تواند بیشتر پیش برود. شما آنها را نصب می کنید (این وابستگی های اسمبلی در کنسول نمایش داده می شوند)

    # apt-get install package1 package2 package3 ...

    و سپس مونتاژ را تکرار کنید (به مرحله 3 برگردید).

    5. جستجوی خودکار برای وابستگی ها برای یک بسته جدید

    اگر در حال ساخت یک بسته جدید هستید، و یک srpm موجود را بازسازی نمی کنید، این ابزار به خوبی در طراحی (جستجو و ثبت) وابستگی های لازم در مشخصات به شما کمک خواهد کرد. buildreqاز بسته rpm-utils:

    $ buildreq spec_file_name.spec