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

标签 c++ cmake build-automation

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

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

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 的数量必须是常量。 ARG 的参数给出数据在数组中的位置。

目前wrapper文件都是手动写的,以前由于接口(interface)的变化导致了一些耗时的错误。这就是我想自动执行此步骤的原因。

您是否知道一种无需自己创建解析器即可归档此类内容的方法?如前所述,最好是适合我使用 CMake 构建过程的东西。

最佳答案

我很荣幸回答我自己的问题。 它可以完全在 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 文件中包含足够的宏定义更短、更直接。

关于c++ - CMake:从 cpp 文件自动生成 c-wrapper 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14126613/

相关文章:

c++ - cmake 是否使用约定优于配置?

deployment - 什么是构建管道的好工具?

ios - 如何从命令行从 iOS 8 模拟器中删除应用程序?

python-2.7 - 如何在 windows 上使用 expresser for python

c# - PInvoke x64 崩溃与 .Net 4.0

c++ - 我如何存储和获取结构队列?

c++ - CMake 错过 Qt5 的 QT_DEFINITIONS 变量

c++ - 在这种情况下,为什么编译器会抛出 “undefined reference to…”错误?

以 Vector 对象为成员的 C++ Sprite 类

c++ - 我是不是遗漏了什么,或者虚拟电话的表现不如人们想象的那么糟糕