diff mbox series

[v4,1/4] cutils: Introduce bundle mechanism

Message ID 20220614210746.78911-2-akihiko.odaki@gmail.com (mailing list archive)
State New, archived
Headers show
Series cutils: Introduce bundle mechanism | expand

Commit Message

Akihiko Odaki June 14, 2022, 9:07 p.m. UTC
Developers often run QEMU without installing. The bundle mechanism
allows to look up files which should be present in installation even in
such a situation.

It is a general mechanism and can find any files located relative
to the installation tree. The build tree must have a new directory,
qemu-bundle, to represent what files the installation tree would
have for reference by the executables.

Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
---
 include/qemu/cutils.h | 19 +++++++++++++++++++
 util/cutils.c         | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+)

Comments

Paolo Bonzini June 15, 2022, 8:19 a.m. UTC | #1
On 6/14/22 23:07, Akihiko Odaki wrote:
> diff --git a/util/cutils.c b/util/cutils.c
> index a58bcfd80e7..fe3bbb1c4eb 100644
> --- a/util/cutils.c
> +++ b/util/cutils.c
> @@ -1086,3 +1086,36 @@ char *get_relocated_path(const char *dir)
>       }
>       return g_string_free(result, false);
>   }
> +
> +static const char * const bundle_formats[] = {
> +    "%s" G_DIR_SEPARATOR_S ".." G_DIR_SEPARATOR_S "%s",
> +    "%s" G_DIR_SEPARATOR_S "qemu-bundle" G_DIR_SEPARATOR_S "%s"
> +};

Why do you need both?

Paolo
Akihiko Odaki June 15, 2022, 1:12 p.m. UTC | #2
On 2022/06/15 17:19, Paolo Bonzini wrote:
> On 6/14/22 23:07, Akihiko Odaki wrote:
>> diff --git a/util/cutils.c b/util/cutils.c
>> index a58bcfd80e7..fe3bbb1c4eb 100644
>> --- a/util/cutils.c
>> +++ b/util/cutils.c
>> @@ -1086,3 +1086,36 @@ char *get_relocated_path(const char *dir)
>>       }
>>       return g_string_free(result, false);
>>   }
>> +
>> +static const char * const bundle_formats[] = {
>> +    "%s" G_DIR_SEPARATOR_S ".." G_DIR_SEPARATOR_S "%s",
>> +    "%s" G_DIR_SEPARATOR_S "qemu-bundle" G_DIR_SEPARATOR_S "%s"
>> +};
> 
> Why do you need both?
> 
> Paolo

The earlier one is used when QEMU is installed. The latter one is used 
in the build tree.

Actually the order was problematic as Daniel pointed out. It is fixed in 
the v5, which I have just sent out.
On 2022/06/15 17:16, Daniel P. Berrangé wrote:
 > This is flawed because it looks at the installed paths first, and
 > falls back to uninstalled paths afterwards. So if you're building
 > and running QEMU 7.1.0 from git, and have QEMU 5.0.0 installed,
 > your QEMU 7.1.0 will end up finding files from the 5.0.0 install.

Regards,
Akihiko Odaki
diff mbox series

Patch

diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h
index 40e10e19a7e..3b66026cd3c 100644
--- a/include/qemu/cutils.h
+++ b/include/qemu/cutils.h
@@ -213,6 +213,25 @@  const char *qemu_get_exec_dir(void);
  */
 char *get_relocated_path(const char *dir);
 
+/**
+ * find_bundle:
+ * @path: Relative path
+ *
+ * Returns a path for the specified directory or file bundled in QEMU. It uses
+ * the directory of the running executable as the prefix first. See
+ * get_relocated_path() for the details. The next candidate is "qemu-bundle"
+ * directory in the directory of the running executable. "qemu-bundle"
+ * directory is typically present in the build tree.
+ *
+ * The returned string should be freed by the caller.
+ *
+ * Returns: a path that can access the bundle, or NULL if no matching bundle
+ * exists.
+ */
+char *find_bundle(const char *path);
+
+void list_bundle_candidates(const char *path);
+
 static inline const char *yes_no(bool b)
 {
      return b ? "yes" : "no";
diff --git a/util/cutils.c b/util/cutils.c
index a58bcfd80e7..fe3bbb1c4eb 100644
--- a/util/cutils.c
+++ b/util/cutils.c
@@ -1086,3 +1086,36 @@  char *get_relocated_path(const char *dir)
     }
     return g_string_free(result, false);
 }
+
+static const char * const bundle_formats[] = {
+    "%s" G_DIR_SEPARATOR_S ".." G_DIR_SEPARATOR_S "%s",
+    "%s" G_DIR_SEPARATOR_S "qemu-bundle" G_DIR_SEPARATOR_S "%s"
+};
+
+char *find_bundle(const char *path)
+{
+    const char *dir = qemu_get_exec_dir();
+    char *candidate;
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(bundle_formats); i++) {
+        candidate = g_strdup_printf(bundle_formats[i], dir, path);
+        if (access(candidate, R_OK) == 0) {
+            return candidate;
+        }
+        g_free(candidate);
+    }
+
+    return NULL;
+}
+
+void list_bundle_candidates(const char *path)
+{
+    const char *dir = qemu_get_exec_dir();
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(bundle_formats); i++) {
+        printf(bundle_formats[i], dir, path);
+        putc('\n', stdout);
+    }
+}