当第二个不在第一个目录中时,包括第三个makefile,其相对于第二个的路径

问题描述

我有一个Makefile,仅包含项目级定义:要使用的源文件,要创建的二进制文件或库等。

包括../../Make.Arch用于特定于体系结构的定义(例如编译器命令)。

反过来,Make.Arch的意思是包含../etc/Makefile.Standard,用于使make系统正常工作的所有样板。

但是include需要相对于Makefile实际运行位置(或第一个Makefile所在的位置)的路径,而不是相对于第二个Makefile的路径。

解决方法

Make解释工作目录(运行Make的目录)中的相对路径。您尚未指定运行Make的方式,所以我假设您使用Makefile在目录中运行它。

如果允许您修改Makefile,则可以更改路径。

您可以为此更改Make.Arch

include ../etc/Makefile.Standard

对此:

include ../../../etc/Makefile.Standard

,但这将要求所有使用Make.Arch的makefile都必须位于其下两个目录中。显然这不是一个好主意。但是我们可以使用一个变量:

include $(ARCH_DIR)/../etc/Makefile.Standard
Makefile(或使用Make.Arch的任何其他makefile)提供的

ARCH_DIR := ../..
include $(ARCH_DIR)/Make.Arch

如果不允许修改makefile,则必须作弊。一种方法是创建指向Makefile.Standard的符号链接。

mkdir ../etc
ln -s ../../../etc/Makefile.Standard ../etc

现在Makefile将起作用。 (应该可以链接到etc/,但是由于某些原因,我现在无法使它正常工作。)