Openembedded Core Discussions
 help / color / mirror / Atom feed
* [PATCH 1/2] bitbake: share source directory
       [not found] <cover.1307774199.git.liezhi.yang@windriver.com>
@ 2011-06-11  7:19 ` Robert Yang
  2011-06-11  7:19 ` [PATCH 2/2] Share gcc work directories Robert Yang
  1 sibling, 0 replies; 3+ messages in thread
From: Robert Yang @ 2011-06-11  7:19 UTC (permalink / raw)
  To: openembedded-core

This patch is derived from Richard, it is a quick proof of concept to
show how source code could be shared between recipes which use ${B} to
have a separate build directory compared to source directory ${S}.

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 bitbake/lib/bb/build.py    |    4 ++--
 bitbake/lib/bb/cache.py    |    3 +++
 bitbake/lib/bb/runqueue.py |   10 ++++++++++
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py
index 7947906..052a3bf 100644
--- a/bitbake/lib/bb/build.py
+++ b/bitbake/lib/bb/build.py
@@ -383,10 +383,10 @@ def stamp_internal(taskname, d, file_name):
         taskflagname = taskname.replace("_setscene", "")
 
     if file_name:
-        stamp = d.stamp[file_name]
+        stamp = d.stamp_base[file_name].get(taskflagname) or d.stamp[file_name]
         extrainfo = d.stamp_extrainfo[file_name].get(taskflagname) or ""
     else:
-        stamp = d.getVar('STAMP', True)
+        stamp = d.getVarFlag(taskflagname, 'stamp-base', True) or d.getVar('STAMP', True)
         file_name = d.getVar('BB_FILENAME', True)
         extrainfo = d.getVarFlag(taskflagname, 'stamp-extra-info', True) or ""
 
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py
index d4a16ad..10ef235 100644
--- a/bitbake/lib/bb/cache.py
+++ b/bitbake/lib/bb/cache.py
@@ -124,6 +124,7 @@ class CoreRecipeInfo(RecipeInfoCommon):
         self.broken = self.getvar('BROKEN', metadata)
         self.not_world = self.getvar('EXCLUDE_FROM_WORLD', metadata)
         self.stamp = self.getvar('STAMP', metadata)
+        self.stamp_base = self.flaglist('stamp-base', self.tasks, metadata)
         self.stamp_extrainfo = self.flaglist('stamp-extra-info', self.tasks, metadata)
         self.packages_dynamic = self.listvar('PACKAGES_DYNAMIC', metadata)
         self.depends          = self.depvar('DEPENDS', metadata)
@@ -151,6 +152,7 @@ class CoreRecipeInfo(RecipeInfoCommon):
         cachedata.pkg_dp = {}
 
         cachedata.stamp = {}
+        cachedata.stamp_base = {}
         cachedata.stamp_extrainfo = {}
         cachedata.fn_provides = {}
         cachedata.pn_provides = defaultdict(list)
@@ -183,6 +185,7 @@ class CoreRecipeInfo(RecipeInfoCommon):
         cachedata.pkg_pepvpr[fn] = (self.pe, self.pv, self.pr)
         cachedata.pkg_dp[fn] = self.defaultpref
         cachedata.stamp[fn] = self.stamp
+        cachedata.stamp_base[fn] = self.stamp_base
         cachedata.stamp_extrainfo[fn] = self.stamp_extrainfo
 
         provides = [self.pn]
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index af21eae..5ec69af 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -105,6 +105,11 @@ class RunQueueScheduler(object):
             if self.rq.runq_running[taskid] == 1:
                 continue
             if self.rq.runq_buildable[taskid] == 1:
+                fn = self.rqdata.taskData.fn_index[self.rqdata.runq_fnid[taskid]]
+                taskname = self.rqdata.runq_task[taskid]
+                stamp = bb.build.stampfile(taskname, self.rqdata.dataCache, fn)
+                if stamp in self.rq.build_stamps.values():
+                    continue
                 return taskid
 
     def next(self):
@@ -1009,6 +1014,7 @@ class RunQueueExecute:
         self.runq_complete = []
         self.build_pids = {}
         self.build_pipes = {}
