diff mbox series

[1/2] cmake-qemu.bbclass: support qemu for cmake

Message ID 20231120144628.52664-2-adrian.freihofer@siemens.com
State Accepted, archived
Commit b197d0b0de1fa5f295d32dbda2eb815ca0153299
Headers show
Series cmake-qemu | expand

Commit Message

Adrian Freihofer Nov. 20, 2023, 2:46 p.m. UTC
Define the CMAKE_CROSSCOMPILING_EMULATOR variable similar to what the
meson bbclass does. This allows for example to execute cross compilied
unit tests on the build machine when using an SDK.

CMAKE_CROSSCOMPILING_EMULATOR is a semi colon separated list of
paramters which could directly handle the -L and the -E parameters.
Creating a wrapper script is not absolutely mandatory. But anyway lets
do it similar to what the meson.bbclass does and also disable pseudo.

Further information can be found in the camke documentation in the
CMAKE_CROSSCOMPILING_EMULATOR section.

Keep the code optional, as the core does not need this function and does
not intend to use it in the future.

[YOCTO #15214]

Signed-off-by: Adrian Freihofer <adrian.freihofer@siemens.com>
---
 meta/classes-recipe/cmake-qemu.bbclass | 28 ++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)
 create mode 100644 meta/classes-recipe/cmake-qemu.bbclass

Comments

Richard Purdie Nov. 23, 2023, 2:24 p.m. UTC | #1
On Mon, 2023-11-20 at 15:46 +0100, Adrian Freihofer wrote:
> Define the CMAKE_CROSSCOMPILING_EMULATOR variable similar to what the
> meson bbclass does. This allows for example to execute cross compilied
> unit tests on the build machine when using an SDK.
> 
> CMAKE_CROSSCOMPILING_EMULATOR is a semi colon separated list of
> paramters which could directly handle the -L and the -E parameters.
> Creating a wrapper script is not absolutely mandatory. But anyway lets
> do it similar to what the meson.bbclass does and also disable pseudo.
> 
> Further information can be found in the camke documentation in the
> CMAKE_CROSSCOMPILING_EMULATOR section.
> 
> Keep the code optional, as the core does not need this function and does
> not intend to use it in the future.
> 
> [YOCTO #15214]
> 
> Signed-off-by: Adrian Freihofer <adrian.freihofer@siemens.com>
> ---
>  meta/classes-recipe/cmake-qemu.bbclass | 28 ++++++++++++++++++++++++++
>  1 file changed, 28 insertions(+)
>  create mode 100644 meta/classes-recipe/cmake-qemu.bbclass
> 
> diff --git a/meta/classes-recipe/cmake-qemu.bbclass b/meta/classes-recipe/cmake-qemu.bbclass
> new file mode 100644
> index 0000000000..76b748f340
> --- /dev/null
> +++ b/meta/classes-recipe/cmake-qemu.bbclass
> @@ -0,0 +1,28 @@
> +#
> +# Copyright OpenEmbedded Contributors
> +#
> +# SPDX-License-Identifier: MIT
> +#
> +# Not all platforms are supported by Qemu. Using qemu-user therefore
> +# involves a certain risk, which is also the reason why this feature
> +# is not activated by default.

"not part of the main cmake class by default"?

> +
> +inherit qemu
> +
> +CMAKE_EXEWRAPPER_ENABLED:class-native = "False"
> +CMAKE_EXEWRAPPER_ENABLED:class-nativesdk = "False"
> +CMAKE_EXEWRAPPER_ENABLED ?= "${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)}"
> +DEPENDS:append = "${@' qemu-native' if d.getVar('CMAKE_EXEWRAPPER_ENABLED') == 'True' else ''}"

I suspect making that a DEPENDS:append:class-target might help bitbake
with parsing things a bit.

I'm also a bit torn on CMAKE_EXEWRAPPER_ENABLED and whether we
need/want the variable or just switch on qemu-usermode. I'm guessing
you worked the code this way so you could conditionally bypass it with
different defaults.

> +
> +cmake_do_generate_toolchain_file:append:class-target() {
> +    if [ "${CMAKE_EXEWRAPPER_ENABLED}" = "True" ]; then
> +        # Write out a qemu wrapper that will be used as exe_wrapper so that camake
> +        # can run target helper binaries through that. This also allows to execute ctest.
> +        qemu_binary="${@qemu_wrapper_cmdline(d, '${STAGING_DIR_HOST}', ['${STAGING_DIR_HOST}/${libdir}','${STAGING_DIR_HOST}/${base_libdir}'])}"
> +        echo "#!/bin/sh" > "${WORKDIR}/cmake-qemuwrapper"
> +        echo "$qemu_binary \"\$@\"" >> "${WORKDIR}/cmake-qemuwrapper"
> +        chmod +x "${WORKDIR}/cmake-qemuwrapper"
> +        echo "set( CMAKE_CROSSCOMPILING_EMULATOR ${WORKDIR}/cmake-qemuwrapper)" \
> +          >> ${WORKDIR}/toolchain.cmake
> +    fi

Cheers,

Richard
diff mbox series

Patch

diff --git a/meta/classes-recipe/cmake-qemu.bbclass b/meta/classes-recipe/cmake-qemu.bbclass
new file mode 100644
index 0000000000..76b748f340
--- /dev/null
+++ b/meta/classes-recipe/cmake-qemu.bbclass
@@ -0,0 +1,28 @@ 
+#
+# Copyright OpenEmbedded Contributors
+#
+# SPDX-License-Identifier: MIT
+#
+# Not all platforms are supported by Qemu. Using qemu-user therefore
+# involves a certain risk, which is also the reason why this feature
+# is not activated by default.
+
+inherit qemu
+
+CMAKE_EXEWRAPPER_ENABLED:class-native = "False"
+CMAKE_EXEWRAPPER_ENABLED:class-nativesdk = "False"
+CMAKE_EXEWRAPPER_ENABLED ?= "${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)}"
+DEPENDS:append = "${@' qemu-native' if d.getVar('CMAKE_EXEWRAPPER_ENABLED') == 'True' else ''}"
+
+cmake_do_generate_toolchain_file:append:class-target() {
+    if [ "${CMAKE_EXEWRAPPER_ENABLED}" = "True" ]; then
+        # Write out a qemu wrapper that will be used as exe_wrapper so that camake
+        # can run target helper binaries through that. This also allows to execute ctest.
+        qemu_binary="${@qemu_wrapper_cmdline(d, '${STAGING_DIR_HOST}', ['${STAGING_DIR_HOST}/${libdir}','${STAGING_DIR_HOST}/${base_libdir}'])}"
+        echo "#!/bin/sh" > "${WORKDIR}/cmake-qemuwrapper"
+        echo "$qemu_binary \"\$@\"" >> "${WORKDIR}/cmake-qemuwrapper"
+        chmod +x "${WORKDIR}/cmake-qemuwrapper"
+        echo "set( CMAKE_CROSSCOMPILING_EMULATOR ${WORKDIR}/cmake-qemuwrapper)" \
+          >> ${WORKDIR}/toolchain.cmake
+    fi
+}