Linux kernel 如何为本地子目录运行make

Linux kernel 如何为本地子目录运行make,linux-kernel,linux-device-driver,gnu-make,Linux Kernel,Linux Device Driver,Gnu Make,我正在尝试将现有代码移植到一个更大的项目中。较大的项目有一个主Makefile,每个子目录中都有Makefile。我相信下面的路径会告诉你它是如何设置的。我想把我的代码移植到 /WORKING_DIRECTORY/Drivers/Char/example 内容如下: sansari@ubuntu:~/WORKING_DIRECTORY/drivers/char/examples$ ls hello1.c Makefile 我的问题是1-应该修改这个本地Makefile还是主Makefile

我正在尝试将现有代码移植到一个更大的项目中。较大的项目有一个主Makefile,每个子目录中都有Makefile。我相信下面的路径会告诉你它是如何设置的。我想把我的代码移植到

/WORKING_DIRECTORY/Drivers/Char/example
内容如下:

sansari@ubuntu:~/WORKING_DIRECTORY/drivers/char/examples$ ls
hello1.c  Makefile
我的问题是1-应该修改这个本地Makefile还是主Makefile?我正在设置修改这个,但我不确定

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

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

@艾哈迈德·马苏德-嘿,伙计,谢谢。是生成文件。嘿,伙计,这个链接正是我需要的。我想这也会解决我的其他问题。你看,我交叉编译了这段代码,当我闪现我的手机时,我得到了以下信息

uname -r:  1|root@hltespr:/lib/modules # uname -r
uname -r
3.4.0-g7e6fbf7-dirty
我一直在想“脏”是什么意思,它从哪里来。如果你知道,请告诉我。您发送的链接声明make可能会在那里插入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
从2015年6月20日起更新-我在模块的make文件中加入了
include/home/sansari/mytree2/tbt/makefile
。我得到以下错误:
makefile:3:**缺少分隔符。停止。

@艾哈迈德-这是截至062415的更新。谢谢你的信息。我的目标是让make查看这个外部目录,收集所有源文件并为我构建它们。你有什么建议?我被卡住了,因为我知道make会查看我的examples目录,但我对examples目录中的本地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_示例)+=hello1.o
语句。然后,我继续在makefile的顶部添加目录变量,并添加了
$(lib_*):$(MAKE)--directory=$@
命令MAKE编译目录中的内容。我相信它就是这样做的。如果我弄错了,请告诉我。虽然当我将同一个make文件放在项目中的另一个目录中时,它会继续创建对象文件,但当它位于设备驱动程序目录中时,它不会这样做。我不明白为什么。另一个目录是/external目录,它位于树的顶部。但这并不重要。我所做的是首先确保我可以在我的设备驱动程序目录中编译一个名为/examples的hello程序。现在我想在本节中添加更多源代码。我相信正确的术语是模块?我还想知道是否应该将源文件复制到/examples目录或通过路径引用它们。也就是说,我是否应该将源代码目录移到/examples目录下?

如果您使用的是使用Kbuild的内核,那么这要简单得多

强烈推荐阅读

情况A—您的源代码是内核源代码的一个子树 您不会修改顶级Makefile,只需确保正确/正常设置了
~/WORKING\u目录/drivers/char/examples/Makefile
~/WORKING\u目录/drivers/char/examples/KBuild
。然后在内核构建目录的顶层(假设您有一个单独的构建目录),您将键入:

 foo@bar:~/build-dir$ make drivers/char/examples
内核顶级makefile然后只构建该子树。您可以在内核的任何部分试用,例如:

 foo@bar:~/build-dir$ make fs
注意:
builddir
可以与内核源目录相同

情况B-您正在构建一个外部模块 然后使用普通模块KBuild/Makefile进程

附笔。
如果您发布makefile/Kbuild,那么我可能可以帮助您进行实际的生成处理。

谢谢。我处于情况A中。我只是尝试移植一堆其他代码,而这些代码本身也没有任何问题。但它是为一个不同的董事会建造的。他们两人都用胳膊跑步;事实上,我使用了相同的工具链。我已经在我的目标设备上运行了Example目录中的内容,所以我知道如果我在那里得到了代码,我会很好的。太好了,如果你需要帮助,请告诉我,我很高兴这有帮助。艾哈迈德,我错了。由于我试图将一个项目移植到另一个项目中,我相信我处于情况B中。两个项目都有特定于其需求的makefile。这里讨论了我可能遇到的一些问题:。你怎么认为?您仍然认为我应该遵循模块/Kbuild流程吗?你能详细说明一下吗