From: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
To: openembedded-core@lists.openembedded.org
Cc: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Subject: [PATCH 2/3] icecc.bbclass: replace with updated version
Date: Fri, 16 Sep 2011 10:55:16 +0400 [thread overview]
Message-ID: <1316156117-22147-2-git-send-email-dbaryshkov@gmail.com> (raw)
In-Reply-To: <1316156117-22147-1-git-send-email-dbaryshkov@gmail.com>
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
next prev parent reply other threads:[~2011-09-16 7:00 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1316156117-22147-2-git-send-email-dbaryshkov@gmail.com \
--to=dbaryshkov@gmail.com \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.