Makefile 强制make在同一环境中执行命令
我有一个makefile来编译一个跨平台的应用程序。对于Windows,我决定使用MSVC。为了设置编译器工具链(环境变量以方便访问特定目标体系结构的编译器),MSVC提供了一个名为Makefile 强制make在同一环境中执行命令,makefile,gnu-make,Makefile,Gnu Make,我有一个makefile来编译一个跨平台的应用程序。对于Windows,我决定使用MSVC。为了设置编译器工具链(环境变量以方便访问特定目标体系结构的编译器),MSVC提供了一个名为vcvarsall的批处理文件。如果我手动调用它,它工作正常,makefile也可以执行。我试图通过从makefile调用它来自动化它,但是make似乎在不同的环境中运行它,所以它找不到编译器 有没有办法强制make在不同的环境中不执行某些命令?make与所有进程一样,在启动它的环境中运行。 它执行的配方的每一行都在
vcvarsall
的批处理文件。如果我手动调用它,它工作正常,makefile也可以执行。我试图通过从makefile调用它来自动化它,但是make似乎在不同的环境中运行它,所以它找不到编译器
有没有办法强制make在不同的环境中不执行某些命令?make与所有进程一样,在启动它的环境中运行。 它执行的配方的每一行都在不同的子流程中运行,具体来说, 对shell的独特调用。子流程不能做任何事情来更改 它的父进程或同级子进程:它只能传递修改过的环境 到它自己的子流程
targetA: prequisitesA...
command1 # New shell; inherits environment of `make`
command2 # Another new shell; inherits environment of `make`
...
targetB: prequisitesB...
command1 && command2 # New shell; inherits environment of `make`
command3 # Another new shell; inherits environment of `make`
...
targetC: prequisitesC...
command1 && \
command2 # New shell; inherits environment of `make`
command3; \
command4 # Another new shell; inherits environment of `make`
...
在生成配方的命令中使用
通过运行vcvarsall
应用,然后必须在之后运行make
vcvarsall
在同一个环境中,或者在继承的环境中保留这些
设置,否则每个配方命令都必须相同
在这些设置上
您可以指示Make在一个shell中运行每个配方的所有命令,
按照配方,通过编写伪目标
在makefile中。但这似乎不太可能解决你的问题
对于您的案例来说,一个合适的自动化方法可能是编写一个包装器
在make
之前调用vcvarsall
的脚本
根据makefile的结构以及对递归make的容忍度,您可能会喜欢递归解决方案,具体如下:
ARCH ?= amd64
.PHONY: all
all:
vcvarsall $(ARCH) && $(MAKE) prog
其中:-
(架构)如果未在ARCH
调用环境中的命令行或make
是您的默认目标虚假目标all
是你真正的目标prog