-
-
Notifications
You must be signed in to change notification settings - Fork 787
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
linux内核模块编译 #1923
Comments
你可以覆盖内置的 linux-headers 重写路径指向你的源码路径 package("linux-headers")
on_fetch(function (package, opt)
return {includedirs = "/usr/src/linux-headers-5.0/include"}
end)
package_end()
add_requires("linux-headers")
target("test")
add_rules("platform.linux.driver")
add_rules("src/*.c")
add_packages("linux-headers") |
刚改进了下,可以更加简单的传递自己的路径,如果不走包模式的话。 target("hello")
add_rules("platform.linux.driver")
add_files("src/*.c")
set_values("linux.driver.linux-headers", "/usr/src/linux-headers-5.11.0-41-generic") 我们也可以通过定义 option 选项,将 linux-headers 路径作为 option("linux-headers", {showmenu = true, description = "Set linux-headers path."})
target("hello")
add_rules("platform.linux.driver")
add_files("src/*.c")
set_values("linux.driver.linux-headers", "$(linux-headers)") |
仔细看下文档 examples 。。指定 cross 平台 https://xmake.io/#/zh-cn/guide/project_examples?id=%e4%ba%a4%e5%8f%89%e7%bc%96%e8%af%91 |
我只在在 linux kernel 5.x 上测过,回头其他版本测下
那也应改是切工具连,而不是平台,-p cross --toolchain=xxx |
不过你那么配置应该也是可以的,只是 driver 那个 rule 内部 on_load 里面提前取了 toolchain 导致交叉工具链获取失效了。。这块回头有空可以改进下。。 |
我改进了下 可以更新到 dev再试试 |
这个试了可以,谢谢。然后就是,我验证了一下其他的架构,目前不支持mips和powerpc,这个后面可以支持么? |
这个试了可以,谢谢。然后就是,我验证了一下mips和powerpc的架构,提示不支持,这个后面可以支持么? |
我暂时没工具链和环境测试,最近也没空搞了,你可以直接提个 pr 过来 里面对其他 arch 判断下就行了 |
mips powerpc 加上了 |
前两图只有一些警告,没看到具体错误,最后一个问题,我改进了下,应该可以了,更新下再试试 |
其实错误就是我以前发的图片的错误,其实我想说明的是,前两个图片的编译和后最后一个图片的编译区别很大,最后一个图片的编译有很多编译属性的,但是前两个就没有。所以说,前两个图片编译出错,是不是就是因为缺少这些编译属性导致的。 |
最好给完整编译错误,完整执行命令,以及详细输出还有完整 xmake.lua 配置,不要图片,否则不好查问题,我都不知道到底那个问题对哪个。。另外最后一个问题 刚修复的,请确认下 |
好的,那我晚上把整个日志附上 |
xmake内核编译错误记录这里通过两种编译方式来说明,第一种是在xmake.lua里面配置架构和交叉编译链,第二种是通过命令行传递的方式,两种方式都用同一xmake.lua文件,然后测试代码为xmake里面的hello例子,内核源码为4.19。xmake.lua如下: toolchain("gcc-arm32")
set_kind("standalone")
set_sdkdir("/opt/gcc-arm")
toolchain_end()
if is_plat("arm32") then
set_toolchains("gcc-arm32")
set_arch("arm")
end
target("hello")
add_rules("platform.linux.driver")
add_files("src/*.c")
set_values("linux.driver.linux-headers", "../linux-xlnx")
set_license("GPL-2.0") 第一种方法命令行输入 第二种方法1、命令行输入 2、改一下xmake.lua里面的内核路径,使用绝对路径,再次使用 |
第一,第二种,你都用了相对路径,不是这么设置的,目前只有 add_files add_headerfiles 此类路径接口,才支持基于当前 xmake.lua 的相对路径,内部会给你做自动路径变换,生成正确的绝对路径。。 但是 其他设置接口,只会把它当做 string 直接传入编译器,所以如果编译器执行的当前路径变动都会导致失败。。 你得改成:
来设置基于当前脚本路径,或者干脆基于工程根目录
这个我没看到完整 link output ,按理 -v 应该会输出 link args 才对。。看到了,我才能知道哪里有问题 或者你切到 makefile 版本,给我一份带 verbose 的完整输出。。我对下 flags |
关于最后那个问题,我大概知道原因,但是没有 4.x 的 kernel 。。你这整个 hello module makefile ,开下 V=1 然后切到你的 kernel 上去,执行后,给我一份完整的输出,我需要分析后才能做改进 或者用这个 module demo 切到 makefile 上开下 V=1 |
通过Makefile编译的日志如下: |
我改进过了 再试试 |
xmake update -s master到最新,还是有问题,错误如下,看ld的地方,感觉像是没有链接脚本:
|
怪了,按理应该可以了,你更新到 test 分支,再给我一份 -v 的输出,我看下。。xmake update -s github:xmake-io/xmake#test |
xmake update -s github:xmake-io/xmake#test 操作之后,xmake -v结果如下:
|
我改了下,再更新下 test 分支给我一份 log |
更新之后,通过
但是通过 |
凡事先贴完整输出和错误,我哪知道是以前的哪个错误 |
好的,错误如下: |
加了点 log 再更新下 test 分支,给我个完整输出 |
ok,更新后输出日志如下: 我有个疑问,想请教一下:xmake里面编译内核模块,是通过解析内核源码的Makefile来实现的,还是说通过Makefile编译的make V=1的输出信息来适配的。假如说是通过make V=1来不停地去适配不同的内核版本,感觉这个方向就有点偏了,后面可能就是不停的去适配内核版本了。 |
改了下,在更新下 test 试试,如果还是不行,再给份输出
分析的 make V=1 ,这反而是兼容性最好的方案,只要迭代几个版本,基本就能完全稳定。。 现在因为是初步支持,之前的实现逻辑,还存在一些硬编码,所以才会有些问题,最近几次改进,已经删除这部分硬编码 flags,完全适配 make V=1 输出,所以兼容性更好了。。 而你现在最后一个问题,也跟这个没啥关系,是你 -p arm64,设置的平台不符合我当初的要求, 没设置我之前需要的 cross 平台,所以内部仅判断 cross plat 导致的问题,跟解析 V=1 没任何关系 所以,目前的方案是最不会根据 kernel 版本做各种适配的,兼容性最好。。 而且,其他也没更好的方案:
如果你有更好的方案,可以提出来,但是我目前想到的,就当前这个最好,而且现在跟你调的各种问题,也跟kernel版本兼容性无关,都是其他地方的问题,以及原本解析逻辑存在的问题修复而已。 |
新改的可以通过xmake f -p arm32 -c编译过了,谢谢了。。。。我也没有好的方案,只是这几天通过这些问题,有了一些疑问,所以问一下,了解一下。 |
那你更新到 dev 分支吧,昨天已经同步过去了 这些改动 |
换了个平台龙芯2K的,内核是3.10版本,gcc是4.9.3,xmake.lua如下: toolchain("gcc-arm32")
set_kind("standalone")
set_sdkdir("/opt/gcc-arm")
toolchain_end()
toolchain("gcc-mips")
set_kind("standalone")
set_sdkdir("/opt/gcc-4.9.3-64-gnu64")
toolchain_end()
if is_plat("arm32") then
set_toolchains("gcc-arm32")
set_arch("arm")
set_values("linux.driver.linux-headers", "/home/zhangting/workspace/project/xmaketest/linux-xlnx")
end
if is_plat("ls2k") then
set_toolchains("gcc-mips")
set_arch("mips")
set_values("linux.driver.linux-headers", "/home/zhangting/workspace/project/sh-ls2k/linux-3.10")
end
target("hello")
add_rules("platform.linux.driver")
add_files("src/*.c")
-- set_values("linux.driver.linux-headers", "/home/zhangting/workspace/project/xmaketest/linux-xlnx")
set_license("GPL-2.0") 通过 通过Makefile,日志如下: |
2.txt 下载不了 |
可能是这个github总是网络访问出问题,我重新上传2.txt。 |
现在这个问题是由于 includedirs 我目前还没走 make V=1 提取,还是尝试硬编码自己拼的路径列表,原本以为不同 kernel 下差异不会太大,所以没去动。。看来也要全走 make V=1 才能自动适配不同 kernel 版本的 includedirs 路径。。 我明天抽空也改下就好了。 |
我 dev 改过了,全走 V=1 提取了,再试试,xmake update -s github:xmake-io/xmake#dev |
再给个 make V=1的输出给我看下呢 |
好的,日志如下: |
再试试 |
再试试 |
可以了,谢谢 |
我正在编译一个helloworld的Linux驱动但是遇到了很多问题。 环境
第一种配置文件无法正常安装add_requires("linux-headers")
target("hello")
-- add_includedirs("/usr/src/linux-headers-5.15.0-57/include",
-- "/usr/src/linux-headers-5.15.0-57-generic/arch/x86/include/generated",
-- "/usr/src/linux-headers-5.15.0-57/arch/x86/include"
-- )
add_rules("platform.linux.driver")
add_files("src/*.c")
-- set_values("linux.driver.linux-headers", "/usr/src/linux-headers-5.15.0-57/include")
add_packages("linux-headers")
-- set_license("GPL-2.0")
使用insmod安装报错如下
第二种配置无法找到头文件add_requires("linux-headers", {configs = {driver_modules = true}})
package("linux-headers")
on_fetch(function (package, opt)
return {includedirs = "/usr/src/linux-headers-5.15.0-57/include"}
end)
package_end()
add_requires("linux-headers")
target("hello")
-- add_includedirs("/usr/src/linux-headers-5.15.0-57/include",
-- "/usr/src/linux-headers-5.15.0-57-generic/arch/x86/include/generated",
-- "/usr/src/linux-headers-5.15.0-57/arch/x86/include"
-- )
add_rules("platform.linux.driver")
add_files("src/*.c")
-- set_values("linux.driver.linux-headers", "/usr/src/linux-headers-5.15.0-57/include")
add_packages("linux-headers")
-- set_license("GPL-2.0")
而该文件是存在的, 第三种配置,头文件丢失target("hello")
-- add_includedirs("/usr/src/linux-headers-5.15.0-57/include",
-- "/usr/src/linux-headers-5.15.0-57-generic/arch/x86/include/generated",
-- "/usr/src/linux-headers-5.15.0-57/arch/x86/include"
-- )
add_rules("platform.linux.driver")
add_files("src/*.c")
set_values("linux.driver.linux-headers", "/usr/src/linux-headers-5.15.0-57/include")
-- add_packages("linux-headers")
-- set_license("GPL-2.0")
即使我添加了头文件路径 target("hello")
add_includedirs("/usr/src/linux-headers-5.15.0-57/include",
"/usr/src/linux-headers-5.15.0-57-generic/arch/x86/include/generated"
)
add_rules("platform.linux.driver")
add_files("src/*.c")
set_values("linux.driver.linux-headers", "/usr/src/linux-headers-5.15.0-57/include") 又会产生如下报错:
|
新问题,单独开 issues |
看了新发布的2.6.2介绍,支持linux内核模块编译,但是内核以及相关的工具都是从网上去拉取。而对于嵌入式场景,内核是定制化的,源码都在本地,并且相应的环境也是搭建好的,所以是否可以支持指定本地内核源码路径来编译内核模块?
The text was updated successfully, but these errors were encountered: