Не раскрывайте переменную списка CMake - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть сценарий CMake, который запускает некоторые тесты через add_test(), работающий под Windows (Server 2008, не спрашивайте) в CMake 3.15. Когда вызываются эти тесты, переменная среды PYTHONPATH в среде, в которой они запускаются, кажется, сбрасывается в значение по умолчанию среды и не содержит некоторых путей, которые ей нужны.

Поэтому мне нужно установить PYTHONPATH, когдатесты выполняются со значением переменной $ ENV {PYTHONPATH} при запуске CMake. У этого есть несколько путей, разделенных точкой с запятой, поэтому CMake думает, что это список, и пытается расширить его до ряда строк, разделенных пробелами, что, очевидно, плохо заканчивается.

Я не могу понять, как остановить работу CMakeэто. Из всего, что я вижу, вы можете просто заключить в кавычки:

add_test(
  NAME mytest
  COMMAND cmake -E env PYTHONPATH="$ENV{PYTHONPATH}"
  run_test_here)

... но это всегда делает расширение. Я также попытался установить с помощью set_tests_properties:

set_tests_properties(mytest PROPERTIES
    ENVIRONMENT PYTHONPATH="$ENV{PYTHONPATH}")

... но это, похоже, ничего не делало - PYTHONPATH во время теста не изменилась. Я думал, что это потому, что это переменная окружения, но использование обычной переменной CMake через set() не имеет значения, поэтому я делаю что-то не так. Помогите пожалуйста!

1 Ответ

0 голосов
/ 01 ноября 2019

Должно работать следующее:

COMMAND cmake -E env "PYTHONPATH=$ENV{PYTHONPATH}"

Вам необходимо заключить в кавычки полную часть командной строки, чтобы правильно развернуть сообщение.

Протестировано с:

set(tmp "C:\\Python27\\Scripts;E:\\JenkinsMIDEBLD\\workspace\\...;...")
add_test(NAME MYtest1 COMMAND cmake -S . -E env "tmp=${tmp}") 
add_test(NAME MYtest2 COMMAND cmake -S . -E env tmp="${tmp}") 

После запуска ctest я получаю:

1: Test command: /bin/cmake "-S" "." "-E" "env" "tmp=C:\Python27\Scripts;E:\JenkinsMIDEBLD\workspace\...;..."
2: Test command: /bin/cmake "-S" "." "-E" "env" "tmp="C:\Python27\Scripts" "E:\JenkinsMIDEBLD\workspace\..." "...""

Первый тест имеет правильный ;, переданный var, а второй проходит список, разделенный пробелами.

ЭтоВот как cmake анализирует цитируемые аргументы . Аргумент либо полностью заключен в кавычки, либо не заключен в кавычки - частичные кавычки интерпретируются как литерал ". Итак, предположим, что:

set(var a;b;c)

Следующее:

var="$var"

Не является аргументом в кавычках и " воспринимается буквально! Он расширяет список $var в список, разделенный пробелами, и остается ", между = и a есть один ", а в конце добавляется ". var="$var" равно:

var=\"a b c\"
    ^^     ^^    - the quotes stay!
^^^^^^^ ^ ^^^    - these are 3 arguments, the last one is `c"`

Без кавычек:

var=$var

равно (обратите внимание на отсутствующие кавычки):

var=a c c

КомуАргумент кавычек Вы должны все это заключить в кавычки, с первым и последним символом элемента beeing ":

"var=$var"

расширится до:

"var=a;b;c"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...