Makefile 强制make在同一环境中执行命令

Makefile 强制make在同一环境中执行命令,makefile,gnu-make,Makefile,Gnu Make,我有一个makefile来编译一个跨平台的应用程序。对于Windows,我决定使用MSVC。为了设置编译器工具链(环境变量以方便访问特定目标体系结构的编译器),MSVC提供了一个名为vcvarsall的批处理文件。如果我手动调用它,它工作正常,makefile也可以执行。我试图通过从makefile调用它来自动化它,但是make似乎在不同的环境中运行它,所以它找不到编译器 有没有办法强制make在不同的环境中不执行某些命令?make与所有进程一样,在启动它的环境中运行。 它执行的配方的每一行都在

我有一个makefile来编译一个跨平台的应用程序。对于Windows,我决定使用MSVC。为了设置编译器工具链(环境变量以方便访问特定目标体系结构的编译器),MSVC提供了一个名为
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
    是你真正的目标


现在我正在考虑编写包装。但有一个名为Win32Debug的规则似乎非常方便,例如,它只使用x86参数调用vcvarsall(如果调用了Win64Debug,则调用x64)。编写包装器意味着在配置检查中会有大量重复。@PeterLenkefi也许您会进行递归-请参阅更新。