Makefile路径处理:执行路径、绝对路径与相对路径的处理

问题描述

  • 最近编写了一个 编译设备树 的 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 绝对路径,再拼接相对路径

猜你喜欢

转载自blog.csdn.net/tcjy1000/article/details/131017220
今日推荐