2013-01-02 145 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-文件足夠的宏定義。