From patchwork Fri Jun 24 17:34:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Akihiko Odaki X-Patchwork-Id: 12894953 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8669DC433EF for ; Fri, 24 Jun 2022 17:40:01 +0000 (UTC) Received: from localhost ([::1]:40980 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o4nHk-000098-3x for qemu-devel@archiver.kernel.org; Fri, 24 Jun 2022 13:40:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:39882) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o4nCH-0005Ky-6P for qemu-devel@nongnu.org; Fri, 24 Jun 2022 13:34:21 -0400 Received: from mail-pj1-x1031.google.com ([2607:f8b0:4864:20::1031]:51148) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1o4nCF-000296-Jd for qemu-devel@nongnu.org; Fri, 24 Jun 2022 13:34:20 -0400 Received: by mail-pj1-x1031.google.com with SMTP id go6so3471602pjb.0 for ; Fri, 24 Jun 2022 10:34:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=pv04gkshDxNH3B9RohTSkXVFQo/HTk4n+LV9OX7qnAM=; b=AugesnIAo7XBZbW4sZwzUNzNyIxG4KNUttJ6CU9mMtCBKGm90g3nor/1GN6OzewjKI LEoV1yABwl9HnG+I42jVIC/wQYknaqbGIKQZpb/peQpi3FainKm4Fh4Ik2QsTwKYZ3WC IUefF70ULSK9NamiXO8HqBGH964ONndj5eOQ07Ih9tJH2TFAgjdn7ZrMhmdb1/3yONN0 OokF7CSgSCgAhOf0tI12+EMg269TgLCaxjBUoYkh8LuN82NCuxst56DZFBYgcjInjt08 I/cLDgNUqTv5CgQhckXSr5qPBZV2p5qHhCjcH+QHuizujHHu/NR6L0Cr/u6oNxpqoNPM EZtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=pv04gkshDxNH3B9RohTSkXVFQo/HTk4n+LV9OX7qnAM=; b=JOd0pTdDnjyOGgTi1RrCvjNu6O36irYOpZIzdaAfxDIlfXA1pVfkd7+81lNBCQSqa3 2vxh0en/27iACcmburtR3qTNGnPHIkmhsbxPIVWzNUeSu/Lf0z3VsV2ZVgWRGDwZUopB RVLHffW6I8AkyhLcCbI/vQeXJqcQDMZYVmjtHD9JxBcPga/XuW43Db5D38E6mRlrctZg EHHCMZiKQiOKzlRvRIJADAsm/kB1TCchbMnGiewiVW73FfyILLz1aVI/3gjDOlL49cfw KPM/S8WUq2pmo4ogcGxk3Nog7lixKPTAm+F550fhoiG0D3iVk+lxv/H0t+/oPb93BiAY B3sw== X-Gm-Message-State: AJIora+0MTN1zTNRESGIW1y8E9UashDHiaaw++6dBcLRwAdIuT0pDcHM KX7SX57oL04ibHEbW/vjpMk= X-Google-Smtp-Source: AGRyM1tfoSrHkITGxkRmX1xwqDYEKe+yvCmAA83Ej8RbMYgvsb46qry6w9t1fqMHVstbmH9l0tRzOQ== X-Received: by 2002:a17:903:41d2:b0:16a:2cca:4869 with SMTP id u18-20020a17090341d200b0016a2cca4869mr161593ple.13.1656092058277; Fri, 24 Jun 2022 10:34:18 -0700 (PDT) Received: from localhost.localdomain ([2400:4050:c360:8200:80ba:2fd0:a1d1:c891]) by smtp.gmail.com with ESMTPSA id mv24-20020a17090b199800b001d954837197sm4269406pjb.22.2022.06.24.10.34.14 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jun 2022 10:34:17 -0700 (PDT) From: Akihiko Odaki To: Cc: Peter Maydell , Jason Wang , qemu-devel@nongnu.org, Programmingkid , =?utf-8?q?Philippe_Mathieu-Daud?= =?utf-8?q?=C3=A9?= , Gerd Hoffmann , =?utf-8?q?Daniel_P_=2E_Berrang=C3=A9?= , Paolo Bonzini , =?utf-8?q?Alex_Benn=C3=A9e?= , Thomas Huth , John Snow , Cleber Rosa , Stefan Weil , Akihiko Odaki Subject: [PATCH v9 1/4] tests/vm: do not specify -bios option Date: Sat, 25 Jun 2022 02:34:02 +0900 Message-Id: <20220624173405.85131-2-akihiko.odaki@gmail.com> X-Mailer: git-send-email 2.32.1 (Apple Git-133) In-Reply-To: <20220624173405.85131-1-akihiko.odaki@gmail.com> References: <20220624173405.85131-1-akihiko.odaki@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::1031; envelope-from=akihiko.odaki@gmail.com; helo=mail-pj1-x1031.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Paolo Bonzini When running from the build tree, the executable is able to find the BIOS on its own; when running from the source tree, a firmware blob should already be installed and there is no guarantee that the one in the source tree works with the QEMU that is being used for the installation. Just remove the -bios option, since it is unnecessary and in fact there are other x86 VM tests that do not bother specifying it. Signed-off-by: Paolo Bonzini Reviewed-by: Daniel P. Berrangé Reviewed-by: Thomas Huth Signed-off-by: Akihiko Odaki Message-Id: <20220616083025.116902-1-pbonzini@redhat.com> --- tests/vm/fedora | 1 - tests/vm/freebsd | 1 - tests/vm/netbsd | 1 - tests/vm/openbsd | 1 - 4 files changed, 4 deletions(-) diff --git a/tests/vm/fedora b/tests/vm/fedora index 92b78d6e2c9..12eca919a08 100755 --- a/tests/vm/fedora +++ b/tests/vm/fedora @@ -79,7 +79,6 @@ class FedoraVM(basevm.BaseVM): self.exec_qemu_img("create", "-f", "qcow2", img_tmp, self.size) self.print_step("Booting installer") self.boot(img_tmp, extra_args = [ - "-bios", "pc-bios/bios-256k.bin", "-machine", "graphics=off", "-device", "VGA", "-cdrom", iso diff --git a/tests/vm/freebsd b/tests/vm/freebsd index 805db759d67..cd1fabde523 100755 --- a/tests/vm/freebsd +++ b/tests/vm/freebsd @@ -95,7 +95,6 @@ class FreeBSDVM(basevm.BaseVM): self.print_step("Booting installer") self.boot(img_tmp, extra_args = [ - "-bios", "pc-bios/bios-256k.bin", "-machine", "graphics=off", "-device", "VGA", "-cdrom", iso diff --git a/tests/vm/netbsd b/tests/vm/netbsd index 45aa9a7fda7..aa883ec23c9 100755 --- a/tests/vm/netbsd +++ b/tests/vm/netbsd @@ -86,7 +86,6 @@ class NetBSDVM(basevm.BaseVM): self.print_step("Booting installer") self.boot(img_tmp, extra_args = [ - "-bios", "pc-bios/bios-256k.bin", "-machine", "graphics=off", "-cdrom", iso ]) diff --git a/tests/vm/openbsd b/tests/vm/openbsd index 13c82542140..6f1b6f5b98a 100755 --- a/tests/vm/openbsd +++ b/tests/vm/openbsd @@ -82,7 +82,6 @@ class OpenBSDVM(basevm.BaseVM): self.print_step("Booting installer") self.boot(img_tmp, extra_args = [ - "-bios", "pc-bios/bios-256k.bin", "-machine", "graphics=off", "-device", "VGA", "-cdrom", iso From patchwork Fri Jun 24 17:34:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akihiko Odaki X-Patchwork-Id: 12894956 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 991E3C43334 for ; Fri, 24 Jun 2022 17:45:02 +0000 (UTC) Received: from localhost ([::1]:46492 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o4nMb-0004Hy-E5 for qemu-devel@archiver.kernel.org; Fri, 24 Jun 2022 13:45:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:39914) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o4nCM-0005Vn-6u for qemu-devel@nongnu.org; Fri, 24 Jun 2022 13:34:26 -0400 Received: from mail-pg1-x52e.google.com ([2607:f8b0:4864:20::52e]:39565) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1o4nCK-00029r-4i for qemu-devel@nongnu.org; Fri, 24 Jun 2022 13:34:25 -0400 Received: by mail-pg1-x52e.google.com with SMTP id q140so3032331pgq.6 for ; Fri, 24 Jun 2022 10:34:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=sneudjCVQKDIpUIG1Euerp1ep4JgwSpu6LEFZPh/6hc=; b=m3OEGGapSwFIotDtBv3VFs5vJQffRAmfcdImvgHGb6mZME4puIIZqf5KkPADVzyNnE h2bAIBr7eNBQYwUptD/KRMqPu3Z1NHl0p1PLMIT/r3oHCHyS7UH5hNaXPXo63dFKSgGQ 6T17M+ft9Xyh1cnK5cYSyEHKzAr11jWV/mhlChzg790q7Gi2hEnsxoTDsZGw1LtUmtd0 XXubmbAqyeUtH/Rg6sJsf0u5KB9Bqh+4W2Za9V4pMOqQHfDVgD3h7XtlSpSnAJqFZVfv MN/4zKEF1HCo2a9FLPEGHQVWTnwC6Ag9bjdyf210T6ZJiJ2vDSf8f7Zhy/oKwEcpdaQf tLjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=sneudjCVQKDIpUIG1Euerp1ep4JgwSpu6LEFZPh/6hc=; b=Eghw/K86xzkXZ1TPKHqxQPgKl9+XNtHi75EGHy1iZwTYahOuWndOBrAybQTZ+4I9Z5 zasg8owr+sHR5+Q3PB5WI6UpCVSpiEQ91ejp9HDmobawBAsBxweC+mo0D99YLqOHN5QY T3kRIvgx3XBnUF9Kr3bSUbyHQa7+yuxd7bMylvWGE4vrkydV/YD9a/+UBGyImmaI0Qbw FgtSnzDrKqd59oNd2akfbBCLp2+lkEbV/M8AlWplZugEKis0YaP/WjSe1Xk45Li9UiZI /Ypp9yQan3jI9Mg3wRGScGoYLY1VP3fdV5pPTx6hnHFkGtmrJtsK4gr6cI+YvRtiU2RN JAsg== X-Gm-Message-State: AJIora9S7UYIz+28zlGmlG8jXh5t5js8Cwh2t4IkuNC7nHm5MI2/E2tS 4QuFK6O3+B4whCcwcSQFlrI= X-Google-Smtp-Source: AGRyM1vqcRn7nY0gyQJT+aRCF9V3vAQ4cCWZkOJ+4C9DdWRpBopjDGBHPNW+bvDn/ZaJhvinzkx7Mg== X-Received: by 2002:a63:ff19:0:b0:403:7c60:ae96 with SMTP id k25-20020a63ff19000000b004037c60ae96mr12589888pgi.466.1656092062748; Fri, 24 Jun 2022 10:34:22 -0700 (PDT) Received: from localhost.localdomain ([2400:4050:c360:8200:80ba:2fd0:a1d1:c891]) by smtp.gmail.com with ESMTPSA id mv24-20020a17090b199800b001d954837197sm4269406pjb.22.2022.06.24.10.34.18 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jun 2022 10:34:22 -0700 (PDT) From: Akihiko Odaki To: Cc: Peter Maydell , Jason Wang , qemu-devel@nongnu.org, Programmingkid , =?utf-8?q?Philippe_Mathieu-Daud?= =?utf-8?q?=C3=A9?= , Gerd Hoffmann , =?utf-8?q?Daniel_P_=2E_Berrang=C3=A9?= , Paolo Bonzini , =?utf-8?q?Alex_Benn=C3=A9e?= , Thomas Huth , John Snow , Cleber Rosa , Stefan Weil , Akihiko Odaki Subject: [PATCH v9 2/4] cutils: Introduce bundle mechanism Date: Sat, 25 Jun 2022 02:34:03 +0900 Message-Id: <20220624173405.85131-3-akihiko.odaki@gmail.com> X-Mailer: git-send-email 2.32.1 (Apple Git-133) In-Reply-To: <20220624173405.85131-1-akihiko.odaki@gmail.com> References: <20220624173405.85131-1-akihiko.odaki@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::52e; envelope-from=akihiko.odaki@gmail.com; helo=mail-pg1-x52e.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" 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 in the installation tree. The build tree will have a new directory, qemu-bundle, to represent what files the installation tree would have for reference by the executables. Note that it abandons compatibility with Windows older than 8. The extended support for the prior version, 7 ended more than 2 years ago, and it is unlikely that someone would like to run the latest QEMU on such an old system. Signed-off-by: Akihiko Odaki Suggested-by: Paolo Bonzini --- docs/about/build-platforms.rst | 2 +- include/qemu/cutils.h | 18 +++++++-- include/qemu/osdep.h | 2 +- meson.build | 4 ++ scripts/symlink-install-tree.py | 37 ++++++++++++++++++ util/cutils.c | 68 +++++++++++++++++++++++---------- util/meson.build | 1 + 7 files changed, 106 insertions(+), 26 deletions(-) create mode 100755 scripts/symlink-install-tree.py diff --git a/docs/about/build-platforms.rst b/docs/about/build-platforms.rst index 1958edb4305..ebde20f9815 100644 --- a/docs/about/build-platforms.rst +++ b/docs/about/build-platforms.rst @@ -88,7 +88,7 @@ Windows The project aims to support the two most recent versions of Windows that are still supported by the vendor. The minimum Windows API that is currently -targeted is "Windows 7", so theoretically the QEMU binaries can still be run +targeted is "Windows 8", so theoretically the QEMU binaries can still be run on older versions of Windows, too. However, such old versions of Windows are not tested anymore, so it is recommended to use one of the latest versions of Windows instead. diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h index d3e532b64c8..92c436d8c70 100644 --- a/include/qemu/cutils.h +++ b/include/qemu/cutils.h @@ -224,9 +224,21 @@ const char *qemu_get_exec_dir(void); * @dir: the directory (typically a `CONFIG_*DIR` variable) to be relocated. * * Returns a path for @dir that uses the directory of the running executable - * as the prefix. For example, if `bindir` is `/usr/bin` and @dir is - * `/usr/share/qemu`, the function will append `../share/qemu` to the - * directory that contains the running executable and return the result. + * as the prefix. + * + * When a directory named `qemu-bundle` exists in the directory of the running + * executable, the path to the directory will be prepended to @dir. For + * example, if the directory of the running executable is `/qemu/build` @dir + * is `/usr/share/qemu`, the result will be + * `/qemu/build/qemu-bundle/usr/share/qemu`. The directory is expected to exist + * in the build tree. + * + * Otherwise, the directory of the running executable will be used as the + * prefix and it appends the relative path from `bindir` to @dir. For example, + * if the directory of the running executable is `/opt/qemu/bin`, `bindir` is + * `/usr/bin` and @dir is `/usr/share/qemu`, the result will be + * `/opt/qemu/bin/../share/qemu`. + * * The returned string should be freed by the caller. */ char *get_relocated_path(const char *dir); diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h index b1c161c035a..84f8b9d0243 100644 --- a/include/qemu/osdep.h +++ b/include/qemu/osdep.h @@ -75,7 +75,7 @@ QEMU_EXTERN_C int daemon(int, int); #ifdef _WIN32 /* as defined in sdkddkver.h */ #ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0601 /* Windows 7 API (should be in sync with glib) */ +#define _WIN32_WINNT 0x0602 /* Windows 8 API (should be in sync with glib) */ #endif /* reduces the number of implicitly included headers */ #ifndef WIN32_LEAN_AND_MEAN diff --git a/meson.build b/meson.build index 9efcb175d16..c49f5ebfc37 100644 --- a/meson.build +++ b/meson.build @@ -7,6 +7,8 @@ add_test_setup('quick', exclude_suites: ['slow', 'thorough'], is_default: true) add_test_setup('slow', exclude_suites: ['thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow']) add_test_setup('thorough', env: ['G_TEST_SLOW=1', 'SPEED=thorough']) +meson.add_postconf_script('scripts/symlink-install-tree.py') + not_found = dependency('', required: false) keyval = import('keyval') ss = import('sourceset') @@ -356,10 +358,12 @@ nvmm =not_found hvf = not_found midl = not_found widl = not_found +pathcch = not_found host_dsosuf = '.so' if targetos == 'windows' midl = find_program('midl', required: false) widl = find_program('widl', required: false) + pathcch = cc.find_library('pathcch') socket = cc.find_library('ws2_32') winmm = cc.find_library('winmm') diff --git a/scripts/symlink-install-tree.py b/scripts/symlink-install-tree.py new file mode 100755 index 00000000000..f35aa176404 --- /dev/null +++ b/scripts/symlink-install-tree.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +from pathlib import Path +import errno +import json +import os +import subprocess +import sys + +def destdir_join(d1: str, d2: str) -> str: + if not d1: + return d2 + d2_path = Path(d2) + d2_parts = d2_path.parts + # c:\destdir + c:\prefix must produce c:\destdir\prefix + if d2_path.drive or d2_path.root: + d2_parts = d2_parts[1:] + return str(Path(d1, *d2_parts)) + +introspect = os.environ.get('MESONINTROSPECT') +out = subprocess.run([*introspect.split(' '), '--installed'], + stdout=subprocess.PIPE, check=True).stdout +for source, dest in json.loads(out).items(): + assert os.path.isabs(source) + bundle_dest = destdir_join('qemu-bundle', dest) + path = os.path.dirname(bundle_dest) + try: + os.makedirs(path, exist_ok=True) + except BaseException as e: + print(f'error making directory {path}', file=sys.stderr) + raise e + try: + os.symlink(source, bundle_dest) + except BaseException as e: + if not isinstance(e, OSError) or e.errno != errno.EEXIST: + print(f'error making symbolic link {dest}', file=sys.stderr) + raise e diff --git a/util/cutils.c b/util/cutils.c index 6d04e52907b..8199dac5988 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -35,6 +35,11 @@ #include #endif +#ifdef G_OS_WIN32 +#include +#include +#endif + #include "qemu/ctype.h" #include "qemu/cutils.h" #include "qemu/error-report.h" @@ -1074,31 +1079,52 @@ char *get_relocated_path(const char *dir) /* Fail if qemu_init_exec_dir was not called. */ assert(exec_dir[0]); - if (!starts_with_prefix(dir) || !starts_with_prefix(bindir)) { - return g_strdup(dir); - } result = g_string_new(exec_dir); + g_string_append(result, "/qemu-bundle"); + if (access(result->str, R_OK) == 0) { +#ifdef G_OS_WIN32 + size_t size = mbsrtowcs(NULL, &dir, 0, &(mbstate_t){0}) + 1; + PWSTR wdir = g_new(WCHAR, size); + mbsrtowcs(wdir, &dir, size, &(mbstate_t){0}); + + PCWSTR wdir_skipped_root; + PathCchSkipRoot(wdir, &wdir_skipped_root); + + size = wcsrtombs(NULL, &wdir_skipped_root, 0, &(mbstate_t){0}); + char *cursor = result->str + result->len; + g_string_set_size(result, result->len + size); + wcsrtombs(cursor, &wdir_skipped_root, size + 1, &(mbstate_t){0}); + g_free(wdir); +#else + g_string_append(result, dir); +#endif + } else if (!starts_with_prefix(dir) || !starts_with_prefix(bindir)) { + g_string_assign(result, dir); + } else { + g_string_assign(result, exec_dir); + + /* Advance over common components. */ + len_dir = len_bindir = prefix_len; + do { + dir += len_dir; + bindir += len_bindir; + dir = next_component(dir, &len_dir); + bindir = next_component(bindir, &len_bindir); + } while (len_dir && len_dir == len_bindir && !memcmp(dir, bindir, len_dir)); + + /* Ascend from bindir to the common prefix with dir. */ + while (len_bindir) { + bindir += len_bindir; + g_string_append(result, "/.."); + bindir = next_component(bindir, &len_bindir); + } - /* Advance over common components. */ - len_dir = len_bindir = prefix_len; - do { - dir += len_dir; - bindir += len_bindir; - dir = next_component(dir, &len_dir); - bindir = next_component(bindir, &len_bindir); - } while (len_dir && len_dir == len_bindir && !memcmp(dir, bindir, len_dir)); - - /* Ascend from bindir to the common prefix with dir. */ - while (len_bindir) { - bindir += len_bindir; - g_string_append(result, "/.."); - bindir = next_component(bindir, &len_bindir); + if (*dir) { + assert(G_IS_DIR_SEPARATOR(dir[-1])); + g_string_append(result, dir - 1); + } } - if (*dir) { - assert(G_IS_DIR_SEPARATOR(dir[-1])); - g_string_append(result, dir - 1); - } return g_string_free(result, false); } diff --git a/util/meson.build b/util/meson.build index 8f16018cd43..6cacb8689f1 100644 --- a/util/meson.build +++ b/util/meson.build @@ -23,6 +23,7 @@ util_ss.add(when: 'CONFIG_WIN32', if_true: files('event_notifier-win32.c')) util_ss.add(when: 'CONFIG_WIN32', if_true: files('oslib-win32.c')) util_ss.add(when: 'CONFIG_WIN32', if_true: files('qemu-thread-win32.c')) util_ss.add(when: 'CONFIG_WIN32', if_true: winmm) +util_ss.add(when: 'CONFIG_WIN32', if_true: pathcch) util_ss.add(files('envlist.c', 'path.c', 'module.c')) util_ss.add(files('host-utils.c')) util_ss.add(files('bitmap.c', 'bitops.c')) From patchwork Fri Jun 24 17:34:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akihiko Odaki X-Patchwork-Id: 12894954 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8DCD3C43334 for ; Fri, 24 Jun 2022 17:41:22 +0000 (UTC) Received: from localhost ([::1]:41704 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o4nJ3-0000g1-KB for qemu-devel@archiver.kernel.org; Fri, 24 Jun 2022 13:41:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:39976) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o4nCR-0005ka-UG for qemu-devel@nongnu.org; Fri, 24 Jun 2022 13:34:31 -0400 Received: from mail-pj1-x1029.google.com ([2607:f8b0:4864:20::1029]:33694) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1o4nCO-0002AG-1E for qemu-devel@nongnu.org; Fri, 24 Jun 2022 13:34:31 -0400 Received: by mail-pj1-x1029.google.com with SMTP id i8-20020a17090aee8800b001ecc929d14dso6066128pjz.0 for ; Fri, 24 Jun 2022 10:34:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vwv4FPGt6FeS4iOQvh4mjchV/ZSf2nl3arPW8BgJEEg=; b=EegXLVrTIhzzGjyEKFPu+h0w361B4npFF0pRCA9zHjdvcGD/H5fWhrlMxs9CFD547n 23R4QUwE+oVUqhyd9EghuhBLL8Zpk50nlT4r73c/lA3mExCnqckcY0kFteKzZQnrO1EA 1pIYpmoXbDM5yva2/xezDNfQCJihrjgAP549M+KsKq35i/OIchW3MSyvB9M5K7SiNmU4 eAr0b/s7iptnyRMbGbxsQleHttqzGWcKSp2dSz7/bGV5uCOSeTYylfzsMc+qbiJXmTYH TRbPrcOZrYFazQ0cjitkPmIB7LFvZh8CWh430IoBK8DDdH1grZvpGwe2kQdrWqQQhDoi 0egg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vwv4FPGt6FeS4iOQvh4mjchV/ZSf2nl3arPW8BgJEEg=; b=jLNe4sCxVNaObJmviidkazT9M/e1mDo+wmKBLH1/TPUzxQFAPaZRIBRnIDQTHw1zjS kZjGipkOdLz0LeTg9u5NzihInLu2bHuYsOLlAvLOdY5I1DX4WF+UqSc6ujrgdu6NkSRg yZ/rcmecwTFOLOWsghz/suY6QTvhOlDrVOkXbs5iBXirD3NdDaoY+atqKucCZ839+ZOq 1n5VdNS9PSEt4rQ/qpcpIiS2M11FTwTbW212Zgny1xCmPR/LCmv5PwTm7VeOpvGoM/oL q5X4UHt47SQeqW37XefGZDFP18EEqMNR8mdYsEFVn4ln8QzGpNddxmpJlpaEG1d7aJzt Fh0A== X-Gm-Message-State: AJIora/5ozQRgMnPc947W0hDkzJi1s3/BKQvMc824QslHIJLiZnoKHTd 1O4KBQUzk2JRXjHeWHQda58= X-Google-Smtp-Source: AGRyM1tpyaltzTUqOCLBruBkKxvecRcB6YSknBr36eTyYXbk0mSoaec0dsDSESI27Yj+v6dNT7JCLA== X-Received: by 2002:a17:902:9348:b0:167:8e92:272f with SMTP id g8-20020a170902934800b001678e92272fmr152896plp.77.1656092066733; Fri, 24 Jun 2022 10:34:26 -0700 (PDT) Received: from localhost.localdomain ([2400:4050:c360:8200:80ba:2fd0:a1d1:c891]) by smtp.gmail.com with ESMTPSA id mv24-20020a17090b199800b001d954837197sm4269406pjb.22.2022.06.24.10.34.23 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jun 2022 10:34:26 -0700 (PDT) From: Akihiko Odaki To: Cc: Peter Maydell , Jason Wang , qemu-devel@nongnu.org, Programmingkid , =?utf-8?q?Philippe_Mathieu-Daud?= =?utf-8?q?=C3=A9?= , Gerd Hoffmann , =?utf-8?q?Daniel_P_=2E_Berrang=C3=A9?= , Paolo Bonzini , =?utf-8?q?Alex_Benn=C3=A9e?= , Thomas Huth , John Snow , Cleber Rosa , Stefan Weil , Akihiko Odaki Subject: [PATCH v9 3/4] datadir: Use bundle mechanism Date: Sat, 25 Jun 2022 02:34:04 +0900 Message-Id: <20220624173405.85131-4-akihiko.odaki@gmail.com> X-Mailer: git-send-email 2.32.1 (Apple Git-133) In-Reply-To: <20220624173405.85131-1-akihiko.odaki@gmail.com> References: <20220624173405.85131-1-akihiko.odaki@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::1029; envelope-from=akihiko.odaki@gmail.com; helo=mail-pj1-x1029.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" softmmu/datadir.c had its own implementation to find files in the build tree, but now bundle mechanism provides the unified implementation which works for datadir and the other files. Signed-off-by: Akihiko Odaki --- .travis.yml | 2 +- pc-bios/keymaps/meson.build | 21 ++++++--------------- pc-bios/meson.build | 13 +++---------- scripts/oss-fuzz/build.sh | 2 +- softmmu/datadir.c | 22 +--------------------- tests/qtest/fuzz/fuzz.c | 15 --------------- 6 files changed, 12 insertions(+), 63 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9afc4a54b8f..4fdc9a67855 100644 --- a/.travis.yml +++ b/.travis.yml @@ -223,7 +223,7 @@ jobs: - BUILD_RC=0 && make -j${JOBS} || BUILD_RC=$? - | if [ "$BUILD_RC" -eq 0 ] ; then - mv pc-bios/s390-ccw/*.img pc-bios/ ; + mv pc-bios/s390-ccw/*.img qemu-bundle/usr/local/share/qemu ; ${TEST_CMD} ; else $(exit $BUILD_RC); diff --git a/pc-bios/keymaps/meson.build b/pc-bios/keymaps/meson.build index 44247a12b54..2837eb34f4e 100644 --- a/pc-bios/keymaps/meson.build +++ b/pc-bios/keymaps/meson.build @@ -40,9 +40,9 @@ else endif cp = find_program('cp') -t = [] -foreach km, args: keymaps - if native_qemu_keymap.found() +if native_qemu_keymap.found() + t = [] + foreach km, args: keymaps # generate with qemu-kvm t += custom_target(km, build_by_default: true, @@ -50,20 +50,11 @@ foreach km, args: keymaps command: [native_qemu_keymap, '-f', '@OUTPUT@', args.split()], install: true, install_dir: qemu_datadir / 'keymaps') - else - # copy from source tree - t += custom_target(km, - build_by_default: true, - input: km, - output: km, - command: [cp, '@INPUT@', '@OUTPUT@'], - install: true, - install_dir: qemu_datadir / 'keymaps') - endif -endforeach + endforeach -if native_qemu_keymap.found() alias_target('update-keymaps', t) +else + install_data(keymaps.keys(), install_dir: qemu_datadir / 'keymaps') endif install_data(['sl', 'sv'], install_dir: qemu_datadir / 'keymaps') diff --git a/pc-bios/meson.build b/pc-bios/meson.build index 41ba1c0ec7b..388e0db6e40 100644 --- a/pc-bios/meson.build +++ b/pc-bios/meson.build @@ -85,16 +85,9 @@ blobs = [ 'vof-nvram.bin', ] -ln_s = [find_program('ln', required: true), '-sf'] -foreach f : blobs - roms += custom_target(f, - build_by_default: have_system, - output: f, - input: files('meson.build'), # dummy input - install: get_option('install_blobs'), - install_dir: qemu_datadir, - command: [ ln_s, meson.project_source_root() / 'pc-bios' / f, '@OUTPUT@' ]) -endforeach +if get_option('install_blobs') + install_data(blobs, install_dir: qemu_datadir) +endif subdir('descriptors') subdir('keymaps') diff --git a/scripts/oss-fuzz/build.sh b/scripts/oss-fuzz/build.sh index 98b56e05210..16316b25662 100755 --- a/scripts/oss-fuzz/build.sh +++ b/scripts/oss-fuzz/build.sh @@ -88,7 +88,7 @@ if [ "$GITLAB_CI" != "true" ]; then fi # Copy over the datadir -cp -r ../pc-bios/ "$DEST_DIR/pc-bios" +cp -r ../pc-bios/ "$DEST_DIR/data" targets=$(./qemu-fuzz-i386 | awk '$1 ~ /\*/ {print $2}') base_copy="$DEST_DIR/qemu-fuzz-i386-target-$(echo "$targets" | head -n 1)" diff --git a/softmmu/datadir.c b/softmmu/datadir.c index 160cac999a6..697cffea932 100644 --- a/softmmu/datadir.c +++ b/softmmu/datadir.c @@ -83,26 +83,6 @@ void qemu_add_data_dir(char *path) data_dir[data_dir_idx++] = path; } -/* - * Find a likely location for support files using the location of the binary. - * When running from the build tree this will be "$bindir/pc-bios". - * Otherwise, this is CONFIG_QEMU_DATADIR (possibly relocated). - * - * The caller must use g_free() to free the returned data when it is - * no longer required. - */ -static char *find_datadir(void) -{ - g_autofree char *dir = NULL; - - dir = g_build_filename(qemu_get_exec_dir(), "pc-bios", NULL); - if (g_file_test(dir, G_FILE_TEST_IS_DIR)) { - return g_steal_pointer(&dir); - } - - return get_relocated_path(CONFIG_QEMU_DATADIR); -} - void qemu_add_default_firmwarepath(void) { char **dirs; @@ -116,7 +96,7 @@ void qemu_add_default_firmwarepath(void) g_strfreev(dirs); /* try to find datadir relative to the executable path */ - qemu_add_data_dir(find_datadir()); + qemu_add_data_dir(get_relocated_path(CONFIG_QEMU_DATADIR)); } void qemu_list_data_dirs(void) diff --git a/tests/qtest/fuzz/fuzz.c b/tests/qtest/fuzz/fuzz.c index 0ad4ba9e94d..2062b40d82b 100644 --- a/tests/qtest/fuzz/fuzz.c +++ b/tests/qtest/fuzz/fuzz.c @@ -174,21 +174,6 @@ int LLVMFuzzerInitialize(int *argc, char ***argv, char ***envp) target_name = strstr(**argv, "-target-"); if (target_name) { /* The binary name specifies the target */ target_name += strlen("-target-"); - /* - * With oss-fuzz, the executable is kept in the root of a directory (we - * cannot assume the path). All data (including bios binaries) must be - * in the same dir, or a subdir. Thus, we cannot place the pc-bios so - * that it would be in exec_dir/../pc-bios. - * As a workaround, oss-fuzz allows us to use argv[0] to get the - * location of the executable. Using this we add exec_dir/pc-bios to - * the datadirs. - */ - bindir = qemu_get_exec_dir(); - datadir = g_build_filename(bindir, "pc-bios", NULL); - if (g_file_test(datadir, G_FILE_TEST_IS_DIR)) { - qemu_add_data_dir(datadir); - } else { - g_free(datadir); } } else if (*argc > 1) { /* The target is specified as an argument */ target_name = (*argv)[1]; From patchwork Fri Jun 24 17:34:05 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akihiko Odaki X-Patchwork-Id: 12894958 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1C72CC43334 for ; Fri, 24 Jun 2022 17:49:15 +0000 (UTC) Received: from localhost ([::1]:51344 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o4nQg-00080D-0h for qemu-devel@archiver.kernel.org; Fri, 24 Jun 2022 13:49:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:39992) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o4nCT-0005nG-72 for qemu-devel@nongnu.org; Fri, 24 Jun 2022 13:34:33 -0400 Received: from mail-pf1-x429.google.com ([2607:f8b0:4864:20::429]:41538) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1o4nCR-0002AV-LI for qemu-devel@nongnu.org; Fri, 24 Jun 2022 13:34:32 -0400 Received: by mail-pf1-x429.google.com with SMTP id i64so3135750pfc.8 for ; Fri, 24 Jun 2022 10:34:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=so1aZRcDpyrdxlBJDv3CBb5TATsqmUYPZ6aYDaBQuyc=; b=NJUgsrMiRb5EKbskDmM6FdKa23Z6rduxWJkD3GLwwNBqGUkUSt0xPuatN2lptVyKBR zkCOT4spfbAf+EXdbRabdRBvVWrnLy68lNJj8uHgELsPup8L9hdGkDqqSMuTEFQfJtWK FY+ZFNQFr87Rdi3jUW6b1lfhWffcJg1iEMEJ9NOZcVMGPHFX2ftXUoeAUU6Zn//dLjFq 4dWT5cYJYvNRstlTs30rt0FD6aDpXHzTToimKXgn7x6Jn0e73Pz6ZJpwwaV5/j0Yd8hU HkIblG4CZ9RlKTuqx86+sNTnC4QI7cWTrZyy014l0a+7v9WpYpBp1JGqAI6o4gWvj29B GbLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=so1aZRcDpyrdxlBJDv3CBb5TATsqmUYPZ6aYDaBQuyc=; b=2oMIUUHPYOYo72oHvaqZEArgNAlqKjJ4t2IVIE9DcPnVFxf3qV/N0syW2qYzbHIIdU x2T9nPEjb0NmQebZyn0x8IV/ZSYckeHslQjnx+Hx33sujvnMY+9kqY1LVHAwRiqnvNeF wWffl7yjCGDloS6zSViWawetzhQV/b0BZbKkpu9u1QM5Qr5arVpBToDb7tImkVhZxdi+ xzjDq0XJjRMxQIKSJUcO89ajGw9cia1PVs7diJj/UzOt0ztJlkooquUKRcd/5OI6Vqzw Wyn00Dn0Al1uyYRJe8purPJ9ZXtShq7FqEWoiMerCoijMPcmoU5eGHEBegsE30Tylk4O bC/A== X-Gm-Message-State: AJIora9kBhVsZJOdilAoFc4UHg7xAQeXKNN00qafbNnBF+pN8Bxm6Gdw M6eYP6Hkreox1Kf/IzMztZlzb2EzUkQ= X-Google-Smtp-Source: AGRyM1v7aAe8NvSJwB/IV8Lx6ONGWdQYTzqsSzt10GikmEEbwUOPLby7/M28K6tBIecNZwkqBeofNA== X-Received: by 2002:a63:ef0b:0:b0:40d:287d:71e1 with SMTP id u11-20020a63ef0b000000b0040d287d71e1mr3301pgh.330.1656092070442; Fri, 24 Jun 2022 10:34:30 -0700 (PDT) Received: from localhost.localdomain ([2400:4050:c360:8200:80ba:2fd0:a1d1:c891]) by smtp.gmail.com with ESMTPSA id mv24-20020a17090b199800b001d954837197sm4269406pjb.22.2022.06.24.10.34.27 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jun 2022 10:34:29 -0700 (PDT) From: Akihiko Odaki To: Cc: Peter Maydell , Jason Wang , qemu-devel@nongnu.org, Programmingkid , =?utf-8?q?Philippe_Mathieu-Daud?= =?utf-8?q?=C3=A9?= , Gerd Hoffmann , =?utf-8?q?Daniel_P_=2E_Berrang=C3=A9?= , Paolo Bonzini , =?utf-8?q?Alex_Benn=C3=A9e?= , Thomas Huth , John Snow , Cleber Rosa , Stefan Weil , Akihiko Odaki Subject: [PATCH v9 4/4] module: Use bundle mechanism Date: Sat, 25 Jun 2022 02:34:05 +0900 Message-Id: <20220624173405.85131-5-akihiko.odaki@gmail.com> X-Mailer: git-send-email 2.32.1 (Apple Git-133) In-Reply-To: <20220624173405.85131-1-akihiko.odaki@gmail.com> References: <20220624173405.85131-1-akihiko.odaki@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2607:f8b0:4864:20::429; envelope-from=akihiko.odaki@gmail.com; helo=mail-pf1-x429.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" Before this change, the directory of the executable was being added to resolve modules in the build tree. However, get_relocated_path() can now resolve them with the new bundle mechanism. Signed-off-by: Akihiko Odaki --- util/module.c | 1 - 1 file changed, 1 deletion(-) diff --git a/util/module.c b/util/module.c index 6bb4ad915a1..8ddb0e18f51 100644 --- a/util/module.c +++ b/util/module.c @@ -274,7 +274,6 @@ bool module_load_one(const char *prefix, const char *lib_name, bool mayfail) dirs[n_dirs++] = g_strdup_printf("%s", search_dir); } dirs[n_dirs++] = get_relocated_path(CONFIG_QEMU_MODDIR); - dirs[n_dirs++] = g_strdup(qemu_get_exec_dir()); #ifdef CONFIG_MODULE_UPGRADES version_dir = g_strcanon(g_strdup(QEMU_PKGVERSION),