From e1345b76c04b5a829b7219c12772bec1fb301850 Mon Sep 17 00:00:00 2001 From: Mark Hatle Date: Tue, 11 Dec 2012 08:09:40 -0600 Subject: rpm/smart: Fix runtime-relocation issues w/ RPM and Smart Fix runtime-relocation issues with the RPM and Smart wrappers. In addition the patches were necessary to fix related problems. The changes to the includes three categories of issues: *) Incorrect pathname evaluations *) Incorrect evaluation of the /etc/rpm/platform file contents *) Confusing vendor #define checks Finally, a simple way to debug the platformScore was added as that is necessary to debug how this works and into the smart system. (From OE-Core rev: 355a621caca66ed393d36fff6be8918921cf45ae) Signed-off-by: Mark Hatle Signed-off-by: Saul Wold Signed-off-by: Richard Purdie --- .../python/python-smartpm_1.4.1.bb | 17 ++++- .../rpm/rpm/rpm-debug-platform.patch | 65 ++++++++++++++++ meta/recipes-devtools/rpm/rpm/rpm-platform.patch | 2 +- meta/recipes-devtools/rpm/rpm/rpm-platform2.patch | 87 +++++++++++++++++----- meta/recipes-devtools/rpm/rpm_5.4.9.bb | 41 +++++----- 5 files changed, 173 insertions(+), 39 deletions(-) create mode 100644 meta/recipes-devtools/rpm/rpm/rpm-debug-platform.patch diff --git a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb index 53f232bfab..04f61f8999 100644 --- a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb +++ b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb @@ -11,7 +11,7 @@ LICENSE = "GPLv2" LIC_FILES_CHKSUM = "file://LICENSE;md5=393a5ca445f6965873eca0259a17f833" DEPENDS = "python rpm" -PR = "r4" +PR = "r5" SRCNAME = "smart" SRC_URI = "\ @@ -87,6 +87,21 @@ do_install_append() { fi } +add_native_wrapper() { + create_wrapper ${D}/${bindir}/smart \ + RPM_USRLIBRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('libdir', True), d.getVar('bindir', True))}/rpm \ + RPM_ETCRPM='$'{RPM_ETCRPM-'`dirname $''realpath`'/${@os.path.relpath(d.getVar('sysconfdir', True), d.getVar('bindir', True))}/rpm} \ + RPM_LOCALEDIRRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('datadir', True), d.getVar('bindir', True))}/locale +} + +do_install_append_class-native() { + add_native_wrapper +} + +do_install_append_class-nativesdk() { + add_native_wrapper +} + PACKAGES = "${PN}-dev ${PN}-dbg ${PN}-doc smartpm \ ${@base_contains('PACKAGECONFIG', 'rpm', '${PN}-backend-rpm', '', d)} \ ${@base_contains('PACKAGECONFIG', 'qt4', '${PN}-interface-qt4', '', d)} \ diff --git a/meta/recipes-devtools/rpm/rpm/rpm-debug-platform.patch b/meta/recipes-devtools/rpm/rpm/rpm-debug-platform.patch new file mode 100644 index 0000000000..25ebbdcbed --- /dev/null +++ b/meta/recipes-devtools/rpm/rpm/rpm-debug-platform.patch @@ -0,0 +1,65 @@ +Debug the platform score generation... + +Index: rpm-5.4.9/lib/rpmrc.c +=================================================================== +--- rpm-5.4.9.orig/lib/rpmrc.c ++++ rpm-5.4.9/lib/rpmrc.c +@@ -465,6 +465,8 @@ static rpmRC rpmPlatform(const char * pl + + rc = (rpmRC) rpmiobSlurp(platform, &iob); + ++ fprintf(stderr, "D: rpmPlatform file %s\n", platform); ++ + if (rc || iob == NULL) { + rc = RPMRC_FAIL; + goto exit; +@@ -486,6 +488,7 @@ static rpmRC rpmPlatform(const char * pl + while (--t > p && xisspace(*t)) + *t = '\0'; + if (t > p) { ++ fprintf(stderr, "D: rpmPlatform mireAppend REGEX %s\n", p); + xx = mireAppend(RPMMIRE_REGEX, 0, p, NULL, &mi_re, &mi_nre); + } + continue; +@@ -503,6 +506,11 @@ static rpmRC rpmPlatform(const char * pl + _gnu = rpmExpand("-", cvog->gnu, NULL); + + addMacro(NULL, "_platform_gnu", NULL, (_gnu ? _gnu : ""), -1); ++ fprintf(stderr, "D: rpmPlatform addMacro %s-%s-%s(%s)\n", ++ rpmExpand("%{_platform_cpu}", NULL), ++ rpmExpand("%{_platform_vendor}", NULL), ++ rpmExpand("%{_platform_os}", NULL), ++ rpmExpand("%{_platform_gnu}", NULL)); + #else + addMacro(NULL, "_host_cpu", NULL, cvog->cpu, -1); + addMacro(NULL, "_host_vendor", NULL, cvog->vendor, -1); +@@ -510,6 +518,7 @@ static rpmRC rpmPlatform(const char * pl + #endif + } + ++ fprintf(stderr, "D: rpmPlatform mireAppend STRCMP %s -- ", p); + #if defined(RPM_VENDOR_OPENPKG) /* explicit-platform */ + /* do not use vendor and GNU attribution */ + p = rpmExpand("%{_host_cpu}-%{_host_os}", NULL); +@@ -518,6 +527,7 @@ static rpmRC rpmPlatform(const char * pl + (cvog && *cvog->gnu ? "-" : NULL), + (cvog ? cvog->gnu : NULL), NULL); + #endif ++ fprintf(stderr, "%s\n", p); + xx = mireAppend(RPMMIRE_STRCMP, 0, p, NULL, &mi_re, &mi_nre); + p = _free(p); + +@@ -686,9 +696,12 @@ int rpmPlatformScore(const char * platfo + + if ((mire = (miRE) mi_re) != NULL) + for (i = 0; i < mi_nre; i++) { +- if (mireRegexec(mire + i, platform, 0) >= 0) ++ if (mireRegexec(mire + i, platform, 0) >= 0) { ++ fprintf(stderr, "D: rpmPlatformScore %s (%d)\n", platform, i + 1); + return (i + 1); ++ } + } ++ fprintf(stderr, "D: rpmPlatformScore %s (%d)\n", platform, 0); + return 0; + } + /*@=onlytrans@*/ diff --git a/meta/recipes-devtools/rpm/rpm/rpm-platform.patch b/meta/recipes-devtools/rpm/rpm/rpm-platform.patch index 7b81857837..9e167d82f3 100644 --- a/meta/recipes-devtools/rpm/rpm/rpm-platform.patch +++ b/meta/recipes-devtools/rpm/rpm/rpm-platform.patch @@ -40,7 +40,7 @@ diff -ur rpm-5.4.0.orig/lib/depends.c rpm-5.4.0/lib/depends.c return rc; } -+#if defined(RPM_VENDOR_WINDRIVER) ++#if defined(RPM_VENDOR_WINDRIVER) || defined(RPM_VENDOR_POKY) +#define _ETC_RPM_SYSINFO "%{_etcrpm}/sysinfo" +#else +#define _ETC_RPM_SYSINFO SYSCONFIGDIR "/sysinfo" diff --git a/meta/recipes-devtools/rpm/rpm/rpm-platform2.patch b/meta/recipes-devtools/rpm/rpm/rpm-platform2.patch index 3d50e46c11..6683d8fdbf 100644 --- a/meta/recipes-devtools/rpm/rpm/rpm-platform2.patch +++ b/meta/recipes-devtools/rpm/rpm/rpm-platform2.patch @@ -3,10 +3,13 @@ Fix up platform and related sysinfo file loading (part 2). Upstream-Status: Pending We need to ensure that we set the _gnu flag somehow. We do this by reading -from the platform file, and setting a new platform_gnu and related vars. +from the platform file, and setting a new _platform_gnu and related vars. -We then check for the existance of these things and change the configure -time defaults to the run-time values as necessary. +The default values of _host_cpu, _host_vendor and _host_os are changed to +reference either the automatically determined _target_... or _platform_... +values. The macros file uses the configure time defaults in _platform_... +versions have not been defined. This preserves existing behavior, but +ensures reasonable defaults are always available. Signed-off-by: Mark Hatle @@ -14,17 +17,43 @@ Index: rpm-5.4.9/lib/rpmrc.c =================================================================== --- rpm-5.4.9.orig/lib/rpmrc.c +++ rpm-5.4.9/lib/rpmrc.c -@@ -487,9 +487,10 @@ static rpmRC rpmPlatform(const char * pl +@@ -328,10 +328,15 @@ static void setDefaults(void) + /*@modifies rpmGlobalMacroContext, internalState @*/ + { + +-#if defined(RPM_VENDOR_WINDRIVER) ++#if defined(RPM_VENDOR_WINDRIVER) || defined(RPM_VENDOR_POKY) + addMacro(NULL, "_usrlibrpm", NULL, __usrlibrpm, RMIL_DEFAULT); + addMacro(NULL, "_etcrpm", NULL, __etcrpm, RMIL_DEFAULT); + addMacro(NULL, "_vendor", NULL, "%{?_host_vendor}%{!?_host_vendor:wrs}", RMIL_DEFAULT); ++ ++ addMacro(NULL, "_host_cpu", NULL, "%{?_platform_cpu}%{!?_platform_cpu:%{?_target_cpu}}", RMIL_DEFAULT); ++ addMacro(NULL, "_host_vendor", NULL, "%{?_platform_vendor}%{!?_platform_cpu:%{?_target_vendor}}", RMIL_DEFAULT); ++ addMacro(NULL, "_host_os", NULL, "%{?_platform_os}%{!?_platform_os:%{?_target_os}}", RMIL_DEFAULT); ++ addMacro(NULL, "_host_gnu", NULL, "%{?_platform_gnu}%{!?_platform_gnu:%{?_gnu}}", RMIL_DEFAULT); + #endif + + addMacro(NULL, "_usr", NULL, USRPREFIX, RMIL_DEFAULT); +@@ -487,9 +492,22 @@ static rpmRC rpmPlatform(const char * pl } if (!parseCVOG(p, &cvog) && cvog != NULL) { -- addMacro(NULL, "_host_cpu", NULL, cvog->cpu, -1); -- addMacro(NULL, "_host_vendor", NULL, cvog->vendor, -1); -- addMacro(NULL, "_host_os", NULL, cvog->os, -1); ++#if defined(RPM_VENDOR_POKY) ++ char * _gnu = NULL; ++ + addMacro(NULL, "_platform_cpu", NULL, cvog->cpu, -1); + addMacro(NULL, "_platform_vendor", NULL, cvog->vendor, -1); + addMacro(NULL, "_platform_os", NULL, cvog->os, -1); -+ addMacro(NULL, "_platform_gnu", NULL, cvog->gnu, -1); ++ ++ if (cvog->gnu && cvog->gnu[0] != '\0') ++ _gnu = rpmExpand("-", cvog->gnu, NULL); ++ ++ addMacro(NULL, "_platform_gnu", NULL, (_gnu ? _gnu : ""), -1); ++#else + addMacro(NULL, "_host_cpu", NULL, cvog->cpu, -1); + addMacro(NULL, "_host_vendor", NULL, cvog->vendor, -1); + addMacro(NULL, "_host_os", NULL, cvog->os, -1); ++#endif } #if defined(RPM_VENDOR_OPENPKG) /* explicit-platform */ @@ -32,25 +61,45 @@ Index: rpm-5.4.9/macros/macros.in =================================================================== --- rpm-5.4.9.orig/macros/macros.in +++ rpm-5.4.9/macros/macros.in -@@ -873,7 +873,7 @@ $_arbitrary_tags_tests Foo:Bar - %_build_arch @RPMCANONARCH@ - %_vendor @RPMCANONVENDOR@ +@@ -875,9 +875,9 @@ $_arbitrary_tags_tests Foo:Bar %_os @RPMCANONOS@ --%_gnu @RPMCANONGNU@ -+%_gnu %{?_platform_gnu:-%{_platform_gnu}}%{!?_platform_gnu:@RPMCANONGNU@} + %_gnu @RPMCANONGNU@ + +-%_host_platform %{_host_cpu}-%{_host_vendor}-%{_host_os}%{?_gnu} +-%_build_platform %{_build_cpu}-%{_build_vendor}-%{_build_os}%{?_gnu} +-%_target_platform %{_target_cpu}-%{_target_vendor}-%{_target_os}%{?_gnu} ++%_host_platform %{_host_cpu}-%{_host_vendor}-%{_host_os}%{?_host_gnu}%{!?_host_gnu:%{?_gnu}} ++%_build_platform %{_build_cpu}-%{_build_vendor}-%{_build_os}%{?_host_gnu}%{!?_host_gnu:%{?_gnu}} ++%_target_platform %{_target_cpu}-%{_target_vendor}-%{_target_os}%{?_host_gnu}%{!?_host_gnu:%{?_gnu}} - %_host_platform %{_host_cpu}-%{_host_vendor}-%{_host_os}%{?_gnu} - %_build_platform %{_build_cpu}-%{_build_vendor}-%{_build_os}%{?_gnu} -@@ -920,9 +920,9 @@ $_arbitrary_tags_tests Foo:Bar + #============================================================================== + # ---- configure macros. +@@ -920,9 +920,10 @@ $_arbitrary_tags_tests Foo:Bar %_build_os %{_host_os} %_host @host@ %_host_alias @host_alias@%{nil} -%_host_cpu @host_cpu@ -%_host_vendor @host_vendor@ -%_host_os @host_os@ -+%_host_cpu %{?_platform_cpu}%{!?_platform_cpu:@host_cpu@} -+%_host_vendor %{?_platform_vendor}%{!?_platform_vendor:@host_vendor@} -+%_host_os %{?_platform_os}%{!?_platform_os:@host_os@} ++%_host_cpu %{?_platform_cpu}%{!?_platform_cpu:%{_arch}} ++%_host_vendor %{?_platform_vendor}%{!?_platform_vendor:%{_vendor}} ++%_host_os %{?_platform_os}%{!?_platform_os:%{_os}} ++%_host_gnu %{?_platform_gnu}%{!?_platform_gnu:%{_gnu}} %_target %{_host} %_target_alias %{_host_alias} %_target_cpu %{_host_cpu} +Index: rpm-5.4.9/python/rpmmodule.c +=================================================================== +--- rpm-5.4.9.orig/python/rpmmodule.c ++++ rpm-5.4.9/python/rpmmodule.c +@@ -65,8 +65,8 @@ static PyObject * archScore(PyObject * s + if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &arch)) + return NULL; + +-#if defined(RPM_VENDOR_WINDRIVER) +- platform = rpmExpand(arch, "-%{_host_vendor}", "-%{_host_os}%{?_gnu}", NULL); ++#if defined(RPM_VENDOR_WINDRIVER) || defined(RPM_VENDOR_POKY) ++ platform = rpmExpand(arch, "-%{_host_vendor}", "-%{_host_os}%{?_host_gnu}%{!?_host_gnu:%{?_gnu}}", NULL); + #else + platform = rpmExpand(arch, "-", "%{_vendor}", "-", "%{_os}", NULL); + #endif diff --git a/meta/recipes-devtools/rpm/rpm_5.4.9.bb b/meta/recipes-devtools/rpm/rpm_5.4.9.bb index 7311d0e015..be76f2470a 100644 --- a/meta/recipes-devtools/rpm/rpm_5.4.9.bb +++ b/meta/recipes-devtools/rpm/rpm_5.4.9.bb @@ -43,7 +43,7 @@ LICENSE = "LGPLv2.1" LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=2d5025d4aa3495befef8f17206a5b0a1" DEPENDS = "libpcre attr acl popt ossp-uuid file bison-native" -PR = "r58" +PR = "r59" # rpm2cpio is a shell script, which is part of the rpm src.rpm. It is needed # in order to extract the distribution SRPM into a format we can extract... @@ -86,6 +86,11 @@ SRC_URI = "http://www.rpm5.org/files/rpm/rpm-5.4/rpm-5.4.9-0.20120508.src.rpm;ex file://rpm-platform2.patch \ " +# Uncomment the following line to enable platform score debugging +# This is useful when identifying issues with Smart being unable +# to process certain package feeds. +#SRC_URI += "file://rpm-debug-platform.patch" + SRC_URI[md5sum] = "60d56ace884340c1b3fcac6a1d58e768" SRC_URI[sha256sum] = "bac7cc5bd9d0e8262fdc0099349924608da8f680f5cb243751f696552239dde8" @@ -150,7 +155,7 @@ PACKAGECONFIG[tcl] = "--with-tcl,--without-tcl,tcl," PACAKGECONFIG[augeas] = "--with-augeas,--without-augeas,augeas," EXTRA_OECONF += "--verbose \ - --sysconfdir=/etc \ + --sysconfdir=${sysconfdir} \ --with-file \ --with-path-magic=%{_usrlibrpm}/../../share/misc/magic.mgc \ --with-syck=internal \ @@ -226,7 +231,7 @@ FILES_${PN}-dbg += "${libdir}/rpm/.debug \ FILES_${PN}-common = "${bindir}/rpm2cpio \ ${bindir}/gendiff \ - /etc/rpm \ + ${sysconfdir}/rpm \ /var/spool/repackage \ " @@ -444,30 +449,30 @@ do_install_append() { do_install_append_class-native() { create_wrapper ${D}/${bindir}/rpm \ - RPM_USRLIBRPM=${STAGING_LIBDIR_NATIVE}/rpm \ - RPM_ETCRPM=${STAGING_ETCDIR_NATIVE}/rpm \ - RPM_LOCALEDIRRPM=${STAGING_DATADIR_NATIVE}/locale + RPM_USRLIBRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('libdir', True), d.getVar('bindir', True))}/rpm \ + RPM_ETCRPM='$'{RPM_ETCRPM-'`dirname $''realpath`'/${@os.path.relpath(d.getVar('sysconfdir', True), d.getVar('bindir', True))}/rpm} \ + RPM_LOCALEDIRRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('datadir', True), d.getVar('bindir', True))}/locale create_wrapper ${D}/${bindir}/rpm2cpio \ - RPM_USRLIBRPM=${STAGING_LIBDIR_NATIVE}/rpm \ - RPM_ETCRPM=${STAGING_ETCDIR_NATIVE}/rpm \ - RPM_LOCALEDIRRPM=${STAGING_DATADIR_NATIVE}/locale + RPM_USRLIBRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('libdir', True), d.getVar('bindir', True))}/rpm \ + RPM_ETCRPM='$'{RPM_ETCRPM-'`dirname $''realpath`'/${@os.path.relpath(d.getVar('sysconfdir', True), d.getVar('bindir', True))}/rpm} \ + RPM_LOCALEDIRRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('datadir', True), d.getVar('bindir', True))}/locale create_wrapper ${D}/${bindir}/rpmbuild \ - RPM_USRLIBRPM=${STAGING_LIBDIR_NATIVE}/rpm \ - RPM_ETCRPM=${STAGING_ETCDIR_NATIVE}/rpm \ - RPM_LOCALEDIRRPM=${STAGING_DATADIR_NATIVE}/locale + RPM_USRLIBRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('libdir', True), d.getVar('bindir', True))}/rpm \ + RPM_ETCRPM='$'{RPM_ETCRPM-'`dirname $''realpath`'/${@os.path.relpath(d.getVar('sysconfdir', True), d.getVar('bindir', True))}/rpm} \ + RPM_LOCALEDIRRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('datadir', True), d.getVar('bindir', True))}/locale create_wrapper ${D}/${bindir}/rpmconstant \ - RPM_USRLIBRPM=${STAGING_LIBDIR_NATIVE}/rpm \ - RPM_ETCRPM=${STAGING_ETCDIR_NATIVE}/rpm \ - RPM_LOCALEDIRRPM=${STAGING_DATADIR_NATIVE}/locale + RPM_USRLIBRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('libdir', True), d.getVar('bindir', True))}/rpm \ + RPM_ETCRPM='$'{RPM_ETCRPM-'`dirname $''realpath`'/${@os.path.relpath(d.getVar('sysconfdir', True), d.getVar('bindir', True))}/rpm} \ + RPM_LOCALEDIRRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('datadir', True), d.getVar('bindir', True))}/locale for rpm_binary in ${D}/${libdir}/rpm/bin/rpm*; do create_wrapper $rpm_binary - RPM_USRLIBRPM=${STAGING_LIBDIR_NATIVE}/rpm \ - RPM_ETCRPM=${STAGING_ETCDIR_NATIVE}/rpm \ - RPM_LOCALEDIRRPM=${STAGING_DATADIR_NATIVE}/locale + RPM_USRLIBRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('libdir', True), d.getVar('bindir', True))}/rpm \ + RPM_ETCRPM='$'{RPM_ETCRPM-'`dirname $''realpath`'/${@os.path.relpath(d.getVar('sysconfdir', True), d.getVar('bindir', True))}/rpm} \ + RPM_LOCALEDIRRPM='`dirname $''realpath`'/${@os.path.relpath(d.getVar('datadir', True), d.getVar('bindir', True))}/locale done # Adjust popt macros to match... -- cgit v1.2.3-54-g00ecf