在makefile中设置环境变量,以便jom / nmake读取

3
我有一个makefile,它是为与nmake(在ms visual studio命令行提示符中)配合使用而设计的。 makefile 本身设置了一个环境变量 MY_SAY_SOMETHING,这对于其他工具如批处理文件 test.bat 非常重要。这在 nmake 中非常好用。
然而,我想使用 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(从Visual Studio命令行提示符)调用makefile。这看起来像这样:
D:\> nmake Microsoft(R) Program Maintenance Utility Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. THIS IS MY SUPER MESSAGE ""my super message""
当我调用jom(无论是从Visual Studio命令行提示符还是普通的Windows cmd.exe提示符),我只会得到这个:
D:\> jom jom 1.1.3 - empower your cores THIS IS MY SUPER MESSAGE ""
我还使用了-nmake和-jom选项-P以获取有关如何解释makefile的更多信息。然而,我的环境变量是与nmake一起打印的,但与jom不同。我还尝试了相同结果的-E选项(覆盖环境变量宏)。
也许这只是jom中的一个错误...

我已经发布了第二个答案,可能比我的第一个答案更有用。 - Joseph Quinsey
1
也许我误解了你的问题,或者我的回答不适合你的环境?如果您能提供更多信息,可能会有所帮助。谢谢。 - Joseph Quinsey
3个回答

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""

微软Windows [版本10.0.18363.1198]和GNU Make 3.81。我无法为由make-utility运行的进程设置环境变量。在同一make-recipe中,该变量的值为空。 @set qwe=asd,echo qwe=%qwe% - Solo.dmitry
@Solo.dmitry:这个问题涉及到的是 nmakejom,而不是 gmake - Joseph Quinsey

0
在Makefile中,你可以写入以下内容:
!IF [call set MY_SAY_SOMETHING="my super message"]
!ENDIF

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


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来说,这是可选的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接