免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sky__sea
打印 上一主题 下一主题

[内核模块] 关于内核模块的Makefile [复制链接]

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
11 [报告]
发表于 2016-04-11 18:47 |只看该作者
本帖最后由 nswcfd 于 2016-04-11 18:55 编辑

清理一下输出
  1. [test]$ cat sub1/Makefile
  2. a=$(PWD)
  3. b=$(shell pwd)
  4. all:
  5.         @echo '$$(PWD)=$a $$(shell pwd)=$b'
  6.         make -C ../sub2

  7. [test]$ cat sub2/Makefile
  8. a=$(PWD)
  9. b=$(shell pwd)
  10. all:
  11.         @echo '$$(PWD)=$a $$(shell pwd)=$b'
  12.         @#make -C ../sub2

  13. [test]$ make -C sub1 --no-print
  14. $(PWD)=/home/test $(shell pwd)=/home/test/sub1
  15. make -C ../sub2
  16. $(PWD)=/home/test $(shell pwd)=/home/test/sub2
复制代码
注意$PWD一致保持在当前目录

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
12 [报告]
发表于 2016-04-11 18:49 |只看该作者
csdn吞掉了几个$

@echo '$$PWD=$a $$(shell pwd)=$b'
  1. @echo '$PWD=$a $(shell pwd)=$b'
复制代码
@echo '$$PWD=$a $$(shell pwd)=$b'

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-29 06:20:00
13 [报告]
发表于 2016-04-14 16:23 |只看该作者
a=$(PWD)
b=$(shell pwd)
obj-m := test.o

all :
        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
        echo $a

clean:
        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
include $(a)/test.make

还是不行,在echo的时候显示的路径是对的,当前我的代码路径,但是到后面的 include的时候,$a又编程了内核源码路径。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
14 [报告]
发表于 2016-04-18 12:02 |只看该作者
make不是过程式语言,而是声明式语言(有点像fp),include在所有的target(包括默认all)‘执行’之前完成。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
15 [报告]
发表于 2016-04-18 13:04 |只看该作者
本帖最后由 nswcfd 于 2016-04-18 13:13 编辑

1. Makefile @curdir
1) 解释make变量定义
a. a = curdir
b. b = curdir
c. include curdir/test.make
2)扫描规则&依赖
all: (默认)
3)build目标
a. 子make(make -C ksrc M=`pwd` modules) #注意-C的影响
b. echo curdir

2. Makefile @ksrc
1)解释变量
a. 几个关键的变量是M,KBUILD_EXTMOD, modules-dirs
b. 扫描规则&依赖
modules: modules-dirs
        make -f scripts/Mafile.modpost
modules-dirs:
        make -f scripts/Makefile.build obj=curdir
2)build依赖modules-dirs
a. 执行子make -f scripts/Makefile.build obj=curdir
3)build目标modules
a. 执行子make -f scripts/Mafile.modpost

3. Makefile.build @ksrc/scripts
1)解释变量
a. kbuild-file = curdir/Makfile
b. include $kbuild-file,即curdir/Makefile
b.1 a = $(PWD) = curdir           #-C不影响这个值
b.2 b = $(shell pwd) = ksrc       #注意不是ksrc/scripts
b.3 obj-m被定义
b.4 include $ksrc/test.make       #这个受到了-C的影响。
c. 根据obj-m的定义决定下一步行为

11楼的例子说明了-C对$(PWD)和$(shell pwd)的影响

PWD是shell的环境变量,make初始化的时候从环境变量里继承了这个值(外部变量,并向子make传递)。
make -C dir相当于在make内部调用chdir(dir),【不影响】继承自shell的make变量。
相反,所有在make内部发起的shell命令,由于shell会初始化自己的PWD,所以会受到chdir的影响。
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. void show()
  6. {
  7.         char buf[128];
  8.         strcpy(buf, "XXXX");
  9.         getcwd(buf, 128);
  10.         printf("getcwd=%s\n", buf);
  11.         printf("env[PWD]=%s\n", getenv("PWD"));
  12.         system("echo shell-pwd=`pwd`");
  13. }

  14. #define SUBDIR "sub"
  15. int main()
  16. {
  17.         show();
  18.         printf("\nchdir to %s...\n\n", SUBDIR);
  19.         chdir(SUBDIR);
  20.         show();
  21. }
复制代码

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
16 [报告]
发表于 2016-04-18 13:12 |只看该作者
楼主在Makefile的最前面加上
$(warning $$(PWD)=$(PWD), $$(shell pwd)=$(shell pwd))

第二次输出哪些值?

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-29 06:20:00
17 [报告]
发表于 2016-04-25 16:39 |只看该作者
$(warning $$(PWD)=$(PWD), $$(shell pwd)=$(shell pwd))
a=$(PWD)
b=$(shell pwd)
obj-m := 2.o
all :
        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
        echo $a
        echo $b
clean:
        $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
include $(a)/test.make


是这样吗?还是一样的错误。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
18 [报告]
发表于 2016-04-27 12:18 |只看该作者
本帖最后由 nswcfd 于 2016-04-27 12:19 编辑

加那句话其实是想判断一下楼主所用make程序的行为,不是用来解决问题的……

所以,输出是什么样的?(先注释掉include语句)

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-29 06:20:00
19 [报告]
发表于 2016-04-27 16:36 |只看该作者
一共输出了3次,第一次是我的源码目录:$(PWD)=/home/test, $(shell pwd)=/home/test
后面两次都是:$(PWD)=/usr/src/linux-2.6.32.12-0.7, $(shell pwd)=/usr/src/linux-2.6.32.12-0.7-obj/x86_64/default

最后输出的$a, $b都是我的源码路径:=/home/test

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-29 06:20:00
20 [报告]
发表于 2016-04-27 17:30 |只看该作者
还有就是,同样的makefile我在centos下执行路径就没有问题,是不是和系统源码路径下的makefile有关?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP