diff mbox

[v3,03/14] Eliminate $(HOST_DIR)/usr

Message ID 20170704140404.4098-4-arnout@mind.be
State Accepted
Headers show

Commit Message

Arnout Vandecappelle July 4, 2017, 2:03 p.m. UTC
We currently use $(HOST_DIR)/usr as the prefix for host packages. That
has a few disadvantages:

- There are some things installed in $(HOST_DIR)/etc and
  $(HOST_DIR)/sbin, which is inconsistent.

- To pack a buildroot-built toolchain into a tarball for use as an
  external toolchain, you have to pack output/host/usr instead of the
  more obvious output/host.

- Because of the above, the internal toolchain wrapper breaks which
  forces us to work around it (call the actual toolchain executable
  directly). This is OK for us, but when used in another build system,
  that's a problem.

- Paths are four characters longer.

To allow us to gradually eliminate $(HOST_DIR)/usr while building
packages, replace it with a symlink to .

The symlinks from $(HOST_DIR)/usr/$(GNU_TARGET_NAME) and
$(HOST_DIR)/usr/lib that were added previously are removed again.

Note that the symlink creation will break when $(HOST_DIR)/usr
already exists as a directory, i.e. when rebuilding in an existing
output directory. This is necessary: if we don't break it now, the
following commits (which remove the usr part from various variables)
_will_ break it.

At the same time as creating this symlink, we have to update the
external toolchain wrapper and the external toolchain symlinks to go
one directory less up. Indeed, $(HOST_DIR) is one level less up than
it was before.

Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
---
I intended to also move $(HOST_DIR)/usr/bin in a separate patch, but
that turns out to break the internal toolchain: host-gcc-initial uses
relative paths to find cc1 etc. and these will be broken.
---
 Makefile                                               | 7 +++----
 toolchain/toolchain-external/pkg-toolchain-external.mk | 6 +++---
 toolchain/toolchain-wrapper.c                          | 2 +-
 3 files changed, 7 insertions(+), 8 deletions(-)

Comments

Romain Naour July 4, 2017, 3:01 p.m. UTC | #1
Hi Arnout,

Le 04/07/2017 à 16:03, Arnout Vandecappelle (Essensium/Mind) a écrit :
> We currently use $(HOST_DIR)/usr as the prefix for host packages. That
> has a few disadvantages:
> 
> - There are some things installed in $(HOST_DIR)/etc and
>   $(HOST_DIR)/sbin, which is inconsistent.
> 
> - To pack a buildroot-built toolchain into a tarball for use as an
>   external toolchain, you have to pack output/host/usr instead of the
>   more obvious output/host.
> 
> - Because of the above, the internal toolchain wrapper breaks which
>   forces us to work around it (call the actual toolchain executable
>   directly). This is OK for us, but when used in another build system,
>   that's a problem.
> 
> - Paths are four characters longer.
> 
> To allow us to gradually eliminate $(HOST_DIR)/usr while building
> packages, replace it with a symlink to .
> 
> The symlinks from $(HOST_DIR)/usr/$(GNU_TARGET_NAME) and
> $(HOST_DIR)/usr/lib that were added previously are removed again.
> 
> Note that the symlink creation will break when $(HOST_DIR)/usr
> already exists as a directory, i.e. when rebuilding in an existing
> output directory. This is necessary: if we don't break it now, the
> following commits (which remove the usr part from various variables)
> _will_ break it.
> 
> At the same time as creating this symlink, we have to update the
> external toolchain wrapper and the external toolchain symlinks to go
> one directory less up. Indeed, $(HOST_DIR) is one level less up than
> it was before.
> 
> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>

Reviewed-by: Romain Naour <romain.naour@smile.fr>

Best regards,
Romain

