[PATCH 3/4] configure: propagate --extra-cflags and --extra-ldflags to meson compile tests

Paolo Bonzini posted 4 patches 4 years, 3 months ago
[PATCH 3/4] configure: propagate --extra-cflags and --extra-ldflags to meson compile tests
Posted by Paolo Bonzini 4 years, 3 months ago
Meson (intentionally) does not add QEMU_CFLAGS to cc.compiles/cc.links
tests, as they are supposed to be independent of the specific sets of
compilation flags used to build the programs.  However, the user can
still use CFLAGS or the toolchain file's LANG_args/LANG_link_args option
to specify -I or -L options that apply to cc.compiles/cc.links as well.

This is also the intended use of configure's --extra-cflags,
--extra-cxxflags and --extra-ldflags options.  For example, if
one has netmap's header in a nonstandard directory, up to commit
837b84b1c078bf3e909 it used to work fine to do:

.../configure --enable-netmap \
     --extra-cflags=-I/path/to/netmap/sys

but since the test was converted to meson, this does not work anymore.

Pass these options to meson via the toolchain file instead of via
config-host.mak, since the toolchain file's variables have the
same purpose as configure's --extra-*flags arguments.

Reported-by: Owen LaGarde
Reported-by: Thomas Huth <thuth@redhat.com>
Fixes: 47b30835e4 ("configure: consistently pass CFLAGS/CXXFLAGS/LDFLAGS to meson", 2020-10-06)
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure | 36 ++++++++++++++++++++----------------
 1 file changed, 20 insertions(+), 16 deletions(-)

diff --git a/configure b/configure
index d268f59246..1ea26c67e5 100755
--- a/configure
+++ b/configure
@@ -174,14 +174,14 @@ update_cxxflags() {
 
 compile_object() {
   local_cflags="$1"
-  do_cc $CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
+  do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
 }
 
 compile_prog() {
   local_cflags="$1"
   local_ldflags="$2"
-  do_cc $CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
-      $LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
+  do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
+      $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
 }
 
 # symbolically link $1 to $2.  Portable version of "ln -sf".
@@ -286,6 +286,10 @@ for opt do
   esac
 done
 
+EXTRA_CFLAGS=""
+EXTRA_CXXFLAGS=""
+EXTRA_LDFLAGS=""
+
 xen_ctrl_version="$default_feature"
 xfs="$default_feature"
 membarrier="$default_feature"
@@ -394,13 +398,13 @@ for opt do
   ;;
   --cpu=*) cpu="$optarg"
   ;;
-  --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
-                    QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
+  --extra-cflags=*)
+    EXTRA_CFLAGS="$EXTRA_CFLAGS $optarg"
+    EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"
+    ;;
+  --extra-cxxflags=*) EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"
   ;;
-  --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
-  ;;
-  --extra-ldflags=*) QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
-                     EXTRA_LDFLAGS="$optarg"
+  --extra-ldflags=*) EXTRA_LDFLAGS="$EXTRA_LDFLAGS $optarg"
   ;;
   --enable-debug-info) debug_info="yes"
   ;;
@@ -1346,8 +1350,8 @@ Advanced options (experts only):
                            build time
   --cxx=CXX                use C++ compiler CXX [$cxx]
   --objcc=OBJCC            use Objective-C compiler OBJCC [$objcc]
-  --extra-cflags=CFLAGS    append extra C compiler flags QEMU_CFLAGS
-  --extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS
+  --extra-cflags=CFLAGS    append extra C compiler flags CFLAGS
+  --extra-cxxflags=CXXFLAGS append extra C++ compiler flags CXXFLAGS
   --extra-ldflags=LDFLAGS  append extra linker flags LDFLAGS
   --cross-cc-ARCH=CC       use compiler when building ARCH guest test cases
   --cross-cc-flags-ARCH=   use compiler flags when building ARCH guest tests
@@ -3402,7 +3406,7 @@ EOF
 
     update_cxxflags
 
-    if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
+    if do_cxx $CXXFLAGS $EXTRA_CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
         # C++ compiler $cxx works ok with C compiler $cc
         :
     else
@@ -3909,10 +3913,10 @@ if test "$skip_meson" = no; then
 
   test -z "$cxx" && echo "link_language = 'c'" >> $cross
   echo "[built-in options]" >> $cross
-  echo "c_args = [$(meson_quote $CFLAGS)]" >> $cross
-  echo "cpp_args = [$(meson_quote $CXXFLAGS)]" >> $cross
-  echo "c_link_args = [$(meson_quote $LDFLAGS)]" >> $cross
-  echo "cpp_link_args = [$(meson_quote $LDFLAGS)]" >> $cross
+  echo "c_args = [$(meson_quote $CFLAGS $EXTRA_CFLAGS)]" >> $cross
+  echo "cpp_args = [$(meson_quote $CXXFLAGS $EXTRA_CXXFLAGS)]" >> $cross
+  echo "c_link_args = [$(meson_quote $LDFLAGS $EXTRA_LDFLAGS)]" >> $cross
+  echo "cpp_link_args = [$(meson_quote $LDFLAGS $EXTRA_LDFLAGS)]" >> $cross
   echo "[binaries]" >> $cross
   echo "c = [$(meson_quote $cc $CPU_CFLAGS)]" >> $cross
   test -n "$cxx" && echo "cpp = [$(meson_quote $cxx $CPU_CFLAGS)]" >> $cross
