lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Hi Philipp and thanks.  Most helpful,  will let you know when I have progress to report.

Gregg
On Jul 18, 2015 4:35 AM, "Philipp Janda" <siffiejoe@gmx.net> wrote:
>
> Am 17.07.2015 um 16:30 schröbte Gregg Reynolds:
>>
>> Hi list,
>
>
> Hi!
>
>
>>
>> I'm just starting on a lua wrapper of libmraa for the intel Edison (
>> http://iotdk.intel.com/docs/master/mraa/).  I've got a basic implementation
>> working. My question is whether it is possible to split the code into
>> multiple c files.
>
>
> Sure it is.
>
>
>> libmraa is split into seven modules so I'd like to keep
>> the wrapper code distinct.  But my understanding is that the interface
>> functions must be static.
>
>
> C functions exported to Lua don't *have* to be static. Lua uses them by pointer only, so they usually *can* be static, and it's good practice to limit symbol visibility as much as possible. But nobody prevents you from using non-static functions if you want to reference those symbols from another file (e.g. to put them into a `luaL_Reg` array). I usually don't do that though, because it gets inconvenient when the number of exported functions is large. Instead, I do something like the following:
>
>     LUAMRAA_API int luaopen_luamraa( lua_State* L ) {
>       lua_newtable( L );
>       luamraa_mod1_setup( L );
>       luamraa_mod2_setup( L );
>       luamraa_mod3_setup( L );
>       return 1;
>     }
>
> The `luamraa_modX_setup` functions are defined in separate files and register all functions, metatables, etc. in that file. They can't be `static`, but they don't have to be exported from the shared library either (on Unices you can have hidden visibility, on Windows you don't need `__declspec(dllexport)` stuff).
>
>
>> I can create seven wrappers but I'd like to have
>> one "luamraa" module as well.  Is the Right Way to do this to just use a
>> lua module to import the seven wrappers?  (My lua is a little rusty,
>> haven't worked with it for several years.)
>
>
> You can also use separate modules per C file and collect those modules in a single shared object/DLL (e.g. module `luamraa.modX` defined in function `luaopen_luamraa_modX` exported from DLL `luamraa.dll`). This makes sense if the modules are more or less independent from each other. For convenience you may load sub-modules from the "main" module using `require` in Lua or `luaL_requiref` in C. There are also some modules out there that do some form of auto-loading via metatables ...
>
>>
>> Thanks,
>>
>> Gregg
>>
>
> HTH,
> Philipp
>
>
>
>