[PATCH] meson: Prefix each element of firmware path

Akihiko Odaki posted 1 patch 1 year, 10 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20220624154042.51512-1-akihiko.odaki@gmail.com
Maintainers: John Snow <jsnow@redhat.com>, Cleber Rosa <crosa@redhat.com>
configure                     | 23 +++++++++++++++++++++++
meson.build                   | 10 ++++++++--
meson_options.txt             |  2 +-
scripts/meson-buildoptions.py |  7 +++++--
scripts/meson-buildoptions.sh |  6 +++---
softmmu/datadir.c             |  8 +++++---
6 files changed, 45 insertions(+), 11 deletions(-)
[PATCH] meson: Prefix each element of firmware path
Posted by Akihiko Odaki 1 year, 10 months ago
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
---
 configure                     | 23 +++++++++++++++++++++++
 meson.build                   | 10 ++++++++--
 meson_options.txt             |  2 +-
 scripts/meson-buildoptions.py |  7 +++++--
 scripts/meson-buildoptions.sh |  6 +++---
 softmmu/datadir.c             |  8 +++++---
 6 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/configure b/configure
index 4b12a8094ca..ab952e7ce3b 100755
--- a/configure
+++ b/configure
@@ -675,6 +675,29 @@ fi
 
 werror=""
 
+meson_option_build_array() {
+  local a
+  local ifs
+
+  if test "$targetos" == windows; then
+    ifs=\;
+  else
+    ifs=:
+  fi
+
+  echo -n "["
+
+  while IFS="$ifs" read -ra a; do
+    for e in "${a[@]}"; do
+      echo -n '"""'
+      echo -n "$e" | sed 's/\\/\\\\/g; s/"/\\"/g'
+      echo -n '"""',
+    done
+  done <<< "$1"
+
+  echo "]"
+}
+
 . $source_path/scripts/meson-buildoptions.sh
 
 meson_options=
diff --git a/meson.build b/meson.build
index 0c2e11ff071..40111ce4053 100644
--- a/meson.build
+++ b/meson.build
@@ -1684,7 +1684,13 @@ config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
 config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
 config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
 config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
-config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('prefix') / get_option('qemu_firmwarepath'))
+
+qemu_firmwarepath = ''
+foreach k : get_option('qemu_firmwarepath')
+  qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
+endforeach
+config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
+
 config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
 config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
 config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
@@ -3622,7 +3628,7 @@ endif
 summary_info = {}
 summary_info += {'Install prefix':    get_option('prefix')}
 summary_info += {'BIOS directory':    qemu_datadir}
-summary_info += {'firmware path':     get_option('prefix') / get_option('qemu_firmwarepath')}
+summary_info += {'firmware path':     qemu_firmwarepath}
 summary_info += {'binary directory':  get_option('prefix') / get_option('bindir')}
 summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
 summary_info += {'module directory':  qemu_moddir}
diff --git a/meson_options.txt b/meson_options.txt
index 0e8197386b9..8ad5cd73819 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -6,7 +6,7 @@ option('qemu_suffix', type : 'string', value: 'qemu',
        description: 'Suffix for QEMU data/modules/config directories (can be empty)')
 option('docdir', type : 'string', value : 'share/doc',
        description: 'Base directory for documentation installation (can be empty)')
