CMake:从cpp-file自动生成c-wrapper文件

时间:2013-01-02 17:43:30

标签: c++ cmake build-automation

由于某些原因,我有很多用C ++编写的共享库函数,必须由C函数“包装”才能正确调用。现在,我想知道我是否可以自动化这个过程(最好很好地集成到我的CMake-build-process中)

一个例子:假设我有函数定义

extern "C" void foo(Somestruct myinfo, char const * const data, char const * const data2)

在我的.hpp文件中。现在我要改变这个定义,比如说

C_WRAPPER void foo(Somestruct myinfo, ARG(1) data, ARG(3) data2)

使用一些宏,可以将其转换为原始形式而不会出现任何问题 - 因此,从功能的角度来看,保持hpp文件不受影响。

现在有些解析器应该读取此文件并生成一个包含(例如)

的新c文件
extern void foo(Somestruct myinfo, char const * const, char const*const);
void foo_wrapper(Array everything) {
     char * data1 = fromArray(array, 1);
     char * data3 = fromArray(arary, 3);
     foo(fromArray(0), data1, data3);
}

边界条件:总体布局看起来总是一样的。唯一的区别是ARG s的数量必然是不变的。 ARG的参数给出了数据所在数组中的位置。

目前,手动编写包装文件,由于过去的界面更改,导致一些耗时的错误。这就是我想自动完成这一步骤的原因。

您是否知道如何在不必自己创建解析器的情况下存档此类内容?如上所述,最好使用CMake完全适合我的构建过程。

1 个答案:

答案 0 :(得分:1)

我有幸回答了我自己的问题。 它可以完全在CMake中完成。

这里只是填充包含所有包装函数的变量funcstring的CMake脚本。使用典型的配置文件,可以在包装函数中写入这些字符串。

set(sources a.cpp)

foreach(source ${sources})
    file(READ ${source} contents)

    foreach(var IN ITEMS ${contents})
        string(REGEX MATCH "C_WRAPPER[ ]+[a-zA-Z0-9]+[(].*[)]" wrapperfun ${var})

        if(wrapperfun)
        string(REGEX REPLACE "C_WRAPPER[ ]+\([a-zA-Z0-9]+\)[(].*[)]" "\\1" function_name ${wrapperfun})

        string(REGEX MATCHALL "ARG[(][0-9]+[)]" args ${wrapperfun})

        set(lines "")
        set(funcargs "")
        foreach(arg ${args})
            string(REGEX MATCH "[0-9]+" num ${arg})
            set(lines "${lines}
                char * data${num} = fromArray(array, ${num})\;")
            set(funcargs "${funcargs}, arg${num})")
        endforeach(arg)

        set(funcstring "
            ${wrapperfun}\;
            Datum ${function_name}_wrapper(Array everything) {
                ${lines}
                return ${function_name}(fromArray(0), ${funcargs})\;
            }

        ")

        endif()    

    endforeach(var)
endforeach(source)

宏还没有被替换 - 这可以在CMake中完成,但是在最终的C文件中包含足够的宏定义会更短更直接。