在CMake

时间:2017-03-29 08:59:03

标签: cmake

我正在使用CMake配置使用configure_file构建项目所需的一些脚本。

其中一些脚本没有任何数学功能,因此我需要使用math宏在我的CMake脚本中计算派生值,例如:

math(EXPR EXAMPLE_BLOCKS_SIZE "${EXAMPLE_SIZE} / ${EXAMPLE_BLOCK_COUNT}")

但是,似乎math不支持浮点运算。如果我设置-DEXAMPLE_SIZE=2.5-DEXAMPLE_BLOCK_COUNT=2 CMake会抛出错误:

math cannot parse the expression: "2.5 * 2": syntax error, unexpected
exp_NUMBER, expecting $end (2)

有没有办法直接使用CMake宏计算实数?

如果没有,那么实现这一目标的可行方式是什么?

1 个答案:

答案 0 :(得分:1)

首先,就我所知,CMake不支持浮点数学。但是,可以使用shell命令计算变量。以下CMake函数应该可以解决这个问题:

function(floatexpr expr output)
    execute_process(COMMAND awk "BEGIN {print ${expr}}" OUTPUT_VARIABLE __output)
    set(${output} ${__output} PARENT_SCOPE)
endfunction()

使用示例:

set(A 2.0)
set(B 3.0)
floatexpr("${A} / ${B}" RESULT)
message(${RESULT})

注意:可以使用命令bc -l <<< 'EXPRESSION'计算更高级的计算(例如三角函数),但它不是标准系统软件包的一部分,可能无法安装。

编辑:完全可移植(尽管速度慢得多)的解决方案是使用try_run功能编译运行表达式的C文件:

function(floatexpr expr output)
    SET(FLOAT_EXPR_SRC "
    #include <stdio.h>
    int main(int argc, char *argv[]){printf(\"%f\\n\", ${expr})\; return 0\;}
    ")
    FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFloatExpr.c ${FLOAT_EXPR_SRC})

    try_run(RESULT COMPRES ${CMAKE_CURRENT_BINARY_DIR}
            ${CMAKE_CURRENT_BINARY_DIR}/CMakeFloatExpr.c
            RUN_OUTPUT_VARIABLE __output)

    set(${output} ${__output} PARENT_SCOPE)
endfunction()