【问题标题】:CMake: automatically generate c-wrapper file from cpp-fileCMake:从 cpp-file 自动生成 c-wrapper 文件
【发布时间】:2013-01-02 17:43:29
【问题描述】:

由于某些原因,我有很多用 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);
}

边界条件:总体布局看起来总是一样的。唯一的区别是ARGs 的数量必须是恒定的。 ARG 的参数给出了数据在数组中的位置。

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

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

【问题讨论】:

    标签: c++ cmake build-automation


    【解决方案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 文件中包含足够的宏定义会更短更直接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2014-02-27
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      相关资源
      最近更新 更多