各路神仙帮帮我这个凡人个忙!!(Makefile)

fengqingyang000 2010-12-02 04:06:41
小弟初入程序员江湖,武功浅薄,求一名师而不得。近日兴致勃发,挥手而就几行linux内核代码(大神不要笑我),然Makefile不知其要领,访某一网站临摹而成,虽得结果,然不明其理,求各神解说,弟不胜感激!
Makefile内容如下:
ifeq ($(KERNELRELEASE),)
#$(KERNELRELEASE),何解?
KERNELSRCDIR = /usr/src/kernels/2.6.18-194.el5-x86_64

BUILD_DIR :=$(shell pwd)

all: modules
modules:
make -C $(KERNELSRCDIR) M=$(BUILD_DIR) modules

clean:
rm -rf *.o *~ core .depend *.ko *.mod.c .tmp_versions mykernel

.PHONY: modules clean
#.PHONY何解?
else
obj-m := mykernel.o
endif

#为何使用ifeq else endif结构?为何obj-m := mykernel.o写在else下??
...全文
157 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2010-12-02
  • 打赏
  • 举报
回复
一个拿不出手的例子:
#ifeq (${objective}, "lib")
all:
#一些编译动作,产生一个库
#else
all:
#一些编译动作,产生一个可执行文件
#endif
这样如果make objective=lib,就会执行if分枝,编译一个库出来;如果直接make,那么就执行else分枝,编译一个可执行文件出来。
其实就把make当成一种programming就可以了,和常见的编程没什么区别,有变量,有条件运行,等等。
fengqingyang000 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 forestdb 的回复:]
终极密码:上GNU官网,找make,然后有它的manual,然后RTFM(不知道RTFM?read the fxcking manual)。
附带一提,我是有全部读完的。
[/Quote]

经过两位大哥的解答,小弟好像有些感觉了,非常感谢两位,虽然分数少的拿不出手,但是一定会给两位的以表谢意。如果ForestDB能够再给我说说“搞kernel的人想出了一套方法,来简化build流程和kernel的开发”中的这套方法是怎样一套方法?或者您再举个简单的另一套方法来对比一下就更感谢您了。
再次感谢两位!
ForestDB 2010-12-02
  • 打赏
  • 举报
回复

终极密码:上GNU官网,找make,然后有它的manual,然后RTFM(不知道RTFM?read the fxcking manual)。
附带一提,我是有全部读完的。

小弟初入程序员江湖,武功浅薄,求一名师而不得。近日兴致勃发,挥手而就几行linux内核代码(大神不要笑我),然Makefile不知其要领,访某一网站临摹而成,虽得结果,然不明其理,求各神解说,弟不胜感激!
Makefile内容如下:
ifeq ($(KERNELRELEASE),)
#$(KERNELRELEASE),何解?

KERNELRELEASE是变量,是在“某处”有定义的,即kernel系统的make框架里面

KERNELSRCDIR = /usr/src/kernels/2.6.18-194.el5-x86_64

BUILD_DIR :=$(shell pwd)

all: modules
modules:
make -C $(KERNELSRCDIR) M=$(BUILD_DIR) modules

clean:
rm -rf *.o *~ core .depend *.ko *.mod.c .tmp_versions mykernel

.PHONY: modules clean
#.PHONY何解?

“假”的目标,这里的假是相对于常见的目标来说的,比如我们写个hello,有hello.c源文件,可能需要编译成hello.o,然后连接成hello可执行档,这里的hello.o和hello(.exe)都是具体的目标,而且都是文件;与此对比,“假”的目标不是一个真正要生成的文件什么的,而只是个要执行的“命令”。

else
obj-m := mykernel.o
endif

#为何使用ifeq else endif结构?为何obj-m := mykernel.o写在else下??

这是一份代码,编译成两种不同文件的方法(一个分支是编译成module,一个分支是编译进kernel),这其实已经和make无太大关系,只是make提供了这样一个工具,然后搞kernel的人想出了一套方法,来简化build流程和kernel的开发。
赵4老师 2010-12-02
  • 打赏
  • 举报
回复
偶只知道MakeFile文件中的Tab字符必须是真的Tab字符,不能用空格代替。
skipjack36 2010-12-02
  • 打赏
  • 举报
回复
这个else 对应的不应该是ifeq ($(KERNELRELEASE),) 啊?
fengqingyang000 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 skipjack36 的回复:]
至于最后一个, 理由就一个, 它想这么写。。。
[/Quote]

我试过了,如果去掉else就不会生成相应的.ko了,奇怪也!不知他为何要这么这么写。
skipjack36 2010-12-02
  • 打赏
  • 举报
回复
如果为空 就会执行KERNELSRCDIR = /usr/src/kernels/2.6.18-194.el5-x86_64 以及下面的
skipjack36 2010-12-02
  • 打赏
  • 举报
回复
至于最后一个, 理由就一个, 它想这么写。。。
fengqingyang000 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 skipjack36 的回复:]
$(KERNELRELEASE) 取变量KERNELRELEASE 的值
ifeq ($(KERNELRELEASE),) 是判断 KERNELRELEASE 是否为空
[/Quote]

多谢!那样的话,如果KERNELRELEASE不为空岂不是就不走else了吗?为何还能生成相应的.ko呢?
skipjack36 2010-12-02
  • 打赏
  • 举报
回复
.PHONY: modules clean 说明modules clean 不是真正的文件
skipjack36 2010-12-02
  • 打赏
  • 举报
回复
$(KERNELRELEASE) 取变量KERNELRELEASE 的值
ifeq ($(KERNELRELEASE),) 是判断 KERNELRELEASE 是否为空
skipjack36 2010-12-02
  • 打赏
  • 举报
回复
#不是comment吗

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