Message ID | 1415919806-13005-2-git-send-email-romain.naour@openwide.fr |
---|---|
State | Rejected |
Headers | show |
Romain, All, On 2014-11-14 00:03 +0100, Romain Naour spake thusly: > With the Sourcery Codebench standard edition, the sysroot returned > point to a non existant directory if no CFLAGS are specified. I finally get to review this. Sorry for the long delay... :-( [--SNIP--] > Signed-off-by: Romain Naour <romain.naour@openwide.fr> > > --- > v3: no change > v2: new patch > --- > toolchain/toolchain-external/toolchain-external.mk | 28 +++++++++++++++------- > 1 file changed, 20 insertions(+), 8 deletions(-) > > diff --git a/toolchain/toolchain-external/toolchain-external.mk b/toolchain/toolchain-external/toolchain-external.mk > index da3718c..109af21 100644 > --- a/toolchain/toolchain-external/toolchain-external.mk > +++ b/toolchain/toolchain-external/toolchain-external.mk [--SNIP--] > @@ -443,6 +443,18 @@ define toolchain_find_libdir > $$(echo -n $(call toolchain_find_libc_a,$(1)) | sed -r -e 's:.*/(usr/)?(lib(32|64)?)/([^/]*/)?libc.a:\2:') > endef > > +# Returns the main sysroot location for the given compiler + flags > +# First, try to find the sysroot without flags. > +# If the sysroot path is empty/bogus then use the arch sysroot instead. > +define toolchain_find_sysroot > +$$(main_sysroot="$(call toolchain_find_arch_sysroot,$(1))"; \ > +if ! test -d $${main_sysroot}; then \ > + echo -n $(call toolchain_find_arch_sysroot,$(1), $(2)) ; \ > +else \ > + echo -n $${main_sysroot}; \ > +fi) Two comments: - we prefer positive logic, - we usually do not prepend a space before arguments to make macros. So: if test -d $${main_sysroot}; then \ echo -n $${main_sysroot}; \ else echo -n $(call toolchain_find_arch_sysroot,$(1),$(2)) ; \ fi > +endef > + > # Checks for an already installed toolchain: check the toolchain > # location, check that it supports sysroot, and then verify that it > # matches the configuration provided in Buildroot: ABI, C++ support, > @@ -450,13 +462,13 @@ endef > define TOOLCHAIN_EXTERNAL_CONFIGURE_CMDS > $(Q)$(call check_cross_compiler_exists,$(TOOLCHAIN_EXTERNAL_CC)) > $(Q)$(call check_unusable_toolchain,$(TOOLCHAIN_EXTERNAL_CC)) > - $(Q)SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC))" ; \ > + $(Q)SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC), $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ Ditto: no space in front of a macro argument. > if test -z "$${SYSROOT_DIR}" ; then \ > @echo "External toolchain doesn't support --sysroot. Cannot use." ; \ > exit 1 ; \ > fi ; \ > $(call check_kernel_headers_version,\ > - $(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC)),\ > + $(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC), $(TOOLCHAIN_EXTERNAL_CFLAGS)),\ Ditto: no space in front of a macro argument. > $(call qstrip,$(BR2_TOOLCHAIN_HEADERS_AT_LEAST))); \ > if test "$(BR2_arm)" = "y" ; then \ > $(call check_arm_abi,\ > @@ -539,12 +551,12 @@ endif > # to the target filesystem. > > define TOOLCHAIN_EXTERNAL_INSTALL_CORE > - $(Q)SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC))" ; \ > + $(Q)SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC), $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ Ditto: no space in front of a macro argument. > if test -z "$${SYSROOT_DIR}" ; then \ > @echo "External toolchain doesn't support --sysroot. Cannot use." ; \ > exit 1 ; \ > fi ; \ > - ARCH_SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC) $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ > + ARCH_SYSROOT_DIR="$(call toolchain_find_arch_sysroot,$(TOOLCHAIN_EXTERNAL_CC), $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ Ditto: no space in front of a macro argument. > ARCH_LIB_DIR="$(call toolchain_find_libdir,$(TOOLCHAIN_EXTERNAL_CC) $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ > SUPPORT_LIB_DIR="" ; \ > if test `find $${ARCH_SYSROOT_DIR} -name 'libstdc++.a' | wc -l` -eq 0 ; then \ > @@ -590,7 +602,7 @@ ifeq ($(BR2_BFIN_INSTALL_FDPIC_SHARED),y) > define TOOLCHAIN_EXTERNAL_INSTALL_BFIN_FDPIC > $(Q)$(call MESSAGE,"Install external toolchain FDPIC libraries to target...") ; \ > FDPIC_EXTERNAL_CC=$(dir $(TOOLCHAIN_EXTERNAL_CC))/../../bfin-linux-uclibc/bin/bfin-linux-uclibc-gcc ; \ > - FDPIC_SYSROOT_DIR="$(call toolchain_find_sysroot,$${FDPIC_EXTERNAL_CC} $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ > + FDPIC_SYSROOT_DIR="$(call toolchain_find_arch_sysroot,$${FDPIC_EXTERNAL_CC}, $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ Ditto: no space in front of a macro argument. Otherwise, looks OK. Regards, Yann E. MORIN.
Hi Yann, all, Le 28/11/2014 00:06, Yann E. MORIN a écrit : > Romain, All, > > On 2014-11-14 00:03 +0100, Romain Naour spake thusly: >> With the Sourcery Codebench standard edition, the sysroot returned >> point to a non existant directory if no CFLAGS are specified. > > I finally get to review this. Sorry for the long delay... :-( It's ok, thank you for your help :) > > [--SNIP--] >> Signed-off-by: Romain Naour <romain.naour@openwide.fr> >> >> --- >> v3: no change >> v2: new patch >> --- >> toolchain/toolchain-external/toolchain-external.mk | 28 +++++++++++++++------- >> 1 file changed, 20 insertions(+), 8 deletions(-) >> >> diff --git a/toolchain/toolchain-external/toolchain-external.mk b/toolchain/toolchain-external/toolchain-external.mk >> index da3718c..109af21 100644 >> --- a/toolchain/toolchain-external/toolchain-external.mk >> +++ b/toolchain/toolchain-external/toolchain-external.mk > [--SNIP--] >> @@ -443,6 +443,18 @@ define toolchain_find_libdir >> $$(echo -n $(call toolchain_find_libc_a,$(1)) | sed -r -e 's:.*/(usr/)?(lib(32|64)?)/([^/]*/)?libc.a:\2:') >> endef >> >> +# Returns the main sysroot location for the given compiler + flags >> +# First, try to find the sysroot without flags. >> +# If the sysroot path is empty/bogus then use the arch sysroot instead. >> +define toolchain_find_sysroot >> +$$(main_sysroot="$(call toolchain_find_arch_sysroot,$(1))"; \ >> +if ! test -d $${main_sysroot}; then \ >> + echo -n $(call toolchain_find_arch_sysroot,$(1), $(2)) ; \ >> +else \ >> + echo -n $${main_sysroot}; \ >> +fi) > > Two comments: > - we prefer positive logic, > - we usually do not prepend a space before arguments to make macros. > > So: > > if test -d $${main_sysroot}; then \ > echo -n $${main_sysroot}; \ > else > echo -n $(call toolchain_find_arch_sysroot,$(1),$(2)) ; \ > fi Fixed > >> +endef >> + >> # Checks for an already installed toolchain: check the toolchain >> # location, check that it supports sysroot, and then verify that it >> # matches the configuration provided in Buildroot: ABI, C++ support, >> @@ -450,13 +462,13 @@ endef >> define TOOLCHAIN_EXTERNAL_CONFIGURE_CMDS >> $(Q)$(call check_cross_compiler_exists,$(TOOLCHAIN_EXTERNAL_CC)) >> $(Q)$(call check_unusable_toolchain,$(TOOLCHAIN_EXTERNAL_CC)) >> - $(Q)SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC))" ; \ >> + $(Q)SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC), $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ > > Ditto: no space in front of a macro argument. Fixed > >> if test -z "$${SYSROOT_DIR}" ; then \ >> @echo "External toolchain doesn't support --sysroot. Cannot use." ; \ >> exit 1 ; \ >> fi ; \ >> $(call check_kernel_headers_version,\ >> - $(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC)),\ >> + $(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC), $(TOOLCHAIN_EXTERNAL_CFLAGS)),\ > > Ditto: no space in front of a macro argument. Fixed > >> $(call qstrip,$(BR2_TOOLCHAIN_HEADERS_AT_LEAST))); \ >> if test "$(BR2_arm)" = "y" ; then \ >> $(call check_arm_abi,\ >> @@ -539,12 +551,12 @@ endif >> # to the target filesystem. >> >> define TOOLCHAIN_EXTERNAL_INSTALL_CORE >> - $(Q)SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC))" ; \ >> + $(Q)SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC), $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ > > Ditto: no space in front of a macro argument. Fixed > >> if test -z "$${SYSROOT_DIR}" ; then \ >> @echo "External toolchain doesn't support --sysroot. Cannot use." ; \ >> exit 1 ; \ >> fi ; \ >> - ARCH_SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC) $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ >> + ARCH_SYSROOT_DIR="$(call toolchain_find_arch_sysroot,$(TOOLCHAIN_EXTERNAL_CC), $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ > > Ditto: no space in front of a macro argument. Fixed > >> ARCH_LIB_DIR="$(call toolchain_find_libdir,$(TOOLCHAIN_EXTERNAL_CC) $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ >> SUPPORT_LIB_DIR="" ; \ >> if test `find $${ARCH_SYSROOT_DIR} -name 'libstdc++.a' | wc -l` -eq 0 ; then \ >> @@ -590,7 +602,7 @@ ifeq ($(BR2_BFIN_INSTALL_FDPIC_SHARED),y) >> define TOOLCHAIN_EXTERNAL_INSTALL_BFIN_FDPIC >> $(Q)$(call MESSAGE,"Install external toolchain FDPIC libraries to target...") ; \ >> FDPIC_EXTERNAL_CC=$(dir $(TOOLCHAIN_EXTERNAL_CC))/../../bfin-linux-uclibc/bin/bfin-linux-uclibc-gcc ; \ >> - FDPIC_SYSROOT_DIR="$(call toolchain_find_sysroot,$${FDPIC_EXTERNAL_CC} $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ >> + FDPIC_SYSROOT_DIR="$(call toolchain_find_arch_sysroot,$${FDPIC_EXTERNAL_CC}, $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ > > Ditto: no space in front of a macro argument. Fixed > > Otherwise, looks OK. > > Regards, > Yann E. MORIN. > Best regards,
diff --git a/toolchain/toolchain-external/toolchain-external.mk b/toolchain/toolchain-external/toolchain-external.mk index da3718c..109af21 100644 --- a/toolchain/toolchain-external/toolchain-external.mk +++ b/toolchain/toolchain-external/toolchain-external.mk @@ -432,9 +432,9 @@ define toolchain_find_libc_a $$(readlink -f $$(LANG=C $(1) -print-file-name=libc.a)) endef -# Returns the sysroot location for the given compiler + flags -define toolchain_find_sysroot -$$(echo -n $(call toolchain_find_libc_a,$(1)) | sed -r -e 's:(usr/)?lib(32|64)?/([^/]*/)?libc\.a::') +# Returns the arch sysroot location for the given compiler + flags +define toolchain_find_arch_sysroot +$$(echo -n $(call toolchain_find_libc_a,$(1) $(2)) | sed -r -e 's:(usr/)?lib(32|64)?/([^/]*/)?libc\.a::') endef # Returns the lib subdirectory for the given compiler + flags (i.e @@ -443,6 +443,18 @@ define toolchain_find_libdir $$(echo -n $(call toolchain_find_libc_a,$(1)) | sed -r -e 's:.*/(usr/)?(lib(32|64)?)/([^/]*/)?libc.a:\2:') endef +# Returns the main sysroot location for the given compiler + flags +# First, try to find the sysroot without flags. +# If the sysroot path is empty/bogus then use the arch sysroot instead. +define toolchain_find_sysroot +$$(main_sysroot="$(call toolchain_find_arch_sysroot,$(1))"; \ +if ! test -d $${main_sysroot}; then \ + echo -n $(call toolchain_find_arch_sysroot,$(1), $(2)) ; \ +else \ + echo -n $${main_sysroot}; \ +fi) +endef + # Checks for an already installed toolchain: check the toolchain # location, check that it supports sysroot, and then verify that it # matches the configuration provided in Buildroot: ABI, C++ support, @@ -450,13 +462,13 @@ endef define TOOLCHAIN_EXTERNAL_CONFIGURE_CMDS $(Q)$(call check_cross_compiler_exists,$(TOOLCHAIN_EXTERNAL_CC)) $(Q)$(call check_unusable_toolchain,$(TOOLCHAIN_EXTERNAL_CC)) - $(Q)SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC))" ; \ + $(Q)SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC), $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ if test -z "$${SYSROOT_DIR}" ; then \ @echo "External toolchain doesn't support --sysroot. Cannot use." ; \ exit 1 ; \ fi ; \ $(call check_kernel_headers_version,\ - $(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC)),\ + $(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC), $(TOOLCHAIN_EXTERNAL_CFLAGS)),\ $(call qstrip,$(BR2_TOOLCHAIN_HEADERS_AT_LEAST))); \ if test "$(BR2_arm)" = "y" ; then \ $(call check_arm_abi,\ @@ -539,12 +551,12 @@ endif # to the target filesystem. define TOOLCHAIN_EXTERNAL_INSTALL_CORE - $(Q)SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC))" ; \ + $(Q)SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC), $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ if test -z "$${SYSROOT_DIR}" ; then \ @echo "External toolchain doesn't support --sysroot. Cannot use." ; \ exit 1 ; \ fi ; \ - ARCH_SYSROOT_DIR="$(call toolchain_find_sysroot,$(TOOLCHAIN_EXTERNAL_CC) $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ + ARCH_SYSROOT_DIR="$(call toolchain_find_arch_sysroot,$(TOOLCHAIN_EXTERNAL_CC), $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ ARCH_LIB_DIR="$(call toolchain_find_libdir,$(TOOLCHAIN_EXTERNAL_CC) $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ SUPPORT_LIB_DIR="" ; \ if test `find $${ARCH_SYSROOT_DIR} -name 'libstdc++.a' | wc -l` -eq 0 ; then \ @@ -590,7 +602,7 @@ ifeq ($(BR2_BFIN_INSTALL_FDPIC_SHARED),y) define TOOLCHAIN_EXTERNAL_INSTALL_BFIN_FDPIC $(Q)$(call MESSAGE,"Install external toolchain FDPIC libraries to target...") ; \ FDPIC_EXTERNAL_CC=$(dir $(TOOLCHAIN_EXTERNAL_CC))/../../bfin-linux-uclibc/bin/bfin-linux-uclibc-gcc ; \ - FDPIC_SYSROOT_DIR="$(call toolchain_find_sysroot,$${FDPIC_EXTERNAL_CC} $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ + FDPIC_SYSROOT_DIR="$(call toolchain_find_arch_sysroot,$${FDPIC_EXTERNAL_CC}, $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ FDPIC_LIB_DIR="$(call toolchain_find_libdir,$${FDPIC_EXTERNAL_CC} $(TOOLCHAIN_EXTERNAL_CFLAGS))" ; \ FDPIC_SUPPORT_LIB_DIR="" ; \ if test `find $${FDPIC_SYSROOT_DIR} -name 'libstdc++.a' | wc -l` -eq 0 ; then \
With the Sourcery Codebench standard edition, the sysroot returned point to a non existant directory if no CFLAGS are specified. Here are the results of -print-sysroot gcc option: $ ./i686-pc-linux-gnu-gcc -print-sysroot Full/path/to/i686-pc-linux-gnu/libc/system32 (doesn't exist) $ ./i686-pc-linux-gnu-gcc -m64 -print-sysroot Full/path/to/i686-pc-linux-gnu/libc/system64 (doesn't exist) $ ./i686-pc-linux-gnu-gcc -msgxx-glibc -print-sysroot Full/path/to/i686-pc-linux-gnu/libc/sgxx-glibc (exist) The problem is that in the "libc" directory there is only the sub-directory "sgxx-glibc". Therefore all hearders files and libraries are only available in arch specific sysroot. When using the -print-file-name gcc option, the result is quite buggy and it is not empty. $ ./i686-pc-linux-gnu-gcc -print-file-name=libc.a libc.a So the toolchain check fail because $PWD/libc.a is used as SYSROOT_DIR since the toolchain-external backend does not always use CFLAGS. This patch change the SYSROOT_DIR/ARCH_SYSROOT_DIR detection logic so that if SYSROOT_DIR is empty/bogus, then the same value as ARCH_SYSROOT_DIR is used. This ensures that both SYSROOT_DIR and ARCH_SYSROOT_DIR point to valid directories (which would the same in the case of this toolchain, which brings us back to the non-multilib toolchain case). If toolchain_find_sysroot() was used without flags, then flags are added to allow the fallback to arch sysroot. In normal cases the same behavior as before is expected. If toolchain_find_sysroot() was used with flags, then it's replaced by toolchain_find_arch_sysroot() with the same flags. Signed-off-by: Romain Naour <romain.naour@openwide.fr> --- v3: no change v2: new patch --- toolchain/toolchain-external/toolchain-external.mk | 28 +++++++++++++++------- 1 file changed, 20 insertions(+), 8 deletions(-)