2013-01-02 108 views
0

C-包装文件对于一些原因我有C++编写的具有由C-函数中“包装”被正确地称为共享库的相当多的功能。现在,我不知道如果我可以自动完成这一过程(最好很好地融入我的CMake建造过程)CMake的:自动生成从CPP-文件

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

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的参数给所述阵列中的数据所在的位置。

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

你知道的方式来归档这样的事情,而无需创建一个解析器自己?正如所说的,最好是适合我使用CMake的构建过程的东西。

回答

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-文件足够的宏定义。