在jom / nmake读取的makefile中设置环境变量

时间:2018-12-19 17:18:25

标签: windows qt makefile environment-variables nmake

我有一个Makefile,旨在与nmake一起使用(在ms visual studio命令行提示符下)。 makefile本身设置了其他工具(例如批处理文件MY_SAY_SOMETHING)所需的环境变量test.batnmake可以很好地工作。

但是,我想使用Qt的jom通过使用多个带有处理器-J的处理器内核来加快构建过程。根据Qt,工具jom被认为是nmake的克隆,因此makefile应该兼容。

问题是 jom没有在Windows计算机上设置环境变量!至少不是nmake支持它的方式。

所以我的问题是: 如何使用jom设置环境变量?


这是显示我的问题的最短示例:

makefile:

!IF [set MY_SAY_SOMETHING="my super message"]
!ENDIF

all:
    @test.bat

test.bat:

@echo off
echo THIS IS MY SUPER MESSAGE "%MY_SAY_SOMETHING%"

现在,我只是用nmake调用makefile(从Visual Studio命令行提示符下)。看起来像这样:

  

D:\> nmake

     

Microsoft(R)程序维护实用程序版本10.00.30319.01   版权所有(C)Microsoft Corporation。保留所有权利。

     

这是我的超级消息““我的超级消息””

当我打电话给jom时(从Visual Studio命令行提示符或常规的Windows cmd.exe提示符),我得到的是:

  

D:\> jom

     

jom 1.1.3-增强核心能力

     

这是我的超级讯息“”

我还为-Pnmake调用了jom选项,以获取有关如何解释Makefile的更多信息。但是,我的环境变量是用nmake打印的,而不是用jom打印的。我还尝试了具有相同结果的选项-E(覆盖环境变量宏)。

也许这只是jom中的错误...

3 个答案:

答案 0 :(得分:0)

编辑:这是我的第一个答案,探讨了三个无效有效的想法。请参阅我的第二个答案以获取实际的解决方案。


这不是评论,而是答案,但这确实建议一种解决方法。

以下makefile的输出:

!IF [echo Test 1:] && [set MY_SAY_SOMETHING="my super message"] && [set MY]
!ENDIF

!IF [echo Test 2: && set MY_SAY_SOMETHING="my unsuper message" && set MY]
!ENDIF

WORK_AROUND = set MY_SAY_SOMETHING="this is a possible work-around"

all:
    @echo Test 3:
    @-call set MY
    @test.bat
    @echo Test 4:
    @$(WORK_AROUND)
    @call set MY
    @test.bat

用于nmake

>nmake

Microsoft (R) Program Maintenance Utility Version 14.10.25019.0
Copyright (C) Microsoft Corporation.  All rights reserved.

Test 1:
MY_SAY_SOMETHING="my super message"
Test 2:
MY_SAY_SOMETHING="my unsuper message"
Test 3:
MY_SAY_SOMETHING="my super message"
THIS IS MY SUPER MESSAGE ""my super message""
Test 4:
MY_SAY_SOMETHING="this is a possible work-around"
THIS IS MY SUPER MESSAGE ""this is a possible work-around""

jom

>jom
Test 1:
Environment variable MY not defined
Test 2:
MY_SAY_SOMETHING="my unsuper message"

jom 1.1.3 - empower your cores

Test 3:
Environment variable MY not defined
THIS IS MY SUPER MESSAGE ""
Test 4:
MY_SAY_SOMETHING="this is a possible work-around"
THIS IS MY SUPER MESSAGE ""this is a possible work-around""

注释1 :对于nmake,测试2的输出是我期望的,但不是“需要”。测试3中的set MY提供了测试1中设置的内容。

注释2 :对于jom,测试2给出了所需的输出,但同样没有“取得”。测试1失败了。

注意3::在配方中,call需要jom才能使set MY工作。 nmake是可选的。

答案 1 :(得分:0)

makefile:

all: .MY_ENVIRONMENT
    @test.bat

.MY_ENVIRONMENT:
    @set MY_SAY_SOMETHING="my super message"

将与nmakejom一起使用:

>nmake -l
THIS IS MY SUPER MESSAGE ""my super message""

>jom -l
THIS IS MY SUPER MESSAGE ""my super message""

答案 2 :(得分:0)

在Makefile中,您可以编写:

!IF [call set MY_SAY_SOMETHING="my super message"]
!ENDIF

这不应破坏nmake,但可以修复JOM。