Linux 内核 - 如何为本地子目录运行 make



我正在尝试将现有代码移植到更大的项目中。较大的项目有一个主生成文件,每个子目录中都有生成文件。我相信下面的路径会告诉您有关其设置方式的所有信息。我想将我的代码移植到

/WORKING_DIRECTORY/Drivers/Char/example

以下是内容:

sansari@ubuntu:~/WORKING_DIRECTORY/drivers/char/examples$ ls
hello1.c  Makefile

我的问题是 1- 应该修改这个本地制作文件还是主文件?我正在设置修改这个,但我不确定。

2-我的另一个问题是,如果我修改此本地文件,我可以从这里运行make并验证我的配置而不是为整个项目运行make吗?我知道只更新更改的文件;但是,当我在每次制作之前清洁构建环境时,我感觉更好。我遇到了一些情况,仅此一项就解决了我的问题。

就像背景一样,我确实尝试包含目标项目的 make 文件,我试图使用 -f 命令在此处导入该文件。我所做的是:make -f Makefile -f ../mytarget/core/Makefile但是我遇到了一些问题,使得它没有做它在主要项目中所做的一些正常事情。例如,有一个包含语句,其中包含头文件的相对路径,这让我错误地看不到它。所以现在我暂时放弃了这一策略。

@Ahmad 马苏德 - 嘿,伙计,谢谢。这是生成文件。嘿伙计,链接正是我所需要的。我认为它也会解决我的其他问题。你看,我交叉编译了这段代码,当我刷我的手机时,我得到了以下内容

uname -r:  1|root@hltespr:/lib/modules # uname -r
uname -r
3.4.0-g7e6fbf7-dirty

我一直想知道"肮脏"是什么意思以及它来自哪里。如果你知道,请告诉我。您发送的链接指出,也许会在那里插入Linux内核版本?我问这个,因为当我尝试加载我的模块时,modprobe 不起作用。相反,insmod 工作,我可以验证我的模块是否在。我现在的主要问题是我不知道如何执行文件以确保它运行。我只知道如何使用 modprobe 运行文件,我不能使用它。它给了我以下错误:

1|root@hltespr:/ # modprobe /lib/modules/hello1.ko
modprobe /lib/modules/hello1.ko
modprobe: can't change directory to '3.4.0-g7e6fbf7-dirty': No such file or directory

截至 06 年 20 月 15 日的更新 - 我在模块的 make 文件中输入了include /home/sansari/mytree2/tbt/makefile。我收到以下错误:makefile:3: *** missing separator. Stop.

@Ahmad - 这是截至062415的更新。感谢您提供的信息。我的目标是查看这个外部目录,收集所有源文件并为我构建它们。你有什么建议?我被困住了,因为就目前而言,我知道make会查看我的示例目录,但是我对示例目录中的本地make文件所做的其他更改没有显示在make中。例如,我尝试添加($warning...)和@echo消息,但即使它们也没有显示。

070215更新-感谢您之前的评论和支持。我觉得我真的应该重新打开这个线程,因为我没有详细解释目标,现在我觉得我可以更好地描述它,希望解决方案会对其他人有所帮助。我发出命令:

TARGET=msm8974 PLATFORM=msm8974 make  drivers/char/examples

但是我收到一条消息,指出:没有什么可做的,而我添加了一些任务要做。 下面是我的 make 文件,我将详细说明我之后添加的内容:

lib_tbt := ../../../m/shahin/tbt
lib_daemon := ../../../m/shahin/daemon
lib_lib := ../../../m/shahin/lib
lib_tasks := ../../../m/shahin/tasks
lib_tbt_driver := ../../../m/shahin/tbt_driver
lib_tbt_make := ../../../m/shahin/tbt/make
lib_tbt_msm_common := ../../../m/shahin/tbt/platform/msm8974/common
lib_tbt_msm8974 := ../../../m/shahin/tbt/platform/msm8974
lib_asm_generic = ../../../m/shahin/tbt/platform/msm8974/include/asm-generic
$(warning This is what is in lib_asm_generic $(lib_asm_generic))
#include $(lib_tbt_make)/macros.mk
.PHONY: all $(lib_tbt)
$(lib_tbt) $(lib_daemon) $(lib_lib) $(lib_tasks) $(lib_tbt_driver) $(lib_tbt_make) $(lib_tbt_msm_common) $(lib_tbt_msm8974) $(lib_asmgeneric) :
        $(MAKE) --directory=$@
        $(lib_*): $(MAKE) --directory=$@
obj-$(CONFIG_EXAMPLES)          += hello1.o
_

最初,我的 make 文件中只有 obj-$(CONFIG_EXAMPLES) += hello1.o 语句。然后,我继续在makefile的顶部添加目录变量,并添加了$(lib_*): $(MAKE) --directory=$@指导make来编译目录中的内容。我相信这就是它的作用。如果我弄错了,请告诉我。尽管当我将它放在项目中的不同目录时,这个相同的 make 文件会继续创建对象文件,但当它位于设备驱动程序目录中时,它不会这样做。我不明白为什么。另一个目录是/external 目录,它位于树的顶部。但这应该无关紧要。我所做的是首先确保我可以在我的设备驱动程序目录中编译一个名为/examples 的 hello 程序。我现在想向本节添加更多源代码。我相信正确的术语是模块?我还想知道我是否应该将源文件复制到/examples 目录或通过路径引用它们是可以的。也就是说,我是否应该将源代码目录移动到/examples 目录下?

如果您使用的是使用 Kbuild 的内核,则比这简单得多。

强烈推荐阅读

http://www.tldp.org/LDP/lkmpg/2.6/html/x181.html

情况 A - 您的源代码是内核源代码的子树

您不会修改顶级生成文件,只需确保正确/正常设置~/WORKING_DIRECTORY/drivers/char/examples/Makefile~/WORKING_DIRECTORY/drivers/char/examples/KBuild即可。 然后在内核构建目录的顶层(假设您有一个单独的构建目录),您将键入:

 foo@bar:~/build-dir$ make drivers/char/examples

然后,内核顶级生成文件仅构建该子树。 您可以在内核的任何部分试用,例如:

 foo@bar:~/build-dir$ make fs

注意:build-dir可以与内核源目录相同

情况 B - 您正在构建外部模块

然后使用普通模块KBuild/Makefile进程。

附言

如果您发布您的makefile/Kbuild,那么我可能会帮助进行实际的构建处理。

最新更新