Makefile gnu make将包含路径放入make文件

Makefile gnu make将包含路径放入make文件,makefile,gnu-make,Makefile,Gnu Make,“我的包含文件”引用许多其他文件使用以下方式生成文件: makeincludepaht += include Enablers/MSRP/Android.mk include Enablers/MSRP/Android.mk ... include Enablers/MSRP/Android.mk 问题在于引用所有其他makefiles的make文件位于子文件夹的深处,或者换句话说,正确的路径类似于: makeincludepaht += include Enablers/MSRP/Andro

“我的包含文件”引用许多其他文件使用以下方式生成文件:

makeincludepaht += include Enablers/MSRP/Android.mk
include Enablers/MSRP/Android.mk
...
include Enablers/MSRP/Android.mk

问题在于引用所有其他makefiles的make文件位于子文件夹的深处,或者换句话说,正确的路径类似于:

makeincludepaht += include Enablers/MSRP/Android.mk
include Enablers/MSRP/Android.mk
...
include../../../../../../../Enablers/MSRP/Android.mk

为了构建makefile,我必须添加../../../../../。。要创建搜索路径,请执行以下操作:

.INCLUDE_DIRS += ../../..
ndk build-I../../../../../../-j8其他参数…

(ndk build是android buildsystem上gnu make的包装器,相当于make build-local.mk其他参数)

那么,我可以做些什么来避免添加
。/../../../../../../
来创建搜索路径?我可以打开makefile并更新所有makefile include语句,但我正在寻找在makefile顶部添加额外include路径的方法。比如:

makeincludepaht += include Enablers/MSRP/Android.mk
include Enablers/MSRP/Android.mk
...

我不熟悉ndk构建,但我有类似的设置。我只是在make中设置了一个包含此路径的变量,然后在所有include中使用该变量。
makefile:

INCLUDE_TOP=../../../../../../..
include$(include\u TOP)/someDir/includes.mk

然后还可以对所有路径使用INCLUDE_TOP inside includes.mk。通常最好通过在其中有条件地设置使其默认为某个值。
包括.mk:

#仅当尚未设置时才会设置
包括顶部?=。/
页眉=$(包括页眉)/页眉

将新的包含路径附加到标准搜索路径:

.INCLUDE_DIRS += ../../..

使用
-I
方法可能是最好的。您可以将路径放在makefile的顶部,但这将使makefile与目录结构相结合。您确定要这样做吗?您始终可以创建从深层目录到某个顶层的软链接,并在makefile中引用该链接。缺点是如果没有链接,您的构建将失败,因此如果您想与其他人共享您的makefile,则需要创建一个脚本来自动创建链接。@Beta:您所说的-I方法是什么?它是我需要放在命令行中还是放在makefile本身中的东西?顺便说一句,我可以为那个目录结构结婚,这正是我想要的。@HonkyTonk:不行,我需要这个s%it在windows上也能工作(在常规cmd中),如果你对硬盘的实际布局没有问题的话,您应该能够向make发送一个包含顶级目录的变量,并使用该变量在makefile中构造其余的。这样就不需要详细的
。\..\
用法。它不会起作用。原因是,位于不同级别的文件也将引用相对于该../../..../。。但在另一个层面上,它将已经是错误的文件夹。为了使这个解决方案起作用,我需要修改许多make文件并将其转换为../。。这似乎不起作用,至少在GNUmake4.1中是这样。本手册也没有说明如何设置
。INCLUDE_DIRS
,只是其中包含INCLUDE搜索路径,而不是您可以设置它。您测试过这个解决方案吗?我看到您在这里回答了自己的问题,所以我假设它对您有效(您一定已经测试过)。您使用的GNU版本是什么?@camh我不记得上下文,这意味着在我修复它之后,我再也不会使用它了。链接文档描述了它的功能,这正是我所需要的。只是为了澄清并避免混淆:这是make的include搜索路径以包含其他make文件,与c/c++include路径无关。为了记录历史,这个答案不适用于gnu make 4.1<代码>mkdir foo;printf“>INCLUDE_DIRS+=foo\n包括bar.mk\n”>Makefile;printf“all:;@echo in bar.mk\n”>foo/bar.mk;make导致
Makefile:2:bar.mk:没有这样的文件或目录
<代码>生成-I foo确实有效。我对链接文档的看法是,它们没有说更改
.INCLUDE\u DIRS
实际上会更改搜索路径。文档只说明
.INCLUDE\u DIRS
扩展到搜索路径。@camm您是对的。从快速搜索中,它看起来也是只读的。