diff mbox series

[v2] linux-yocto: build out-of-tree drivers with SDK

Message ID 20250513035520.147573-2-vince@underview.tech
State New
Headers show
Series [v2] linux-yocto: build out-of-tree drivers with SDK | expand

Commit Message

Vincent Davis Jr May 13, 2025, 3:55 a.m. UTC
Attached patch enables the compilation
of out-of-tree drivers whilst utilizing
the Yocto built SDK.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
---
 ...-add-KCFLAGS-to-build-with-Yocto-SDK.patch | 65 +++++++++++++++++++
 meta/recipes-kernel/linux/linux-yocto-dev.bb  |  4 ++
 .../linux/linux-yocto-rt_6.12.bb              |  4 ++
 .../linux/linux-yocto-tiny_6.12.bb            |  4 ++
 meta/recipes-kernel/linux/linux-yocto_6.12.bb |  4 ++
 5 files changed, 81 insertions(+)
 create mode 100644 meta/recipes-kernel/linux/files/0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch

Comments

Vincent Davis Jr May 13, 2025, 3:57 a.m. UTC | #1
Hello,

Wanted to propose a method to fix SDK out-of-tree kernel driver compilation problems.
Know a patch here may not be the best route as there's zero patches for a reason.

Wanted to know how we want to solve issue described in patch 0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch.
Or do we want to just document it somewhere for future people?

Attempting to get above patch merged.
Bruce Ashfield May 15, 2025, 5:58 p.m. UTC | #2
On Mon, May 12, 2025 at 11:55 PM Vincent Davis Jr via lists.openembedded.org
<vince=underview.tech@lists.openembedded.org> wrote:

> Attached patch enables the compilation
> of out-of-tree drivers whilst utilizing
> the Yocto built SDK.
>
> Signed-off-by: Vincent Davis Jr <vince@underview.tech>
> ---
>  ...-add-KCFLAGS-to-build-with-Yocto-SDK.patch | 65 +++++++++++++++++++
>  meta/recipes-kernel/linux/linux-yocto-dev.bb  |  4 ++
>  .../linux/linux-yocto-rt_6.12.bb              |  4 ++
>  .../linux/linux-yocto-tiny_6.12.bb            |  4 ++
>  meta/recipes-kernel/linux/linux-yocto_6.12.bb |  4 ++
>  5 files changed, 81 insertions(+)
>  create mode 100644
> meta/recipes-kernel/linux/files/0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch
>
> diff --git
> a/meta/recipes-kernel/linux/files/0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch
> b/meta/recipes-kernel/linux/files/0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch
> new file mode 100644
> index 0000000000..edf6a8480f
> --- /dev/null
> +++
> b/meta/recipes-kernel/linux/files/0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch
> @@ -0,0 +1,65 @@
> +From e48021f480428b5e34d299261029bfafdf0e3a2f Mon Sep 17 00:00:00 2001
> +From: Vincent Davis Jr <vince@underview.tech>
> +Date: Sun, 11 May 2025 19:57:46 -0400
> +Subject: [PATCH] Makefile: add KCFLAGS to build with Yocto SDK
> +
> +Upstream-Status: Pending
> +
> +When running
> +
> +make -C \
> +"${SDKTARGETSYSROOT}/lib/modules/<kernel version>/build" \
> +modules_prepare
> +
> +Issues that are encountered include
> +
> +make -f ./Makefile syncconfig
> +make -f ./scripts/Makefile.build obj=scripts/basic
> +   92 | #include <sys/types.h>
> +      |          ^~~~~~~~~~~~~
> +compilation terminated.
> +
> +ld: cannot find Scrt1.o: No such file or directory
> +ld: cannot find crti.o: No such file or directory
> +ld: cannot find crtbeginS.o: No such file or directory
> +ld: cannot find -lgcc: No such file or directory
> +ld: cannot find -lgcc_s: No such file or directory
> +ld: cannot find -lc: No such file or directory
> +ld: cannot find -lgcc: No such file or directory
> +ld: cannot find -lgcc_s: No such file or directory
> +ld: cannot find crtendS.o: No such file or directory
> +ld: cannot find crtn.o: No such file or directory
> +
> +Solved by setting KCFLAGS as the yocto project SDK
> +KCFLAGS is set to --sysroot="${SDKTARGETSYSROOT}".
> +
> +Signed-off-by: Vincent Davis Jr <vince@underview.tech>
> +---
> + Makefile | 4 ++--
> + 1 file changed, 2 insertions(+), 2 deletions(-)
> +
> +diff --git a/Makefile b/Makefile
> +index 64c514f4bc19..bbe7b0503841 100644
> +--- a/Makefile
> ++++ b/Makefile
> +@@ -459,7 +459,7 @@ HOSTRUSTC = rustc
> + HOSTPKG_CONFIG        = pkg-config
> +
> + KBUILD_USERHOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \
> +-                       -O2 -fomit-frame-pointer -std=gnu11
> ++                       -O2 -fomit-frame-pointer -std=gnu11 $(KCFLAGS)
> + KBUILD_USERCFLAGS  := $(KBUILD_USERHOSTCFLAGS) $(USERCFLAGS)
> + KBUILD_USERLDFLAGS := $(USERLDFLAGS)
> +
> +@@ -491,7 +491,7 @@ KBUILD_HOSTCXXFLAGS := -Wall -O2 $(HOST_LFS_CFLAGS)
> $(HOSTCXXFLAGS) \
> +                      -I $(srctree)/scripts/include
> + KBUILD_HOSTRUSTFLAGS := $(rust_common_flags) -O -Cstrip=debuginfo \
> +                       -Zallow-features= $(HOSTRUSTFLAGS)
> +-KBUILD_HOSTLDFLAGS  := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS)
> ++KBUILD_HOSTLDFLAGS  := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS) $(KCFLAGS)
>