-option('qemu_firmwarepath', type : 'string', value : 'qemu-firmware',
+option('qemu_firmwarepath', type : 'array', value : ['qemu-firmware'],
        description: 'search PATH for firmware files')
 option('pkgversion', type : 'string', value : '',
        description: 'use specified string as sub-version of the package')
diff --git a/scripts/meson-buildoptions.py b/scripts/meson-buildoptions.py
index e624c16b01a..3e2b4785388 100755
--- a/scripts/meson-buildoptions.py
+++ b/scripts/meson-buildoptions.py
@@ -156,7 +156,7 @@ def cli_metavar(opt):
     if opt["type"] == "string":
         return "VALUE"
     if opt["type"] == "array":
-        return "CHOICES"
+        return "CHOICES" if "choices" in opt else "VALUES"
     return "CHOICE"
 
 
@@ -199,7 +199,10 @@ def print_parse(options):
         key = cli_option(opt)
         name = opt["name"]
         if require_arg(opt):
-            print(f'    --{key}=*) quote_sh "-D{name}=$2" ;;')
+            if opt["type"] == "array" and not "choices" in opt:
+                print(f'    --{key}=*) quote_sh "-D{name}=$(meson_option_build_array $2)" ;;')
+            else:
+                print(f'    --{key}=*) quote_sh "-D{name}=$2" ;;')
         elif opt["type"] == "boolean":
             print(f'    --enable-{key}) printf "%s" -D{name}=true ;;')
             print(f'    --disable-{key}) printf "%s" -D{name}=false ;;')
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
index 1fc1d2e2c36..238bab162bd 100644
--- a/scripts/meson-buildoptions.sh
+++ b/scripts/meson-buildoptions.sh
@@ -42,12 +42,12 @@ meson_options_help() {
   printf "%s\n" '  --enable-trace-backends=CHOICES'
   printf "%s\n" '                           Set available tracing backends [log] (choices:'
   printf "%s\n" '                           dtrace/ftrace/log/nop/simple/syslog/ust)'
-  printf "%s\n" '  --firmwarepath=VALUE     search PATH for firmware files [qemu-firmware]'
+  printf "%s\n" '  --firmwarepath=VALUES    search PATH for firmware files [qemu-firmware]'
   printf "%s\n" '  --iasl=VALUE             Path to ACPI disassembler'
   printf "%s\n" '  --includedir=VALUE       Header file directory [include]'
   printf "%s\n" '  --interp-prefix=VALUE    where to find shared libraries etc., use %M for'
   printf "%s\n" '                           cpu name [/usr/gnemul/qemu-%M]'
-  printf "%s\n" '  --libdir=VALUE           Library directory [lib64]'
+  printf "%s\n" '  --libdir=VALUE           Library directory [lib]'
   printf "%s\n" '  --libexecdir=VALUE       Library executable directory [libexec]'
   printf "%s\n" '  --localedir=VALUE        Locale data directory [share/locale]'
   printf "%s\n" '  --localstatedir=VALUE    Localstate data directory [/var/local]'
@@ -356,7 +356,7 @@ _meson_option_parse() {
     --disable-qcow1) printf "%s" -Dqcow1=disabled ;;
     --enable-qed) printf "%s" -Dqed=enabled ;;
     --disable-qed) printf "%s" -Dqed=disabled ;;
-    --firmwarepath=*) quote_sh "-Dqemu_firmwarepath=$2" ;;
+    --firmwarepath=*) quote_sh "-Dqemu_firmwarepath=$(meson_option_build_array $2)" ;;
     --enable-qga-vss) printf "%s" -Dqga_vss=enabled ;;
     --disable-qga-vss) printf "%s" -Dqga_vss=disabled ;;
     --enable-qom-cast-debug) printf "%s" -Dqom_cast_debug=true ;;
