【问题标题】:Redirecting output of linux module build重定向linux模块构建的输出
【发布时间】: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 的地方。

标签: linux module makefile kernel


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-11-25
    • 2011-02-23
    • 1970-01-01
    • 2019-07-22
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多