Установить переменную окружения в make-файле, читаемом jom / nmake - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть make-файл, который предназначен для работы с nmake (в командной строке ms visual studio).makefile сам устанавливает переменную окружения MY_SAY_SOMETHING, необходимую для других инструментов, таких как пакетный файл test.bat.Это прекрасно работает с nmake.

Однако я хочу использовать вместо jom Qt, чтобы ускорить процесс сборки, используя несколько процессорных ядер с опцией -J.Инструмент jom считается клоном nmake в соответствии с Qt it, поэтому 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%"

Теперь я просто вызываю make-файл с помощью nmake (из командной строки Visual Studio).Это выглядит так:

D: \> nmake

Утилита обслуживания программ Microsoft (R) Версия 10.00.30319.01 Copyright (C) Microsoft Corporation.Все права защищены.

ЭТО МОЕ СУПЕР СООБЩЕНИЕ "" Мое супер сообщение ""

Когда я звоню Джому (из командной строки Visual Studio или из обычного окна)cmd.exe), я просто получаю следующее:

D: \> jom

jom 1.1.3 - расширение возможностей ваших ядер

ЭТО МОЕ СУПЕР СООБЩЕНИЕ""

Я также вызвал параметр -P для nmake и jom, чтобы получить больше информации о том, как интерпретируется make-файл.Однако моя переменная окружения была напечатана с nmake, но не с jom.Я также попробовал опцию -E (переопределить макросы переменных среды) с тем же результатом.

Может быть, это просто ошибка в jom ...

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

make-файл:

all: .MY_ENVIRONMENT
    @test.bat

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

будет работать с nmake и jom:

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

>jom -l
THIS IS MY SUPER MESSAGE ""my super message""
0 голосов
/ 31 января 2019

Редактировать: Это мой первый ответ, исследующий три идеи, которые не работают.См. Мой второй ответ для реального решения.


Это скорее комментарий, чем ответ, но он предлагает обходной путь.

Вывод следующего make-файла:

!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 - это то, что я ожидал, но он не «берет».set MY в Тесте 3 дает то, что было установлено в Тесте 1.

Примечание 2 : Для jom, Тест 2 дает желаемый результат, но опять-таки он не "принимает».Тест 1 не пройден.

Примечание 3: В рецепте call необходим для jom, чтобы set MY работал.Это необязательно для nmake.

...