> ---
> I intended to also move $(HOST_DIR)/usr/bin in a separate patch, but
> that turns out to break the internal toolchain: host-gcc-initial uses
> relative paths to find cc1 etc. and these will be broken.
> ---
>  Makefile                                               | 7 +++----
>  toolchain/toolchain-external/pkg-toolchain-external.mk | 6 +++---
>  toolchain/toolchain-wrapper.c                          | 2 +-
>  3 files changed, 7 insertions(+), 8 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index ac349a79e8..7453bfd193 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -552,16 +552,15 @@ prepare: $(BUILD_DIR)/buildroot-config/auto.conf
>  .PHONY: world
>  world: target-post-image
>  
> -# When creating HOST_DIR, also symlink usr/lib -> ../lib
> +# When creating HOST_DIR, also symlink usr -> .
>  $(HOST_DIR):
> -	@mkdir -p $@/usr $@/lib
> -	@ln -snf ../lib $@/usr/lib
> +	@mkdir -p $@
> +	@ln -snf . $@/usr
>  
>  # Populating the staging with the base directories is handled by the skeleton package
>  $(STAGING_DIR): | $(HOST_DIR)
>  	@mkdir -p $(STAGING_DIR)
>  	@ln -snf $(STAGING_DIR) $(BASE_DIR)/staging
> -	@ln -snf ../$(GNU_TARGET_NAME) $(HOST_DIR)/usr/$(GNU_TARGET_NAME)
>  
>  RSYNC_VCS_EXCLUSIONS = \
>  	--exclude .svn --exclude .git --exclude .hg --exclude .bzr \
> diff --git a/toolchain/toolchain-external/pkg-toolchain-external.mk b/toolchain/toolchain-external/pkg-toolchain-external.mk
> index 8460e37d09..adbd3fe67e 100644
> --- a/toolchain/toolchain-external/pkg-toolchain-external.mk
> +++ b/toolchain/toolchain-external/pkg-toolchain-external.mk
> @@ -250,18 +250,18 @@ define TOOLCHAIN_EXTERNAL_INSTALL_WRAPPER
>  		base=$${i##*/}; \
>  		case "$$base" in \
>  		*-ar|*-ranlib|*-nm) \
> -			ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%../..%') .; \
> +			ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%..%') .; \
>  			;; \
>  		*cc|*cc-*|*++|*++-*|*cpp|*-gfortran) \
>  			ln -sf toolchain-wrapper $$base; \
>  			;; \
>  		*gdb|*gdbtui) \
>  			if test "$(BR2_PACKAGE_HOST_GDB)" != "y"; then \
> -				ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%../..%') .; \
> +				ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%..%') .; \
>  			fi \
>  			;; \
>  		*) \
> -			ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%../..%') .; \
> +			ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%..%') .; \
>  			;; \
>  		esac; \
>  	done
> diff --git a/toolchain/toolchain-wrapper.c b/toolchain/toolchain-wrapper.c
> index 100aa181c6..3a4455ff82 100644
> --- a/toolchain/toolchain-wrapper.c
> +++ b/toolchain/toolchain-wrapper.c
> @@ -178,7 +178,7 @@ int main(int argc, char **argv)
>  			perror(__FILE__ ": malloc");
>  			return 2;
>  		}
> -		sprintf(relbasedir, "%s/../..", argv[0]);
> +		sprintf(relbasedir, "%s/..", argv[0]);
>  		absbasedir = realpath(relbasedir, NULL);
>  	} else {
>  		basename = progpath;
>
diff mbox

Patch

diff --git a/Makefile b/Makefile
index ac349a79e8..7453bfd193 100644
--- a/Makefile
+++ b/Makefile
@@ -552,16 +552,15 @@  prepare: $(BUILD_DIR)/buildroot-config/auto.conf
 .PHONY: world
 world: target-post-image
 
-# When creating HOST_DIR, also symlink usr/lib -> ../lib
+# When creating HOST_DIR, also symlink usr -> .
 $(HOST_DIR):
-	@mkdir -p $@/usr $@/lib
-	@ln -snf ../lib $@/usr/lib
+	@mkdir -p $@
+	@ln -snf . $@/usr
 
 # Populating the staging with the base directories is handled by the skeleton package
 $(STAGING_DIR): | $(HOST_DIR)
 	@mkdir -p $(STAGING_DIR)
 	@ln -snf $(STAGING_DIR) $(BASE_DIR)/staging
-	@ln -snf ../$(GNU_TARGET_NAME) $(HOST_DIR)/usr/$(GNU_TARGET_NAME)
 
 RSYNC_VCS_EXCLUSIONS = \
 	--exclude .svn --exclude .git --exclude .hg --exclude .bzr \
diff --git a/toolchain/toolchain-external/pkg-toolchain-external.mk b/toolchain/toolchain-external/pkg-toolchain-external.mk
index 8460e37d09..adbd3fe67e 100644
--- a/toolchain/toolchain-external/pkg-toolchain-external.mk
+++ b/toolchain/toolchain-external/pkg-toolchain-external.mk
@@ -250,18 +250,18 @@  define TOOLCHAIN_EXTERNAL_INSTALL_WRAPPER
 		base=$${i##*/}; \
 		case "$$base" in \
 		*-ar|*-ranlib|*-nm) \
-			ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%../..%') .; \
+			ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%..%') .; \
 			;; \
 		*cc|*cc-*|*++|*++-*|*cpp|*-gfortran) \
 			ln -sf toolchain-wrapper $$base; \
 			;; \
 		*gdb|*gdbtui) \
 			if test "$(BR2_PACKAGE_HOST_GDB)" != "y"; then \
-				ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%../..%') .; \
+				ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%..%') .; \
 			fi \
 			;; \
 		*) \
-			ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%../..%') .; \
+			ln -sf $$(echo $$i | sed 's%^$(HOST_DIR)%..%') .; \
 			;; \
 		esac; \
 	done
diff --git a/toolchain/toolchain-wrapper.c b/toolchain/toolchain-wrapper.c
index 100aa181c6..3a4455ff82 100644
--- a/toolchain/toolchain-wrapper.c
+++ b/toolchain/toolchain-wrapper.c
@@ -178,7 +178,7 @@  int main(int argc, char **argv)
 			perror(__FILE__ ": malloc");
 			return 2;
 		}
-		sprintf(relbasedir, "%s/../..", argv[0]);
+		sprintf(relbasedir, "%s/..", argv[0]);
 		absbasedir = realpath(relbasedir, NULL);
 	} else {
 		basename = progpath;