diff mbox

[1,of,3,v2] infra: support buildroot being located in /usr

Message ID 2969a1777632f4df4615.1403291464@localhost
State Superseded
Headers show

Commit Message

Thomas De Schampheleire June 20, 2014, 7:11 p.m. UTC
pkg-generic and pkg-autotools both perform sed replacements of /usr to
$(STAGING_DIR)/usr, in .pc and .la files respectively. However, if buildroot
itself is located in /usr, then STAGING_DIR also starts with /usr, and naive
replacements of '/usr' can result in paths of the form:
    /usr/buildroot/.../sysroot/usr/buildroot/.../sysroot/...

This patch makes the replacements more careful, by first replacing the known
paths BASE_DIR and STAGING_DIR to tokens, then performing the actual
replacement, and finally replacing the tokens with the corresponding paths.

Additionally it removes the unnecessary making of a backup copy in
pkg-autotools.

Partially fixes bug #5750 (https://bugs.busybox.net/show_bug.cgi?id=5750)

Partially-based-on-a-patch-from: Ben Stoltz <benstoltz@gmail.com>
Signed-off-by: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>

---
v2: s/Jeremy Kerr/Ben Stoltz/

 package/pkg-autotools.mk |   8 ++++++--
 package/pkg-generic.mk   |  10 +++++++---
 2 files changed, 13 insertions(+), 5 deletions(-)

Comments

Arnout Vandecappelle June 20, 2014, 11:09 p.m. UTC | #1
On 20/06/14 21:11, Thomas De Schampheleire wrote:
> pkg-generic and pkg-autotools both perform sed replacements of /usr to
> $(STAGING_DIR)/usr, in .pc and .la files respectively. However, if buildroot
> itself is located in /usr, then STAGING_DIR also starts with /usr, and naive
> replacements of '/usr' can result in paths of the form:
>     /usr/buildroot/.../sysroot/usr/buildroot/.../sysroot/...
> 
> This patch makes the replacements more careful, by first replacing the known
> paths BASE_DIR and STAGING_DIR to tokens, then performing the actual
> replacement, and finally replacing the tokens with the corresponding paths.
> 
> Additionally it removes the unnecessary making of a backup copy in
> pkg-autotools.
> 
> Partially fixes bug #5750 (https://bugs.busybox.net/show_bug.cgi?id=5750)
> 
> Partially-based-on-a-patch-from: Ben Stoltz <benstoltz@gmail.com>
> Signed-off-by: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
> 
> ---
> v2: s/Jeremy Kerr/Ben Stoltz/
> 
>  package/pkg-autotools.mk |   8 ++++++--
>  package/pkg-generic.mk   |  10 +++++++---
>  2 files changed, 13 insertions(+), 5 deletions(-)
> 
> diff -r a59338f65a46 -r 2969a1777632 package/pkg-autotools.mk
> --- a/package/pkg-autotools.mk	Wed Jun 18 20:22:00 2014 +0400
> +++ b/package/pkg-autotools.mk	Fri Jun 20 21:09:35 2014 +0200
> @@ -268,8 +268,12 @@
>  define $(2)_INSTALL_STAGING_CMDS
>  	$$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_INSTALL_STAGING_OPT) -C $$($$(PKG)_SRCDIR)
>  	for i in $$$$(find $$(STAGING_DIR)/usr/lib* -name "*.la"); do \
> -		cp -f $$$$i $$$$i~; \
> -		$$(SED) "s:\(['= ]\)/usr:\\1$$(STAGING_DIR)/usr:g" $$$$i; \
> +		$$(SED) "s:$$(BASE_DIR):@BASE_DIR@:g" \
> +			-e "s:$$(STAGING_DIR):@STAGING_DIR@:g" \

 STAGING_DIR contains BASE_DIR, so this second expression will never match
anymore, no? It would match if you swap the two expressions, but there is not
much reason I think.

 But don't let that stop this patch. So:

Reviewed-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>


