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有关?