-- 
2.33.1



Re: [PATCH 3/4] configure: propagate --extra-cflags and --extra-ldflags to meson compile tests
Posted by Thomas Huth 4 years, 3 months ago
On 08/11/2021 09.43, Paolo Bonzini wrote:
> Meson (intentionally) does not add QEMU_CFLAGS to cc.compiles/cc.links
> tests, as they are supposed to be independent of the specific sets of
> compilation flags used to build the programs.  However, the user can
> still use CFLAGS or the toolchain file's LANG_args/LANG_link_args option
> to specify -I or -L options that apply to cc.compiles/cc.links as well.
> 
> This is also the intended use of configure's --extra-cflags,
> --extra-cxxflags and --extra-ldflags options.  For example, if
> one has netmap's header in a nonstandard directory, up to commit
> 837b84b1c078bf3e909 it used to work fine to do:
> 
> .../configure --enable-netmap \
>       --extra-cflags=-I/path/to/netmap/sys
> 
> but since the test was converted to meson, this does not work anymore.
> 
> Pass these options to meson via the toolchain file instead of via
> config-host.mak, since the toolchain file's variables have the
> same purpose as configure's --extra-*flags arguments.
> 
> Reported-by: Owen LaGarde
> Reported-by: Thomas Huth <thuth@redhat.com>
> Fixes: 47b30835e4 ("configure: consistently pass CFLAGS/CXXFLAGS/LDFLAGS to meson", 2020-10-06)
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>   configure | 36 ++++++++++++++++++++----------------
>   1 file changed, 20 insertions(+), 16 deletions(-)
> 
> diff --git a/configure b/configure
> index d268f59246..1ea26c67e5 100755
> --- a/configure
> +++ b/configure
> @@ -174,14 +174,14 @@ update_cxxflags() {
>   
>   compile_object() {
>     local_cflags="$1"
> -  do_cc $CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
> +  do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
>   }
>   
>   compile_prog() {
>     local_cflags="$1"
>     local_ldflags="$2"
> -  do_cc $CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
> -      $LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
> +  do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
> +      $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
>   }
>   
>   # symbolically link $1 to $2.  Portable version of "ln -sf".
> @@ -286,6 +286,10 @@ for opt do
>     esac
>   done
>   
> +EXTRA_CFLAGS=""
> +EXTRA_CXXFLAGS=""
> +EXTRA_LDFLAGS=""
> +
>   xen_ctrl_version="$default_feature"
>   xfs="$default_feature"
>   membarrier="$default_feature"
> @@ -394,13 +398,13 @@ for opt do
>     ;;
>     --cpu=*) cpu="$optarg"
>     ;;
> -  --extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg"
> -                    QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
> +  --extra-cflags=*)
> +    EXTRA_CFLAGS="$EXTRA_CFLAGS $optarg"
> +    EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"

I'd rather drop that EXTRA_CXXFLAGS line here - I think that calls for 
trouble otherwise if a user is trying to add a C compiler option that is not 
supported in C++ mode.
If the users have some options that need to be passed to both, C and C++, 
they should simply use --extra-cxxflags in addition instead.

  Thomas

> +    ;;
> +  --extra-cxxflags=*) EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"
>     ;;
> -  --extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg"
> -  ;;
> -  --extra-ldflags=*) QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
> -                     EXTRA_LDFLAGS="$optarg"
> +  --extra-ldflags=*) EXTRA_LDFLAGS="$EXTRA_LDFLAGS $optarg"
>     ;;
>     --enable-debug-info) debug_info="yes"
>     ;;


Re: [PATCH 3/4] configure: propagate --extra-cflags and --extra-ldflags to meson compile tests
Posted by Paolo Bonzini 4 years, 3 months ago
On 11/8/21 10:11, Thomas Huth wrote:
>> +    EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"
> 
> I'd rather drop that EXTRA_CXXFLAGS line here - I think that calls for 
> trouble otherwise if a user is trying to add a C compiler option that is 
> not supported in C++ mode.
> If the users have some options that need to be passed to both, C and 
> C++, they should simply use --extra-cxxflags in addition instead.

True, but that is needed to preserve previous behavior, where 
QEMU_CXXFLAGS is initialized with QEMU_CFLAGS in update_cxxflags.

update_cxxflags does not do any filtering either, except for some -W 
options that shouldn't be in --extra-cflags.  So (apart from those -W 
options) a C-only option wouldn't have worked before with 
--extra-cflags, either.

Paolo