如何为本地子目录运行make

时间:2015-06-19 19:18:02

标签: 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还是主要的?我正在修改这个,但我不确定。

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

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

@Ahmad Masoud - 嘿,伙计,谢谢。 Here是Makefile。嘿,这个链接正是我所需要的。我认为它也将解决我的其他问题。你看,我交叉编译了这段代码,当我刷了手机时,我得到了以下内容

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日起更新 - 我将include /home/sansari/mytree2/tbt/makefile放入我的模块的make文件中。我收到以下错误: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目录下移动源代码目录吗?

1 个答案:

答案 0 :(得分:1)

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

强烈建议阅读

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

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

您不会修改顶级Makefile,只需确保<nav class="navbar navbar-default navbar-static-top" role="navigation"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#tusaj-main"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand brandmedia" href="#"><img src="img/logo_final.png" alt=""></a> </div> <!-- Collect the nav links, forms, and other content for toggling --> <div class="pspacerv20t spacerh10r"> <div class="collapse navbar-collapse" id="tusaj-main"> <ul class="nav navbar-nav navbar-right"> <p class="navbar-text">Search Jobs By:</p> <li><a href="#">State</a></li> <li class="divider-vertical"></li> <li><a href="#"><div class="spacerh80"> Category</div></a></li> <li><a href="#">Post Jobs</a></li> <li class="divider-vertical"></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Client Login <span class="caret"></span></a> <ul class="dropdown-menu" role="menu"> <li> <form class="form-inline no-margin center-block" role="form"> <div class="form-group pspacerv10b pspacerv10t"> <div class="col-sm-5"> <input type="text" placeholder="Username" class="form-control"> </div> </div> <div class="form-group pspacerv10b"> <div class="col-sm-5"> <input type="password" placeholder="Password" class="form-control"> </div> </div> <!--<div class="form-group pspacerv10b"> <div class="col-sm-6"> <div class="checkbox"> <label><input type="checkbox"> Remember me</label> </div> </div> </div> /--> <div class="form-group center-block pspacerv10b"> <div class="col-sm-3"> <button type="submit" class="btn btn-success">Sign in</button> </div> </div> </form> </li> </ul> </li> </ul> </div> </div><!-- /.navbar-collapse --> </div><!-- /.container-fluid --> <div class="tagline col-lg-12"> <p class="taglinealignright pspacerv15t spacerh25r">Search Jobs and Careers: Find Your Ideal Job. 1,000s of New Jobs Daily!</p> <br /> </div> </nav> ~/WORKING_DIRECTORY/drivers/char/examples/Makefile设置正确/正常。那么在内核构建目录的顶层(假设你有一个单独的构建目录),你可以输入:

~/WORKING_DIRECTORY/drivers/char/examples/KBuild

然后,内核顶级makefile只构建该子树。您可以在内核的任何部分进行尝试,例如:

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

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

相同

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

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

P.S。

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