GNU Make:将包含路径放入Makefile中

3
我的include文件引用了许多其他的make文件,使用类似以下语句:

include Enablers/MSRP/Android.mk

问题在于,引用所有其他make文件的make文件深入到了子文件夹中,或者换句话说,正确的路径应该是这样的:

include ../../../../../Enablers/MSRP/Android.mk

为了能够构建我的makefile,我必须将../../../../..添加到搜索路径中:

ndk-build -I../../../../.. -j8 other params...

(ndk-build是android构建系统上gnu make的包装器,它相当于make build-local.mk other params)
那么,我该怎么做才能避免将“../../../../..”添加到搜索路径中呢?我可以进入makefile并更新所有makefile include语句,但我正在寻找一种在makefile顶部添加额外include路径的方式。例如:
makeincludepaht += include Enablers/MSRP/Android.mk
include Enablers/MSRP/Android.mk
...

“-I” 方法可能是最好的选择。你可以将路径放在 makefile 的顶部,但这将使 makefile 与你的目录结构紧密耦合。你确定要这样做吗? - Beta
您可以随时从深层目录创建软链接到某些顶层目录,并在makefile中引用它。缺点是,如果没有这些链接,您的构建将失败,因此如果要与他人共享makefile,则需要创建一个自动化创建链接的脚本。 - HonkyTonk
@Beta:你所说的“-I”方法是什么?我需要在命令行上使用它还是放在makefile内部?顺便说一下,我可以接受那个目录结构,因为那正是我想要的。 - Pavel P
@HonkyTonk:不行,我需要这个东西在Windows上也能正常运行(在普通的命令提示符中)。 - Pavel P
如果您对实际硬盘布局的硬依赖没有问题,那么您应该能够发送一个包含顶级目录的变量,并在makefile中使用它来构建其余部分。这样就不需要使用复杂的 ..\..\.. 了。 - HonkyTonk
我已经通过命令行传递 ../../..,但目标是避免在那里传递任何东西。 - Pavel P
2个回答

2
将新的包含路径添加到标准搜索路径中:
.INCLUDE_DIRS += ../../..

请查看“特殊变量”部分的末尾,找到“.INCLUDE_DIRS”特殊变量。 (链接)

这似乎不起作用,至少在GNU make 4.1中是如此。手册也没有提到设置.INCLUDE_DIRS,只是它包含了包含搜索路径,而不能设置它。你测试过这个解决方案吗? - camh
我看到你在这里回答了自己的问题,所以我会假设它对你起作用了(并且你一定已经测试过了)。你使用的GNU make版本是什么? - camh
@camh 我不记得上下文了,这意味着在我修复它之后我从未回来过。链接的文档描述了它的功能,那正是我所需要的。只是为了明确和避免混淆:这是用于make包含其他make文件的包含搜索路径,与c/c++的包含路径无关。 - Pavel P
2
为了记录历史,这个答案不适用于gnu make 4.1。mkdir foo; printf ".INCLUDE_DIRS += foo\ninclude bar.mk\n" >Makefile; printf "all: ; @echo in bar.mk\n" > foo/bar.mk; make 的结果是 Makefile:2: bar.mk: No such file or directorymake -I foo 可以工作。我关于链接文档的观点是,它们并没有说改变 .INCLUDE_DIRS 实际上会改变搜索路径。文档只说 .INCLUDE_DIRS 扩展到搜索路径。 - camh
1
@camh 你是正确的。从快速搜索的结果看,它似乎一直是只读的。 - Pavel P

0

我不熟悉ndk-build,但我有类似的设置。我只是在makefile中设置一个变量,其中包含此路径,然后在所有的include中使用该变量。
makefile:
INCLUDE_TOP=../../../../..
include $(INCLUDE_TOP)/someDir/includes.mk

您还可以在includes.mk中使用INCLUDE_TOP来处理所有路径。通常最好通过在其中有条件地设置来将其默认设置为某个值。
includes.mk:
# 如果尚未设置,则仅设置
INCLUDE_TOP ?= ./
HEADERS=$(INCLUDE_TOP)/headers


不会起作用。原因是不同级别的文件也会相对于 ../../../.. 引用,但在另一个级别中,它将是错误的文件夹。为了使此解决方案起作用,我需要修改大量的 make 文件并将 ../../.. 转换为绝对路径。 - Pavel P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接