From 1f4e66a4a375372e2339d07f773338c4a4cda74e Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Wed, 30 Aug 2023 17:04:18 +0000 Subject: [PATCH] arch: Enhance check for support by host and check for interpreter Signed-off-by: Michael Tremer --- src/libpakfire/arch.c | 25 ++++++++++++++++++++++--- src/libpakfire/include/pakfire/arch.h | 2 +- src/libpakfire/jail.c | 2 +- src/libpakfire/pakfire.c | 2 +- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/libpakfire/arch.c b/src/libpakfire/arch.c index dda1538f0..18ab74b33 100644 --- a/src/libpakfire/arch.c +++ b/src/libpakfire/arch.c @@ -203,7 +203,7 @@ int pakfire_arch_is_compatible(const char* name, const char* compatible_arch) { This function figures out which architecture the build environment has - which might not be the same as the requested architecture. */ -const char* pakfire_arch_supported_by_host(const char* name) { +static const char* pakfire_arch_is_natively_supported_by_host(const char* name) { if (!name) { errno = EINVAL; return NULL; @@ -220,7 +220,26 @@ const char* pakfire_arch_supported_by_host(const char* name) { return name; // Not supported - errno = ENOTSUP; + return NULL; +} + +const char* pakfire_arch_is_supported_by_host(const char* name) { + const char* arch = NULL; + + // Check if we natively support this architecture + arch = pakfire_arch_is_natively_supported_by_host(name); + if (arch) + return arch; + + // Otherwise check if we have an interpreter + char* interpreter = pakfire_arch_find_interpreter(name); + if (interpreter) { + free(interpreter); + + return name; + } + + // Otherwise this architecture is not supported return NULL; } @@ -296,7 +315,7 @@ char* pakfire_arch_find_interpreter(const char* name) { // If the host supports this architecture natively, // we do not need to search for the interpreter - if (pakfire_arch_supported_by_host(name)) + if (pakfire_arch_is_natively_supported_by_host(name)) goto ERROR; const struct pakfire_arch* arch = pakfire_arch_find(name); diff --git a/src/libpakfire/include/pakfire/arch.h b/src/libpakfire/include/pakfire/arch.h index f09f777c3..0fa67787b 100644 --- a/src/libpakfire/include/pakfire/arch.h +++ b/src/libpakfire/include/pakfire/arch.h @@ -40,7 +40,7 @@ int __pakfire_arch_buildtarget(char* buffer, size_t length, const char* arch, co const char* pakfire_arch_platform(const char* name); int pakfire_arch_is_compatible(const char* name, const char* compatible_arch); -const char* pakfire_arch_supported_by_host(const char* name); +const char* pakfire_arch_is_supported_by_host(const char* name); char* pakfire_arch_find_interpreter(const char* name); #endif diff --git a/src/libpakfire/jail.c b/src/libpakfire/jail.c index e22feeca5..b1f71c77b 100644 --- a/src/libpakfire/jail.c +++ b/src/libpakfire/jail.c @@ -280,7 +280,7 @@ PAKFIRE_EXPORT int pakfire_jail_create(struct pakfire_jail** jail, struct pakfir } // Enable all CPU features that CPU has to offer - if (!pakfire_arch_supported_by_host(arch)) { + if (!pakfire_arch_is_supported_by_host(arch)) { r = pakfire_jail_set_env(j, "QEMU_CPU", "max"); if (r) goto ERROR; diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index e3f392dd7..a4ab9f9cb 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -866,7 +866,7 @@ PAKFIRE_EXPORT int pakfire_create(struct pakfire** pakfire, const char* path, goto ERROR; // Determine the effective architecture - p->arches.effective = pakfire_arch_supported_by_host(arch); + p->arches.effective = pakfire_arch_is_supported_by_host(arch); if (!p->arches.effective) { ERROR(p, "Unsupported architecture: %s\n", arch); r = errno; -- 2.39.5