This needs to be explained more.

our eSDK and ontarget building and testing of out of tree kernel modules
work fine
without this.  The eSDK uses the sysroot, and that is done via the
definition of
the compiler.

Is there a reason why that won't work here ?

You could also just overload the HOST_* flags variables versus adding
something
completely new.



> + KBUILD_HOSTLDLIBS   := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
> + KBUILD_PROCMACROLDFLAGS := $(or
> $(PROCMACROLDFLAGS),$(KBUILD_HOSTLDFLAGS))
> +
> +--
> +2.43.0
> +
> diff --git a/meta/recipes-kernel/linux/linux-yocto-dev.bb
> b/meta/recipes-kernel/linux/linux-yocto-dev.bb
> index 4b1f93a692..43ad4c4791 100644
> --- a/meta/recipes-kernel/linux/linux-yocto-dev.bb
> +++ b/meta/recipes-kernel/linux/linux-yocto-dev.bb
> @@ -20,6 +20,10 @@ KMETA = "kernel-meta"
>  SRC_URI = "git://
> git.yoctoproject.org/linux-yocto-dev.git;branch=${KBRANCH};name=machine;protocol=https
> <http://git.yoctoproject.org/linux-yocto-dev.git;branch=$%7BKBRANCH%7D;name=machine;protocol=https>
> \
>             git://
> git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=master;destsuffix=${KMETA};protocol=https
> <http://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=master;destsuffix=$%7BKMETA%7D;protocol=https>
> "
>
> +# Appears to be the only way to build out-of-tree
> +# kernel drivers with the yocto project SDK.
> +SRC_URI +=
> "file://0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch"
> +
>  # Set default SRCREVs. Both the machine and meta SRCREVs are statically
> set
>  # to the korg v3.7 tag, and hence prevent network access during parsing.
> If
>  # linux-yocto-dev is the preferred provider, they will be overridden to
> diff --git a/meta/recipes-kernel/linux/linux-yocto-rt_6.12.bb
> b/meta/recipes-kernel/linux/linux-yocto-rt_6.12.bb
> index 6560175461..3f34dbf87d 100644
> --- a/meta/recipes-kernel/linux/linux-yocto-rt_6.12.bb
> +++ b/meta/recipes-kernel/linux/linux-yocto-rt_6.12.bb
> @@ -20,6 +20,10 @@ SRCREV_meta ?=
> "a50ff542f8d79235030741f9e850d34768907d2d"
>  SRC_URI = "git://
> git.yoctoproject.org/linux-yocto.git;branch=${KBRANCH};name=machine;protocol=https
> <http://git.yoctoproject.org/linux-yocto.git;branch=$%7BKBRANCH%7D;name=machine;protocol=https>
> \
>             git://
> git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.12;destsuffix=${KMETA};protocol=https
> <http://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.12;destsuffix=$%7BKMETA%7D;protocol=https>
> "
>
> +# Appears to be the only way to build out-of-tree
> +# kernel drivers with the yocto project SDK.
> +SRC_URI +=
> "file://0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch"
> +
>  LINUX_VERSION ?= "6.12.27"
>
>  LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
> diff --git a/meta/recipes-kernel/linux/linux-yocto-tiny_6.12.bb
> b/meta/recipes-kernel/linux/linux-yocto-tiny_6.12.bb
> index cf6014efad..aab465e9dd 100644
> --- a/meta/recipes-kernel/linux/linux-yocto-tiny_6.12.bb
> +++ b/meta/recipes-kernel/linux/linux-yocto-tiny_6.12.bb
> @@ -25,6 +25,10 @@ PV = "${LINUX_VERSION}+git"
>  SRC_URI = "git://
> git.yoctoproject.org/linux-yocto.git;branch=${KBRANCH};name=machine;protocol=https
> <http://git.yoctoproject.org/linux-yocto.git;branch=$%7BKBRANCH%7D;name=machine;protocol=https>
> \
>             git://
> git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.12;destsuffix=${KMETA};protocol=https
> <http://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.12;destsuffix=$%7BKMETA%7D;protocol=https>
> "
>
> +# Appears to be the only way to build out-of-tree
> +# kernel drivers with the yocto project SDK.
> +SRC_URI +=
> "file://0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch"
> +
>  COMPATIBLE_MACHINE = "^(qemux86|qemux86-64|qemuarm64|qemuarm|qemuarmv5)$"
>
>  # Functionality flags
> diff --git a/meta/recipes-kernel/linux/linux-yocto_6.12.bb
> b/meta/recipes-kernel/linux/linux-yocto_6.12.bb
> index fefed8c9c5..b5efcc0192 100644
> --- a/meta/recipes-kernel/linux/linux-yocto_6.12.bb
> +++ b/meta/recipes-kernel/linux/linux-yocto_6.12.bb
> @@ -43,6 +43,10 @@ KBRANCH:class-devupstream = "v6.12/base"
>  SRC_URI = "git://
> git.yoctoproject.org/linux-yocto.git;name=machine;branch=${KBRANCH};protocol=https
> <http://git.yoctoproject.org/linux-yocto.git;name=machine;branch=$%7BKBRANCH%7D;protocol=https>
> \
>             git://
> git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.12;destsuffix=${KMETA};protocol=https
> <http://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.12;destsuffix=$%7BKMETA%7D;protocol=https>
> "
>
> +# Appears to be the only way to build out-of-tree
> +# kernel drivers with the yocto project SDK.
> +SRC_URI +=
> "file://0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch"
> +
>

