【问题标题】:Compacting CMake unit test macros into one macro using conditional statement使用条件语句将 CMake 单元测试宏压缩为一个宏
【发布时间】:2020-04-06 16:17:02
【问题描述】:

我想减少下面代码中的 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)

【问题讨论】:

    标签: foreach cmake ctest


    【解决方案1】:

    您的 if 语句似乎具有 Python 语法。您应该使用elseif 而不是elif。此外,用于测试相等性的 CMake if 语句 syntaxEQUAL,而不是 ==

    此外,您需要将 if 语句块 in 移动到 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
    

    【讨论】:

    • 谢谢你..它帮了我很多!
    • 我想再问一个查询..在 if 语句中可以使用 and (&&) or or (||) 运算符。因为我有 width 56 和 8 将与相同的 height 从 8 16 24 。
    • @jailaxmik 请参阅我在回复中链接的文档。它显示了您可以在 CMake if 语句中使用的所有可用运算符。布尔运算符可用,但它们的语法是 ANDOR
    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多