* [PATCH 1/3] icecc-create-env: a tool to create icecc toolchain tarballs
@ 2011-09-16 6:55 Dmitry Eremin-Solenikov
2011-09-16 6:55 ` [PATCH 2/3] icecc.bbclass: replace with updated version Dmitry Eremin-Solenikov
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Dmitry Eremin-Solenikov @ 2011-09-16 6:55 UTC (permalink / raw)
To: openembedded-core; +Cc: Dmitry Eremin-Solenikov
IceCC needs tarballs with toolchains to work correctly. This is a
version largely based on one from org.openembedded.dev, plus a patch to
support recent compilers, LTO, etc.
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
---
.../icecc-create-env/icecc-lto-update.patch | 103 ++++++++++++++++++++
.../icecc-create-env/icecc-create-env_0.1.bb | 29 ++++++
2 files changed, 132 insertions(+), 0 deletions(-)
create mode 100644 meta/recipes-devtools/icecc-create-env/icecc-create-env/icecc-lto-update.patch
create mode 100644 meta/recipes-devtools/icecc-create-env/icecc-create-env_0.1.bb
diff --git a/meta/recipes-devtools/icecc-create-env/icecc-create-env/icecc-lto-update.patch b/meta/recipes-devtools/icecc-create-env/icecc-create-env/icecc-lto-update.patch
new file mode 100644
index 0000000..b396261
--- /dev/null
+++ b/meta/recipes-devtools/icecc-create-env/icecc-create-env/icecc-lto-update.patch
@@ -0,0 +1,103 @@
+--- a/icecc-create-env 2006-12-14 09:50:46.000000000 +0300
++++ b/icecc-create-env 2011-08-31 17:52:45.000000000 +0400
+@@ -27,9 +27,6 @@
+ # readlink is not portable enough.
+ path=`ls -H $path`
+ toadd="$name=$path"
+- if test "$name" = "$path"; then
+- toadd=$path
+- fi
+ is_contained "$toadd" && return
+ if test -z "$silent"; then
+ echo "adding file $toadd"
+@@ -117,6 +114,14 @@
+ add_file "$specfile"
+ fi
+
++ltofile=`$added_gcc -print-prog-name=lto1`
++pluginfile="${ltofile%lto1}liblto_plugin.so"
++if test -r "$pluginfile"
++then
++ add_file $pluginfile ${pluginfile#*usr}
++ add_file $pluginfile /usr${pluginfile#*usr}
++fi
++
+ tempdir=`mktemp -d /tmp/iceccenvXXXXXX`
+ new_target_files=
+ for i in $target_files; do
+@@ -140,49 +147,44 @@
+ done
+
+ #sort the files
+- target_files=`for i in $new_target_files; do echo $i; done | sort`
++target_files=`for i in $new_target_files; do echo $i; done | sort`
+
+ #test if an archive name was supplied
+ #if not use the md5 of all files as the archive name
+ if test -z "$archive_name"; then
+-md5sum=NONE
+-for file in /usr/bin/md5sum /bin/md5 /usr/bin/md5; do
+- if test -x $file; then
+- md5sum=$file
+- break
+- fi
+-done
++ md5sum=NONE
++ for file in /usr/bin/md5sum /bin/md5 /usr/bin/md5; do
++ if test -x $file; then
++ md5sum=$file
++ break
++ fi
++ done
+
+-#calculate md5 and use it as the archive name
+-archive_name=`for i in $target_files; do $md5sum $tempdir/$i; done | sed -e 's/ .*$//' | $md5sum | sed -e 's/ .*$//'` || {
+- if test -z "$silent"; then
+- echo "Couldn't compute MD5 sum."
++ #calculate md5 and use it as the archive name
++ archive_name=`for i in $target_files; do test -f $tempdir/$i && $md5sum $tempdir/$i; done | sed -e 's/ .*$//' | $md5sum | sed -e 's/ .*$//'`.tar.gz || {
++ if test -z "$silent"; then
++ echo "Couldn't compute MD5 sum."
++ fi
++ exit 2
++ }
++ mydir=`pwd`
++else
++ mydir="`dirname "$archive_name"`"
++
++ #check if we have a full path or only a filename
++ if test "$mydir" = "." ; then
++ mydir=`pwd`
++ else
++ mydir=""
+ fi
+- exit 2
+-}
+-
+ fi
+
+ if test -z "$silent"; then
+-echo "creating $archive_name.tar.gz"
++echo "creating $archive_name"
+ fi
+
+-if test -z "$archive_name"; then
+- mydir=`pwd`
+-else
+-# mydir=dirname ${archive_name}
+- mydir=${archive_name%/*}
+-
+-#check if we have a full path or only a filename
+- if test -z "$mydir"; then
+- mydir=`pwd`
+- else
+- mydir=""
+- fi
+-
+-fi
+ cd $tempdir
+-tar -czhf "$mydir/$archive_name".tar.gz $target_files || {
++tar -czhf "$mydir/$archive_name" $target_files || {
+ if test -z "$silent"; then
+ echo "Couldn't create archive"
+ fi
diff --git a/meta/recipes-devtools/icecc-create-env/icecc-create-env_0.1.bb b/meta/recipes-devtools/icecc-create-env/icecc-create-env_0.1.bb
new file mode 100644
index 0000000..9a440ba
--- /dev/null
+++ b/meta/recipes-devtools/icecc-create-env/icecc-create-env_0.1.bb
@@ -0,0 +1,29 @@
+DESCRIPTION = "This is a modified version of the icecc-create-env script in order to\
+make it work with OE."
+SECTION = "base"
+PRIORITY = "optional"
+# source file has just a "GPL" word, but upstream is GPLv2+.
+# most probably just GPL would be a mistake
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://icecc-create-env;beginline=2;endline=5;md5=ae1df3d6a058bfda40b66094c5f6065f"
+
+PR = "r1"
+
+DEPENDS = ""
+INHIBIT_DEFAULT_DEPS = "1"
+
+inherit native
+
+PATCHTOOL = "patch"
+SRC_URI = "http://www.digital-opsis.com/openembedded/icecc-create-env-${PV}.tar.gz \
+ file://icecc-lto-update.patch "
+
+S = "${WORKDIR}"
+
+do_install() {
+ install -d ${D}/${bindir}
+ install -m 0755 ${WORKDIR}/icecc-create-env ${D}/${bindir}
+}
+
+SRC_URI[md5sum] = "641ec45fe377529c7fd914f77b11b44f"
+SRC_URI[sha256sum] = "9ff8360375432a7a5c476cc6d55b3fdea9d6f3edc080d295a60421d8f47b1834"
--
1.7.2.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] icecc.bbclass: replace with updated version
2011-09-16 6:55 [PATCH 1/3] icecc-create-env: a tool to create icecc toolchain tarballs Dmitry Eremin-Solenikov
@ 2011-09-16 6:55 ` Dmitry Eremin-Solenikov
2011-09-16 6:55 ` [PATCH 3/3] bugzilla.bbclass: add a class to report build problems to bugzilla Dmitry Eremin-Solenikov
2011-09-16 16:35 ` [PATCH 1/3] icecc-create-env: a tool to create icecc toolchain tarballs Richard Purdie
2 siblings, 0 replies; 4+ messages in thread
From: Dmitry Eremin-Solenikov @ 2011-09-16 6:55 UTC (permalink / raw)
To: openembedded-core; +Cc: Dmitry Eremin-Solenikov
Replace a non-working icecc class with a rewritten one. It's cleaned up,
most things are handled now in shell scripts, as it's possible that
toolchains won't exist at the time of parsing/python substitution.
Packages which empty PARALLEL_MAKE are ignored now, as not to break
them.
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
---
meta/classes/icecc.bbclass | 390 ++++++++++++++++----------------------------
1 files changed, 144 insertions(+), 246 deletions(-)
diff --git a/meta/classes/icecc.bbclass b/meta/classes/icecc.bbclass
index 715f870..e20666b 100644
--- a/meta/classes/icecc.bbclass
+++ b/meta/classes/icecc.bbclass
@@ -26,295 +26,193 @@
#Error checking is kept to minimum so double check any parameters you pass to the class
###########################################################################################
+ICECC_ENV_EXEC ?= "${STAGING_BINDIR_NATIVE}/icecc-create-env"
-def icc_determine_gcc_version(gcc):
- """
- Hack to determine the version of GCC
-
- 'i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5363)'
- """
- return os.popen("%s --version" % gcc ).readline().split()[2]
-
-def create_cross_env(bb,d):
- """
- Create a tar.bz2 of the current toolchain
- """
- # Constin native-native compilation no environment needed if
- # host prefix is empty (let us duplicate the query for ease)
- prefix = bb.data.expand('${HOST_PREFIX}', d)
- if len(prefix) == 0:
- return ""
-
- import tarfile, socket, time
- prefix = bb.data.expand('${HOST_PREFIX}' , d)
- ice_dir = bb.data.expand("${STAGING_DIR_NATIVE}${prefix_native}")
- distro = bb.data.expand('${DISTRO}', d)
- target_sys = bb.data.expand('${TARGET_SYS}', d)
- target_prefix = bb.data.expand('${TARGET_PREFIX}', d)
- float = bb.data.getVar('TARGET_FPU', d) or "hard"
- name = socket.gethostname()
-
- # Stupid check to determine if we have built a libc and a cross
- # compiler.
- try:
- os.stat(os.path.join(ice_dir, target_sys, 'lib', 'libc.so'))
- os.stat(os.path.join(ice_dir, target_sys, 'bin', 'g++'))
- except: # no cross compiler built yet
- return ""
-
- VERSION = icc_determine_gcc_version( os.path.join(ice_dir,target_sys,"bin","g++") )
- cross_name = prefix + distro + "-" + target_sys + "-" + float + "-" + VERSION + "-" + name
- tar_file = os.path.join(ice_dir, 'ice', cross_name + '.tar.gz')
-
- try:
- os.stat(tar_file)
- # tar file already exists
- return tar_file
- except:
- try:
- os.makedirs(os.path.join(ice_dir,'ice'))
- except:
- # directory already exists, continue
- pass
-
-
- #check if user has specified a specific icecc-create-env script
- #if not use the OE provided one
- cr_env_script = bb.data.getVar('ICECC_ENV_EXEC', d) or bb.data.expand('${STAGING_DIR}', d)+"/ice/icecc-create-env"
- #call the modified create-env script
- result=os.popen("%s %s %s %s %s %s" %(cr_env_script,
- "--silent",
- os.path.join(ice_dir,target_sys,'bin','gcc'),
- os.path.join(ice_dir,target_sys,'bin','g++'),
- os.path.join(ice_dir,target_sys,'bin','as'),
- os.path.join(ice_dir,"ice",cross_name) ) )
- return tar_file
-
+def icecc_dep_prepend(d):
+ # INHIBIT_DEFAULT_DEPS doesn't apply to the patch command. Whether or not
+ # we need that built is the responsibility of the patch function / class, not
+ # the application.
+ if not bb.data.getVar('INHIBIT_DEFAULT_DEPS', d):
+ return "icecc-create-env"
+ return ""
-def create_native_env(bb,d):
- import tarfile, socket, time
- ice_dir = bb.data.expand("${STAGING_DIR_NATIVE}${prefix_native}")
- prefix = bb.data.expand('${HOST_PREFIX}' , d)
- distro = bb.data.expand('${DISTRO}', d)
- target_sys = bb.data.expand('${TARGET_SYS}', d)
- target_prefix = bb.data.expand('${TARGET_PREFIX}', d)
- float = bb.data.getVar('TARGET_FPU', d) or "hard"
- name = socket.gethostname()
+DEPENDS_prepend += "${@icecc_dep_prepend(d)} "
- archive_name = "local-host-env" + "-" + name
- tar_file = os.path.join(ice_dir, 'ice', archive_name + '.tar.gz')
-
- try:
- os.stat(tar_file)
- # tar file already exists
- return tar_file
- except:
- try:
- #os.makedirs(os.path.join(ice_dir))
- os.makedirs(os.path.join(ice_dir,'ice'))
- except:
- # directory already exists, continue
- pass
-
- #check if user has specified a specific icecc-create-env script
- #if not use the OE provided one
- cr_env_script = bb.data.getVar('ICECC_ENV_EXEC', d) or bb.data.expand('${STAGING_DIR}', d)+"/ice/icecc-create-env"
- result=os.popen("%s %s %s %s %s %s" %(cr_env_script,
- "--silent",
- os.popen("%s gcc" % "which").read()[:-1],
- os.popen("%s g++" % "which").read()[:-1],
- os.popen("%s as" % "which").read()[:-1],
- os.path.join(ice_dir,"ice",archive_name) ) )
- return tar_file
-
-
-
-def create_cross_kernel_env(bb,d):
- import tarfile, socket, time
- ice_dir = bb.data.expand("${STAGING_DIR_NATIVE}${prefix_native}")
- prefix = bb.data.expand('${HOST_PREFIX}' , d)
- distro = bb.data.expand('${DISTRO}', d)
- target_sys = bb.data.expand('${TARGET_SYS}', d)
- target_prefix = bb.data.expand('${TARGET_PREFIX}', d)
- float = bb.data.getVar('TARGET_FPU', d) or "hard"
- name = socket.gethostname()
+def get_cross_kernel_cc(bb,d):
kernel_cc = bb.data.expand('${KERNEL_CC}', d)
- kernel_cc = kernel_cc[:-1]
-
- # Stupid check to determine if we have built a libc and a cross
- # compiler.
- try:
- os.stat(os.path.join(ice_dir, 'bin', kernel_cc))
- except: # no cross compiler built yet
- return ""
-
- VERSION = icc_determine_gcc_version( os.path.join(ice_dir,"bin",kernel_cc) )
- cross_name = prefix + distro + "-" + target_sys + "-" + float + "-" + VERSION + "-" + name
- tar_file = os.path.join(ice_dir, 'ice', cross_name + '.tar.gz')
-
- try:
- os.stat(tar_file)
- # tar file already exists
- return tar_file
- except:
- try:
- os.makedirs(os.path.join(ice_dir,'ice'))
- except:
- # directory already exists, continue
- pass
-
+ kernel_cc = kernel_cc.replace('ccache', '').strip()
+ kernel_cc = kernel_cc.split(' ')[0]
+ kernel_cc = kernel_cc.strip()
+ return kernel_cc
- #check if user has specified a specific icecc-create-env script
- #if not use the OE provided one
- cr_env_script = bb.data.getVar('ICECC_ENV_EXEC', d) or bb.data.expand('${STAGING_DIR}', d)+"/ice/icecc-create-env"
- result=os.popen("%s %s %s %s %s %s" %(cr_env_script,
- "--silent",
- os.path.join(ice_dir,'bin',kernel_cc),
- os.path.join(ice_dir,target_sys,'bin','g++'),
- os.path.join(ice_dir,target_sys,'bin','as'),
- os.path.join(ice_dir,"ice",cross_name) ) )
- return tar_file
-
-
-def create_env(bb,d):
-
- #return create_cross_kernel_env(bb,d)
-
- if bb.data.inherits_class("native", d):
- return create_native_env(bb,d)
- elif bb.data.inherits_class("kernel", d):
- return create_cross_kernel_env(bb,d)
- elif bb.data.inherits_class("cross", d):
- return create_native_env(bb,d)
- elif bb.data.inherits_class("sdk", d):
- return create_native_env(bb,d)
- else:
- return create_cross_env(bb,d)
-
-
-def create_path(compilers, type, bb, d):
+def create_path(compilers, bb, d):
"""
Create Symlinks for the icecc in the staging directory
"""
- staging = os.path.join(bb.data.expand('${STAGING_DIR}', d), "ice", type)
+ staging = os.path.join(bb.data.expand('${STAGING_BINDIR}', d), "ice")
+ if icc_is_kernel(bb, d):
+ staging += "-kernel"
#check if the icecc path is set by the user
- icecc = bb.data.getVar('ICECC_PATH', d) or os.popen("%s icecc" % "which").read()[:-1]
+ icecc = bb.data.getVar('ICECC_PATH', d) or os.popen("which icecc").read()[:-1]
# Create the dir if necessary
try:
os.stat(staging)
except:
- os.makedirs(staging)
+ try:
+ os.makedirs(staging)
+ except:
+ pass
for compiler in compilers:
gcc_path = os.path.join(staging, compiler)
try:
os.stat(gcc_path)
except:
- os.symlink(icecc, gcc_path)
+ try:
+ os.symlink(icecc, gcc_path)
+ except:
+ pass
- return staging + ":"
+ return staging
+def use_icc(bb,d):
+ package_tmp = bb.data.expand('${PN}', d)
-def use_icc_version(bb,d):
- icecc_ver = "yes"
- system_class_blacklist = [ "none" ]
-
- for black in system_class_blacklist:
- if bb.data.inherits_class(black, d):
- icecc_ver = "no"
-
- user_class_blacklist = bb.data.getVar('ICECC_USER_CLASS_BL', d) or "none"
- user_class_blacklist = user_class_blacklist.split()
-
- for black in user_class_blacklist:
- if bb.data.inherits_class(black, d):
- icecc_ver = "no"
-
- return icecc_ver
-
+ system_class_blacklist = [ "none" ]
+ user_class_blacklist = (bb.data.getVar('ICECC_USER_CLASS_BL', d) or "none").split()
+ package_class_blacklist = system_class_blacklist + user_class_blacklist
-def icc_path(bb,d,compile):
- package_tmp = bb.data.expand('${PN}', d)
+ for black in package_class_blacklist:
+ if bb.data.inherits_class(black, d):
+ #bb.note(package_tmp, ' class ', black, ' found in blacklist, disable icecc')
+ return "no"
#"system" package blacklist contains a list of packages that can not distribute compile tasks
#for one reason or the other
- system_package_blacklist = [ "uclibc", "glibc-intermediate", "gcc", "qemu", "bind", "u-boot", "dhcp-forwarder", "enchant" ]
-
- for black in system_package_blacklist:
- if black in package_tmp:
- bb.data.setVar("PARALLEL_MAKE" , "", d)
- return ""
-
- #user defined exclusion list
- user_package_blacklist = bb.data.getVar('ICECC_USER_PACKAGE_BL', d) or "none"
- user_package_blacklist = user_package_blacklist.split()
-
- for black in user_package_blacklist:
- if black in package_tmp:
- bb.data.setVar("PARALLEL_MAKE" , "", d)
- return ""
-
-
- prefix = bb.data.expand('${HOST_PREFIX}', d)
-
-
- if compile and bb.data.inherits_class("cross", d):
- return create_path( ["gcc", "g++"], "native", bb, d)
-
- elif compile and bb.data.inherits_class("native", d):
- return create_path( ["gcc", "g++"], "native", bb, d)
-
- elif compile and bb.data.inherits_class("kernel", d):
- return create_path( [get_cross_kernel_ver(bb,d), "foo"], "cross-kernel", bb, d)
+ system_package_blacklist = [ "uclibc", "glibc", "gcc", "bind", "u-boot", "dhcp-forwarder", "enchant", "connman", "orbit2" ]
+ user_package_blacklist = (bb.data.getVar('ICECC_USER_PACKAGE_BL', d) or "").split()
+ package_blacklist = system_package_blacklist + user_package_blacklist
+
+ for black in package_blacklist:
+ if black in package_tmp:
+ #bb.note(package_tmp, ' found in blacklist, disable icecc')
+ return "no"
+
+ if bb.data.getVar('PARALLEL_MAKE', d) == "":
+ bb.note(package_tmp, " ", bb.data.expand('${PV}', d), " has empty PARALLEL_MAKE, disable icecc")
+ return "no"
+
+ return "yes"
+
+def icc_is_kernel(bb, d):
+ return \
+ bb.data.inherits_class("kernel", d);
+
+def icc_is_native(bb, d):
+ return \
+ bb.data.inherits_class("cross", d) or \
+ bb.data.inherits_class("cross-canadian", d) or \
+ bb.data.inherits_class("native", d) or \
+ bb.data.inherits_class("nativesdk", d);
+
+def icc_version(bb, d):
+ if use_icc(bb, d) == "no":
+ return ""
- elif not compile or len(prefix) == 0:
- return create_path( ["gcc", "g++"], "native", bb, d)
+ parallel = bb.data.getVar('ICECC_PARALLEL_MAKE', d) or ""
+ bb.data.setVar("PARALLEL_MAKE", parallel, d)
+ if icc_is_native(bb, d):
+ archive_name = "local-host-env"
+ elif bb.data.expand('${HOST_PREFIX}', d) == "":
+ bb.fatal(bb.data.expand("${PN}", d), " NULL prefix")
else:
- return create_path( [prefix+"gcc", prefix+"g++"], "cross", bb, d)
+ prefix = bb.data.expand('${HOST_PREFIX}' , d)
+ distro = bb.data.expand('${DISTRO}', d)
+ target_sys = bb.data.expand('${TARGET_SYS}', d)
+ float = bb.data.getVar('TARGET_FPU', d) or "hard"
+ archive_name = prefix + distro + "-" + target_sys + "-" + float
+ if icc_is_kernel(bb, d):
+ archive_name += "-kernel"
+
+ import socket
+ ice_dir = bb.data.expand('${STAGING_DIR_NATIVE}${prefix_native}', d)
+ tar_file = os.path.join(ice_dir, 'ice', archive_name + "-@VERSION@-" + socket.gethostname() + '.tar.gz')
+ return tar_file
+def icc_path(bb,d):
+ if icc_is_kernel(bb, d):
+ return create_path( [get_cross_kernel_cc(bb,d), ], bb, d)
+ else:
+ prefix = bb.data.expand('${HOST_PREFIX}', d)
+ return create_path( [prefix+"gcc", prefix+"g++"], bb, d)
+
+def icc_get_tool(bb, d, tool):
+ if icc_is_native(bb, d):
+ return os.popen("which %s" % tool).read()[:-1]
+ elif icc_is_kernel(bb, d):
+ return os.popen("which %s" % get_cross_kernel_cc(bb, d)).read()[:-1]
+ else:
+ ice_dir = bb.data.expand('${STAGING_BINDIR_TOOLCHAIN}', d)
+ target_sys = bb.data.expand('${TARGET_SYS}', d)
+ return os.path.join(ice_dir, "%s-%s" % (target_sys, tool))
+
+set_icecc_env() {
+ ICECC_VERSION="${@icc_version(bb, d)}"
+ if [ "x${ICECC_VERSION}" = "x" ]
+ then
+ return
+ fi
-def icc_version(bb,d):
- return create_env(bb,d)
+ ICE_PATH="${@icc_path(bb, d)}"
+ if [ "x${ICE_PATH}" = "x" ]
+ then
+ return
+ fi
+ ICECC_CC="${@icc_get_tool(bb,d, "gcc")}"
+ ICECC_CXX="${@icc_get_tool(bb,d, "g++")}"
+ if [ ! -x "${ICECC_CC}" -o ! -x "${ICECC_CXX}" ]
+ then
+ return
+ fi
-def check_for_kernel(bb,d):
- if bb.data.inherits_class("kernel", d):
- return "yes"
- return "no"
+ ICE_VERSION=`$ICECC_CC -dumpversion`
+ ICECC_VERSION=`echo ${ICECC_VERSION} | sed -e "s/@VERSION@/$ICE_VERSION/g"`
+ if [ ! -x "${ICECC_ENV_EXEC}" ]
+ then
+ return
+ fi
+ ICECC_AS="`${ICECC_CC} -print-prog-name=as`"
+ if [ "`dirname "${ICECC_AS}"`" = "." ]
+ then
+ ICECC_AS="`which as`"
+ fi
-def get_cross_kernel_ver(bb,d):
+ if [ ! -r "${ICECC_VERSION}" ]
+ then
+ mkdir -p "`dirname "${ICECC_VERSION}"`"
+ ${ICECC_ENV_EXEC} "${ICECC_CC}" "${ICECC_CXX}" "${ICECC_AS}" "${ICECC_VERSION}"
+ fi
- return bb.data.expand('${KERNEL_CC}', d).strip() or "gcc"
+ export ICECC_VERSION ICECC_CC ICECC_CXX
+ export PATH="$ICE_PATH:$PATH"
+ export CCACHE_PATH="$PATH"
+}
-# set the icecream environment variables
do_configure_prepend() {
- export PATH=${@icc_path(bb,d,False)}$PATH
- export ICECC_CC="gcc"
- export ICECC_CXX="g++"
+ set_icecc_env
}
do_compile_prepend() {
-
- export PATH=${@icc_path(bb,d,True)}$PATH
-
- #check if we are building a kernel and select gcc-cross-kernel
- if [ "${@check_for_kernel(bb,d)}" = "yes" ]; then
- export ICECC_CC="${@get_cross_kernel_ver(bb,d)}"
- export ICECC_CXX="${HOST_PREFIX}g++"
- else
- export ICECC_CC="${HOST_PREFIX}gcc"
- export ICECC_CXX="${HOST_PREFIX}g++"
- fi
-
- if [ "${@use_icc_version(bb,d)}" = "yes" ]; then
- export ICECC_VERSION="${@icc_version(bb,d)}"
- else
- export ICECC_VERSION="NONE"
- fi
+ set_icecc_env
}
+
+#do_install_prepend() {
+# set_icecc_env
+#}
--
1.7.2.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] bugzilla.bbclass: add a class to report build problems to bugzilla
2011-09-16 6:55 [PATCH 1/3] icecc-create-env: a tool to create icecc toolchain tarballs Dmitry Eremin-Solenikov
2011-09-16 6:55 ` [PATCH 2/3] icecc.bbclass: replace with updated version Dmitry Eremin-Solenikov
@ 2011-09-16 6:55 ` Dmitry Eremin-Solenikov
2011-09-16 16:35 ` [PATCH 1/3] icecc-create-env: a tool to create icecc toolchain tarballs Richard Purdie
2 siblings, 0 replies; 4+ messages in thread
From: Dmitry Eremin-Solenikov @ 2011-09-16 6:55 UTC (permalink / raw)
To: openembedded-core; +Cc: Dmitry Eremin-Solenikov
Add a class to report build errors to bugzilla. Idea largely based on
sepukku.bbclass, however it's rewritten nearly fully to use XML-RPC
interface of bugzilla. Tested with bugzilla 4.0, other version might
require some sort of adaptation.
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
---
meta/classes/bugzilla.bbclass | 186 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 186 insertions(+), 0 deletions(-)
create mode 100644 meta/classes/bugzilla.bbclass
diff --git a/meta/classes/bugzilla.bbclass b/meta/classes/bugzilla.bbclass
new file mode 100644
index 0000000..801bd66
--- /dev/null
+++ b/meta/classes/bugzilla.bbclass
@@ -0,0 +1,186 @@
+#
+# Small event handler to automatically open URLs and file
+# bug reports at a bugzilla of your choiche
+# it uses XML-RPC interface, so you must have it enabled
+#
+# Before using you must define BUGZILLA_USER, BUGZILLA_PASS credentials,
+# BUGZILLA_XMLRPC - uri of xmlrpc.cgi,
+# BUGZILLA_PRODUCT, BUGZILLA_COMPONENT - a place in BTS for build bugs
+# BUGZILLA_VERSION - version against which to report new bugs
+#
+
+def bugzilla_find_bug_report(debug_file, server, args, bugname):
+ args['summary'] = bugname
+ bugs = server.Bug.search(args)
+ if len(bugs['bugs']) == 0:
+ print >> debug_file, "Bugs not found"
+ return (False,None)
+ else: # silently pick the first result
+ print >> debug_file, "Result of bug search is "
+ print >> debug_file, bugs
+ status = bugs['bugs'][0]['status']
+ id = bugs['bugs'][0]['id']
+ return (not status in ["CLOSED", "RESOLVED", "VERIFIED"],id)
+
+def bugzilla_file_bug(debug_file, server, args, name, text, version):
+ args['summary'] = name
+ args['comment'] = text
+ args['version'] = version
+ args['op_sys'] = 'Linux'
+ args['platform'] = 'Other'
+ args['severity'] = 'normal'
+ args['priority'] = 'Normal'
+ try:
+ return server.Bug.create(args)['id']
+ except Exception, e:
+ print >> debug_file, repr(e)
+ return None
+
+def bugzilla_reopen_bug(debug_file, server, args, bug_number):
+ args['ids'] = [bug_number]
+ args['status'] = "CONFIRMED"
+ try:
+ server.Bug.update(args)
+ return True
+ except Exception, e:
+ print >> debug_file, repr(e)
+ return False
+
+def bugzilla_create_attachment(debug_file, server, args, bug_number, text, file_name, log, logdescription):
+ args['ids'] = [bug_number]
+ args['file_name'] = file_name
+ args['summary'] = logdescription
+ args['content_type'] = "text/plain"
+ args['data'] = log
+ args['comment'] = text
+ try:
+ server.Bug.add_attachment(args)
+ return True
+ except Exception, e:
+ print >> debug_file, repr(e)
+ return False
+
+def bugzilla_add_comment(debug_file, server, args, bug_number, text):
+ args['id'] = bug_number
+ args['comment'] = text
+ try:
+ server.Bug.add_comment(args)
+ return True
+ except Exception, e:
+ print >> debug_file, repr(e)
+ return False
+
+addhandler bugzilla_eventhandler
+python bugzilla_eventhandler() {
+ import bb, os, glob
+ import xmlrpclib, httplib
+
+ class ProxiedTransport(xmlrpclib.Transport):
+ def __init__(self, proxy, use_datetime = 0):
+ xmlrpclib.Transport.__init__(self, use_datetime)
+ self.proxy = proxy
+ self.user = None
+ self.password = None
+
+ def set_user(self, user):
+ self.user = user
+
+ def set_password(self, password):
+ self.password = password
+
+ def make_connection(self, host):
+ self.realhost = host
+ return httplib.HTTP(self.proxy)
+
+ def send_request(self, connection, handler, request_body):
+ connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler))
+ if self.user != None:
+ if self.password != None:
+ auth = "%s:%s" % (self.user, self.password)
+ else:
+ auth = self.user
+ connection.putheader("Proxy-authorization", "Basic " + base64.encodestring(auth))
+
+ event = e
+ data = e.data
+ name = bb.event.getName(event)
+ if name == "MsgNote":
+ # avoid recursion
+ return
+
+ if name == "TaskFailed":
+ xmlrpc = bb.data.getVar("BUGZILLA_XMLRPC", data, True)
+ user = bb.data.getVar("BUGZILLA_USER", data, True)
+ passw = bb.data.getVar("BUGZILLA_PASS", data, True)
+ product = bb.data.getVar("BUGZILLA_PRODUCT", data, True)
+ compon = bb.data.getVar("BUGZILLA_COMPONENT", data, True)
+ version = bb.data.getVar("BUGZILLA_VERSION", data, True)
+
+ proxy = bb.data.getVar('http_proxy', data, True )
+ if (proxy):
+ import urllib2
+ s, u, p, hostport = urllib2._parse_proxy(proxy)
+ transport = ProxiedTransport(hostport)
+ else:
+ transport = None
+
+ server = xmlrpclib.ServerProxy(xmlrpc, transport=transport, verbose=0)
+ args = {
+ 'Bugzilla_login': user,
+ 'Bugzilla_password': passw,
+ 'product': product,
+ 'component': compon}
+
+ # evil hack to figure out what is going on
+ debug_file = open(os.path.join(bb.data.getVar("TMPDIR", data, True),"..","bugzilla-log"),"a")
+
+ file = None
+ bugname = "%(package)s-%(pv)s-autobuild" % { "package" : bb.data.getVar("PN", data, True),
+ "pv" : bb.data.getVar("PV", data, True),
+ }
+ log_file = glob.glob("%s/log.%s.*" % (bb.data.getVar('T', event.data, True), event.task))
+ text = "The %s step in %s failed at %s for machine %s" % (e.task, bb.data.getVar("PN", data, True), bb.data.getVar('DATETIME', data, True), bb.data.getVar( 'MACHINE', data, True ) )
+ if len(log_file) != 0:
+ print >> debug_file, "Adding log file %s" % log_file[0]
+ file = open(log_file[0], 'r')
+ log = file.read()
+ file.close();
+ else:
+ print >> debug_file, "No log file found for the glob"
+ log = None
+
+ (bug_open, bug_number) = bugzilla_find_bug_report(debug_file, server, args.copy(), bugname)
+ print >> debug_file, "Bug is open: %s and bug number: %s" % (bug_open, bug_number)
+
+ # The bug is present and still open, attach an error log
+ if not bug_number:
+ bug_number = bugzilla_file_bug(debug_file, server, args.copy(), bugname, text, version)
+ if not bug_number:
+ print >> debug_file, "Couldn't acquire a new bug_numer, filing a bugreport failed"
+ else:
+ print >> debug_file, "The new bug_number: '%s'" % bug_number
+ elif not bug_open:
+ if not bugzilla_reopen_bug(debug_file, server, args.copy(), bug_number):
+ print >> debug_file, "Failed to reopen the bug #%s" % bug_number
+ else:
+ print >> debug_file, "Reopened the bug #%s" % bug_number
+
+ if bug_number and log:
+ print >> debug_file, "The bug is known as '%s'" % bug_number
+ desc = "Build log for machine %s" % (bb.data.getVar('MACHINE', data, True))
+ if not bugzilla_create_attachment(debug_file, server, args.copy(), bug_number, text, log_file[0], log, desc):
+ print >> debug_file, "Failed to attach the build log for bug #%s" % bug_number
+ else:
+ print >> debug_file, "Created an attachment for '%s' '%s' '%s'" % (product, compon, bug_number)
+ else:
+ print >> debug_file, "Not trying to create an attachment for bug #%s" % bug_number
+ if not bugzilla_add_comment(debug_file, server, args.copy(), bug_number, text, ):
+ print >> debug_file, "Failed to create a comment the build log for bug #%s" % bug_number
+ else:
+ print >> debug_file, "Created an attachment for '%s' '%s' '%s'" % (product, compon, bug_number)
+
+ # store bug number for oestats-client
+ if bug_number:
+ bb.data.setVar('OESTATS_BUG_NUMBER', bug_number, data)
+}
+
--
1.7.2.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/3] icecc-create-env: a tool to create icecc toolchain tarballs
2011-09-16 6:55 [PATCH 1/3] icecc-create-env: a tool to create icecc toolchain tarballs Dmitry Eremin-Solenikov
2011-09-16 6:55 ` [PATCH 2/3] icecc.bbclass: replace with updated version Dmitry Eremin-Solenikov
2011-09-16 6:55 ` [PATCH 3/3] bugzilla.bbclass: add a class to report build problems to bugzilla Dmitry Eremin-Solenikov
@ 2011-09-16 16:35 ` Richard Purdie
2 siblings, 0 replies; 4+ messages in thread
From: Richard Purdie @ 2011-09-16 16:35 UTC (permalink / raw)
To: Patches and discussions about the oe-core layer; +Cc: Dmitry Eremin-Solenikov
On Fri, 2011-09-16 at 10:55 +0400, Dmitry Eremin-Solenikov wrote:
> IceCC needs tarballs with toolchains to work correctly. This is a
> version largely based on one from org.openembedded.dev, plus a patch to
> support recent compilers, LTO, etc.
>
> Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
> ---
> .../icecc-create-env/icecc-lto-update.patch | 103 ++++++++++++++++++++
> .../icecc-create-env/icecc-create-env_0.1.bb | 29 ++++++
> 2 files changed, 132 insertions(+), 0 deletions(-)
> create mode 100644 meta/recipes-devtools/icecc-create-env/icecc-create-env/icecc-lto-update.patch
> create mode 100644 meta/recipes-devtools/icecc-create-env/icecc-create-env_0.1.bb
Merged to master, thanks (along with patches 2 and 3)
Cheers,
Richard
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-09-16 16:41 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-16 6:55 [PATCH 1/3] icecc-create-env: a tool to create icecc toolchain tarballs Dmitry Eremin-Solenikov
2011-09-16 6:55 ` [PATCH 2/3] icecc.bbclass: replace with updated version Dmitry Eremin-Solenikov
2011-09-16 6:55 ` [PATCH 3/3] bugzilla.bbclass: add a class to report build problems to bugzilla Dmitry Eremin-Solenikov
2011-09-16 16:35 ` [PATCH 1/3] icecc-create-env: a tool to create icecc toolchain tarballs Richard Purdie
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.