linux-yocto patches go to the linux-yocto mailing list for integration.

But I think there are other ways to solve / work around this, so no need to
send it there immediately.

Bruce



>  LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
>  LINUX_VERSION ?= "6.12.27"
>
> --
> 2.43.0
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#216393):
> https://lists.openembedded.org/g/openembedded-core/message/216393
> Mute This Topic: https://lists.openembedded.org/mt/113084730/1050810
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
> bruce.ashfield@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
Vincent Davis Jr May 20, 2025, 12:36 a.m. UTC | #3
On Thu, May 15, 2025 at 12:58 PM, Bruce Ashfield wrote:

> 
> KBUILD_USERHOSTCFLAGS

Hello this patch may be dropped. May just have been an issue with the way I build
the standard SDK in my setup. Cloning poky and building bellow recipe generates
a standard SDK who's kernel source tree can be prepared for out-of-tree driver
development. Should of tried this first.

> 
> cat >> recipes-sdk/images/base-devel-sdk.bb <<EOF
> SUMMARY = "Some Development Standard SDK"
> LICENSE = "MIT"
> inherit populate_sdk
> TOOLCHAIN_TARGET_TASK += "kernel-devsrc"
> EOF
> 

> 
> KBUILD_USERHOSTCFLAGS="${KCFLAGS}" make -e -C
> sysroots/core2-64-poky-linux/lib/modules/6.12.27-yocto-standard/build/
> modules_prepare
> 

