首页 文章

GNU递归make - 如何捕获make变量来执行嵌套的makefile

提问于
浏览
1

我有一堆 qmake 生成的makefile,每个makefile都以链式方式调用它们内部的 make (递归 make ) .

我的构建结束后, qmake 生成的makefile都在磁盘上,所以如果我想'replay'一个特定的makefile,你认为我可以在其中一个上调用 make . 错误 .

当我尝试 make -ing one时,它会失败,可能是因为在正常构建期间它通常从调用makefile继承了一堆(环境)变量 .

除了变量之外,每个 qmake 生成的makefile都是独立的 .

QUESTION

如何为给定的递归 make 模拟'normal'环境,以便我可以单独调用它?

我必须对 --print-data-base 输出执行某些操作:解析它然后使用与正常构建期间相同的变量和值调用 make .

WHY

我'm doing this because I need to modify the compile commands for ONE makefile but it'全部由顶级 .conf 控制,而且我的方式太深了 .

1 回答

  • 0

    我假设问题是您需要在有机会对生成的makefile进行任何更改之前找到此信息 . 因此,这个解决方案专注于shell命令(我假设你在Linux上,因为你没有说) .

    在开始构建之后,第一次使用类似的东西:

    ps -ef | head -1
    ps -ef | grep make
    

    找到构建中涉及的make进程 . PID列列出了make进程的进程ID,而PPID列列出了其父进程的进程ID . 使用此信息查找顶级制作过程 . 然后,运行:

    strings /proc/<pid>/environ | sort > /tmp/make_env
    env | sort > /tmp/normal_env
    diff /tmp/normal_env /tmp/make_env
    

    这将向您展示make进程的环境与当前shell的环境有何不同 .

    现在,这可能无法解决您的问题,因为GNU Make允许将变量指定为命令行参数 . 所以,你还应该检查它是如何运行的:

    strings /proc/<pid>/cmdline
    

    这将在单独的行上打印<pid>的每个命令行参数 .

    顺便说一下,当变量通过命令行参数传递给GNU Make时,它们是通过覆盖同一变量的任何实例来处理的,这些实例可能包含在makefile中 .


    在makefile中,您可以使用以下命令查看其环境:

    $(info My environment is $(shell env))
    

    您可以使用以下命令查看其命令行选项:

    $(info MAKEFLAGS = $(MAKEFLAGS))
    

    如果您只想查看覆盖,请使用MAKEOVERRIDES:

    $(info MAKEOVERRIDES = $(MAKEOVERRIDES))
    

    最后,可以使用以下方式查看目标:

    $(info MAKECMDGOALS = $(MAKECMDGOALS))
    

相关问题