如何将目录添加到GNU Make的搜索路径中?

时间:2017-01-18 21:05:58

标签: makefile gnu-make

我有一个看起来像这样的makefile:

include anotherFile.mk

all:
    someStuff

文件anotherFile.mk是这样的:

include yetAnotherFile.mk
export SOME_VAR = 93

问题是anotherFile.mkyetAnotherFile.mk与Makefile位于不同的目录中。所以我的makefile不能改为:

include $(OTHER_PROJECT_PATH)/anotherFile.mk

all:
    someStuff

这种方法的问题是anotherFile.mk中的include语句会失败,因为它将在当前目录中搜索。

我找到的部分解决方案是将--include-dir=$OTHER_PROJECT_PATH标志传递给make的调用,但这对用户不友好。

所以我的问题是:我的makefile中是否有可以添加到执行include时搜索的目录?像MAKE_INCLUDE_DIRS += $(OTHER_PROJECT_PATH)

这样的东西

2 个答案:

答案 0 :(得分:1)

令人惊讶的是,这个问题似乎并不是一个好的答案。强制.INCLUDE_DIR并没有帮助,似乎无法用make调用--include-dir=$OTHER_PROJECT_PATH

然而,可以在makefile中放置适当的递归make调用,但是为了让它适用于所有合理的情况,它很快变得太复杂而不值得。总之,它需要:

  • 检查OTHER_PROJECT_PATH是否在.INCLUDE_DIR
  • 中的最高级别条件
  • 使用配方调用的适当目标进行递归
  • 如果有多个命令目标,则可能是其他目标
  • 包含在条件
  • else部分中的真实make文件

你Makefile看起来像这样:

OTHER_PROJECT_PATH := other
ifeq (,$(filter $(OTHER_PROJECT_PATH), $(.INCLUDE_DIRS)))
# this is the mechanism to add the include dir in a recursive make
$(or $(firstword $(MAKECMDGOALS)),all):
    $(MAKE) -I$(OTHER_PROJECT_PATH) $(MAKECMDGOALS)
# add empty targets for additional goals if needed
ifneq (,$(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)))
$(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)):
endif
else
# this is where the real makefile starts
all more:
    echo $@: $< $^
include a.mak
endif

答案 1 :(得分:1)

在makefile中似乎仍然不可能,但是如果您有一个设置环境变量的脚本,则可以使用MAKEFLAGS(例如,在Linux上为export MAKEFLAGS = I / your / path ordentlich,在Windows上为SET)