Команда выражения генератора Cmake - PullRequest
0 голосов
/ 01 октября 2018

Если какое-то логическое условие истинно (например, ENABLE_TESTING), тогда я хочу запустить что-то вроде:

COMMAND ./b2 --with-filesystem --with-program_options --with-test

А если логическое условие ложно, тогда я вместо этого хочу:

COMMAND ""

Кажется, что я могу добиться этого с помощью этого очень уродливого кода:

COMMAND $<$<BOOL:${ENABLE_TESTING}>:./b2> $<$<BOOL:${ENABLE_TESTING}>:--with-filesystem> $<$<BOOL:${ENABLE_TESTING}>:--with-program_options> $<$<BOOL:${ENABLE_TESTING}>:--with-test>

Но, как вы можете видеть, я должен повторять логический тест снова и снова.Если я наивно пытаюсь объединить их в одно выражение:

COMMAND $<$<BOOL:${ENABLE_TESTING}>:./b2 --with-filesystem --with-program_options --with-test>

Тогда я получаю ошибку /bin/sh: 1: $<1:./b2: not found.Пространства, по-видимому, анализируются до вычисления выражения генератора.Я цитирую все это:

COMMAND "$<$<BOOL:${ENABLE_TESTING}>:./b2 --with-filesystem --with-program_options --with-test>"

Но это приводит к ошибке /bin/sh 1: /b2 --with-filesystem --with-program_options --with-test: not found.Я полагаю, что все это рассматривается как имя команды, а не команды с параметрами.Как я могу написать это так, чтобы оно было чистым и работало?

РЕДАКТИРОВАТЬ: я попытался упростить код для минимального примера, но я оставил дополнительные сложности.Эта команда выполняется в секции ExternalProject_Add, и мне нужно полагаться на специальные токены, такие как <BINARY_DIR>.

COMMAND ./b2 "--stagedir=<BINARY_DIR>" --with-filesystem --with-program_options --with-test

. Я не могу переместить команды в оператор if в другом месте, потому что если ясделайте так, чтобы токены каталога не расширялись.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

С точки зрения читабельности кода выражения-генераторы являются неудачным дополнением к языку CMake.В таких сценариях, как ваш, где невозможно избежать выражения генератора, я использую обычную переменную CMake, чтобы избежать дублирования кода, например:

set (_runB2GenEx "$<BOOL:${ENABLE_TESTING}>")
ExternalProject_Add(example
    ...
    COMMAND 
        $<${_runB2GenEx}:./b2> 
        $<${_runB2GenEx}:--stagedir=<BINARY_DIR>> 
        $<${_runB2GenEx}:--with-filesystem> 
        $<${_runB2GenEx}:--with-program_options> 
        $<${_runB2GenEx}:--with-test>
    ...
)
0 голосов
/ 04 октября 2018

Вы можете сделать это с помощью COMMAND_EXPAND_LISTS:

cmake_minimum_required(VERSION 3.11)
set(ENABLE_TESTING 1)
add_custom_target(
  foo COMMAND "$<$<BOOL:${ENABLE_TESTING}>:./b2;--with-filesystem;--with-program_options;--with-test>"
  COMMAND_EXPAND_LISTS)

Давайте проверим, что это работает:

$ cmake .
$ VERBOSE=1 make foo
...
./b2 --with-filesystem --with-program_options --with-test
Built target foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...