Bladeren bron

generate bindings for lua and python

Julius Pfrommer 10 jaren geleden
bovenliggende
commit
618e4d95dc
5 gewijzigde bestanden met toevoegingen van 145 en 36 verwijderingen
  1. 40 33
      CMakeLists.txt
  2. 39 0
      bindings/CMakeLists.txt
  3. 59 0
      bindings/open62541.i
  4. 3 3
      include/ua_server.h
  5. 4 0
      include/ua_types.h

+ 40 - 33
CMakeLists.txt

@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 2.8.8)
-# set(CMAKE_VERBOSE_MAKEFILE on )
+# set(CMAKE_VERBOSE_MAKEFILE on)
 
 project(open62541 C)
 set(open62541_VERSION_MAJOR 0)
@@ -35,7 +35,7 @@ add_definitions(-std=c99 -pipe -Wall -Wextra -Werror -Wformat
 	endif()
 endif()
 
-# main sources of libopen62541
+# build the main library
 include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
 include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src")
 file(GLOB_RECURSE exported_headers "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
@@ -63,6 +63,37 @@ set(lib_sources src/ua_types.c
 				${exported_headers}
 				${generated_headers} )
 
+## set the precompiler flags
+configure_file("src/ua_config.h.in" "${PROJECT_BINARY_DIR}/src_generated/ua_config.h")
+
+## generate code from xml definitions
+file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/src_generated")
+include_directories("${PROJECT_BINARY_DIR}/src_generated")
+
+add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_types_generated.c
+                          ${PROJECT_BINARY_DIR}/src_generated/ua_types_generated.h
+                   PRE_BUILD
+                   COMMAND python ${PROJECT_SOURCE_DIR}/tools/generate_datatypes.py --typedescriptions ${PROJECT_SOURCE_DIR}/tools/schema/NodeIds.csv 0 ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd ${PROJECT_BINARY_DIR}/src_generated/ua_types
+                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_datatypes.py
+                           ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd
+                           ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/NodeIds.csv)
+
+add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated.c
+                          ${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated.h
+                   PRE_BUILD
+                   COMMAND python ${PROJECT_SOURCE_DIR}/tools/generate_datatypes.py --ns0-types-xml ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd 1 ${PROJECT_SOURCE_DIR}/tools/schema/Custom.Opc.Ua.Transport.bsd ${PROJECT_BINARY_DIR}/src_generated/ua_transport
+                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_datatypes.py
+                           ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/Custom.Opc.Ua.Transport.bsd)
+
+add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_nodeids.h
+                   PRE_BUILD
+                   COMMAND python ${PROJECT_SOURCE_DIR}/tools/generate_nodeids.py ${PROJECT_SOURCE_DIR}/tools/schema/NodeIds.csv ${PROJECT_BINARY_DIR}/src_generated/ua_nodeids
+                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_nodeids.py
+                           ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/NodeIds.csv)
+
+## logging
+set(UA_LOGLEVEL 300 CACHE STRING "Level at which logs shall be reported")
+
 ## multithreading
 option(MULTITHREADING "Enable multithreading" OFF)
 if(MULTITHREADING)
