Patchwork [RFC] fs/common.mk: Add support for fakeroot script

login
register
mail settings
Submitter Andrew Ruder
Date Oct. 15, 2013, 1:21 p.m.
Message ID <20131015132102.GA20116@gmail.com>
Download mbox | patch
Permalink /patch/283631/
State Rejected
Headers show

Comments

Andrew Ruder - Oct. 15, 2013, 1:21 p.m.
This adds a BR2_ROOTFS_FAKE_ROOT_SCRIPT (similar to
BR2_ROOTFS_POST_BUILD_SCRIPT and BR2_ROOTFS_POST_IMAGE_SCRIPT). This
script is called inside the fakeroot which allows the script to change
permissions, create device nodes, etc.

Signed-off-by: Andrew Ruder <andrew.ruder@elecsyscorp.com>
---
 I am using this script as part of a configuration that creates a bunch
 of directories that need to have specific ownership.  I can create
 the directories in a post-build script, but permissions needed to be
 done in a fakeroot environment.  Didn't see any other way to hook into
 the fakeroot.

 fs/common.mk     |  2 ++
 system/Config.in | 16 +++++++++++++++-
 2 files changed, 17 insertions(+), 1 deletion(-)
Thomas Petazzoni - Oct. 15, 2013, 2:19 p.m.
Dear Andrew Ruder,

On Tue, 15 Oct 2013 08:21:02 -0500, Andrew Ruder wrote:
> This adds a BR2_ROOTFS_FAKE_ROOT_SCRIPT (similar to

Should be FAKEROOT, not FAKE_ROOT (if we validate the whole proposal
this patch is doing).

> BR2_ROOTFS_POST_BUILD_SCRIPT and BR2_ROOTFS_POST_IMAGE_SCRIPT). This
> script is called inside the fakeroot which allows the script to change
> permissions, create device nodes, etc.
> 
> Signed-off-by: Andrew Ruder <andrew.ruder@elecsyscorp.com>
> ---
>  I am using this script as part of a configuration that creates a bunch
>  of directories that need to have specific ownership.  I can create
>  the directories in a post-build script, but permissions needed to be
>  done in a fakeroot environment.  Didn't see any other way to hook into
>  the fakeroot.

Well, the conventional way would be to have those directories created
by packages (and they can use the <pkg>_PERMISSIONS mechanism to get
proper ownership or permissions). Or, if they really don't belong to
any package, create them in the post build script, and have a device
table assign the permission and ownership.

Thomas
Andrew Ruder - Oct. 18, 2013, 8:23 p.m.
On Tue, Oct 15, 2013 at 04:19:41PM +0200, Thomas Petazzoni wrote:
> Well, the conventional way would be to have those directories created
> by packages (and they can use the <pkg>_PERMISSIONS mechanism to get
> proper ownership or permissions). Or, if they really don't belong to
> any package, create them in the post build script, and have a device
> table assign the permission and ownership.

I didn't realize the device table functionality could modify arbitrary
file/directory ownerships but looking through the makedevs source code
that DOES appear to be true.  I guess let's just consider this thread as
a question disguised as a poorly spelled patch. :)

Cheers,
Andy
Yann E. MORIN - Oct. 18, 2013, 8:49 p.m.
Andrew, All,

On 2013-10-18 15:23 -0500, Andrew Ruder spake thusly:
> On Tue, Oct 15, 2013 at 04:19:41PM +0200, Thomas Petazzoni wrote:
> > Well, the conventional way would be to have those directories created
> > by packages (and they can use the <pkg>_PERMISSIONS mechanism to get
> > proper ownership or permissions). Or, if they really don't belong to
> > any package, create them in the post build script, and have a device
> > table assign the permission and ownership.
> 
> I didn't realize the device table functionality could modify arbitrary
> file/directory ownerships but looking through the makedevs source code
> that DOES appear to be true.

Or you could have had a look at the manual:
    http://buildroot.net/downloads/manual/manual.html#makedev-syntax

The first sentence in this section reads:
    The makedev syntax is used in several places in Buildroot to define
    changes to be made for permissions. [...]

Regards,
Yann E. MORIN.
Andrew Ruder - Oct. 18, 2013, 9:35 p.m.
On Fri, Oct 18, 2013 at 10:49:20PM +0200, Yann E. MORIN wrote:
> Or you could have had a look at the manual:
>     http://buildroot.net/downloads/manual/manual.html#makedev-syntax
> 
> The first sentence in this section reads:

Yes, taken out of context it looks perfect, but put the whole sentence
in there and it sounds like it is specifically for device node creation.

> The makedev syntax is used in several places in Buildroot to define
> changes to be made for permissions, or which device files to create
> and how to create them, ***in order to avoid calls to mknod.***

Emphasis mine, of course.

- Andy
Yann E. MORIN - Oct. 18, 2013, 10:07 p.m.
Andrew, All,

