代码之家  ›  专栏  ›  技术社区  ›  Peter Lenkefi

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

  •  1
  • Peter Lenkefi  · 技术社区  · 7 年前

    我有一个makefile来编译一个跨平台的应用程序。对于Windows,我决定使用MSVC。为了设置编译器工具链(环境变量以方便访问特定目标体系结构的编译器),MSVC提供了一个名为 vcvarsall 。如果我手动调用它,它工作得很好,makefile也可以执行。我试图通过从makefile中调用它来自动化它,但make似乎在另一个环境中运行,因此它找不到编译器。

    有没有办法强制make在不同的环境中不执行某些命令?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mike Kinghan Luchian Grigore    7 年前

    与所有进程一样,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运行每个配方的所有命令 壳 按照配方,通过写入伪目标 .ONESHELL: 在makefile中。但这似乎不太可能解决你的问题。

    对于您的案例来说,一个合适的自动化方法可能是编写包装器 调用 vcvarsall公司 之前 制作

    根据makefile的结构以及对递归make的容忍度,您可能会想到一种递归解决方案,具体如下:

    ARCH ?= amd64
    
    .PHONY: all
    
    all:
        vcvarsall $(ARCH) && $(MAKE) prog
    

    其中:-

    • ARCH (架构)默认为 amd64 如果未在上定义 制作 命令行或在调用环境中

    • all 你的默认目标是假的目标吗

    • prog 是你真正的目标。