首页 > 解决方案 > 使用条件语句将 CMake 单元测试宏压缩为一个宏

问题描述

我想减少下面代码中的 CMake 宏调用,并将其压缩为一个 CMake 宏调用,以使用 if-else 语句执行我的操作。

我需要ctest通过传递不同的高度和宽度参数来运行(使用 CMake)。

请将此视为一些算术运算。

就我而言,根据宽度,我的高度范围将像这样变化:

  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

那么,是否可以在 CMake 文件中使用一些 if-else 语句来进行一次调用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)

标签: foreachcmakectest

解决方案


您的 if 语句似乎具有 Python 语法。您应该使用elseif而不是elif. 此外,用于测试相等性的 CMake if 语句语法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

推荐阅读