问题描述
- 最近编写了一个 编译设备树 的 Makefile,遇到了使用
make -f xx/Makefile
,执行路径变了,造成 Makefile 里面的一些操作路径不正确,无法执行
获取当前目录
-
make 内置的
$(CURDIR)
,可以把当前路径的全路径打印出来 -
注意:如果执行其他路径下的Makefile,这个
$(CURDIR)
打印出来的是 执行的路径,而不是 Makefile 所在的路径 -
测试代码
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
cur_makefile_path := $(dir $(mkfile_path))
DIR_ROOT := $(cur_makefile_path)
CUR_ROOT := $(CURDIR)
All:
echo $(DIR_ROOT)
echo $(CUR_ROOT)
- 对比 Makefile 的路径,
$(CURDIR)
打印的是 执行的路径
获取 Makefile 的路径
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
cur_makefile_path := $(dir $(mkfile_path))
这里的 $(cur_makefile_path) 不会因为在不同的路径下执行,就会错乱,验证如下
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
cur_makefile_path := $(dir $(mkfile_path))
DIR_ROOT := $(cur_makefile_path)
All:
echo $(DIR_ROOT)
-
测试效果:
-
注意当前路径下有 Makefile 文件,可以直接
make
, 也可以make -f Makefile
-
执行其他路径下的 Makefile,可以使用
$ make -f make_demo/make_01/Makefile
,也就是$ make -f Makefile路径
后面加上 Makefile 的路径
执行路径
也就是输入 make 命令的路径,这个可以使用 $(CURDIR)
打印出来
相对路径
-
这里最好拿到 Makefile 所在的路径,然后再拼接 Makefile 所在路径
-
示例:执行 Makefile 当前路径下 dtc/dtc 工具
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
cur_makefile_path := $(dir $(mkfile_path))
DIR_ROOT := $(cur_makefile_path)
HOST_DTC := $(DIR_ROOT)dtc/dtc
- 以上的
DIR_ROOT
不可以使用$(CURDIR)
或者.
来实现,否则执行路径不同,就无法正确的执行
小结
- 注意 Makefile 的路径,一般需要或者 Makefile 所在的绝对路径,而不是 当前路径,如果执行其他目录的,最好先获取 Makefile 绝对路径,再拼接相对路径