nswcfd 发表于 2016-04-11 18:47

本帖最后由 nswcfd 于 2016-04-11 18:55 编辑

清理一下输出$ cat sub1/Makefile
a=$(PWD)
b=$(shell pwd)
all:
        @echo '$$(PWD)=$a $$(shell pwd)=$b'
        make -C ../sub2

$ cat sub2/Makefile
a=$(PWD)
b=$(shell pwd)
all:
        @echo '$$(PWD)=$a $$(shell pwd)=$b'
        @#make -C ../sub2

$ make -C sub1 --no-print
$(PWD)=/home/test $(shell pwd)=/home/test/sub1
make -C ../sub2
$(PWD)=/home/test $(shell pwd)=/home/test/sub2注意$PWD一致保持在当前目录

nswcfd 发表于 2016-04-11 18:49

csdn吞掉了几个$

@echo '$$PWD=$a $$(shell pwd)=$b'@echo '$PWD=$a $(shell pwd)=$b'@echo '$$PWD=$a $$(shell pwd)=$b'

sky__sea 发表于 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又编程了内核源码路径。

nswcfd 发表于 2016-04-18 12:02

make不是过程式语言,而是声明式语言(有点像fp),include在所有的target(包括默认all)‘执行’之前完成。

nswcfd 发表于 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的影响。#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
void show()
{
      char buf;
      strcpy(buf, "XXXX");
      getcwd(buf, 128);
      printf("getcwd=%s\n", buf);
      printf("env=%s\n", getenv("PWD"));
      system("echo shell-pwd=`pwd`");
}

#define SUBDIR "sub"
int main()
{
      show();
      printf("\nchdir to %s...\n\n", SUBDIR);
      chdir(SUBDIR);
      show();
}

nswcfd 发表于 2016-04-18 13:12

楼主在Makefile的最前面加上
$(warning $$(PWD)=$(PWD), $$(shell pwd)=$(shell pwd))
第二次输出哪些值?

sky__sea 发表于 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


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

nswcfd 发表于 2016-04-27 12:18

本帖最后由 nswcfd 于 2016-04-27 12:19 编辑

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

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

sky__sea 发表于 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

sky__sea 发表于 2016-04-27 17:30

还有就是,同样的makefile我在centos下执行路径就没有问题,是不是和系统源码路径下的makefile有关?
页: 1 [2] 3
查看完整版本: 关于内核模块的Makefile