> +			-e "s:\(['= ]\)/usr:\\1@STAGING_DIR@/usr:g" \
> +			-e "s:@STAGING_DIR@:$$(STAGING_DIR):g" \
> +			-e "s:@BASE_DIR@:$$(BASE_DIR):g" \
> +			$$$$i; \
>  	done
>  endef
>  endif
> diff -r a59338f65a46 -r 2969a1777632 package/pkg-generic.mk
> --- a/package/pkg-generic.mk	Wed Jun 18 20:22:00 2014 +0400
> +++ b/package/pkg-generic.mk	Fri Jun 20 21:09:35 2014 +0200
> @@ -201,9 +201,13 @@
>  	$(foreach hook,$($(PKG)_POST_INSTALL_STAGING_HOOKS),$(call $(hook))$(sep))
>  	$(Q)if test -n "$($(PKG)_CONFIG_SCRIPTS)" ; then \
>  		$(call MESSAGE,"Fixing package configuration files") ;\
> -			$(SED)  "s,^\(exec_\)\?prefix=.*,\1prefix=$(STAGING_DIR)/usr,g" \
> -				-e "s,-I/usr/,-I$(STAGING_DIR)/usr/,g" \
> -				-e "s,-L/usr/,-L$(STAGING_DIR)/usr/,g" \
> +			$(SED)  "s,$(BASE_DIR),@BASE_DIR@,g" \
> +				-e "s,$(STAGING_DIR),@STAGING_DIR@,g" \
> +				-e "s,^\(exec_\)\?prefix=.*,\1prefix=@STAGING_DIR@/usr,g" \
> +				-e "s,-I/usr/,-I@STAGING_DIR@/usr/,g" \
> +				-e "s,-L/usr/,-L@STAGING_DIR@/usr/,g" \
> +				-e "s,@STAGING_DIR@,$(STAGING_DIR),g" \
> +				-e "s,@BASE_DIR@,$(BASE_DIR),g" \
>  				$(addprefix $(STAGING_DIR)/usr/bin/,$($(PKG)_CONFIG_SCRIPTS)) ;\
>  	fi
>  	$(Q)touch $@
> _______________________________________________
> buildroot mailing list
> buildroot@busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
>
Thomas De Schampheleire June 21, 2014, 9:04 a.m. UTC | #2
On Sat, Jun 21, 2014 at 1:09 AM, Arnout Vandecappelle <arnout@mind.be> wrote:
> On 20/06/14 21:11, Thomas De Schampheleire wrote:
>> pkg-generic and pkg-autotools both perform sed replacements of /usr to
>> $(STAGING_DIR)/usr, in .pc and .la files respectively. However, if buildroot
>> itself is located in /usr, then STAGING_DIR also starts with /usr, and naive
>> replacements of '/usr' can result in paths of the form:
>>     /usr/buildroot/.../sysroot/usr/buildroot/.../sysroot/...
>>
>> This patch makes the replacements more careful, by first replacing the known
>> paths BASE_DIR and STAGING_DIR to tokens, then performing the actual
>> replacement, and finally replacing the tokens with the corresponding paths.
>>
>> Additionally it removes the unnecessary making of a backup copy in
>> pkg-autotools.
>>
>> Partially fixes bug #5750 (https://bugs.busybox.net/show_bug.cgi?id=5750)
>>
>> Partially-based-on-a-patch-from: Ben Stoltz <benstoltz@gmail.com>
>> Signed-off-by: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
>>
>> ---
>> v2: s/Jeremy Kerr/Ben Stoltz/
>>
>>  package/pkg-autotools.mk |   8 ++++++--
>>  package/pkg-generic.mk   |  10 +++++++---
>>  2 files changed, 13 insertions(+), 5 deletions(-)
>>
>> diff -r a59338f65a46 -r 2969a1777632 package/pkg-autotools.mk
>> --- a/package/pkg-autotools.mk        Wed Jun 18 20:22:00 2014 +0400
>> +++ b/package/pkg-autotools.mk        Fri Jun 20 21:09:35 2014 +0200
>> @@ -268,8 +268,12 @@
>>  define $(2)_INSTALL_STAGING_CMDS
>>       $$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_INSTALL_STAGING_OPT) -C $$($$(PKG)_SRCDIR)
>>       for i in $$$$(find $$(STAGING_DIR)/usr/lib* -name "*.la"); do \
>> -             cp -f $$$$i $$$$i~; \
>> -             $$(SED) "s:\(['= ]\)/usr:\\1$$(STAGING_DIR)/usr:g" $$$$i; \
>> +             $$(SED) "s:$$(BASE_DIR):@BASE_DIR@:g" \
>> +                     -e "s:$$(STAGING_DIR):@STAGING_DIR@:g" \
>
>  STAGING_DIR contains BASE_DIR, so this second expression will never match
> anymore, no? It would match if you swap the two expressions, but there is not
> much reason I think.

I originally had the STAGING_DIR token alone, but it caused a problem
still. Then I took over the BASE_DIR expression from Ben Stoltz'
patch, which also kept the STAGING_DIR.
I think you are right that only the BASE_DIR replacement is needed.
After all, this is where the problematic /usr is. I will try this out
for simplicity's sake...

Thanks,
Thomas
diff mbox

Patch

diff -r a59338f65a46 -r 2969a1777632 package/pkg-autotools.mk
--- a/package/pkg-autotools.mk	Wed Jun 18 20:22:00 2014 +0400
+++ b/package/pkg-autotools.mk	Fri Jun 20 21:09:35 2014 +0200
@@ -268,8 +268,12 @@ 
 define $(2)_INSTALL_STAGING_CMDS
 	$$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_INSTALL_STAGING_OPT) -C $$($$(PKG)_SRCDIR)
 	for i in $$$$(find $$(STAGING_DIR)/usr/lib* -name "*.la"); do \
-		cp -f $$$$i $$$$i~; \
-		$$(SED) "s:\(['= ]\)/usr:\\1$$(STAGING_DIR)/usr:g" $$$$i; \
+		$$(SED) "s:$$(BASE_DIR):@BASE_DIR@:g" \
+			-e "s:$$(STAGING_DIR):@STAGING_DIR@:g" \
+			-e "s:\(['= ]\)/usr:\\1@STAGING_DIR@/usr:g" \
+			-e "s:@STAGING_DIR@:$$(STAGING_DIR):g" \
+			-e "s:@BASE_DIR@:$$(BASE_DIR):g" \
+			$$$$i; \
 	done
 endef
 endif
diff -r a59338f65a46 -r 2969a1777632 package/pkg-generic.mk
--- a/package/pkg-generic.mk	Wed Jun 18 20:22:00 2014 +0400
+++ b/package/pkg-generic.mk	Fri Jun 20 21:09:35 2014 +0200
@@ -201,9 +201,13 @@ 
 	$(foreach hook,$($(PKG)_POST_INSTALL_STAGING_HOOKS),$(call $(hook))$(sep))
 	$(Q)if test -n "$($(PKG)_CONFIG_SCRIPTS)" ; then \
 		$(call MESSAGE,"Fixing package configuration files") ;\
-			$(SED)  "s,^\(exec_\)\?prefix=.*,\1prefix=$(STAGING_DIR)/usr,g" \
-				-e "s,-I/usr/,-I$(STAGING_DIR)/usr/,g" \
-				-e "s,-L/usr/,-L$(STAGING_DIR)/usr/,g" \
+			$(SED)  "s,$(BASE_DIR),@BASE_DIR@,g" \
+				-e "s,$(STAGING_DIR),@STAGING_DIR@,g" \
+				-e "s,^\(exec_\)\?prefix=.*,\1prefix=@STAGING_DIR@/usr,g" \
+				-e "s,-I/usr/,-I@STAGING_DIR@/usr/,g" \
+				-e "s,-L/usr/,-L@STAGING_DIR@/usr/,g" \
+				-e "s,@STAGING_DIR@,$(STAGING_DIR),g" \
+				-e "s,@BASE_DIR@,$(BASE_DIR),g" \
 				$(addprefix $(STAGING_DIR)/usr/bin/,$($(PKG)_CONFIG_SCRIPTS)) ;\
 	fi
 	$(Q)touch $@