* [PATCH 1/3] package_rpm: add architecture info in rpm spec file
2011-09-14 6:08 [PATCH 0/3][RFC v2] rpm: multilib related fixes Dongxiao Xu
@ 2011-09-14 6:08 ` Dongxiao Xu
2011-09-14 14:37 ` Mark Hatle
2011-09-14 6:08 ` [PATCH 2/3] rootfs_rpm: Use specific MACHINE_ARCH for multilib recipes Dongxiao Xu
2011-09-14 6:08 ` [PATCH 3/3] multilib: install MULTILIB_IMAGE_INSTALL Dongxiao Xu
2 siblings, 1 reply; 6+ messages in thread
From: Dongxiao Xu @ 2011-09-14 6:08 UTC (permalink / raw)
To: openembedded-core
For supporting multilib, architecture information is needed in package
require/provide/suggest/recommend fields.
Use DEFAULTTUNE value as the postfix.
For "all" arch recipe, it requires "all" arch recipe with no postfix,
but provides all possible multilib archs.
For example, qemu-config:
Requires: rsync
Requires: update-rc.d
Requires: task-core-nfs-server
Requires: distcc
Requires: oprofileui-server
Requires: dbus-x11
Requires: bash
Provides: qemu-config.x86
Provides: qemu-config.x86-64
For other recipe like zlib:
Requires: libc6.x86-64 >= 2.13
Provides: zlib.x86-64
[YOCTO #1457]
Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
---
meta/classes/multilib.bbclass | 1 +
meta/classes/package_rpm.bbclass | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/meta/classes/multilib.bbclass b/meta/classes/multilib.bbclass
index 583d76b..76c86b2 100644
--- a/meta/classes/multilib.bbclass
+++ b/meta/classes/multilib.bbclass
@@ -23,6 +23,7 @@ python multilib_virtclass_handler () {
e.data.setVar("PN", variant + "-" + e.data.getVar("PN", False))
e.data.setVar("SHLIBSDIR_virtclass-multilib-" + variant ,e.data.getVar("SHLIBSDIR", False) + "/" + variant)
e.data.setVar("TARGET_VENDOR_virtclass-multilib-" + variant, e.data.getVar("TARGET_VENDOR", False) + "ml" + variant)
+ e.data.setVar("SAVED_DEFAULTTUNE", e.data.getVar("DEFAULTTUNE", True))
e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override)
}
diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
index 9ef1acd..ea0a079 100644
--- a/meta/classes/package_rpm.bbclass
+++ b/meta/classes/package_rpm.bbclass
@@ -350,6 +350,7 @@ package_install_internal_rpm () {
python write_specfile () {
import textwrap
import oe.packagedata
+ import re
# We need a simple way to remove the MLPREFIX from the package name,
# and dependency information...
@@ -498,6 +499,8 @@ python write_specfile () {
splitname = strip_multilib(pkgname, d)
+ defaulttune = bb.data.getVar('DEFAULTTUNE', localdata, True)
+
splitsummary = (bb.data.getVar('SUMMARY', localdata, True) or bb.data.getVar('DESCRIPTION', localdata, True) or ".")
splitversion = (bb.data.getVar('PKGV', localdata, True) or "").replace('-', '+')
splitrelease = (bb.data.getVar('PKGR', localdata, True) or "")
@@ -528,6 +531,39 @@ python write_specfile () {
if pkg == d.getVar("PN", True):
splitrprovides = splitrprovides + " " + (d.getVar('ALTERNATIVE_LINK', True) or '') + " " + (d.getVar('ALTERNATIVE_LINKS', True) or '')
+ package_arch = bb.data.getVar('PACKAGE_ARCH', localdata, True)
+
+ splitrprovides = splitrprovides + " " + splitname + "." + defaulttune
+ if package_arch != "all":
+ pattern = '\([^()]*\)'
+ prog = re.compile(pattern)
+
+ str_list = [splitrdepends, splitrrecommends, splitrsuggests]
+ for e in range(len(str_list)):
+ brackets = prog.findall(str_list[e])
+ for i in range(len(brackets)):
+ str_list[e] = str_list[e].replace(brackets[i], "#BRACKETS"+str(i)+"#")
+ tmp = ""
+ for i in str_list[e].split():
+ if i.startswith("#BRACKETS"):
+ tmp += " " + str(i)
+ continue
+ tmp += " " + str(i) + "." + defaulttune
+ str_list[e] = tmp
+ for i in range(len(brackets)):
+ str_list[e] = str_list[e].replace("#BRACKETS"+str(i)+"#", brackets[i])
+
+ [splitrdepends, splitrrecommends, splitrsuggests] = str_list
+ else:
+ variants = (bb.data.getVar("MULTILIB_VARIANTS", localdata, True) or "").split()
+ for variant in variants:
+ tune = bb.data.getVar("DEFAULTTUNE_virtclass-multilib-" + variant, localdata, True) or ""
+ if tune:
+ splitrprovides = splitrprovides + " " + splitname + "." + tune
+ tune = bb.data.getVar("SAVED_DEFAULTTUNE", localdata, True) or ""
+ if tune:
+ splitrprovides = splitrprovides + " " + splitname + "." + tune
+
# Gather special src/first package data
if srcname == splitname:
srcrdepends = splitrdepends
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH 1/3] package_rpm: add architecture info in rpm spec file
2011-09-14 6:08 ` [PATCH 1/3] package_rpm: add architecture info in rpm spec file Dongxiao Xu
@ 2011-09-14 14:37 ` Mark Hatle
0 siblings, 0 replies; 6+ messages in thread
From: Mark Hatle @ 2011-09-14 14:37 UTC (permalink / raw)
To: openembedded-core
I still don't think this is what we want. Let me look into the library issues
that you mentioned in the other thread and I'll see if we can deal with it that way.
(Note, we may need to use something like this in non-RPM cases.. but I'm not
sure about that either.)
--Mark
On 9/14/11 1:08 AM, Dongxiao Xu wrote:
> For supporting multilib, architecture information is needed in package
> require/provide/suggest/recommend fields.
>
> Use DEFAULTTUNE value as the postfix.
>
> For "all" arch recipe, it requires "all" arch recipe with no postfix,
> but provides all possible multilib archs.
>
> For example, qemu-config:
>
> Requires: rsync
> Requires: update-rc.d
> Requires: task-core-nfs-server
> Requires: distcc
> Requires: oprofileui-server
> Requires: dbus-x11
> Requires: bash
> Provides: qemu-config.x86
> Provides: qemu-config.x86-64
>
> For other recipe like zlib:
>
> Requires: libc6.x86-64 >= 2.13
> Provides: zlib.x86-64
>
> [YOCTO #1457]
>
> Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
> ---
> meta/classes/multilib.bbclass | 1 +
> meta/classes/package_rpm.bbclass | 36 ++++++++++++++++++++++++++++++++++++
> 2 files changed, 37 insertions(+), 0 deletions(-)
>
> diff --git a/meta/classes/multilib.bbclass b/meta/classes/multilib.bbclass
> index 583d76b..76c86b2 100644
> --- a/meta/classes/multilib.bbclass
> +++ b/meta/classes/multilib.bbclass
> @@ -23,6 +23,7 @@ python multilib_virtclass_handler () {
> e.data.setVar("PN", variant + "-" + e.data.getVar("PN", False))
> e.data.setVar("SHLIBSDIR_virtclass-multilib-" + variant ,e.data.getVar("SHLIBSDIR", False) + "/" + variant)
> e.data.setVar("TARGET_VENDOR_virtclass-multilib-" + variant, e.data.getVar("TARGET_VENDOR", False) + "ml" + variant)
> + e.data.setVar("SAVED_DEFAULTTUNE", e.data.getVar("DEFAULTTUNE", True))
> e.data.setVar("OVERRIDES", e.data.getVar("OVERRIDES", False) + override)
> }
>
> diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
> index 9ef1acd..ea0a079 100644
> --- a/meta/classes/package_rpm.bbclass
> +++ b/meta/classes/package_rpm.bbclass
> @@ -350,6 +350,7 @@ package_install_internal_rpm () {
> python write_specfile () {
> import textwrap
> import oe.packagedata
> + import re
>
> # We need a simple way to remove the MLPREFIX from the package name,
> # and dependency information...
> @@ -498,6 +499,8 @@ python write_specfile () {
>
> splitname = strip_multilib(pkgname, d)
>
> + defaulttune = bb.data.getVar('DEFAULTTUNE', localdata, True)
> +
> splitsummary = (bb.data.getVar('SUMMARY', localdata, True) or bb.data.getVar('DESCRIPTION', localdata, True) or ".")
> splitversion = (bb.data.getVar('PKGV', localdata, True) or "").replace('-', '+')
> splitrelease = (bb.data.getVar('PKGR', localdata, True) or "")
> @@ -528,6 +531,39 @@ python write_specfile () {
> if pkg == d.getVar("PN", True):
> splitrprovides = splitrprovides + " " + (d.getVar('ALTERNATIVE_LINK', True) or '') + " " + (d.getVar('ALTERNATIVE_LINKS', True) or '')
>
> + package_arch = bb.data.getVar('PACKAGE_ARCH', localdata, True)
> +
> + splitrprovides = splitrprovides + " " + splitname + "." + defaulttune
> + if package_arch != "all":
> + pattern = '\([^()]*\)'
> + prog = re.compile(pattern)
> +
> + str_list = [splitrdepends, splitrrecommends, splitrsuggests]
> + for e in range(len(str_list)):
> + brackets = prog.findall(str_list[e])
> + for i in range(len(brackets)):
> + str_list[e] = str_list[e].replace(brackets[i], "#BRACKETS"+str(i)+"#")
> + tmp = ""
> + for i in str_list[e].split():
> + if i.startswith("#BRACKETS"):
> + tmp += " " + str(i)
> + continue
> + tmp += " " + str(i) + "." + defaulttune
> + str_list[e] = tmp
> + for i in range(len(brackets)):
> + str_list[e] = str_list[e].replace("#BRACKETS"+str(i)+"#", brackets[i])
> +
> + [splitrdepends, splitrrecommends, splitrsuggests] = str_list
> + else:
> + variants = (bb.data.getVar("MULTILIB_VARIANTS", localdata, True) or "").split()
> + for variant in variants:
> + tune = bb.data.getVar("DEFAULTTUNE_virtclass-multilib-" + variant, localdata, True) or ""
> + if tune:
> + splitrprovides = splitrprovides + " " + splitname + "." + tune
> + tune = bb.data.getVar("SAVED_DEFAULTTUNE", localdata, True) or ""
> + if tune:
> + splitrprovides = splitrprovides + " " + splitname + "." + tune
> +
> # Gather special src/first package data
> if srcname == splitname:
> srcrdepends = splitrdepends
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/3] rootfs_rpm: Use specific MACHINE_ARCH for multilib recipes
2011-09-14 6:08 [PATCH 0/3][RFC v2] rpm: multilib related fixes Dongxiao Xu
2011-09-14 6:08 ` [PATCH 1/3] package_rpm: add architecture info in rpm spec file Dongxiao Xu
@ 2011-09-14 6:08 ` Dongxiao Xu
2011-09-14 14:38 ` Mark Hatle
2011-09-14 6:08 ` [PATCH 3/3] multilib: install MULTILIB_IMAGE_INSTALL Dongxiao Xu
2 siblings, 1 reply; 6+ messages in thread
From: Dongxiao Xu @ 2011-09-14 6:08 UTC (permalink / raw)
To: openembedded-core
Currently MACHINE_ARCH deploy folder is unique in multilib system, thus
a lib32 version of rpm package will override a normal rpm package if its
PACKAGE_ARCH is ${MACHINE_ARCH}.
Take netbase as an example, which the PACKAGE_ARCH = MACHINE_ARCH. Both
the normal version of netbase package and the lib32 version are named as
"netbase-4.45-r1.qemux86_64.rpm" putting in tmp/deploy/rpm/qemux86-64
directory, so we need to differentiate them.
Here we define spedific MACHINE_virtclass-multilib-lib(xx) to override
the default MACHINE value, thus got different MACHINE_ARCH to fix this
issue.
Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
---
meta/classes/rootfs_rpm.bbclass | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/meta/classes/rootfs_rpm.bbclass b/meta/classes/rootfs_rpm.bbclass
index 135ca75..56c1a85 100644
--- a/meta/classes/rootfs_rpm.bbclass
+++ b/meta/classes/rootfs_rpm.bbclass
@@ -218,6 +218,9 @@ python () {
default_tune = localdata.getVar("DEFAULTTUNE_virtclass-multilib-" + eext[1], False)
if default_tune:
localdata.setVar("DEFAULTTUNE", default_tune)
+ machine = localdata.getVar("MACHINE_virtclass-multilib-" + eext[1], False)
+ if machine:
+ localdata.setVar("MACHINE", machine)
ml_package_archs += localdata.getVar("PACKAGE_ARCHS", True) or ""
#bb.note("ML_PACKAGE_ARCHS %s %s %s" % (eext[1], localdata.getVar("PACKAGE_ARCHS", True) or "(none)", overrides))
bb.data.setVar('MULTILIB_PACKAGE_ARCHS', ml_package_archs, d)
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH 2/3] rootfs_rpm: Use specific MACHINE_ARCH for multilib recipes
2011-09-14 6:08 ` [PATCH 2/3] rootfs_rpm: Use specific MACHINE_ARCH for multilib recipes Dongxiao Xu
@ 2011-09-14 14:38 ` Mark Hatle
0 siblings, 0 replies; 6+ messages in thread
From: Mark Hatle @ 2011-09-14 14:38 UTC (permalink / raw)
To: openembedded-core
This looks fine. The do_archgen() function within the libzypp_git.bb will need
to be updated to look for the multilib machine type as well.
--Mark
On 9/14/11 1:08 AM, Dongxiao Xu wrote:
> Currently MACHINE_ARCH deploy folder is unique in multilib system, thus
> a lib32 version of rpm package will override a normal rpm package if its
> PACKAGE_ARCH is ${MACHINE_ARCH}.
>
> Take netbase as an example, which the PACKAGE_ARCH = MACHINE_ARCH. Both
> the normal version of netbase package and the lib32 version are named as
> "netbase-4.45-r1.qemux86_64.rpm" putting in tmp/deploy/rpm/qemux86-64
> directory, so we need to differentiate them.
>
> Here we define spedific MACHINE_virtclass-multilib-lib(xx) to override
> the default MACHINE value, thus got different MACHINE_ARCH to fix this
> issue.
>
> Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
> ---
> meta/classes/rootfs_rpm.bbclass | 3 +++
> 1 files changed, 3 insertions(+), 0 deletions(-)
>
> diff --git a/meta/classes/rootfs_rpm.bbclass b/meta/classes/rootfs_rpm.bbclass
> index 135ca75..56c1a85 100644
> --- a/meta/classes/rootfs_rpm.bbclass
> +++ b/meta/classes/rootfs_rpm.bbclass
> @@ -218,6 +218,9 @@ python () {
> default_tune = localdata.getVar("DEFAULTTUNE_virtclass-multilib-" + eext[1], False)
> if default_tune:
> localdata.setVar("DEFAULTTUNE", default_tune)
> + machine = localdata.getVar("MACHINE_virtclass-multilib-" + eext[1], False)
> + if machine:
> + localdata.setVar("MACHINE", machine)
> ml_package_archs += localdata.getVar("PACKAGE_ARCHS", True) or ""
> #bb.note("ML_PACKAGE_ARCHS %s %s %s" % (eext[1], localdata.getVar("PACKAGE_ARCHS", True) or "(none)", overrides))
> bb.data.setVar('MULTILIB_PACKAGE_ARCHS', ml_package_archs, d)
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 3/3] multilib: install MULTILIB_IMAGE_INSTALL
2011-09-14 6:08 [PATCH 0/3][RFC v2] rpm: multilib related fixes Dongxiao Xu
2011-09-14 6:08 ` [PATCH 1/3] package_rpm: add architecture info in rpm spec file Dongxiao Xu
2011-09-14 6:08 ` [PATCH 2/3] rootfs_rpm: Use specific MACHINE_ARCH for multilib recipes Dongxiao Xu
@ 2011-09-14 6:08 ` Dongxiao Xu
2 siblings, 0 replies; 6+ messages in thread
From: Dongxiao Xu @ 2011-09-14 6:08 UTC (permalink / raw)
To: openembedded-core
If user set MULTILIB_IMAGE_INSTALL, we need to install those multitlib
packages into the final image.
Also fix the logic in handling multilib prefix. For certain case like a
normal image contains several multilib libraries, the image recipe isn't
extended with MLPREFIX, therefore we need to enumerate the possible
multilib prefixes and compare them with package prefixes.
Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
---
meta/classes/package_rpm.bbclass | 42 +++++++++++++++++++++++++------------
meta/classes/rootfs_rpm.bbclass | 4 +++
2 files changed, 32 insertions(+), 14 deletions(-)
diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
index ea0a079..5e5fb6c 100644
--- a/meta/classes/package_rpm.bbclass
+++ b/meta/classes/package_rpm.bbclass
@@ -166,7 +166,7 @@ package_install_internal_rpm () {
local platform="${INSTALL_PLATFORM_RPM}"
local platform_extra="${INSTALL_PLATFORM_EXTRA_RPM}"
local confbase="${INSTALL_CONFBASE_RPM}"
- local package_to_install="${INSTALL_PACKAGES_NORMAL_RPM}"
+ local package_to_install="${INSTALL_PACKAGES_NORMAL_RPM} ${INSTALL_PACKAGES_MULTILIB_RPM}"
local package_attemptonly="${INSTALL_PACKAGES_ATTEMPTONLY_RPM}"
local package_linguas="${INSTALL_PACKAGES_LINGUAS_RPM}"
local providename="${INSTALL_PROVIDENAME_RPM}"
@@ -210,10 +210,15 @@ package_install_internal_rpm () {
echo "Processing $pkg..."
archvar=base_archs
- ml_pkg=$(echo ${pkg} | sed "s,^${MLPREFIX}\(.*\),\1,")
- if [ "${ml_pkg}" != "${pkg}" ]; then
- archvar=ml_archs
- fi
+ ml_prefix=`echo ${pkg} | cut -d'-' -f1`
+ ml_pkg=$pkg
+ for i in ${MULTILIB_PREFIX_LIST} ; do
+ if [ ${ml_prefix} == ${i} ]; then
+ ml_pkg=$(echo ${pkg} | sed "s,^${ml_prefix}-\(.*\),\1,")
+ archvar=ml_archs
+ break
+ fi
+ done
pkg_name=$(resolve_package_rpm ${confbase}-${archvar}.conf ${ml_pkg})
if [ -z "$pkg_name" ]; then
@@ -224,16 +229,20 @@ package_install_internal_rpm () {
done
fi
fi
-
if [ ! -z "${package_to_install}" ]; then
for pkg in ${package_to_install} ; do
echo "Processing $pkg..."
archvar=base_archs
- ml_pkg=$(echo ${pkg} | sed "s,^${MLPREFIX}\(.*\),\1,")
- if [ "${ml_pkg}" != "${pkg}" ]; then
- archvar=ml_archs
- fi
+ ml_prefix=`echo ${pkg} | cut -d'-' -f1`
+ ml_pkg=$pkg
+ for i in ${MULTILIB_PREFIX_LIST} ; do
+ if [ ${ml_prefix} == ${i} ]; then
+ ml_pkg=$(echo ${pkg} | sed "s,^${ml_prefix}-\(.*\),\1,")
+ archvar=ml_archs
+ break
+ fi
+ done
pkg_name=$(resolve_package_rpm ${confbase}-${archvar}.conf ${ml_pkg})
if [ -z "$pkg_name" ]; then
@@ -258,10 +267,15 @@ package_install_internal_rpm () {
for pkg in ${package_attemptonly} ; do
echo "Processing $pkg..."
archvar=base_archs
- ml_pkg=$(echo ${pkg} | sed "s,^${MLPREFIX}\(.*\),\1,")
- if [ "${ml_pkg}" != "${pkg}" ]; then
- archvar=ml_archs
- fi
+ ml_prefix=`echo ${pkg} | cut -d'-' -f1`
+ ml_pkg=$pkg
+ for i in ${MULTILIB_PREFIX_LIST} ; do
+ if [ ${ml_prefix} == ${i} ]; then
+ ml_pkg=$(echo ${pkg} | sed "s,^${ml_prefix}-\(.*\),\1,")
+ archvar=ml_archs
+ break
+ fi
+ done
pkg_name=$(resolve_package_rpm ${confbase}-${archvar}.conf ${ml_pkg})
if [ -z "$pkg_name" ]; then
diff --git a/meta/classes/rootfs_rpm.bbclass b/meta/classes/rootfs_rpm.bbclass
index 56c1a85..ec58700 100644
--- a/meta/classes/rootfs_rpm.bbclass
+++ b/meta/classes/rootfs_rpm.bbclass
@@ -58,6 +58,7 @@ fakeroot rootfs_rpm_do_rootfs () {
export INSTALL_PLATFORM_RPM="${TARGET_ARCH}"
export INSTALL_CONFBASE_RPM="${RPMCONF_TARGET_BASE}"
export INSTALL_PACKAGES_NORMAL_RPM="${PACKAGE_INSTALL}"
+ export INSTALL_PACKAGES_MULTILIB_RPM="${MULTILIB_PACKAGE_INSTALL}"
export INSTALL_PACKAGES_ATTEMPTONLY_RPM="${PACKAGE_INSTALL_ATTEMPTONLY}"
export INSTALL_PACKAGES_LINGUAS_RPM="${LINGUAS_INSTALL}"
export INSTALL_PROVIDENAME_RPM=""
@@ -210,6 +211,7 @@ python () {
bb.data.setVar('RPM_POSTPROCESS_COMMANDS', '', d)
ml_package_archs = ""
+ ml_prefix_list = ""
multilibs = d.getVar('MULTILIBS', True) or ""
for ext in multilibs.split():
eext = ext.split(':')
@@ -222,6 +224,8 @@ python () {
if machine:
localdata.setVar("MACHINE", machine)
ml_package_archs += localdata.getVar("PACKAGE_ARCHS", True) or ""
+ ml_prefix_list += " " + eext[1]
#bb.note("ML_PACKAGE_ARCHS %s %s %s" % (eext[1], localdata.getVar("PACKAGE_ARCHS", True) or "(none)", overrides))
bb.data.setVar('MULTILIB_PACKAGE_ARCHS', ml_package_archs, d)
+ bb.data.setVar('MULTILIB_PREFIX_LIST', ml_prefix_list, d)
}
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread