[devel] RPM и архитектура бинарных пакетов
Victor Forsyuk
=?iso-8859-1?q?victor_=CE=C1_ksi-linux=2Ecom?=
Пт Окт 24 22:25:40 MSD 2003
On Tue, Oct 21, 2003 at 09:39:49PM +0400, Dmitry V. Levin wrote:
> > "Why all features of RPM should be used in Red Hat's build process?" - этот
> > Витин вопрос остался без ответа. Никто ведь не принуждает РедХет
> > пользоваться фичей, поддержку которой их попросили включить в rpm.
>
> На самом деле один аргумент всё-таки был приведён:
> Эта возможность создаёт риск создания большего количества
> труднообнаруживаемых не_совсем_noarch-пакетов, чем оно есть сейчас.
>
> Впрочем, всякой возможностью можно злоупотребить.
Именно! Наличие ножа в доме создает риск порезаться (если им пользоваться
неосторожно). Но не не совсем понятен аргумент убрать все ножи из дома:
боишься ножа - не пользуйся им :)
> > > 2. Написанный Виктором код уже есть и его можно использовать как затравку
> > > для создания кода, который позволит, например, с дополнительным ключем не
> > > упаковывать подпакеты с выбранной архитектурой, отличной от собираемой --
> > > это позволит легко решить проблему RH(1).
>
> Как говорит Andrew Morgan, "Show me the code".
See attach.
> > p.s. [вполголоса] А вот если бы еще возможность прерывать сборку при наличии
> > в buildroot пропущенных в %files файлов... ;-)
> > Я был бы тогда в два раза счастливее - как кот Матроскин :)
>
> Это вопрос времени.
[мечтательно] Вот бы быстрее это время наступило. :)
> У меня, в принципе, есть патч к rpm-4_0_branch.
----------- следующая часть -----------
diff -urN rpm-4.0.3.orig/build/pack.c rpm-4.0.3/build/pack.c
--- rpm-4.0.3.orig/build/pack.c Tue Apr 17 22:26:32 2001
+++ rpm-4.0.3/build/pack.c Sun Jun 17 18:14:31 2001
@@ -443,8 +443,20 @@
if (Fileno(csa->cpioFdIn) < 0) {
#ifndef DYING
+ if (headerIsEntry(h, RPMTAG_ARCH)) {
+ char *_arch;
+ headerGetEntry(h, RPMTAG_ARCH, NULL, (void **)&_arch, NULL);
+ rpmGetArchNum(_arch, &archnum);
+ } else {
rpmGetArchInfo(NULL, &archnum);
+ }
+ if (headerIsEntry(h, RPMTAG_OS)) {
+ char *_os;
+ headerGetEntry(h, RPMTAG_OS, NULL, (void **)&_os, NULL);
+ rpmGetOsNum(_os, &osnum);
+ } else {
rpmGetOsInfo(NULL, &osnum);
+ }
#endif
} else if (csa->lead != NULL) {
archnum = csa->lead->archnum;
diff -urN rpm-3.0.4.orig/build/parsePreamble.c rpm-3.0.4/build/parsePreamble.c
--- rpm-3.0.4.orig/build/parsePreamble.c Tue Aug 24 17:09:22 1999
+++ rpm-3.0.4/build/parsePreamble.c Thu Sep 30 20:11:20 1999
@@ -140,6 +140,7 @@
{
const char *arch = NULL;
const char *os = NULL;
+ Package pkg;
rpmGetArchInfo(&arch, NULL);
rpmGetOsInfo(&os, NULL);
@@ -154,6 +155,23 @@
rpmError(RPMERR_BADSPEC, _("Architecture is not included: %s"), arch);
return RPMERR_BADSPEC;
}
+ pkg = spec->packages;
+ while (pkg) {
+ if (headerIsEntry(pkg->header, RPMTAG_ARCH)) {
+ headerGetEntry(pkg->header, RPMTAG_ARCH, NULL, (void **)&arch, NULL);
+ if (isMemberInEntry(spec->buildRestrictions,
+ arch, RPMTAG_EXCLUDEARCH) == 1) {
+ rpmError(RPMERR_BADSPEC, _("Architecture is excluded: %s"), arch);
+ return RPMERR_BADSPEC;
+ }
+ if (isMemberInEntry(spec->buildRestrictions,
+ arch, RPMTAG_EXCLUSIVEARCH) == 0) {
+ rpmError(RPMERR_BADSPEC, _("Architecture is not included: %s"), arch);
+ return RPMERR_BADSPEC;
+ }
+ }
+ pkg = pkg->next;
+ }
if (isMemberInEntry(spec->buildRestrictions,
os, RPMTAG_EXCLUDEOS) == 1) {
rpmError(RPMERR_BADSPEC, _("OS is excluded: %s"), os);
@@ -164,6 +182,23 @@
rpmError(RPMERR_BADSPEC, _("OS is not included: %s"), os);
return RPMERR_BADSPEC;
}
+ pkg = spec->packages;
+ while (pkg) {
+ if (headerIsEntry(pkg->header, RPMTAG_OS)) {
+ headerGetEntry(pkg->header, RPMTAG_OS, NULL, (void **)&os, NULL);
+ if (isMemberInEntry(spec->buildRestrictions,
+ os, RPMTAG_EXCLUDEOS) == 1) {
+ rpmError(RPMERR_BADSPEC, _("OS is excluded: %s"), os);
+ return RPMERR_BADSPEC;
+ }
+ if (isMemberInEntry(spec->buildRestrictions,
+ os, RPMTAG_EXCLUSIVEOS) == 0) {
+ rpmError(RPMERR_BADSPEC, _("OS is not included: %s"), os);
+ return RPMERR_BADSPEC;
+ }
+ }
+ pkg = pkg->next;
+ }
return 0;
}
@@ -367,6 +402,8 @@
case RPMTAG_NAME:
case RPMTAG_VERSION:
case RPMTAG_RELEASE:
+ case RPMTAG_ARCH:
+ case RPMTAG_OS:
case RPMTAG_URL:
SINGLE_TOKEN_ONLY;
/* These macros are for backward compatibility */
@@ -611,7 +648,9 @@
{RPMTAG_AUTOREQPROV, 0, 0, "autoreqprov"},
{RPMTAG_AUTOREQ, 0, 0, "autoreq"},
{RPMTAG_AUTOPROV, 0, 0, "autoprov"},
- {RPMTAG_DOCDIR, 0, 0, "docdir"},
+ {RPMTAG_DOCDIR, 0, 0, "docdir"},
+ {RPMTAG_ARCH, 0, 0, "targetarch"},
+ {RPMTAG_OS, 0, 0, "targetos"},
{0, 0, 0, 0}
};
diff -urN rpm-3.0.3.orig/build/parseSpec.c rpm-3.0.3/build/parseSpec.c
--- rpm-3.0.3.orig/build/parseSpec.c Mon Sep 6 23:51:54 1999
+++ rpm-3.0.3/build/parseSpec.c Thu Sep 30 20:11:20 1999
@@ -496,8 +496,10 @@
return RPMERR_BADSPEC;
}
- headerAddEntry(pkg->header, RPMTAG_OS, RPM_STRING_TYPE, os, 1);
- headerAddEntry(pkg->header, RPMTAG_ARCH, RPM_STRING_TYPE, arch, 1);
+ if (!headerIsEntry(pkg->header, RPMTAG_OS))
+ headerAddEntry(pkg->header, RPMTAG_OS, RPM_STRING_TYPE, os, 1);
+ if (!headerIsEntry(pkg->header, RPMTAG_ARCH))
+ headerAddEntry(pkg->header, RPMTAG_ARCH, RPM_STRING_TYPE, arch, 1);
}
FREE(myos);
}
diff -urN rpm-4.0.3.orig/lib/rpmlib.h rpm-4.0.3/lib/rpmlib.h
--- rpm-4.0.3.orig/lib/rpmlib.h Thu Apr 19 18:11:00 2001
+++ rpm-4.0.3/lib/rpmlib.h Sun Jun 17 18:08:16 2001
@@ -475,6 +475,7 @@
* @retval num address of arch number (or NULL)
*/
void rpmGetArchInfo( /*@out@*/ const char ** name, /*@out@*/ int * num);
+void rpmGetArchNum(char * name, int * num);
/** \ingroup rpmrc
* Return current os name and/or number.
@@ -483,6 +484,7 @@
* @retval num address of os number (or NULL)
*/
void rpmGetOsInfo( /*@out@*/ const char ** name, /*@out@*/ int * num);
+void rpmGetOsNum(char * name, int * num);
/** \ingroup rpmrc
* Return arch/os score of a name.
diff -urN rpm-3.0.3.orig/lib/rpmrc.c rpm-3.0.3/lib/rpmrc.c
--- rpm-3.0.3.orig/lib/rpmrc.c Mon Aug 16 19:05:03 1999
+++ rpm-3.0.3/lib/rpmrc.c Thu Sep 30 20:11:20 1999
@@ -1136,6 +1136,38 @@
getMachineInfo(OS, name, num);
}
+static void getNum(int type, char * name, int * num) {
+ struct canonEntry * canon;
+ int which = currTables[type];
+
+ /* use the normal canon tables, even if we're looking up build stuff */
+ if (which >= 2) which -= 2;
+
+ canon = lookupInCanonTable(name,
+ tables[which].canons,
+ tables[which].canonsLength);
+
+ if (canon) {
+ if (num) *num = canon->num;
+ } else {
+ if (num) *num = 255;
+
+ if (tables[currTables[type]].hasCanon) {
+ rpmMessage(RPMMESS_WARNING, _("Unknown system: %s\n"), name);
+/* rpmMessage(RPMMESS_WARNING, _("Please contact rpm-list на redhat.com\n"));*/
+ }
+ }
+}
+
+void rpmGetArchNum(char * name, int * num) {
+ getNum(ARCH, name, num);
+}
+
+void rpmGetOsNum(char * name, int * num) {
+ getNum(OS, name, num);
+}
+
+
void rpmRebuildTargetVars(const char **buildtarget, const char ** canontarget)
{
Подробная информация о списке рассылки Devel