【发布时间】:2021-01-19 04:10:28
【问题描述】:
假设我有一个目录~/dir1/dir2/dir3/,该目录中有一个文件Makefile,其中包含内容
include ../Makefile
~/dir1/dir2/Makefile与~/dir1/dir2/dir3/Makefile的内容相同
如果允许我控制~/dir1/Makefile 的内容,并且make 在~/dir1/dir2/dir3/ 中被调用,我如何获取字符串~/dir1/dir2/dir3/Makefile(第一个包含文件)用作@987654332 中的变量@?
可重复的示例(根据 MadScientist 的要求):
- 任何 unix 系统
mkdir -p ~/dir1/dir2/dir3cd ~/dir1/dir2/dir3echo 'include ../Makefile' > Makefilecp ./Makefile ../Makefile
现在我们在 ~/dir1/dir2/dir3/ 和 ~/dir1/dir2/ 中有一个具有相同声明的 Makefile,即包含父目录中的 Makefile 的包含声明。
如果在~/dir1/dir2/dir3 中调用了make,那么包含链最终会停在~/dir1/Makefile
如何找到此包含链中第一个文件的路径,即~/dir1/dir2/dir3/Makefile 以用作~/dir1/Makefile 中的变量?
【问题讨论】:
-
如果目录名称不完全一样,这个问题会更容易理解。我不确定你是如何从
~/test/test/test/Makefile到~/test/Makefile...还有其他包含吗?无论如何,我认为您可以通过适当使用MAKEFILE_LISTgnu.org/software/make/manual/html_node/… 来获得您想要的东西,但如果不是,也许您可以澄清这个问题,希望使用 MCVE stackoverflow.com/help/minimal-reproducible-example -
我建议您仅使用
include来合并专门为此目的设计和使用的makefile 片段。否则,如果您想使用其他 makefile 中定义的规则,请使用递归make。这将为您省去很多麻烦。其中包括不确定任何给定文件是否是包含树的根。 -
@MadScientist 我已根据您的建议重构了帖子。
MAKEFILE_LIST确实为我完成了这项工作,但在重构帖子后我发现了另一个错误。不知何故,包含来自父目录的 Makefile 意味着您不能包含存在于包含的 Makefile 的父目录中的另一个 Makefile(在包含的 Makefile 中),由于 dir2,我编写的示例在 make 中返回 Bad Address 错误makefile 包括../Makefile -
您新发现的错误是较低的两个makefile中的错误;您可以修复它,但不能从顶级生成文件中修复。至于主要问题,你想要波浪号('~')吗?绝对路径(例如
/users/monke/dir1/dir2/dir3/Makefile)更容易构建。