重定向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-prepareO=


或者,如果您从另一个目录运行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模块构建的输出的主要内容,如果未能解决你的问题,请参考以下文章

Linux重定向(输入重定向 | 输出重定向)

Linux就该这么学——初识重定向

LINUX 标准错误输出重定向

Linux重定向

Linux管道符重定向与环境变量

Linux标准输入输出与重定向详解果断收藏