diff --git a/softmmu/datadir.c b/softmmu/datadir.c
index 160cac999a6..fd24629c543 100644
--- a/softmmu/datadir.c
+++ b/softmmu/datadir.c
@@ -105,15 +105,17 @@ static char *find_datadir(void)
 
 void qemu_add_default_firmwarepath(void)
 {
-    char **dirs;
+    static const char * const dirs[] = {
+        CONFIG_QEMU_FIRMWAREPATH
+        NULL
+    };
+
     size_t i;
 
     /* add configured firmware directories */
-    dirs = g_strsplit(CONFIG_QEMU_FIRMWAREPATH, G_SEARCHPATH_SEPARATOR_S, 0);
     for (i = 0; dirs[i] != NULL; i++) {
         qemu_add_data_dir(get_relocated_path(dirs[i]));
     }
-    g_strfreev(dirs);
 
     /* try to find datadir relative to the executable path */
     qemu_add_data_dir(find_datadir());
-- 
2.32.1 (Apple Git-133)
Re: [PATCH] meson: Prefix each element of firmware path
Posted by Paolo Bonzini 1 year, 10 months ago
Queued, thanks!

Paolo

On 6/24/22 17:40, Akihiko Odaki wrote:
> Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
> ---
>   configure                     | 23 +++++++++++++++++++++++
>   meson.build                   | 10 ++++++++--
>   meson_options.txt             |  2 +-
>   scripts/meson-buildoptions.py |  7 +++++--
>   scripts/meson-buildoptions.sh |  6 +++---
>   softmmu/datadir.c             |  8 +++++---
>   6 files changed, 45 insertions(+), 11 deletions(-)
> 
> diff --git a/configure b/configure
> index 4b12a8094ca..ab952e7ce3b 100755
> --- a/configure
> +++ b/configure
> @@ -675,6 +675,29 @@ fi
>   
>   werror=""
>   
> +meson_option_build_array() {
> +  local a
> +  local ifs
> +
> +  if test "$targetos" == windows; then
> +    ifs=\;
> +  else
> +    ifs=:
> +  fi
> +
> +  echo -n "["
> +
> +  while IFS="$ifs" read -ra a; do
> +    for e in "${a[@]}"; do
> +      echo -n '"""'
> +      echo -n "$e" | sed 's/\\/\\\\/g; s/"/\\"/g'
> +      echo -n '"""',
> +    done
> +  done <<< "$1"
> +
> +  echo "]"
> +}
> +
>   . $source_path/scripts/meson-buildoptions.sh
>   
>   meson_options=
> diff --git a/meson.build b/meson.build
> index 0c2e11ff071..40111ce4053 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -1684,7 +1684,13 @@ config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
>   config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
>   config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
>   config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
> -config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('prefix') / get_option('qemu_firmwarepath'))
> +
> +qemu_firmwarepath = ''
> +foreach k : get_option('qemu_firmwarepath')
> +  qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
> +endforeach
> +config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
> +
>   config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
>   config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
>   config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
> @@ -3622,7 +3628,7 @@ endif
>   summary_info = {}
>   summary_info += {'Install prefix':    get_option('prefix')}
>   summary_info += {'BIOS directory':    qemu_datadir}
> -summary_info += {'firmware path':     get_option('prefix') / get_option('qemu_firmwarepath')}
> +summary_info += {'firmware path':     qemu_firmwarepath}
>   summary_info += {'binary directory':  get_option('prefix') / get_option('bindir')}
>   summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
>   summary_info += {'module directory':  qemu_moddir}
> diff --git a/meson_options.txt b/meson_options.txt
> index 0e8197386b9..8ad5cd73819 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -6,7 +6,7 @@ option('qemu_suffix', type : 'string', value: 'qemu',
>          description: 'Suffix for QEMU data/modules/config directories (can be empty)')
>   option('docdir', type : 'string', value : 'share/doc',
>          description: 'Base directory for documentation installation (can be empty)')
> -option('qemu_firmwarepath', type : 'string', value : 'qemu-firmware',
> +option('qemu_firmwarepath', type : 'array', value : ['qemu-firmware'],
>          description: 'search PATH for firmware files')
>   option('pkgversion', type : 'string', value : '',
>          description: 'use specified string as sub-version of the package')
> diff --git a/scripts/meson-buildoptions.py b/scripts/meson-buildoptions.py
> index e624c16b01a..3e2b4785388 100755
> --- a/scripts/meson-buildoptions.py
> +++ b/scripts/meson-buildoptions.py
> @@ -156,7 +156,7 @@ def cli_metavar(opt):
>       if opt["type"] == "string":
>           return "VALUE"
>       if opt["type"] == "array":
> -        return "CHOICES"
> +        return "CHOICES" if "choices" in opt else "VALUES"
>       return "CHOICE"
>   
>   
> @@ -199,7 +199,10 @@ def print_parse(options):
>           key = cli_option(opt)
>           name = opt["name"]
>           if require_arg(opt):
> -            print(f'    --{key}=*) quote_sh "-D{name}=$2" ;;')
> +            if opt["type"] == "array" and not "choices" in opt:
> +                print(f'    --{key}=*) quote_sh "-D{name}=$(meson_option_build_array $2)" ;;')
> +            else:
> +                print(f'    --{key}=*) quote_sh "-D{name}=$2" ;;')
>           elif opt["type"] == "boolean":
>               print(f'    --enable-{key}) printf "%s" -D{name}=true ;;')
>               print(f'    --disable-{key}) printf "%s" -D{name}=false ;;')
> diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
> index 1fc1d2e2c36..238bab162bd 100644
> --- a/scripts/meson-buildoptions.sh
> +++ b/scripts/meson-buildoptions.sh
> @@ -42,12 +42,12 @@ meson_options_help() {
>     printf "%s\n" '  --enable-trace-backends=CHOICES'
>     printf "%s\n" '                           Set available tracing backends [log] (choices:'
>     printf "%s\n" '                           dtrace/ftrace/log/nop/simple/syslog/ust)'
> -  printf "%s\n" '  --firmwarepath=VALUE     search PATH for firmware files [qemu-firmware]'
> +  printf "%s\n" '  --firmwarepath=VALUES    search PATH for firmware files [qemu-firmware]'
>     printf "%s\n" '  --iasl=VALUE             Path to ACPI disassembler'
>     printf "%s\n" '  --includedir=VALUE       Header file directory [include]'
>     printf "%s\n" '  --interp-prefix=VALUE    where to find shared libraries etc., use %M for'
>     printf "%s\n" '                           cpu name [/usr/gnemul/qemu-%M]'
> -  printf "%s\n" '  --libdir=VALUE           Library directory [lib64]'
> +  printf "%s\n" '  --libdir=VALUE           Library directory [lib]'
>     printf "%s\n" '  --libexecdir=VALUE       Library executable directory [libexec]'
>     printf "%s\n" '  --localedir=VALUE        Locale data directory [share/locale]'
>     printf "%s\n" '  --localstatedir=VALUE    Localstate data directory [/var/local]'
> @@ -356,7 +356,7 @@ _meson_option_parse() {
>       --disable-qcow1) printf "%s" -Dqcow1=disabled ;;
>       --enable-qed) printf "%s" -Dqed=enabled ;;
>       --disable-qed) printf "%s" -Dqed=disabled ;;
> -    --firmwarepath=*) quote_sh "-Dqemu_firmwarepath=$2" ;;
> +    --firmwarepath=*) quote_sh "-Dqemu_firmwarepath=$(meson_option_build_array $2)" ;;
>       --enable-qga-vss) printf "%s" -Dqga_vss=enabled ;;
>       --disable-qga-vss) printf "%s" -Dqga_vss=disabled ;;
>       --enable-qom-cast-debug) printf "%s" -Dqom_cast_debug=true ;;
> diff --git a/softmmu/datadir.c b/softmmu/datadir.c
> index 160cac999a6..fd24629c543 100644
> --- a/softmmu/datadir.c
> +++ b/softmmu/datadir.c
> @@ -105,15 +105,17 @@ static char *find_datadir(void)
>   
>   void qemu_add_default_firmwarepath(void)
>   {
> -    char **dirs;
> +    static const char * const dirs[] = {
> +        CONFIG_QEMU_FIRMWAREPATH
> +        NULL
> +    };
> +
>       size_t i;
>   
>       /* add configured firmware directories */
> -    dirs = g_strsplit(CONFIG_QEMU_FIRMWAREPATH, G_SEARCHPATH_SEPARATOR_S, 0);
>       for (i = 0; dirs[i] != NULL; i++) {
>           qemu_add_data_dir(get_relocated_path(dirs[i]));
>       }
> -    g_strfreev(dirs);
>   
>       /* try to find datadir relative to the executable path */
>       qemu_add_data_dir(find_datadir());