+        self.build_stamps = {}
         self.failed_fnids = []
 
     def runqueue_process_waitpid(self):
@@ -1023,6 +1029,9 @@ class RunQueueExecute:
         del self.build_pids[result[0]]
         self.build_pipes[result[0]].close()
         del self.build_pipes[result[0]]
+        # self.build_stamps[result[0]] may not exist when use shared work directory.
+        if result[0] in self.build_stamps.keys():
+            del self.build_stamps[result[0]]
         if result[1] != 0:
             self.task_fail(task, result[1]>>8)
         else:
@@ -1319,6 +1328,7 @@ class RunQueueExecuteTasks(RunQueueExecute):
 
             self.build_pids[pid] = task
             self.build_pipes[pid] = runQueuePipe(pipein, pipeout, self.cfgData)
+            self.build_stamps[pid] = bb.build.stampfile(taskname, self.rqdata.dataCache, fn)
             self.runq_running[task] = 1
             self.stats.taskActive()
             if self.stats.active < self.number_tasks:
-- 
1.7.1




^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] Share gcc work directories
       [not found] <cover.1307774199.git.liezhi.yang@windriver.com>
  2011-06-11  7:19 ` [PATCH 1/2] bitbake: share source directory Robert Yang
@ 2011-06-11  7:19 ` Robert Yang
  2011-06-11  7:57   ` Richard Purdie
  1 sibling, 1 reply; 3+ messages in thread
From: Robert Yang @ 2011-06-11  7:19 UTC (permalink / raw)
  To: openembedded-core

This patched is derived from Richard, make gcc use the shared source
directory during the different building:

1) Make gcc-cross, gcc-cross-initial, gcc-cross-intermediate and
   gcc-runtime share the same source directory.

2) The source directory is ${TMPDIR}/work-shared/gcc-${PV}, for example:
   tmp/work-shared/gcc-4.6.0

3) gcc uses sed and creates config files against ${S} which means the
   directory should not be shared. Change the way to make it work.

4) Fix do_clean to clean the shared source directory and stamps

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 meta/recipes-devtools/gcc/gcc-common.inc           |   32 ++++++++++++++++++-
 meta/recipes-devtools/gcc/gcc-configure-common.inc |   10 +++++-
 2 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/meta/recipes-devtools/gcc/gcc-common.inc b/meta/recipes-devtools/gcc/gcc-common.inc
index a3fa234..7bf036c 100644
--- a/meta/recipes-devtools/gcc/gcc-common.inc
+++ b/meta/recipes-devtools/gcc/gcc-common.inc
@@ -37,10 +37,38 @@ ${GNU_MIRROR}/gcc/	http://gcc.get-software.com/releases/ \n \
 #
 gcclibdir = "${libdir}/gcc"
 BINV = "${PV}"
-S = "${WORKDIR}/gcc-${PV}"
-B = "${S}/build.${HOST_SYS}.${TARGET_SYS}"
+#S = "${WORKDIR}/gcc-${PV}"
+S = "${TMPDIR}/work-shared/gcc-${PV}/gcc-${PV}"
+B = "${WORKDIR}/gcc-${PV}/build.${HOST_SYS}.${TARGET_SYS}"
+
+# SS means Shared Stamps directory
+SS = "${TMPDIR}/stamps/work-shared/gcc-${PV}"
+do_fetch[stamp-base] = "${SS}"
+do_unpack[stamp-base] = "${SS}"
+do_patch[stamp-base] = "${SS}"
+
+# SW means Shared Work directory
+SW = "${TMPDIR}/work-shared/gcc-${PV}"
+WORKDIR_task-unpack = "${SW}"
+WORKDIR_task-patch = "${SW}"
 
 target_includedir ?= "${includedir}"
 target_libdir ?= "${libdir}"
 target_base_libdir ?= "${base_libdir}"
 target_prefix ?= "${prefix}"
+
+CLEANFUNCS += "workshared_clean"
+# The do_clean should be exclusive since share ${S}
+do_clean[lockfiles] = "${TMPDIR}/stamps/work-shared/gcc-${PV}.clean.lock"
+
+python workshared_clean () {
+	"""clear the source directory"""
+	dir = bb.data.expand("${SW}", d)
+	bb.note("Removing " + dir)
+	oe.path.remove(dir)
+
+	"""clear the the stamps in work-shared"""
+	dir = "%s.*" % bb.data.expand(d.getVarFlag('do_fetch', 'stamp-base', True), d)
+	bb.note("Removing " + dir)
+	oe.path.remove(dir)
+}
diff --git a/meta/recipes-devtools/gcc/gcc-configure-common.inc b/meta/recipes-devtools/gcc/gcc-configure-common.inc
index f7b5836..c32242d 100644
--- a/meta/recipes-devtools/gcc/gcc-configure-common.inc
+++ b/meta/recipes-devtools/gcc/gcc-configure-common.inc
@@ -87,7 +87,15 @@ do_configure () {
 	export ARCH_FLAGS_FOR_TARGET="${ARCH_FLAGS_FOR_TARGET}"
 	(cd ${S} && gnu-configize) || die "failure running gnu-configize"
 	
-	# teach gcc to find correct target includedir when checking libc ssp support
+	# teach gcc to find correct target includedir when checking libc ssp support,
+	# save the files before hack them, so that we can always hack the fresh one.
+	for i in configure.ac Makefile.in defaults.h configure; do
+		[ ! -f ${S}/gcc/$i.orig ] && cp ${S}/gcc/$i ${S}/gcc/$i.orig
+		cp ${S}/gcc/$i.orig ${S}/gcc/$i
+	done
+	# Make sure that ${S}/configure is newer than ${S}/gcc/configure to prevent
+	# auto run autoconf.
+	touch ${S}/configure
 	sed -i 's:^\([ 	]*\)glibc_header_dir=\"${with_build_sysroot}/usr/include\":\1glibc_header_dir=\"${with_build_sysroot}${SYSTEMHEADERS}\":g' ${S}/gcc/configure.ac
 	sed -i 's:^\([ 	]*\)glibc_header_dir=\"${with_build_sysroot}/usr/include\":\1glibc_header_dir=\"${with_build_sysroot}${SYSTEMHEADERS}\":g' ${S}/gcc/configure
 
-- 
1.7.1




^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH 2/2] Share gcc work directories
  2011-06-11  7:19 ` [PATCH 2/2] Share gcc work directories Robert Yang
