重定向linux模块构建的输出
Posted
技术标签:
【中文标题】重定向linux模块构建的输出【英文标题】:Redirecting output of linux module build 【发布时间】:2012-07-25 11:00:02 【问题描述】:我想重定向我的模块构建的输出以将工件与源隔离。
我的 makefile 看起来像:
obj-m += hello-1.o
all:
make ARCH=arm CROSS_COMPILE=arm-eabi- -C /work/TI-android-ICS-4.0.3_AM37x_3.0.0/kernel M=$(PWD) modules
clean:
make ARCH=arm CROSS_COMPILE=arm-eabi- -C /work/TI-Android-ICS-4.0.3_AM37x_3.0.0/kernel M=$(PWD) clean
这可以正常工作,只是模块输出恰好在我的源目录中。我尝试在每一行中添加 O=path to my output dirctory ,但是它无法使用类似...的东西构建......
错误:内核配置无效。 缺少 include/generated/autoconf.h 或 include/config/auto.conf。 在内核 src 上运行 'make oldconfig && make prepare' 来修复它。
警告:符号版本转储 /work/development/linux/driver/blah/Module.symvers 不见了;模块将没有依赖项和修改版本。
我认为这是因为模块构建中使用了内核构建的一些输出文件,并且使用“O=”更改输出目录会与之发生冲突。
有没有一种方法可以使用现有的构建基础设施来实现这一点?
【问题讨论】:
您的问题不清楚,但我猜.../kernel
是您的源目录,也是构建modules
的makefile 所在的位置。没有看到那个makefile,我们不能给你一个具体的答案。让它把它的产品放到其他地方可能是微不足道的,或者是真正的痛苦。
@Beta 抱歉,不清楚。内核确实位于 /work/TI-Android.../kernel。我的模块源位于 /work/mymodule,这是我执行上面列出的 makefile 的地方。
【参考方案1】:
查看the module system 的文档,看起来不太好。也许您可以将.config
复制到您的构建目录中,然后设置make oldconfig && make modules-prepare
和O=
。
或者,如果您从另一个目录运行make
,会发生什么情况?
/somewhere/else$ make -C /path/to/kernel ARCH=arm CROSS_COMPILE=arm-eabi- M=/your/module/dir modules
【讨论】:
不幸的是,当我从“其他”目录执行 make 时,输出仍将输出放在模块源目录中。另外,当我尝试 make oldconfig 和 make prepare (modules-prepare 似乎不是一个有效的目标)时,它抱怨内核目录不干净。 您是否尝试过保存.config
,清理内核目录,然后设置O=
进行准备工作?至少对于 automake 和 kbuild 来说,不允许在脏树上进行源外构建是常见的。【参考方案2】:
这个 Makefile 将解决您的问题
obj-m += hello-1.o
all:
make ARCH=arm CROSS_COMPILE=arm-eabi- -C /work/TI-Android-ICS-4.0.3_AM37x_3.0.0/kernel M=$(PWD) modules_install INSTALL_MOD_PATH=<output directory for modules>
clean:
make ARCH=arm CROSS_COMPILE=arm-eabi- -C /work/TI-Android-ICS-4.0.3_AM37x_3.0.0/kernel M=$(PWD) clean
【讨论】:
以上是关于重定向linux模块构建的输出的主要内容,如果未能解决你的问题,请参考以下文章