我有一堆qmake
生成的makefile,每个makefile都以链式方式调用make
内部(递归make
)。
我的构建结束后,qmake
生成的makefile都在磁盘上,所以如果我想'重放'一个特定的makefile,你可以认为我可以在其中一个上调用make
。错。
当我尝试make
时,它会失败,可能是因为在正常构建期间通常会从调用makefile继承一堆(环境)变量。
除变量外,每个qmake
生成的makefile都是独立的。
问题
如何模拟给定递归make
的“正常”环境,以便我可以单独调用它?
我想我必须对--print-data-base
输出做一些事情:解析它然后用正常构建期间的相同变量和值调用make
。
WHY
我这样做是因为我需要修改ONE makefile的编译命令,但它全部由顶级.conf
控制,而且我的方式太深了。
答案 0 :(得分: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
这将向您展示制作过程的环境与当前shell的环境有何不同。
现在,这可能无法解决您的问题,因为GNU Make允许将变量指定为命令行参数。所以,你还应该检查它是如何运行的:
strings /proc/<pid>/cmdline
这将在另一行打印&lt; pid&gt;的每个命令行参数。
BTW,当变量通过命令行参数传递给GNU Make时,它们是通过覆盖同一变量的任何实例来处理的,这些实例可能包含在makefile中。在makefile中,您可以使用以下命令查看其环境:
$(info My environment is $(shell env))
您可以使用以下命令查看其命令行选项:
$(info MAKEFLAGS = $(MAKEFLAGS))
如果仅想要查看覆盖,请使用MAKEOVERRIDES:
$(info MAKEOVERRIDES = $(MAKEOVERRIDES))
最后,可以使用以下方式查看目标:
$(info MAKECMDGOALS = $(MAKECMDGOALS))