@@ -100,10 +131,14 @@ SET_TARGET_PROPERTIES(open62541-static PROPERTIES OUTPUT_NAME open62541 CLEAN_DI
 target_compile_definitions(open62541-objects PRIVATE UA_DYNAMIC_LINKING)
 target_compile_definitions(open62541-static PRIVATE UA_DYNAMIC_LINKING)
 
-## logging
-set(UA_LOGLEVEL 300 CACHE STRING "Level at which logs shall be reported")
+# build language bindings for the library
+option(ENABLE_BINDING_LUA "Build Lua bindings" OFF)
+option(ENABLE_BINDING_PYTHON "Build Python bindings" OFF)
+if(ENABLE_BINDING_LUA OR ENABLE_BINDING_PYTHON)
+    add_subdirectory(bindings)
+endif()
 
-## coverage
+# coverage
 option(ENABLE_COVERAGE "Enable gcov coverage" OFF)
 if(ENABLE_COVERAGE)
     message(STATUS "Enabling gcov support")
@@ -113,34 +148,6 @@ if(ENABLE_COVERAGE)
     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
 endif()
 
-# set the precompiler flags
-configure_file("src/ua_config.h.in" "${PROJECT_BINARY_DIR}/src_generated/ua_config.h")
-
-# generate code from xml definitions
-file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/src_generated")
-include_directories("${PROJECT_BINARY_DIR}/src_generated") 
-
-add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_types_generated.c
-                          ${PROJECT_BINARY_DIR}/src_generated/ua_types_generated.h
-                   PRE_BUILD
-                   COMMAND python ${PROJECT_SOURCE_DIR}/tools/generate_datatypes.py --typedescriptions ${PROJECT_SOURCE_DIR}/tools/schema/NodeIds.csv 0 ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd ${PROJECT_BINARY_DIR}/src_generated/ua_types
-                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_datatypes.py
-                           ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd
-                           ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/NodeIds.csv)
-
-add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated.c
-                          ${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated.h
-                   PRE_BUILD
-                   COMMAND python ${PROJECT_SOURCE_DIR}/tools/generate_datatypes.py --ns0-types-xml ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd 1 ${PROJECT_SOURCE_DIR}/tools/schema/Custom.Opc.Ua.Transport.bsd ${PROJECT_BINARY_DIR}/src_generated/ua_transport
-                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_datatypes.py
-                           ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/Custom.Opc.Ua.Transport.bsd)
-
-add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_nodeids.h
-                   PRE_BUILD
-                   COMMAND python ${PROJECT_SOURCE_DIR}/tools/generate_nodeids.py ${PROJECT_SOURCE_DIR}/tools/schema/NodeIds.csv ${PROJECT_BINARY_DIR}/src_generated/ua_nodeids
-                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_nodeids.py
-                           ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/NodeIds.csv)
-
 # build example client
 option(CLIENT "Build a test client" OFF)
 if(CLIENT)

+ 39 - 0
bindings/CMakeLists.txt

@@ -0,0 +1,39 @@
+FIND_PACKAGE(SWIG REQUIRED)
+INCLUDE(UseSWIG)
+
+if(ENABLE_BINDING_LUA)
+    FIND_PACKAGE(Lua51)
+    file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/lua)
+    add_custom_command (OUTPUT ${PROJECT_BINARY_DIR}/lua/lua_wrap.c 
+                        COMMAND ${SWIG_EXECUTABLE} -lua
+                        -I${PROJECT_SOURCE_DIR}/include
+                        -o ${PROJECT_BINARY_DIR}/lua/lua_wrap.c
+                        ${CMAKE_CURRENT_SOURCE_DIR}/open62541.i
+                        DEPENDS open62541)
+    add_library(open62541-lua SHARED ${PROJECT_BINARY_DIR}/lua/lua_wrap.c)
+    set_target_properties(open62541-lua PROPERTIES COMPILE_FLAGS "-Wno-error")
+    target_include_directories(open62541-lua PUBLIC ${LUA_INCLUDE_DIR} ${PROJECT_SOURCE_DIR}/include
+                                                    ${PROJECT_BINARY_DIR}/src_generated)
+    target_link_libraries(open62541-lua open62541-static)
+    set_target_properties(open62541-lua PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lua
+                                                   OUTPUT_NAME open62541 PREFIX "")
+endif()
+
+if(ENABLE_BINDING_PYTHON)
+    FIND_PACKAGE(PythonLibs)
+    file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/python)
+    add_custom_command (OUTPUT ${PROJECT_BINARY_DIR}/python/python_wrap.c 
+                        COMMAND ${SWIG_EXECUTABLE} -python
+                        -I${PROJECT_SOURCE_DIR}/include
+                        -o ${PROJECT_BINARY_DIR}/python/python_wrap.c
+                        ${CMAKE_CURRENT_SOURCE_DIR}/open62541.i
+                        DEPENDS open62541)
+    add_library(open62541-python SHARED ${PROJECT_BINARY_DIR}/python/python_wrap.c)
+    set_target_properties(open62541-python PROPERTIES COMPILE_FLAGS "-Wno-error")
+    target_include_directories(open62541-python PUBLIC ${PYTHON_INCLUDE_DIR} ${PROJECT_SOURCE_DIR}/include
+                                                       ${PROJECT_BINARY_DIR}/src_generated)
+    target_link_libraries(open62541-python open62541-static)
+    set_target_properties(open62541-python PROPERTIES
+                                           LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/python
+                                           OUTPUT_NAME _open62541 PREFIX "")
+endif()

+ 59 - 0
bindings/open62541.i