Appears to work for me

Thanks,
Vincent
Vincent Davis Jr May 20, 2025, 12:44 a.m. UTC | #4
Correction,

Above gets me to the m2c command which is further
than originally issue.

Probably more an issue on my end.
diff mbox series

Patch

diff --git a/meta/recipes-kernel/linux/files/0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch b/meta/recipes-kernel/linux/files/0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch
new file mode 100644
index 0000000000..edf6a8480f
--- /dev/null
+++ b/meta/recipes-kernel/linux/files/0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch
@@ -0,0 +1,65 @@ 
+From e48021f480428b5e34d299261029bfafdf0e3a2f Mon Sep 17 00:00:00 2001
+From: Vincent Davis Jr <vince@underview.tech>
+Date: Sun, 11 May 2025 19:57:46 -0400
+Subject: [PATCH] Makefile: add KCFLAGS to build with Yocto SDK
+
+Upstream-Status: Pending
+
+When running
+
+make -C \
+"${SDKTARGETSYSROOT}/lib/modules/<kernel version>/build" \
+modules_prepare
+
+Issues that are encountered include
+
+make -f ./Makefile syncconfig
+make -f ./scripts/Makefile.build obj=scripts/basic
+   92 | #include <sys/types.h>
+      |          ^~~~~~~~~~~~~
+compilation terminated.
+
+ld: cannot find Scrt1.o: No such file or directory
+ld: cannot find crti.o: No such file or directory
+ld: cannot find crtbeginS.o: No such file or directory
+ld: cannot find -lgcc: No such file or directory
+ld: cannot find -lgcc_s: No such file or directory
+ld: cannot find -lc: No such file or directory
+ld: cannot find -lgcc: No such file or directory
+ld: cannot find -lgcc_s: No such file or directory
+ld: cannot find crtendS.o: No such file or directory
+ld: cannot find crtn.o: No such file or directory
+
+Solved by setting KCFLAGS as the yocto project SDK
+KCFLAGS is set to --sysroot="${SDKTARGETSYSROOT}".
+
+Signed-off-by: Vincent Davis Jr <vince@underview.tech>
+---
+ Makefile | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 64c514f4bc19..bbe7b0503841 100644
+--- a/Makefile
++++ b/Makefile
+@@ -459,7 +459,7 @@ HOSTRUSTC = rustc
+ HOSTPKG_CONFIG	= pkg-config
+ 
+ KBUILD_USERHOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \
+-			 -O2 -fomit-frame-pointer -std=gnu11
++			 -O2 -fomit-frame-pointer -std=gnu11 $(KCFLAGS)
+ KBUILD_USERCFLAGS  := $(KBUILD_USERHOSTCFLAGS) $(USERCFLAGS)
+ KBUILD_USERLDFLAGS := $(USERLDFLAGS)
+ 
+@@ -491,7 +491,7 @@ KBUILD_HOSTCXXFLAGS := -Wall -O2 $(HOST_LFS_CFLAGS) $(HOSTCXXFLAGS) \
+ 		       -I $(srctree)/scripts/include
+ KBUILD_HOSTRUSTFLAGS := $(rust_common_flags) -O -Cstrip=debuginfo \
+ 			-Zallow-features= $(HOSTRUSTFLAGS)
+-KBUILD_HOSTLDFLAGS  := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS)
++KBUILD_HOSTLDFLAGS  := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS) $(KCFLAGS)
+ KBUILD_HOSTLDLIBS   := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
+ KBUILD_PROCMACROLDFLAGS := $(or $(PROCMACROLDFLAGS),$(KBUILD_HOSTLDFLAGS))
+ 
+-- 
+2.43.0
+
diff --git a/meta/recipes-kernel/linux/linux-yocto-dev.bb b/meta/recipes-kernel/linux/linux-yocto-dev.bb
index 4b1f93a692..43ad4c4791 100644
--- a/meta/recipes-kernel/linux/linux-yocto-dev.bb
+++ b/meta/recipes-kernel/linux/linux-yocto-dev.bb
@@ -20,6 +20,10 @@  KMETA = "kernel-meta"
 SRC_URI = "git://git.yoctoproject.org/linux-yocto-dev.git;branch=${KBRANCH};name=machine;protocol=https \
            git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=master;destsuffix=${KMETA};protocol=https"
 
