I'm ok with this patch. That can go to master, not need for api-next. Maxim.
On 04/06/17 20:09, Brian Brooks wrote: > On 04/05 01:24:44, Dmitry Eremin-Solenikov wrote: >> On 04.04.2017 23:34, Brian Brooks wrote: >>> On 04/04 23:27:51, Dmitry Eremin-Solenikov wrote: >>>> On 04.04.2017 23:26, Brian Brooks wrote: >>>>> On 04/04 23:04:10, Dmitry Eremin-Solenikov wrote: >>>>>> On 04.04.2017 21:47, Brian Brooks wrote: >>>>>>> Signed-off-by: Brian Brooks <brian.bro...@arm.com> >>>>>> >>>>>> Brian, >>>>>> >>>>>> how does this fail with clang on ARMv8? Could you please include error >>>>>> message in the commit message? >>>>> >>>>> Well, you can't pass -mcx16 to clang when compiling natively on ARM. >>>>> >>>>> This is what it will look like: >>>>> >>>>> clang: error: argument unused during compilation: '-mcx16' >>>>> >>>>> and Autotools will halt the rest of the build. >>>> >>>> Does this happen during configure stage or when building? >>> >>> You will see that error during build. That is when clang is invoked. >>> But, the bug is in configure.ac where -mcx16 is added to CFLAGS when >>> it shouldn't be. >> >> Then why isn't it detected by configure script? > > The configure script is generated by Autoconf. Autoconf takes the > configure.ac file as input. The autoconf tool is invoked when you > run this project's ./bootstrap script. > > configure.ac is a combination of shell script and M4 (a macro language). > If something in configure.ac doesn't look like shell, it is likely > a macro. > > Lets step through it: > > 0 if test "${CC}" != "gcc" -o ${CC_VERSION_MAJOR} -ge 5; then > 1 my_save_cflags="$CFLAGS" > 2 > 3 CFLAGS=-mcx16 > 4 AC_MSG_CHECKING([whether CC supports -mcx16]) > 5 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], > 6 [AC_MSG_RESULT([yes])] > 7 [ODP_CFLAGS="$ODP_CFLAGS $CFLAGS"], > 8 [AC_MSG_RESULT([no])] > 9 ) > 10 CFLAGS="$my_save_cflags" > 11 fi > > Line 0 is specifically checking for whether we are using GCC or > whether whatever compiler we're using's version is greater than > or equal to 5. > > Line 1 saves CFLAGS into a temporary variable, and line 10 restores > it. This technique is useful for when you want to avoid altering > CFLAGS until the very end of the configure.ac has been processed. > The reason is that the compiler may be invoked as configure.ac is > processed and you want a pristine set of CFLAGS when you do this. > > Line 3 adds -mcx16 to CFLAGS. The original author probably wants > to compile a small program with -mcx16 at this point in the > processing of the configure.ac file. If we know we're not running > on an x86-based chip, we can skip this entirely. More on that later. > > Line 4 is a macro to print something to inform the user that we > are checking "whether CC supports -mcx16". > > Lines 5-9 will invoke the compiler with a provided program > (an empty program: AC_LANG_PROGRAM([])) and execute lines 6 and 7 > on success or lines 7 and 8 on failure. The interesting part is > line 7 which appends CFLAGS to ODP_CFLAGS on success. We know > that CFLAGS contains -mcx16, but we must also be mindful that > there is nothing else in CFLAGS otherwise multiple consecutive > uses of this technique would end up appending redundant things > to CFLAGS. > > So, what happens when the configure script is run on ARM with > CC=clang? > > checking whether CC supports -mcx16... yes > > Wat... umm... let's try something else... > > $ touch poof.c > $ clang -mcx16 poof.c > clang: warning: argument unused during compilation: '-mcx16' > (.text+0x30): undefined reference to `main' > clang: error: linker command failed with exit code 1 (use -v to see > invocation) > > OK. So, why does it fail when we do a 'make'? Because of -Werror. > > $ clang -Werror -mcx16 poof.c > clang: error: argument unused during compilation: '-mcx16' > > -Werror is in ODP_CFLAGS, not CFLAGS used throughout the processing > of the configure.ac file. > > An understandable argument is to add that flag to CFLAGS, but we can > do better. Much better. We can skip this onzin entirely because we > already know the architecture that we're targeting (the ${host} > variable). Skipping that saves time. > > So, we only check for the x86-based -mcx16 flag if we're targeting > an x86-based processor: > > if "${host}" == i?86* -o "${host}" == x86*; then > if test "${CC}" != "gcc" -o ${CC_VERSION_MAJOR} -ge 5; then > > [..] > > fi > fi > > It is that simple! :) > >> -- >> With best wishes >> Dmitry