@@ -0,0 +1,59 @@
+/** building for lua
+ swig -lua -I../include open62541.i
+ gcc -fpic -c open62541_wrap.c -I/usr/include/lua5.2 -I../include -I../build/src_generated
+ gcc -shared open62541_wrap.o ../build/libopen62541.a -llua5.2 -o open62541.so
+*/
+
+%module open62541
+%{
+#include "ua_types.h"
+#include "ua_server.h"
+%}
+
+%define UA_TYPE_HANDLING_FUNCTIONS_SWIG(TYPE)
+    TYPE * TYPE##_new(void);
+    void TYPE##_init(TYPE * p);
+    void TYPE##_delete(TYPE * p);
+    void TYPE##_deleteMembers(TYPE * p);
+    UA_StatusCode TYPE##_copy(const TYPE *src, TYPE *dst);
+%enddef
+
+%define UA_TYPE_HANDLING_FUNCTIONS_AS_SWIG(TYPE)
+    TYPE * TYPE##_new(void);
+    void TYPE##_init(TYPE * p);
+    void TYPE##_delete(TYPE * p);
+    void TYPE##_deleteMembers(TYPE * p);
+    UA_StatusCode TYPE##_copy(const TYPE *src, TYPE *dst);
+%enddef
+
+%define UA_EXPORT
+%enddef
+
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_Boolean)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_SByte)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_Byte)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_Int16)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_UInt16)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_Int32)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_UInt32)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_Int64)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_UInt64)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_Float)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_Double)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_String)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_DateTime)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_Guid)
+UA_TYPE_HANDLING_FUNCTIONS_AS_SWIG(UA_ByteString)
+UA_TYPE_HANDLING_FUNCTIONS_AS_SWIG(UA_XmlElement)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_NodeId)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_ExpandedNodeId)
+UA_TYPE_HANDLING_FUNCTIONS_AS_SWIG(UA_StatusCode)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_QualifiedName)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_LocalizedText)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_ExtensionObject)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_DataValue)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_Variant)
+UA_TYPE_HANDLING_FUNCTIONS_SWIG(UA_DiagnosticInfo)
+
+%include "ua_types.h"
+%include "ua_server.h"

+ 3 - 3
include/ua_server.h

@@ -148,7 +148,7 @@ UA_StatusCode UA_EXPORT UA_Server_addRepeatedWorkItem(UA_Server *server, const U
                                                       UA_UInt32 interval, UA_Guid *resultWorkGuid);
 
 /** Remove timed or repeated work */
-UA_Boolean UA_EXPORT UA_Server_removeWorkItem(UA_Server *server, UA_Guid workId);
+/* UA_Boolean UA_EXPORT UA_Server_removeWorkItem(UA_Server *server, UA_Guid workId); */
 
 /**
  * Interface to the binary network layers. This structure is returned from the
@@ -270,8 +270,8 @@ typedef struct UA_ExternalNodeStore {
 	UA_ExternalNodeStore_delete destroy;
 } UA_ExternalNodeStore;
 
-UA_StatusCode UA_EXPORT
-UA_Server_addExternalNamespace(UA_Server *server, UA_UInt16 namespaceIndex, const UA_String *url, UA_ExternalNodeStore *nodeStore);
+/* UA_StatusCode UA_EXPORT */
+/* UA_Server_addExternalNamespace(UA_Server *server, UA_UInt16 namespaceIndex, const UA_String *url, UA_ExternalNodeStore *nodeStore); */
 
 /** @} */
 

+ 4 - 0
include/ua_types.h

@@ -243,12 +243,16 @@ typedef struct UA_DiagnosticInfo {
     struct UA_DiagnosticInfo *innerDiagnosticInfo;
 } UA_DiagnosticInfo;
 
+#ifndef SWIG
 #define UA_TYPE_HANDLING_FUNCTIONS(TYPE)                             \
     TYPE UA_EXPORT * TYPE##_new(void);                               \
     void UA_EXPORT TYPE##_init(TYPE * p);                            \
     void UA_EXPORT TYPE##_delete(TYPE * p);                          \
     void UA_EXPORT TYPE##_deleteMembers(TYPE * p);                   \
     UA_StatusCode UA_EXPORT TYPE##_copy(const TYPE *src, TYPE *dst);
+#else
+#define UA_TYPE_HANDLING_FUNCTIONS(TYPE)
+#endif
 
 /* Functions for all types */
 UA_TYPE_HANDLING_FUNCTIONS(UA_Boolean)