[Buildroot] Issue with the HOST_DIR/usr -> HOST_DIR move

Yann E. MORIN yann.morin.1998 at free.fr
Sun Jul 9 19:44:08 UTC 2017


Arnout, All,

On 2017-07-09 21:30 +0200, Arnout Vandecappelle spake thusly:
> On 09-07-17 18:25, Thomas Petazzoni wrote:
> > Hello Arnout,
> > 
> > I've started rebuilding the pre-built Buildroot external toolchains
> > after the HOST_DIR/usr -> HOST_DIR move. I've dropped my hack on the
> > toolchain wrapper to support the fact that I was moving the toolchain
> > out of the usr/ folder... because obviously this is no longer needed.
> > So basically, I'm building on top of master + a patch that builds
> > host-flex, host-gmp, host-mpc, etc. as static libraries instead of
> > shared ones.
> > 
> > Using this defconfig:
> > 
> > BR2_arm=y
> > BR2_HOST_DIR="/opt/br-arm-full-2017.05-1071-gef605f5"
> > BR2_JLEVEL=16
> > BR2_KERNEL_HEADERS_3_10=y
> > BR2_TOOLCHAIN_BUILDROOT_LOCALE=y
> > BR2_GCC_VERSION_4_9_X=y
> > BR2_TOOLCHAIN_BUILDROOT_CXX=y
> > BR2_INIT_NONE=y
> > BR2_SYSTEM_BIN_SH_NONE=y
> > # BR2_PACKAGE_BUSYBOX is not set
> > # BR2_TARGET_ROOTFS_TAR is not set
> > 
> > I'm seeing this build failure:
> > 
> > ESC[7m>>> uclibc 1.0.25 BuildingESC[27m
> > /usr/bin/make -j16 -C /opt/toolchain-build/build/uclibc-1.0.25 ARCH="arm" CROSS_COMPILE="/opt/br-arm-full-2017.05-1071-gef605f5/bin/arm-buildroot-linux-uclibcgnueabi-" UCLIBC_EXTRA_CFLAGS=" " HOSTCC="/usr/bin/gcc" headers
> > /opt/br-arm-full-2017.05-1071-gef605f5/usr/bin/arm-buildroot-linux-uclibcgnueabi-gcc.br_real: No such file or directory
> > /opt/br-arm-full-2017.05-1071-gef605f5/usr/bin/arm-buildroot-linux-uclibcgnueabi-gcc.br_real: No such file or directory
> > /opt/br-arm-full-2017.05-1071-gef605f5/usr/bin/arm-buildroot-linux-uclibcgnueabi-gcc.br_real: No such file or directory
> > /opt/br-arm-full-2017.05-1071-gef605f5/usr/bin/arm-buildroot-linux-uclibcgnueabi-gcc.br_real: No such file or directory
> > make[1]: Entering directory `/opt/toolchain-build/build/uclibc-1.0.25'
> >   MKDIR include/bits
> >   GEN include/bits/uClibc_config.h
> > /opt/br-arm-full-2017.05-1071-gef605f5/usr/bin/arm-buildroot-linux-uclibcgnueabi-gcc.br_real: No such file or directory
> > /opt/br-arm-full-2017.05-1071-gef605f5/usr/bin/arm-buildroot-linux-uclibcgnueabi-gcc.br_real: No such file or directory
> > /opt/br-arm-full-2017.05-1071-gef605f5/usr/bin/arm-buildroot-linux-uclibcgnueabi-gcc.br_real: No such file or directory
> > /opt/br-arm-full-2017.05-1071-gef605f5/usr/bin/arm-buildroot-linux-uclibcgnueabi-gcc.br_real: No such file or directory
> >   LN include/semaphore.h
> >   LN include/pthread.h
> >   LN include/bits/libc-lock.h
> >   LN include/bits/stdio-lock.h
> >   LN include/bits/pthreadtypes.h
> >   LN include/bits/semaphore.h
> >   GEN include/bits/sysnum.h
> > /opt/br-arm-full-2017.05-1071-gef605f5/usr/bin/arm-buildroot-linux-uclibcgnueabi-gcc.br_real: No such file or directory
> > /opt/br-arm-full-2017.05-1071-gef605f5/usr/bin/arm-buildroot-linux-uclibcgnueabi-gcc.br_real: No such file or directory
> > 
> > There are two problems here:
> > 
> >  * First, the problem that $(HOST_DIR)/usr didn't exist. The reason is
> >    that you rule that creates $(HOST_DIR)/usr is only triggered if the
> >    Buildroot Makefile creates $(HOST_DIR). But when you're building a
> >    SDK inside /opt/foo/, therefore setting BR2_HOST_DIR=/opt/foo/, it's
> >    pretty likely that /opt/foo/ might exist before Buildroot gets
> >    triggered. In such a situation, your $(HOST_DIR) rule in the main
> >    Makefile doesn't get triggered, and $(HOST_DIR)/usr is not created.
> 
>  I never thought of that - I assumed that the HOST_DIR would always be created
> by Buildroot. But indeed it does make sense to install a toolchain in a
> pre-existing directory.
> 
>  There is one problem with that, though: in such a situation, it is also
> possible that the usr/ directory already exists, so we can't create the
> compatibility symlink. I guess we'll just have to live with that.
> 
>  I'll make an explicit rule for $(HOST_DIR)/usr to solve this.

I can totally understand the need to install in an existing directory,
but I don;t think we should accept that there is a usr/ directory in
there.

As far as I understand, we keep the compatibility usr/ as a symlink for
two reasons:

  - that a host-package accidentally wants to install stuff in usr/ and
    we missed that (e.g. for out-of-tree host-packages), but still want
    the build to succeed,

  - that existing users' post-build/fakeroot/image scripts still work
    without modification.

However, we do not add $(HOST_DIR)/usr/{s,}bin in the PATH, so an
existing usr/ directory would have the potential to break when a package
unexpectedly installs stuff therein, especially out-of-tree packages.
And in this case, the build is broken.

So I would argue that we should only accept to use an existing directory
if it is empty.

Regards,
Yann E. MORIN.

> >  * Even if the symlink doesn't exist, the build should still work.
> >    Indeed, the symlink was kept for backward compatibility reasons, but
> >    here I'm doing a full build from scratch, which I would expect to
> >    work even without the usr/ compatibility symlink.
> 
>  D'oh, this is really, really weird, I'm sure I looked at that piece of code
> when I made my initial version of the series, but apparently I didn't look at it
> again last week. There are still *three* references to $(HOST_DIR)/usr in
> toolchain-wrapper.c...
> 
> 
>  Regards,
>  Arnout
> 
> -- 
> Arnout Vandecappelle                          arnout at mind be
> Senior Embedded Software Architect            +32-16-286500
> Essensium/Mind                                http://www.mind.be
> G.Geenslaan 9, 3001 Leuven, Belgium           BE 872 984 063 RPR Leuven
> LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
> GPG fingerprint:  7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'



More information about the buildroot mailing list