Как сделать список в CMake со значением точки с запятой? - PullRequest
0 голосов
/ 22 января 2020

Я думаю, что это должно быть очень тривиально, но кажется, что оно не поддерживается ... Возможно ли даже в CMake, чтобы одно значение списка содержало точку с запятой?

Причина очень проста - потому что Я работаю на Windows, а на Windows точка с запятой является разделителем между двумя или более папками в одной переменной среды (т. Е. PATH).

    list(
      APPEND
      MY_TEST_ENVIRONMENT
      "MY_FLAG=1"
    )

    # <...>

    list(
      APPEND
      MY_TEST_ENVIRONMENT
      "PATH=first_folder_path;second_folder_path"
    #                        ^--- here is the problem
    )

    # <...>


   set_property(TEST MyTests PROPERTY ENVIRONMENT ${MY_TEST_ENVIRONMENT})

Я попытался удалить и добавить двойной кавычки, я пытался экранировать \;, я пытался добавить одну и ту же переменную env два раза - но ни одна из них не работает!

Ответы [ 2 ]

1 голос
/ 22 января 2020

Вы находитесь на правильном пути, минуя точку с запятой с обратной косой чертой sh. Однако при настройке списка в свойстве теста ENVIRONMENT это не последнее место, где будет использоваться список (и интерпретируется CMake). Затем список MY_TEST_ENVIRONMENT используется для заполнения CTestTestfile.cmake, который позже читается CTest для настройки тестовой среды.

Короче говоря, вам нужно больше escape-символов для распространения точек с запятой до тестовой среды. В частности, используйте двойную обратную косую черту sh \\, чтобы убрать дополнительную обратную косую черту sh в список вместе с экранированной точкой с запятой \;. Вот справочная информация CMake документации CMake для справки. В общей сложности три обратные слеши должны работать:

list(
  APPEND
  MY_TEST_ENVIRONMENT
  "MY_FLAG=1"
)

# <...>

list(
  APPEND
  MY_TEST_ENVIRONMENT
  "PATH=first_folder_path\\\;second_folder_path"
#                         ^--- Use three backslashes here
)

# <...>

set_property(TEST MyTests PROPERTY ENVIRONMENT ${MY_TEST_ENVIRONMENT})
0 голосов
/ 22 января 2020

К сожалению, списки внутри CMake - это просто строки, разделенные точкой с запятой. Если вы сделаете:

set(MyList
    ABC
    DEF;GHI
)

Вы определяете список из трех элементов. Если вы посмотрите содержимое:

message(${MyList})
message("${MyList}")

Вы получите ABCDEFGHI и ABC;DEF;GHI соответственно, поэтому невозможно узнать, сколько элементов вы действительно хотели бы иметь в любом случае. Большинство команд CMake, таких как add_executable или target_compile_definitions, интерпретируют переданные аргументы таким образом, и вы не сможете передавать им списки с элементами, содержащими точки с запятой.

Обратите внимание, что точки с запятой не удаляются при установке переменная в кавычках (см. пример выше), поэтому, если вы вызываете какую-то внешнюю команду, например скрипт powershell, тогда переменная PATH должна быть передана правильно. Но тогда вы не будете использовать список для списка аргументов (поскольку элементы разделены точкой с запятой), а просто создадите собственную строку, разделенную пробелом.

...