+# Appears to be the only way to build out-of-tree
+# kernel drivers with the yocto project SDK.
+SRC_URI += "file://0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch"
+
 # Set default SRCREVs. Both the machine and meta SRCREVs are statically set
 # to the korg v3.7 tag, and hence prevent network access during parsing. If
 # linux-yocto-dev is the preferred provider, they will be overridden to
diff --git a/meta/recipes-kernel/linux/linux-yocto-rt_6.12.bb b/meta/recipes-kernel/linux/linux-yocto-rt_6.12.bb
index 6560175461..3f34dbf87d 100644
--- a/meta/recipes-kernel/linux/linux-yocto-rt_6.12.bb
+++ b/meta/recipes-kernel/linux/linux-yocto-rt_6.12.bb
@@ -20,6 +20,10 @@  SRCREV_meta ?= "a50ff542f8d79235030741f9e850d34768907d2d"
 SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;branch=${KBRANCH};name=machine;protocol=https \
            git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.12;destsuffix=${KMETA};protocol=https"
 
+# Appears to be the only way to build out-of-tree
+# kernel drivers with the yocto project SDK.
+SRC_URI += "file://0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch"
+
 LINUX_VERSION ?= "6.12.27"
 
 LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
diff --git a/meta/recipes-kernel/linux/linux-yocto-tiny_6.12.bb b/meta/recipes-kernel/linux/linux-yocto-tiny_6.12.bb
index cf6014efad..aab465e9dd 100644
--- a/meta/recipes-kernel/linux/linux-yocto-tiny_6.12.bb
+++ b/meta/recipes-kernel/linux/linux-yocto-tiny_6.12.bb
@@ -25,6 +25,10 @@  PV = "${LINUX_VERSION}+git"
 SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;branch=${KBRANCH};name=machine;protocol=https \
            git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.12;destsuffix=${KMETA};protocol=https"
 
+# Appears to be the only way to build out-of-tree
+# kernel drivers with the yocto project SDK.
+SRC_URI += "file://0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch"
+
 COMPATIBLE_MACHINE = "^(qemux86|qemux86-64|qemuarm64|qemuarm|qemuarmv5)$"
 
 # Functionality flags
diff --git a/meta/recipes-kernel/linux/linux-yocto_6.12.bb b/meta/recipes-kernel/linux/linux-yocto_6.12.bb
index fefed8c9c5..b5efcc0192 100644
--- a/meta/recipes-kernel/linux/linux-yocto_6.12.bb
+++ b/meta/recipes-kernel/linux/linux-yocto_6.12.bb
@@ -43,6 +43,10 @@  KBRANCH:class-devupstream = "v6.12/base"
 SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;name=machine;branch=${KBRANCH};protocol=https \
            git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-6.12;destsuffix=${KMETA};protocol=https"
 
+# Appears to be the only way to build out-of-tree
+# kernel drivers with the yocto project SDK.
+SRC_URI += "file://0001-Makefile-add-KCFLAGS-to-build-with-Yocto-SDK.patch"
+
 LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
 LINUX_VERSION ?= "6.12.27"