On 2013-10-18 16:35 -0500, Andrew Ruder spake thusly:
> On Fri, Oct 18, 2013 at 10:49:20PM +0200, Yann E. MORIN wrote:
> > Or you could have had a look at the manual:
> >     http://buildroot.net/downloads/manual/manual.html#makedev-syntax
> > 
> > The first sentence in this section reads:
> 
> Yes, taken out of context it looks perfect, but put the whole sentence
> in there and it sounds like it is specifically for device node creation.
> 
> > The makedev syntax is used in several places in Buildroot to define
> > changes to be made for permissions, or which device files to create
> > and how to create them, ***in order to avoid calls to mknod.***
> 
> Emphasis mine, of course.

OK, maybe previous knowledge of the features makes me read the section
in a way that makes it explicit for me. It might not look the same to
others. Then, perhaps you could provide a better wording for this? ;-)

Regards,
Yann E. MORIN.
Arnout Vandecappelle - Oct. 27, 2013, 9:30 a.m.
On 15/10/13 15:21, Andrew Ruder wrote:
> This adds a BR2_ROOTFS_FAKE_ROOT_SCRIPT (similar to
> BR2_ROOTFS_POST_BUILD_SCRIPT and BR2_ROOTFS_POST_IMAGE_SCRIPT). This
> script is called inside the fakeroot which allows the script to change
> permissions, create device nodes, etc.
>
> Signed-off-by: Andrew Ruder <andrew.ruder@elecsyscorp.com>
> ---
>   I am using this script as part of a configuration that creates a bunch
>   of directories that need to have specific ownership.  I can create
>   the directories in a post-build script, but permissions needed to be
>   done in a fakeroot environment.  Didn't see any other way to hook into
>   the fakeroot.

  Hi Andrew,

  At the buildroot developer meeting we decided to drop this patch. For 
your particular use case, there is a better way to do it with 
<pkg>_PERMISSIONS or with the device table. We also discussed other use 
cases, like doing an rsync inside the fakeroot, but these use cases can 
just untar the tarball in a post-image script and work on that. And 
finally, having all these different POST_xxx steps makes things confusing.

  If you still see a reason to add this feature, don't hesitate to tell us.

  Regards,
  Arnout

Patch

diff --git a/fs/common.mk b/fs/common.mk
index 4dab7ea..dfcc647 100644
--- a/fs/common.mk
+++ b/fs/common.mk
@@ -58,6 +58,8 @@  endif
 endif
 	printf '$(subst $(sep),\n,$(PACKAGES_USERS))' > $(USERS_TABLE)
 	$(TOPDIR)/support/scripts/mkusers $(USERS_TABLE) $(TARGET_DIR) >> $(FAKEROOT_SCRIPT)
+	$$(foreach s, $$(call qstrip,$$(BR2_ROOTFS_FAKE_ROOT_SCRIPT)), \
+		echo $$(s) $$(TARGET_DIR) $$(call qstrip,$$(BR2_ROOTFS_POST_SCRIPT_ARGS)) "|| exit"  >> $$(FAKEROOT_SCRIPT)$$(sep))
 	echo "$$(ROOTFS_$(2)_CMD)" >> $$(FAKEROOT_SCRIPT)
 	chmod a+x $$(FAKEROOT_SCRIPT)
 	$$(HOST_DIR)/usr/bin/fakeroot -- $$(FAKEROOT_SCRIPT)
diff --git a/system/Config.in b/system/Config.in
index 4c80087..ef9c689 100644
--- a/system/Config.in
+++ b/system/Config.in
@@ -312,9 +312,23 @@  config BR2_ROOTFS_POST_IMAGE_SCRIPT
 	  first argument. The script is executed from the main Buildroot
 	  source directory as the current directory.
 
+config BR2_ROOTFS_FAKE_ROOT_SCRIPT
+	string "Custom scripts to run during fakeroot image creation"
+	default ""
+	help
+	  Specify a space-separated list of scripts to be run after the build
+	  has finished at the end of the fakeroot filesystem image creation.
+
+	  This gives a final chance to change permissions, create device
+	  nodes, etc.
+
+	  These scripts are called with the target directory name as first
+	  argument. Make sure the exit code of those scripts are 0, otherwise
+	  make will stop after calling them.
+
 config BR2_ROOTFS_POST_SCRIPT_ARGS
 	string "Extra post-{build,image} arguments"
-	depends on BR2_ROOTFS_POST_BUILD_SCRIPT != "" || BR2_ROOTFS_POST_IMAGE_SCRIPT != ""
+	depends on BR2_ROOTFS_POST_BUILD_SCRIPT != "" || BR2_ROOTFS_POST_IMAGE_SCRIPT != "" || BR2_ROOTFS_FAKE_ROOT_SCRIPT != ""
 	help
 	  Pass these aditional arguments to each post-build or post-image
 	  scripts.