Сжатие макросов модульного теста CMake в один макрос с помощью условного оператора - PullRequest
1 голос
/ 06 апреля 2020

Я хочу сократить вызовы макросов CMake в моем коде ниже и сжать его в один вызов макросов CMake для выполнения моей операции с помощью оператора if-else.

Мне нужно запустить ctest (используя CMake ), передавая различные параметры высоты и ширины.

Пожалуйста, рассмотрите это как некоторые арифметические c операции.

В моем случае, в зависимости от ширины, мои диапазоны высоты будут меняться следующим образом:

  Width = 8 ,then height will be 8 16 24 
  Width = 16 ,then height will be 16 24 
  Width = 24 ,then height will be 24 32

Итак, можно ли использовать какой-то оператор if-else в файле CMake для создания один вызов EXECUTE_OPERATION(${width_val} ${height_val} )?

Мой текущий файл CMake выглядит следующим образом:

set(width 8) 
set(size 8 16 24 )

foreach(size_val ${size}
  foreach(width_val  ${width})

  EXECUTE_OPEARTION(${width_val} ${height_val} )

  endforeach(width_val)
endforeach(size_val)

---------------------------

set(width 16) 
set(height 16 24 )

foreach(height_val ${height}
  foreach(width_val  ${width})

  EXECUTE_OPEARTION(${width_val} ${height_val} )

  endforeach(width_val)
endforeach(size_val)

---------------------------

set(width 24) 
set(size 24 32 )

foreach(size_val ${size}
  foreach(width_val  ${width})

  EXECUTE_OPEARTION(${width_val} ${height_val} )

  endforeach(width_val)
endforeach(size_val)

---------------------------

Я попытался сделать это, используя следующее, но это не работал:

set(width 8 16 24 ) 
 if(width == 8)
  set(height 8 16 24 )
 elif(width == 16)
  set(height 16 24 )
 elif(width == 24)
  set(height 24 32)

foreach(height_val ${height}
  foreach(width_val  ${width})

  EXECUTE_OPEARTION(${width_val} ${height_val} )

  endforeach(width_val)
endforeach(size_val)

1 Ответ

1 голос
/ 06 апреля 2020

Ваш if-оператор, кажется, имеет синтаксис Python. Вы должны использовать elseif вместо elif. Кроме того, оператор if CMake синтаксис для проверки на равенство равен EQUAL, а не ==.

Кроме того, вам нужно переместить блок оператора if в блок foreach(), чтобы это работало. Попробуйте что-то вроде этого:

# Define the width values to iterate through.
set(width 8 16 24)

# Iterate through each width value.
foreach(width_val ${width})
  # Set the height values, based on the current width value.
  if(${width_val} EQUAL 8)
    set(height 8 16 24)
  elseif(${width_val} EQUAL 16)
    set(height 16 24)
  elseif(${width_val} EQUAL 24)
    set(height 24 32)
  endif()

  # Loop through each height value.
  foreach(height_val ${height})
    message("Calling EXECUTE_OPEARTION() with args: Width: ${width_val}, Height: ${height_val}")
    EXECUTE_OPEARTION(${width_val} ${height_val})
  endforeach(height_val)
endforeach(width_val)

Это напечатает следующее, проверяя, что функция вызывается с правильными аргументами:

Calling EXECUTE_OPEARTION() with args: Width: 8, Height: 8
Calling EXECUTE_OPEARTION() with args: Width: 8, Height: 16
Calling EXECUTE_OPEARTION() with args: Width: 8, Height: 24
Calling EXECUTE_OPEARTION() with args: Width: 16, Height: 16
Calling EXECUTE_OPEARTION() with args: Width: 16, Height: 24
Calling EXECUTE_OPEARTION() with args: Width: 24, Height: 24
Calling EXECUTE_OPEARTION() with args: Width: 24, Height: 32
...