@ 2011-06-11  7:57   ` Richard Purdie
  0 siblings, 0 replies; 3+ messages in thread
From: Richard Purdie @ 2011-06-11  7:57 UTC (permalink / raw)
  To: Patches and discussions about the oe-core layer

On Sat, 2011-06-11 at 15:19 +0800, Robert Yang wrote:
> This patched is derived from Richard, make gcc use the shared source
> directory during the different building:
> 
> 1) Make gcc-cross, gcc-cross-initial, gcc-cross-intermediate and
>    gcc-runtime share the same source directory.
> 
> 2) The source directory is ${TMPDIR}/work-shared/gcc-${PV}, for example:
>    tmp/work-shared/gcc-4.6.0
> 
> 3) gcc uses sed and creates config files against ${S} which means the
>    directory should not be shared. Change the way to make it work.
> 
> 4) Fix do_clean to clean the shared source directory and stamps
> 
> Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
> ---
>  meta/recipes-devtools/gcc/gcc-common.inc           |   32 ++++++++++++++++++-
>  meta/recipes-devtools/gcc/gcc-configure-common.inc |   10 +++++-
>  2 files changed, 39 insertions(+), 3 deletions(-)
> 
> diff --git a/meta/recipes-devtools/gcc/gcc-common.inc b/meta/recipes-devtools/gcc/gcc-common.inc
> index a3fa234..7bf036c 100644
> --- a/meta/recipes-devtools/gcc/gcc-common.inc
> +++ b/meta/recipes-devtools/gcc/gcc-common.inc
> @@ -37,10 +37,38 @@ ${GNU_MIRROR}/gcc/	http://gcc.get-software.com/releases/ \n \
>  #
>  gcclibdir = "${libdir}/gcc"
>  BINV = "${PV}"
> -S = "${WORKDIR}/gcc-${PV}"
> -B = "${S}/build.${HOST_SYS}.${TARGET_SYS}"
> +#S = "${WORKDIR}/gcc-${PV}"
> +S = "${TMPDIR}/work-shared/gcc-${PV}/gcc-${PV}"
> +B = "${WORKDIR}/gcc-${PV}/build.${HOST_SYS}.${TARGET_SYS}"
> +
> +# SS means Shared Stamps directory
> +SS = "${TMPDIR}/stamps/work-shared/gcc-${PV}"
> +do_fetch[stamp-base] = "${SS}"
> +do_unpack[stamp-base] = "${SS}"
> +do_patch[stamp-base] = "${SS}"
> +
> +# SW means Shared Work directory
> +SW = "${TMPDIR}/work-shared/gcc-${PV}"
> +WORKDIR_task-unpack = "${SW}"
> +WORKDIR_task-patch = "${SW}"
>  
>  target_includedir ?= "${includedir}"
>  target_libdir ?= "${libdir}"
>  target_base_libdir ?= "${base_libdir}"
>  target_prefix ?= "${prefix}"
> +
> +CLEANFUNCS += "workshared_clean"
> +# The do_clean should be exclusive since share ${S}
> +do_clean[lockfiles] = "${TMPDIR}/stamps/work-shared/gcc-${PV}.clean.lock"
> +
> +python workshared_clean () {
> +	"""clear the source directory"""
> +	dir = bb.data.expand("${SW}", d)
> +	bb.note("Removing " + dir)
> +	oe.path.remove(dir)
> +
> +	"""clear the the stamps in work-shared"""
> +	dir = "%s.*" % bb.data.expand(d.getVarFlag('do_fetch', 'stamp-base', True), d)
> +	bb.note("Removing " + dir)
> +	oe.path.remove(dir)
> +}
> diff --git a/meta/recipes-devtools/gcc/gcc-configure-common.inc b/meta/recipes-devtools/gcc/gcc-configure-common.inc
> index f7b5836..c32242d 100644
> --- a/meta/recipes-devtools/gcc/gcc-configure-common.inc
> +++ b/meta/recipes-devtools/gcc/gcc-configure-common.inc
> @@ -87,7 +87,15 @@ do_configure () {
>  	export ARCH_FLAGS_FOR_TARGET="${ARCH_FLAGS_FOR_TARGET}"
>  	(cd ${S} && gnu-configize) || die "failure running gnu-configize"
>  	
> -	# teach gcc to find correct target includedir when checking libc ssp support
> +	# teach gcc to find correct target includedir when checking libc ssp support,
> +	# save the files before hack them, so that we can always hack the fresh one.
> +	for i in configure.ac Makefile.in defaults.h configure; do
> +		[ ! -f ${S}/gcc/$i.orig ] && cp ${S}/gcc/$i ${S}/gcc/$i.orig
> +		cp ${S}/gcc/$i.orig ${S}/gcc/$i
> +	done
> +	# Make sure that ${S}/configure is newer than ${S}/gcc/configure to prevent
> +	# auto run autoconf.
> +	touch ${S}/configure
>  	sed -i 's:^\([ 	]*\)glibc_header_dir=\"${with_build_sysroot}/usr/include\":\1glibc_header_dir=\"${with_build_sysroot}${SYSTEMHEADERS}\":g' ${S}/gcc/configure.ac
>  	sed -i 's:^\([ 	]*\)glibc_header_dir=\"${with_build_sysroot}/usr/include\":\1glibc_header_dir=\"${with_build_sysroot}${SYSTEMHEADERS}\":g' ${S}/gcc/configure
>  

If I run something like a meta-toolchain build at the same time as a
target toolchain build, this isn't going to work. It will also break
when we start doing multilib builds with multiple toolchains as multiple
builds will use ${S} at once.

I think we're going to need to be able to influence these things we
currently set directly either from the configure commandline, or from
config files in ${B} instead of ${S}.

Cheers,

Richard




^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-06-11  8:01 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <cover.1307774199.git.liezhi.yang@windriver.com>
2011-06-11  7:19 ` [PATCH 1/2] bitbake: share source directory Robert Yang
2011-06-11  7:19 ` [PATCH 2/2] Share gcc work directories Robert Yang
2011-06-11  7:57   ` Richard Purdie

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox