【问题标题】:How can I add a directory to the search path of GNU Make?如何将目录添加到 GNU Make 的搜索路径?
【发布时间】:2017-01-18 21:05:58
【问题描述】:

我有一个看起来像这样的生成文件:

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 的调用,但这对用户有点不友好。

所以我的问题是:在执行include 时,我可以在我的makefile 中添加一些东西来添加到进行搜索的目录吗?类似MAKE_INCLUDE_DIRS += $(OTHER_PROJECT_PATH)

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

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

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

    • 检查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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-28
        • 2011-10-30
        • 1970-01-01
        • 2022-12-13
        • 2019-07-03
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        相关资源
        最近更新 更多