Browse Source

cleanup cmake (#681)

* cleanup cmake

* fix readspeed example

* adjust travis and appveyor; use static lib for release

* fix unit test build

* fix server path

* install check for analysis phase

* fix caching packages

* fix assignment

* fix if then

* fix a variable expansion

* add trace outputs to environment install

* more logging

* fixing.,.

* fix a rm

* fix a typo

* fix path

* notifications only for 0.2 and master

* add missing file

* clean osx before install

* fix notification setting

* fix python

* fix an unit test issue
Julius Pfrommer 8 years ago
parent
commit
33051eaed6

+ 10 - 4
.travis.yml

@@ -85,6 +85,7 @@ before_install:
 - export CHECK_INCLUDE_DIRS=$LOCAL_PKG/include/
 - export CHECK_LIBRARIES=$LOCAL_PKG/lib/
 
+- sh ./tools/travis/travis_notifications.sh
 - if [ ${TRAVIS_OS_NAME} == "linux" ]; then sh ./tools/travis/travis_linux_before_install.sh; fi
 - if [ ${TRAVIS_OS_NAME} == "osx" ]; then sh ./tools/travis/travis_osx_before_install.sh; fi
 
@@ -104,9 +105,9 @@ before_deploy:
 - git clone https://github.com/raspberrypi/tools
 - cd -
 - export PATH=$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/
-- cmake -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-rpi64.cmake -DUA_ENABLE_AMALGAMATION=ON -DUA_BUILD_SELFSIGNED_CERTIFICATE=ON -DCMAKE_BUILD_TYPE=Release -DUA_BUILD_EXAMPLESERVER=ON -DUA_BUILD_EXAMPLECLIENT=ON ..
-- make 
-- tar -pczf open62541-raspberrypi.tar.gz ../doc ../../server_cert.der ../LICENSE ../AUTHORS ../README.md server_static server client_static client libopen62541.so open62541.h open62541.c
+- cmake -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-rpi64.cmake -DUA_ENABLE_AMALGAMATION=ON -DCMAKE_BUILD_TYPE=Release -DUA_BUILD_EXAMPLES=ON ..
+- make
+- tar -pczf open62541-raspberrypi.tar.gz ../doc ../../server_cert.der ../LICENSE ../AUTHORS ../README.md examples/server examples/client libopen62541.a open62541.h open62541.c
 - cp open62541-raspberrypi.tar.gz ..
 - cd ..
 
@@ -114,7 +115,7 @@ deploy:
   provider: releases
   api_key:
     secure: PKCoA7MBRtHloIbNF4Qj5LQyCafjekfVeFXlMBd9KmC0ynNuef+D7nn38f/jo25/b0Ii7r+hgslkQPezbKyEqo2zcCB8Pn8TWau2hbzKM/dUCPoN90HVaQcRjUi8P2Y+QkouwyPWSujBL35/X5QiAntRotCSbZx4fkyiN8cU95o=
-  file: 
+  file:
     - open62541-win32.zip
     - open62541-win64.zip
     - open62541-linux32.tar.gz
@@ -127,3 +128,8 @@ deploy:
     repo: open62541/open62541
     tags: true
     condition: $CC = gcc && $ANALYZE = false
+
+notifications:
+  irc: "chat.freenode.net#open62541"
+  on_success: ${IRC_NOTIFY_SUCCESS} # default: change, variable defined in ./tools/travis/travis_notification.sh
+  on_failure: ${IRC_NOTIFY_FAILURE} # default: always, variable defined in ./tools/travis/travis_notification.sh

+ 135 - 249
CMakeLists.txt

@@ -1,21 +1,17 @@
 cmake_minimum_required(VERSION 2.8.11)
 project(open62541 C)
+set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/tools/cmake")
 # set(CMAKE_VERBOSE_MAKEFILE ON)
 
 ######################
 # Check Dependencies #
 ######################
 
-# Find Python
 find_package(PythonInterp REQUIRED)
-
-# Check for git
 find_package(Git)
 if(GIT_FOUND)
   execute_process(COMMAND ${GIT_EXECUTABLE} describe --abbrev=7 --dirty --always --tags
-                  RESULT_VARIABLE res_var
-                  OUTPUT_VARIABLE GIT_COM_ID
-                  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
+                  RESULT_VARIABLE res_var OUTPUT_VARIABLE GIT_COM_ID WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
     if(NOT ${res_var} EQUAL 0)
         set(GIT_COMMIT_ID "unknown--git-commit-id-unknown")
         message(STATUS "Git failed (not a repo, or no tags). Build will not contain git revision info." )
@@ -26,81 +22,18 @@ else()
     set(GIT_COMMIT_ID "unknown--no-git-found")
     message(STATUS "Git not found. Build will not contain git revision info." )
 endif()
-
 message(STATUS "Git version: "  ${GIT_COMMIT_ID})
 
-set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/tools/cmake")
-
-####################################
-# Build Type and Compiler Settings #
-####################################
+############
+# Settings #
+############
 
 # Set default build type.
 if(NOT CMAKE_BUILD_TYPE)
-    message(STATUS "CMAKE_BUILD_TYPE not given; setting to 'Debug'.")
-    set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build." FORCE)
-endif()
-
-# Collect libraries
-list(APPEND open62541_LIBRARIES "")
-
-# compiler flags
-if(CMAKE_COMPILER_IS_GNUCC OR "x${CMAKE_C_COMPILER_ID}" STREQUAL "xClang")
-    add_definitions(-std=c99 -pipe -Wall -Wextra -Werror -Wformat -Wno-unused-parameter
-                    -Wno-unused-function -Wno-unused-label -Wpointer-arith -Wreturn-type -Wsign-compare
-                    -Wmultichar -Wstrict-overflow -Wcast-qual -Wmissing-prototypes -Wstrict-prototypes
-                    -Winit-self -Wuninitialized -Wformat-security -Wformat-nonliteral)
-
-  # library linking
-  set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") # cmake sets -rdynamic by default
-  if(NOT WIN32 AND NOT CYGWIN)
-    add_definitions(-Wshadow -Wconversion -fvisibility=hidden -fPIC)
-    if(NOT APPLE)
-      set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,-z,norelro -Wl,--hash-style=gnu -Wl,--build-id=none")
-    endif()
-  endif()
-
-  # Debug
-  if(CMAKE_BUILD_TYPE STREQUAL "Debug")
-    # add_definitions(-fsanitize=address)
-    # list(APPEND open62541_LIBRARIES asan)
-
-    # add_definitions(-fsanitize=undefined)
-    # list(APPEND open62541_LIBRARIES ubsan)
-
-  elseif(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" OR
-         CMAKE_BUILD_TYPE STREQUAL "Release")
-    add_definitions(-ffunction-sections -fdata-sections -fno-stack-protector -fno-unwind-tables
-                    -fno-asynchronous-unwind-tables -fno-math-errno -fmerge-all-constants -fno-ident)
-    set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -s")
-    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s")
-    if(APPLE)
-      set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,-dead_strip")
-      set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip")
-    else()
-      set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,--gc-sections")
-      set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections")
-      if(NOT WIN32 AND NOT CYGWIN)
-        # these settings reduce the binary size by ~2kb
-        set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,-z,norelro -Wl,--hash-style=gnu -Wl,--build-id=none")
-      endif()
-    endif()
-  endif()
-
-  if(APPLE)
-    set(CMAKE_MACOSX_RPATH 1)
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_DARWIN_C_SOURCE=1")
-  endif()
-elseif(MSVC)
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /WX") # Compiler warnings, error on warning
-  set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT")
-  set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd")
+    message(STATUS "CMAKE_BUILD_TYPE not given; setting to 'Debug'")
+    set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build" FORCE)
 endif()
 
-############
-# Settings #
-############
-
 # Options
 set(UA_LOGLEVEL 300 CACHE STRING "Level at which logs shall be reported")
 option(UA_ENABLE_METHODCALLS "Enable the Method service set" ON)
@@ -138,23 +71,80 @@ if(UA_ENABLE_NONSTANDARD_UDP)
 endif()
 
 # Build Targets
-option(UA_BUILD_EXAMPLESERVER "Build the example server" OFF)
-option(UA_BUILD_EXAMPLECLIENT "Build a test client" OFF)
-option(UA_BUILD_UNIT_TESTS "Run unit tests after building" OFF)
 option(UA_BUILD_EXAMPLES "Build example servers and clients" OFF)
+option(UA_BUILD_EXAMPLES_NODESET_COMPILER "Generate an OPC UA information model from a nodeset XML (experimental)" OFF)
+option(UA_BUILD_UNIT_TESTS "Build the unit tests" OFF)
 option(UA_BUILD_DOCUMENTATION "Generate doxygen/sphinx documentation" OFF)
 
 # Advanced Build Targets
 option(UA_BUILD_SELFSIGNED_CERTIFICATE "Generate self-signed certificate" OFF)
 mark_as_advanced(UA_BUILD_SELFSIGNED_CERTIFICATE)
 
+#####################
+# Compiler Settings #
+#####################
+
+list(APPEND open62541_LIBRARIES "") # Collect libraries
+
+if(CMAKE_COMPILER_IS_GNUCC OR "x${CMAKE_C_COMPILER_ID}" STREQUAL "xClang")
+    # Compiler
+    add_definitions(-std=c99 -pipe -Wall -Wextra -Werror -Wformat -Wno-unused-parameter
+                    -Wno-unused-function -Wno-unused-label -Wpointer-arith -Wreturn-type -Wsign-compare
+                    -Wmultichar -Wstrict-overflow -Wcast-qual -Wmissing-prototypes -Wstrict-prototypes
+                    -Winit-self -Wuninitialized -Wformat-security -Wformat-nonliteral)
+    if(NOT WIN32 AND NOT CYGWIN)
+        add_definitions(-Wshadow -Wconversion -fvisibility=hidden -fPIC)
+    endif()
+
+    # Linker
+    set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") # cmake sets -rdynamic by default
+
+    # Debug
+    if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+        # add_definitions(-fsanitize=address)
+        # list(APPEND open62541_LIBRARIES asan)
+        # add_definitions(-fsanitize=undefined)
+        # list(APPEND open62541_LIBRARIES ubsan)
+    endif()
+
+    # Strip release builds
+    if(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" OR CMAKE_BUILD_TYPE STREQUAL "Release")
+        add_definitions(-ffunction-sections -fdata-sections -fno-stack-protector -fno-unwind-tables
+                        -fno-asynchronous-unwind-tables -fno-math-errno -fmerge-all-constants -fno-ident)
+        set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -s")
+        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s")
+        if(APPLE)
+            set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,-dead_strip")
+            set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip")
+        else()
+            set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,--gc-sections")
+            set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections")
+        endif()
+        if(NOT WIN32 AND NOT CYGWIN AND NOT APPLE)
+            # these settings reduce the binary size by ~2kb
+            set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -Wl,-z,norelro -Wl,--hash-style=gnu -Wl,--build-id=none")
+        endif()
+    endif()
+endif()
+
+if(APPLE)
+    set(CMAKE_MACOSX_RPATH 1)
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_DARWIN_C_SOURCE=1")
+endif()
+
+if(MSVC)
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /WX") # Compiler warnings, error on warning
+  set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT")
+  set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd")
+endif()
+
 #########################
 # Generate Main Library #
 #########################
 
 file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/src_generated")
-include_directories(${PROJECT_BINARY_DIR}/src_generated) #needed to locate an include of examples/server_nodeset.c
 configure_file("include/ua_config.h.in" "${PROJECT_BINARY_DIR}/src_generated/ua_config.h")
+include_directories(${PROJECT_BINARY_DIR}/src_generated)
 
 set(exported_headers ${PROJECT_BINARY_DIR}/src_generated/ua_config.h
                      ${PROJECT_SOURCE_DIR}/include/ua_constants.h
@@ -250,10 +240,9 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_types_generated
                           ${PROJECT_BINARY_DIR}/src_generated/ua_types_generated_encoding_binary.h
                    PRE_BUILD
                    COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/generate_datatypes.py
-                                                --typedescriptions ${PROJECT_SOURCE_DIR}/tools/schema/NodeIds.csv
-                                                --selected_types=${PROJECT_SOURCE_DIR}/tools/schema/datatypes_minimal.txt
-                                                ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd
-                                                ${PROJECT_BINARY_DIR}/src_generated/ua_types
+                           --typedescriptions ${PROJECT_SOURCE_DIR}/tools/schema/NodeIds.csv
+                           --selected_types=${PROJECT_SOURCE_DIR}/tools/schema/datatypes_minimal.txt
+                           ${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
                            ${PROJECT_SOURCE_DIR}/tools/schema/datatypes_minimal.txt
                            ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd
@@ -265,11 +254,10 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_transport_gener
                           ${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated_encoding_binary.h
                    PRE_BUILD
                    COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/generate_datatypes.py
-                                                --namespace=1
-                                                --selected_types=${PROJECT_SOURCE_DIR}/tools/schema/datatypes_transport.txt
-                                                ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd
-                                                ${PROJECT_SOURCE_DIR}/tools/schema/Custom.Opc.Ua.Transport.bsd
-                                                ${PROJECT_BINARY_DIR}/src_generated/ua_transport
+                           --namespace=1 --selected_types=${PROJECT_SOURCE_DIR}/tools/schema/datatypes_transport.txt
+                           ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd
+                           ${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
                            ${PROJECT_SOURCE_DIR}/tools/schema/datatypes_transport.txt
                            ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/Custom.Opc.Ua.Transport.bsd)
@@ -278,8 +266,7 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_transport_gener
 add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_nodeids.h
                    PRE_BUILD
                    COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/generate_nodeids.py
-                                                ${PROJECT_SOURCE_DIR}/tools/schema/NodeIds.csv
-                                                ${PROJECT_BINARY_DIR}/src_generated/ua_nodeids
+                           ${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)
 
@@ -288,10 +275,10 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_g
                           ${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_generated.h
                    PRE_BUILD
                    COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/generate_open62541CCode.py
-                                                -i ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_AssumeExternal.txt
-                                                -s description -b ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist.txt
-                                                ${PROJECT_SOURCE_DIR}/tools/schema/namespace0/${GENERATE_NAMESPACE0_FILE}
-                                                ${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_generated
+                           -i ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_AssumeExternal.txt
+                           -s description -b ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist.txt
+                           ${PROJECT_SOURCE_DIR}/tools/schema/namespace0/${GENERATE_NAMESPACE0_FILE}
+                           ${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_generated
                    DEPENDS ${PROJECT_SOURCE_DIR}/tools/schema/namespace0/${GENERATE_NAMESPACE0_FILE}
                            ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/generate_open62541CCode.py
                            ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/open62541_MacroHelper.py
@@ -304,8 +291,7 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_g
 add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/open62541.h
                    PRE_BUILD
                    COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py
-                                                ${GIT_COMMIT_ID}
-                                                ${CMAKE_CURRENT_BINARY_DIR}/open62541.h ${exported_headers}
+                           ${GIT_COMMIT_ID} ${CMAKE_CURRENT_BINARY_DIR}/open62541.h ${exported_headers}
                    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py
                            ${exported_headers}
                            ${internal_headers})
@@ -313,179 +299,79 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/open62541.h
 add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/open62541.c
                    PRE_BUILD
                    COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py
-                                                ${GIT_COMMIT_ID}
-                                                ${CMAKE_CURRENT_BINARY_DIR}/open62541.c
-                                                ${internal_headers}
-                                                ${PROJECT_SOURCE_DIR}/src/server/ua_nodestore_hash.inc
-                                                ${lib_sources}
-                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py
-                           ${internal_headers}
-                           ${PROJECT_SOURCE_DIR}/src/server/ua_nodestore_hash.inc
-                           ${lib_sources})
-
-#################
-# Build Targets #
-#################
+                           ${GIT_COMMIT_ID} ${CMAKE_CURRENT_BINARY_DIR}/open62541.c ${internal_headers}
+                           ${PROJECT_SOURCE_DIR}/src/server/ua_nodestore_hash.inc ${lib_sources}
+                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py ${internal_headers}
+                           ${PROJECT_SOURCE_DIR}/src/server/ua_nodestore_hash.inc ${lib_sources})
+
+# example information model from nodeset xml
+add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/nodeset.h ${PROJECT_BINARY_DIR}/src_generated/nodeset.c
+                  PRE_BUILD
+                  COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/generate_open62541CCode.py
+                                                -i ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist_FullNS0.txt
+                                                ${PROJECT_SOURCE_DIR}/tools/schema/namespace0/Opc.Ua.NodeSet2.xml
+                                                ${PROJECT_SOURCE_DIR}/examples/server_nodeset.xml
+                                                ${PROJECT_BINARY_DIR}/src_generated/nodeset
+                  DEPENDS ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/generate_open62541CCode.py
+                          ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/open62541_MacroHelper.py
+                          ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_builtin_types.py
+                          ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_constants.py
+                          ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_namespace.py
+                          ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_node_types.py
+                          ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist_FullNS0.txt
+                          ${PROJECT_SOURCE_DIR}/examples/server_nodeset.xml)
+
+#####################
+# Build the Library #
+#####################
 
-# build shared library
 if(UA_ENABLE_AMALGAMATION)
     add_library(open62541-object OBJECT ${PROJECT_BINARY_DIR}/open62541.c ${PROJECT_BINARY_DIR}/open62541.h)
-    include_directories(${PROJECT_BINARY_DIR})
+    target_include_directories(open62541-object PRIVATE ${PROJECT_BINARY_DIR})
 else()
-    add_definitions(-DUA_NO_AMALGAMATION)
     add_library(open62541-object OBJECT ${lib_sources} ${internal_headers} ${exported_headers})
-    include_directories(${PROJECT_SOURCE_DIR}/include)
-    include_directories(${PROJECT_SOURCE_DIR}/src)
-    include_directories(${PROJECT_SOURCE_DIR}/plugins)
-    include_directories(${PROJECT_SOURCE_DIR}/deps)
+    target_include_directories(open62541-object PRIVATE ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src
+                                                        ${PROJECT_SOURCE_DIR}/plugins ${PROJECT_SOURCE_DIR}/deps)
 endif()
+add_library(open62541 $<TARGET_OBJECTS:open62541-object>)
+target_link_libraries(open62541 ${open62541_LIBRARIES})
+
 target_compile_definitions(open62541-object PRIVATE -DUA_DYNAMIC_LINKING)
-add_library(open62541 SHARED $<TARGET_OBJECTS:open62541-object>)
-add_library(open62541-static STATIC $<TARGET_OBJECTS:open62541-object>)
 target_compile_definitions(open62541 PRIVATE -DUA_DYNAMIC_LINKING)
-target_compile_definitions(open62541-static PRIVATE -DUA_DYNAMIC_LINKING)
-target_link_libraries(open62541-static ${open62541_LIBRARIES})
-if(WIN32)
-  target_link_libraries(open62541 ws2_32)
-  target_link_libraries(open62541-static ws2_32)
-endif()
+# target_compile_definitions(open62541-static PRIVATE -DUA_DYNAMIC_LINKING)
 
-if(UA_BUILD_EXAMPLESERVER)
-    set(server_source $<TARGET_OBJECTS:open62541-object>)
-    add_executable(server_static examples/server.c ${server_source})
-    add_executable(server examples/server.c)
-    target_link_libraries(server ${open62541_LIBRARIES} open62541)
-    target_link_libraries(server_static ${open62541_LIBRARIES})
-	target_compile_definitions(server_static PRIVATE -DUA_DYNAMIC_LINKING)
-    if(WIN32)
-        target_link_libraries(server_static ws2_32)
-        target_link_libraries(server ws2_32)
-    elseif(NOT APPLE)
-        target_link_libraries(server_static rt)
-        target_link_libraries(server rt)
-    endif()
-    if(UA_ENABLE_MULTITHREADING)
-        target_link_libraries(server_static urcu-cds urcu urcu-common pthread)
-        target_link_libraries(server urcu-cds urcu urcu-common pthread)
-    endif()
-
-    if(UA_ENABLE_NONSTANDARD_UDP)
-      add_executable(exampleServerUDP $<TARGET_OBJECTS:open62541-object>
-                                      examples/networklayer_udp.c
-                                      examples/server_udp.c)
-      target_link_libraries(exampleServerUDP ${open62541_LIBRARIES} open62541)
-      if(UA_ENABLE_MULTITHREADING)
-        target_link_libraries(exampleServerUDP urcu-cds urcu urcu-common)
-      endif()
-      if (NOT APPLE)
-        target_link_libraries(exampleServerUDP rt)
-      endif()
-    endif()
+if(WIN32)
+    target_link_libraries(open62541 ws2_32)
 endif()
 
-if(UA_BUILD_SELFSIGNED_CERTIFICATE)
-    message(STATUS "Enabling self-signed certificates")
-    find_package(OpenSSL REQUIRED)
-    add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/server_cert.der
-                              ${PROJECT_BINARY_DIR}/ca.crt
-                   COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/certs/create_self-signed.py ${PROJECT_BINARY_DIR}
-                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/certs/create_self-signed.py
-                           ${CMAKE_CURRENT_SOURCE_DIR}/tools/certs/localhost.cnf)
-    add_custom_target(selfsigned ALL DEPENDS ${PROJECT_BINARY_DIR}/server_cert.der ${PROJECT_BINARY_DIR}/ca.crt)
-endif()
+##########################
+# Build Selected Targets #
+##########################
 
-if(UA_BUILD_EXAMPLECLIENT)
-    set(client_source $<TARGET_OBJECTS:open62541-object>)
-    add_executable(client_static examples/client.c ${client_source})
-    add_executable(client examples/client.c)
-    target_link_libraries(client_static ${open62541_LIBRARIES})
-	target_compile_definitions(client_static PRIVATE -DUA_DYNAMIC_LINKING)
-    target_link_libraries(client open62541 ${open62541_LIBRARIES})
-    if(WIN32)
-        target_link_libraries(client_static ws2_32)
-        target_link_libraries(client ws2_32)
-    elseif(NOT APPLE)
-        target_link_libraries(client_static rt)
-        target_link_libraries(client rt)
-    endif()
-    if(UA_ENABLE_MULTITHREADING)
-        target_link_libraries(client_static urcu-cds urcu urcu-common pthread)
-        target_link_libraries(client urcu-cds urcu urcu-common pthread)
-    endif()
+if(UA_BUILD_EXAMPLES)
+    add_subdirectory(examples)
 endif()
 
 if(UA_BUILD_UNIT_TESTS)
-  add_definitions(-DUA_BUILD_UNIT_TESTS)
+    target_compile_definitions(open62541-object PRIVATE UA_BUILD_UNIT_TESTS) # Export some internal functions
     enable_testing()
     add_subdirectory(tests)
 endif()
 
-if(UA_BUILD_EXAMPLES)
-    #add_subdirectory(examples)
-    #FIXME: we had problem with static linking for msvs, here a quick and dirty workaround
-    #http://stackoverflow.com/questions/3704374/linking-error-lnk2019-in-msvc-unresolved-symbols-with-imp-prefix-but-shoul
-    #http://stackoverflow.com/questions/1089828/same-header-file-for-both-dll-and-static-library
-    list(APPEND LIBS ${open62541_LIBRARIES})
-    if(NOT WIN32)
-      list(APPEND LIBS pthread)
-      if (NOT APPLE)
-        list(APPEND LIBS rt)
-      endif()
-    else()
-      list(APPEND LIBS ws2_32)
-    endif()
-    if(UA_ENABLE_MULTITHREADING)
-      list(APPEND LIBS urcu-cds urcu urcu-common)
-    endif(UA_ENABLE_MULTITHREADING)
-
-    add_executable(server_variable ${PROJECT_SOURCE_DIR}/examples/server_variable.c $<TARGET_OBJECTS:open62541-object>)
-    target_link_libraries(server_variable ${LIBS})
-
-    add_executable(server_mainloop ${PROJECT_SOURCE_DIR}/examples/server_mainloop.c $<TARGET_OBJECTS:open62541-object>)
-    target_link_libraries(server_mainloop ${LIBS})
-
-    add_executable(server_datasource ${PROJECT_SOURCE_DIR}/examples/server_datasource.c $<TARGET_OBJECTS:open62541-object>)
-    target_link_libraries(server_datasource ${LIBS})
-
-    # add_executable(server_readspeed ${PROJECT_SOURCE_DIR}/examples/server_readspeed.c $<TARGET_OBJECTS:open62541-object>)
-    # target_link_libraries(server_readspeed ${LIBS})
-
-    add_executable(server_firstSteps ${PROJECT_SOURCE_DIR}/examples/server_firstSteps.c $<TARGET_OBJECTS:open62541-object>)
-    target_link_libraries(server_firstSteps ${LIBS})
-
-    add_executable(client_firstSteps ${PROJECT_SOURCE_DIR}/examples/client_firstSteps.c $<TARGET_OBJECTS:open62541-object>)
-    target_link_libraries(client_firstSteps ${LIBS})
-
-    add_executable(server_repeated_job ${PROJECT_SOURCE_DIR}/examples/server_repeated_job.c $<TARGET_OBJECTS:open62541-object>)
-    target_link_libraries(server_repeated_job ${LIBS})
-
-    add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/nodeset.h ${PROJECT_BINARY_DIR}/src_generated/nodeset.c
-                      PRE_BUILD
-                      COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/generate_open62541CCode.py
-                                                    -i ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist_FullNS0.txt
-                                                    ${PROJECT_SOURCE_DIR}/tools/schema/namespace0/Opc.Ua.NodeSet2.xml
-                                                    ${PROJECT_SOURCE_DIR}/examples/server_nodeset.xml
-                                                    ${PROJECT_BINARY_DIR}/src_generated/nodeset
-                      DEPENDS ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/generate_open62541CCode.py
-                              ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/open62541_MacroHelper.py
-                              ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_builtin_types.py
-                              ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_constants.py
-                              ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_namespace.py
-                              ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_node_types.py
-                              ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist_FullNS0.txt
-                              ${PROJECT_SOURCE_DIR}/examples/server_nodeset.xml)
-
-    add_executable(server_nodeset ${PROJECT_SOURCE_DIR}/examples/server_nodeset.c
-                                  ${PROJECT_BINARY_DIR}/src_generated/nodeset.c
-                                  $<TARGET_OBJECTS:open62541-object>)
-    target_link_libraries(server_nodeset ${LIBS})
-
-    if(UA_ENABLE_METHODCALLS)
-      add_executable(server_method ${PROJECT_SOURCE_DIR}/examples/server_method.c $<TARGET_OBJECTS:open62541-object>)
-      target_link_libraries(server_method ${LIBS})
-    endif()
-endif()
-
 if(UA_BUILD_DOCUMENTATION)
     add_subdirectory(doc)
 endif()
+
+if(UA_BUILD_SELFSIGNED_CERTIFICATE)
+    find_package(OpenSSL REQUIRED)
+    add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/server_cert.der ${PROJECT_BINARY_DIR}/ca.crt
+                       COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/certs/create_self-signed.py ${PROJECT_BINARY_DIR}
+                       DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/certs/create_self-signed.py
+                               ${CMAKE_CURRENT_SOURCE_DIR}/tools/certs/localhost.cnf)
+    add_custom_target(selfsigned ALL DEPENDS ${PROJECT_BINARY_DIR}/server_cert.der ${PROJECT_BINARY_DIR}/ca.crt)
+endif()
+
+if(UA_BUILD_EXAMPLES_NODESET_COMPILER)
+  add_custom_target(generate_informationmodel ALL
+                    DEPENDS ${PROJECT_BINARY_DIR}/src_generated/nodeset.h ${PROJECT_BINARY_DIR}/src_generated/nodeset.c)
+endif()

+ 6 - 6
appveyor.yml

@@ -42,34 +42,34 @@ before_build:
   - set PATH=%PATH:C:\Program Files\Git\usr\bin;=%
   - set PATH=C:\MinGW\bin;%PATH%
 
-build_script: 
+build_script:
   - cd c:\projects\open62541
   - md build
   - cd build
   # cygwin cmake stopped working on 05.07.2016 -- commented out until a fix appears
   #- echo "Testing cygwin"
   #- '%CYG_BASH% --login -lc "/usr/bin/cmake.exe --version"'
-  #- '%CYG_BASH% --login -lc "cd /cygdrive/c/projects/open62541/build; cmake -DUA_BUILD_EXAMPLESERVER:BOOL=ON -DUA_BUILD_EXAMPLECLIENT:BOOL=ON -DUA_BUILD_EXAMPLES:BOOL=ON -G\"Unix Makefiles\" .."'
+  #- '%CYG_BASH% --login -lc "cd /cygdrive/c/projects/open62541/build; cmake -DUA_BUILD_EXAMPLES:BOOL=ON -G\"Unix Makefiles\" .."'
   #- '%CYG_BASH% --login -lc "cd /cygdrive/c/projects/open62541/build; make -j"'
   - cd ..
   - rd /s /q build
   - md build
   - cd build
   - echo "Testing MinGW32"
-  - cmake -DUA_BUILD_EXAMPLESERVER:BOOL=ON -DUA_BUILD_EXAMPLECLIENT:BOOL=ON -DUA_BUILD_EXAMPLES:BOOL=ON -G"MinGW Makefiles" ..
+  - cmake -DUA_BUILD_EXAMPLES:BOOL=ON -G"MinGW Makefiles" ..
   - mingw32-make
   - cd ..
   - rd /s /q build
   - md build
   - cd build
-  - cmake -DUA_BUILD_EXAMPLESERVER:BOOL=ON -DUA_BUILD_EXAMPLECLIENT:BOOL=ON -DUA_BUILD_EXAMPLES:BOOL=ON -G"Visual Studio 12 2013" ..
+  - cmake -DUA_BUILD_EXAMPLES:BOOL=ON -G"Visual Studio 12 2013" ..
   - msbuild open62541.sln /m
   - echo "Testing amalgamation"
   - cd ..
   - rd /s /q build
   - md build
   - cd build
-  - cmake -DUA_BUILD_EXAMPLESERVER:BOOL=ON -DUA_BUILD_EXAMPLECLIENT:BOOL=ON -DUA_BUILD_EXAMPLES:BOOL=ON -DUA_ENABLE_AMALGAMATION:BOOL=ON -G"Visual Studio 12 2013" ..
+  - cmake -DUA_BUILD_EXAMPLES:BOOL=ON -DUA_ENABLE_AMALGAMATION:BOOL=ON -G"Visual Studio 12 2013" ..
   - msbuild open62541.sln /m
   - copy C:\projects\open62541\build\open62541.c C:\projects\open62541\build\Debug\open62541.c
   - copy C:\projects\open62541\build\open62541.h C:\projects\open62541\build\Debug\open62541.h
@@ -77,7 +77,7 @@ build_script:
   - echo "Win 64 build"
   - md build64
   - cd build64
-  - cmake -DUA_BUILD_EXAMPLESERVER:BOOL=ON -DUA_BUILD_EXAMPLECLIENT:BOOL=ON -DUA_BUILD_EXAMPLES:BOOL=ON -DUA_ENABLE_AMALGAMATION:BOOL=ON -G"Visual Studio 12 2013 Win64" ..
+  - cmake -DUA_BUILD_EXAMPLES:BOOL=ON -DUA_ENABLE_AMALGAMATION:BOOL=ON -G"Visual Studio 12 2013 Win64" ..
   - msbuild open62541.sln /m
   - copy C:\projects\open62541\build64\open62541.c C:\projects\open62541\build64\Debug\open62541.c
   - copy C:\projects\open62541\build64\open62541.h C:\projects\open62541\build64\Debug\open62541.h

+ 53 - 36
examples/CMakeLists.txt

@@ -1,60 +1,77 @@
 include_directories(${PROJECT_SOURCE_DIR}/include)
-include_directories(${PROJECT_BINARY_DIR}/src_generated)
+include_directories(${PROJECT_SOURCE_DIR}/plugins)
 
-set(LIBS open62541-static)
+if(UA_ENABLE_AMALGAMATION)
+    include_directories(${PROJECT_BINARY_DIR}) # contain open62541.h
+else()
+    add_definitions(-DUA_NO_AMALGAMATION)
+endif()
+
+list(APPEND LIBS ${open62541_LIBRARIES})
 if(NOT WIN32)
-    list(APPEND LIBS pthread)
-    if (NOT APPLE)
-        list(APPEND LIBS rt)
-    endif()
+  list(APPEND LIBS pthread)
+  if (NOT APPLE)
+    list(APPEND LIBS rt)
+  endif()
 else()
-    list(APPEND LIBS ws2_32)
+  list(APPEND LIBS ws2_32)
 endif()
 if(UA_ENABLE_MULTITHREADING)
-    list(APPEND LIBS urcu-cds urcu urcu-common)
+  list(APPEND LIBS urcu-cds urcu urcu-common)
+endif(UA_ENABLE_MULTITHREADING)
+
+##################
+# Example Server #
+##################
+
+add_executable(server server.c $<TARGET_OBJECTS:open62541-object>)
+target_link_libraries(server ${LIBS})
+
+if(UA_ENABLE_NONSTANDARD_UDP)
+  add_executable(server_udp server_udp.c $<TARGET_OBJECTS:open62541-object> ${PROJECT_SOURCE_DIR}/plugins/networklayer_udp.c)
+  target_link_libraries(server_udp ${LIBS})
 endif()
 
-# add_executable(server_readspeed server_readspeed.c)
-# target_link_libraries(server_readspeed ${LIBS})
+##################
+# Example Client #
+##################
+
+add_executable(client client.c $<TARGET_OBJECTS:open62541-object>)
+target_link_libraries(client ${LIBS})
+
+####################
+# Feature Examples #
+####################
 
-add_executable(server_variable server_variable.c)
+add_executable(server_variable server_variable.c $<TARGET_OBJECTS:open62541-object>)
 target_link_libraries(server_variable ${LIBS})
 
-add_executable(server_mainloop server_mainloop.c)
+add_executable(server_mainloop server_mainloop.c $<TARGET_OBJECTS:open62541-object>)
 target_link_libraries(server_mainloop ${LIBS})
 
-add_executable(server_datasource server_datasource.c)
+add_executable(server_datasource server_datasource.c $<TARGET_OBJECTS:open62541-object>)
 target_link_libraries(server_datasource ${LIBS})
 
-add_executable(server_firstSteps server_firstSteps.c)
+add_executable(server_firstSteps server_firstSteps.c $<TARGET_OBJECTS:open62541-object>)
 target_link_libraries(server_firstSteps ${LIBS})
 
-add_executable(client_firstSteps client_firstSteps.c)
+add_executable(client_firstSteps client_firstSteps.c $<TARGET_OBJECTS:open62541-object>)
 target_link_libraries(client_firstSteps ${LIBS})
 
-if(NOT UA_ENABLE_AMALGAMATION)
-	add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/nodeset.h ${PROJECT_BINARY_DIR}/src_generated/nodeset.c
-		               PRE_BUILD
-		               COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/generate_open62541CCode.py
-                                                    -i ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist_FullNS0.txt
-                                                    ${PROJECT_SOURCE_DIR}/tools/schema/namespace0/Opc.Ua.NodeSet2.xml
-                                                    ${PROJECT_SOURCE_DIR}/examples/server_nodeset.xml
-                                                    ${PROJECT_BINARY_DIR}/src_generated/nodeset
-   		                DEPENDS ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/generate_open62541CCode.py
-		                        ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/logger.py
-		                        ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/open62541_MacroHelper.py
-		                        ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_builtin_types.py
-		                        ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_constants.py
-		                        ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_namespace.py
-		                        ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_node_types.py
-		                        ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist_FullNS0.txt
-		                        ${PROJECT_SOURCE_DIR}/examples/server_nodeset.xml)
-		                      
-	add_executable(server_nodeset server_nodeset.c ${PROJECT_BINARY_DIR}/src_generated/nodeset.c)
-	target_link_libraries(server_nodeset ${LIBS})
+add_executable(server_repeated_job server_repeated_job.c $<TARGET_OBJECTS:open62541-object>)
+target_link_libraries(server_repeated_job ${LIBS})
+
+if(UA_BUILD_EXAMPLES_NODESET_COMPILER)
+  add_executable(server_nodeset server_nodeset.c ${PROJECT_BINARY_DIR}/src_generated/nodeset.c $<TARGET_OBJECTS:open62541-object>)
+  target_link_libraries(server_nodeset ${LIBS})
+  target_include_directories(server_nodeset PRIVATE ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/deps) # needs an internal header
 endif()
 
 if(UA_ENABLE_METHODCALLS)
-  add_executable(server_method server_method.c)
+  add_executable(server_method server_method.c $<TARGET_OBJECTS:open62541-object>)
   target_link_libraries(server_method ${LIBS})
 endif()
+
+add_executable(server_readspeed server_readspeed.c $<TARGET_OBJECTS:open62541-object>)
+target_include_directories(server_readspeed PRIVATE ${PROJECT_SOURCE_DIR}/src ${PROJECT_SOURCE_DIR}/deps) # needs an internal header
+target_link_libraries(server_readspeed ${LIBS})

+ 0 - 1
examples/client.c

@@ -8,7 +8,6 @@
 # include "ua_nodeids.h"
 # include "ua_network_tcp.h"
 # include "ua_config_standard.h"
-# include "ua_types_encoding_binary.h"
 #else
 # include "open62541.h"
 # include <string.h>

+ 13 - 26
examples/server_readspeed.c

@@ -1,40 +1,31 @@
-/*
- * This work is licensed under a Creative Commons CCZero 1.0 Universal License.
- * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
- */
+/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
+ * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
 
-#include <signal.h>
+/* This example is just to see how fast we can process messages. The server does
+   not open a TCP port. */
+
+#include <time.h>
+#include <stdio.h>
 
 #ifdef UA_NO_AMALGAMATION
 # include "ua_types.h"
 # include "ua_types_generated.h"
 # include "ua_server.h"
 # include "ua_config_standard.h"
-# include "networklayer_tcp.h"
 #else
 # include "open62541.h"
+/* include guards to prevent double definitions with open62541.h */
+# define UA_TYPES_H_
+# define UA_SERVER_H_
+# define UA_CONNECTION_H_
+# define UA_TYPES_GENERATED_H_
 #endif
 
-#include <time.h>
-#include <stdio.h>
 #include "server/ua_services.h"
 #include "ua_types_encoding_binary.h"
 
-UA_Boolean running = true;
-UA_Logger logger = Logger_Stdout;
-
-static void stopHandler(int sign) {
-    UA_LOG_INFO(logger, UA_LOGCATEGORY_SERVER, "received ctrl-c");
-    running = false;
-}
-
 int main(int argc, char** argv) {
-    signal(SIGINT, stopHandler); /* catches ctrl-c */
-
     UA_ServerConfig config = UA_ServerConfig_standard;
-    UA_ServerNetworkLayer nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 16664);
-    config.networkLayers = &nl;
-    config.networkLayersSize = 1;
     UA_Server *server = UA_Server_new(config);
 
     /* add a variable node to the address space */
@@ -70,7 +61,7 @@ int main(int argc, char** argv) {
     retval |= UA_ByteString_allocBuffer(&response_msg, 1000);
     size_t offset = 0;
     retval |= UA_encodeBinary(&request, &UA_TYPES[UA_TYPES_READREQUEST], NULL, NULL, &request_msg, &offset);
-    
+
     clock_t begin, end;
     begin = clock();
 
@@ -98,10 +89,6 @@ int main(int argc, char** argv) {
 
     UA_ByteString_deleteMembers(&request_msg);
     UA_ByteString_deleteMembers(&response_msg);
-
-    retval |= UA_Server_run(server, &running);
     UA_Server_delete(server);
-    nl.deleteMembers(&nl);
-
     return (int)retval;
 }

+ 0 - 3
src/server/ua_services.h

@@ -5,9 +5,6 @@
 extern "C" {
 #endif
 
-#include "ua_util.h"
-#include "ua_types.h"
-#include "ua_types_generated.h"
 #include "ua_server.h"
 #include "ua_session.h"
 #include "ua_nodes.h"

+ 2 - 1
src/server/ua_services_subscription.c

@@ -190,7 +190,8 @@ Service_CreateMonitoredItems_single(UA_Server *server, UA_Session *session, UA_S
     LIST_INSERT_HEAD(&sub->MonitoredItems, newMon, listEntry);
 
     /* Create the first sample */
-    UA_MoniteredItem_SampleCallback(server, newMon);
+    if(request->monitoringMode == UA_MONITORINGMODE_REPORTING)
+        UA_MoniteredItem_SampleCallback(server, newMon);
 
     /* Prepare the response */
     UA_String_copy(&request->itemToMonitor.indexRange, &newMon->indexRange);

+ 1 - 1
tests/check_builtin.c

@@ -1322,7 +1322,7 @@ START_TEST(UA_Variant_copyShallWorkOn1DArrayExample) {
     srcArray[2] = UA_STRING_ALLOC("opc ua");
 
     UA_Int32 *dimensions;
-    dimensions = UA_malloc(sizeof(UA_UInt32));
+    dimensions = UA_malloc(sizeof(UA_Int32));
     dimensions[0] = 3;
 
     UA_Variant value, copiedValue;

+ 77 - 61
tools/travis/travis_linux_before_install.sh

@@ -1,71 +1,87 @@
 #!/bin/bash
 set -ev
 
-if [ $ANALYZE = "true" ]; then
-    cd $LOCAL_PKG
-    # travis caches the $LOCAL_PKG dir. If it is loaded, we don't need to reinstall the packages
-    if [ "$CC" = "clang" ]; then
-        clang --version
-    else
-        if [ ! -f $LOCAL_PKG/.cached_analyze ]; then
-            # Install newer cppcheck
-            wget https://github.com/danmar/cppcheck/archive/1.73.tar.gz -O cppcheck-1.73.tar.gz
-            tar xf cppcheck-1.73.tar.gz
-            cd $LOCAL_PKG/cppcheck-1.73
-            make SRCDIR=build CFGDIR="$LOCAL_PKG/cppcheck-1.73/cfg" HAVE_RULES=yes CXXFLAGS="-O2 -DNDEBUG -Wall -Wno-sign-compare -Wno-unused-function" -j8
-            ln -s $LOCAL_PKG/cppcheck-1.73/cppcheck $LOCAL_PKG/cppcheck
-            # create cached flag
-            touch $LOCAL_PKG/.cached_analyze
-        else
-            echo "\n## Using local packages from cache\n"
-        fi
-        g++ --version
-        cppcheck --version
-    fi
-else
-    cd $LOCAL_PKG
+echo "=== Updating the build environment in $LOCAL_PKG ==="
 
-    # travis caches the $LOCAL_PKG dir. If it is loaded, we don't need to reinstall the packages
-    if [ ! -f $LOCAL_PKG/.cached ]; then
+echo "=== Installing python packages ==="
+pip install --user cpp-coveralls
+pip install --user sphinx
+pip install --user sphinx_rtd_theme
 
-        # Install newer valgrind
-        mkdir -p $LOCAL_PKG/package && cd $LOCAL_PKG/package
-        wget http://valgrind.org/downloads/valgrind-3.11.0.tar.bz2
-        tar xf valgrind-3.11.0.tar.bz2
-        cd valgrind-3.11.0
-        ./configure --prefix=$LOCAL_PKG
-        make -s -j8 install
-        echo "\n### Installed valgrind version: $(valgrind --version)"
-        cd $LOCAL_PKG
+# Increase the environment version to force a rebuild of the packages
+# The version is writen to the cache file after every build of the dependencies
+ENV_VERSION="1"
+ENV_INSTALLED=""
+if [ -e $LOCAL_PKG/.build_env ]; then
+    echo "=== No cached build environment ==="
+    read -r ENV_INSTALLED < $LOCAL_PKG/.build_env
+fi
+
+# travis caches the $LOCAL_PKG dir. If it is loaded, we don't need to reinstall the packages
+if [ "$ENV_VERSION" = "$ENV_INSTALLED" ]; then
+    echo "=== The build environment is current ==="
+    # Print version numbers
+    clang --version
+    g++ --version
+    cppcheck --version
+    valgrind --version
+    exit 0
+fi
 
-        # Install specific check version which is not yet in the apt package
-        wget http://ftp.de.debian.org/debian/pool/main/c/check/check_0.10.0-3_amd64.deb
-        dpkg -x check_0.10.0-3_amd64.deb $LOCAL_PKG/package
-        # change pkg-config file path
-        sed -i "s|prefix=/usr|prefix=${LOCAL_PKG}|g" $LOCAL_PKG/package/usr/lib/x86_64-linux-gnu/pkgconfig/check.pc
-        sed -i 's|libdir=.*|libdir=${prefix}/lib|g' $LOCAL_PKG/package/usr/lib/x86_64-linux-gnu/pkgconfig/check.pc
-        # move files to globally included dirs
-        cp -R $LOCAL_PKG/package/usr/lib/x86_64-linux-gnu/* $LOCAL_PKG/lib/
-        cp -R $LOCAL_PKG/package/usr/include/* $LOCAL_PKG/include/
-        cp -R $LOCAL_PKG/package/usr/bin/* $LOCAL_PKG/
+echo "=== The build environment is outdated ==="
 
-        # Install specific liburcu version which is not yet in the apt package
-        wget https://launchpad.net/ubuntu/+source/liburcu/0.8.5-1ubuntu1/+build/6513813/+files/liburcu2_0.8.5-1ubuntu1_amd64.deb
-        wget https://launchpad.net/ubuntu/+source/liburcu/0.8.5-1ubuntu1/+build/6513813/+files/liburcu-dev_0.8.5-1ubuntu1_amd64.deb
-        dpkg -x liburcu2_0.8.5-1ubuntu1_amd64.deb $LOCAL_PKG/package
-        dpkg -x liburcu-dev_0.8.5-1ubuntu1_amd64.deb $LOCAL_PKG/package
-        # move files to globally included dirs
-        cp -R $LOCAL_PKG/package/usr/lib/x86_64-linux-gnu/* $LOCAL_PKG/lib/
-        cp -R $LOCAL_PKG/package/usr/include/* $LOCAL_PKG/include/
+# Clean up
+rm -rf $LOCAL_PKG/*
 
-        # create cached flag
-        touch $LOCAL_PKG/.cached
+# Install newer valgrind
+echo "=== Installing valgrind ==="
+wget http://valgrind.org/downloads/valgrind-3.11.0.tar.bz2
+tar xf valgrind-3.11.0.tar.bz2
+cd valgrind-3.11.0
+./configure --prefix=$LOCAL_PKG
+make -s -j8 install
+cd ..
 
-    else
-        echo "\n## Using local packages from cache\n"
-    fi
+# Install specific check version which is not yet in the apt package
+echo "=== Installing check ==="
+mkdir tmp_check
+wget http://ftp.de.debian.org/debian/pool/main/c/check/check_0.10.0-3_amd64.deb
+dpkg -x check_0.10.0-3_amd64.deb ./tmp_check
+# change pkg-config file path
+sed -i "s|prefix=/usr|prefix=${LOCAL_PKG}|g" ./tmp_check/usr/lib/x86_64-linux-gnu/pkgconfig/check.pc
+sed -i 's|libdir=.*|libdir=${prefix}/lib|g' ./tmp_check/usr/lib/x86_64-linux-gnu/pkgconfig/check.pc
+# move files to globally included dirs
+cp -R ./tmp_check/usr/lib/x86_64-linux-gnu/* $LOCAL_PKG/lib/
+cp -R ./tmp_check/usr/include/* $LOCAL_PKG/include/
+cp -R ./tmp_check/usr/bin/* $LOCAL_PKG/
 
-    pip install --user cpp-coveralls
-    pip install --user sphinx
-    pip install --user sphinx_rtd_theme
-fi
+# Install specific liburcu version which is not yet in the apt package
+echo "=== Installing liburcu ==="
+mkdir tmp_liburcu
+wget https://launchpad.net/ubuntu/+source/liburcu/0.8.5-1ubuntu1/+build/6513813/+files/liburcu2_0.8.5-1ubuntu1_amd64.deb
+wget https://launchpad.net/ubuntu/+source/liburcu/0.8.5-1ubuntu1/+build/6513813/+files/liburcu-dev_0.8.5-1ubuntu1_amd64.deb
+dpkg -x liburcu2_0.8.5-1ubuntu1_amd64.deb ./tmp_liburcu
+dpkg -x liburcu-dev_0.8.5-1ubuntu1_amd64.deb ./tmp_liburcu
+# move files to globally included dirs
+cp -R ./tmp_liburcu/usr/lib/x86_64-linux-gnu/* $LOCAL_PKG/lib/
+cp -R ./tmp_liburcu/usr/include/* $LOCAL_PKG/include/
+
+# Install newer cppcheck
+echo "=== Installing cppcheck ==="
+wget https://github.com/danmar/cppcheck/archive/1.73.tar.gz -O cppcheck-1.73.tar.gz
+tar xf cppcheck-1.73.tar.gz
+cd cppcheck-1.73
+make PREFIX="$LOCAL_PKG" SRCDIR=build CFGDIR="$LOCAL_PKG/cppcheck-cfg" HAVE_RULES=yes CXXFLAGS="-O2 -DNDEBUG -Wall -Wno-sign-compare -Wno-unused-function" -j8
+make PREFIX="$LOCAL_PKG" SRCDIR=build CFGDIR="$LOCAL_PKG/cppcheck-cfg" HAVE_RULES=yes install
+cd ..
+
+# create cached flag
+echo "=== Store cache flag ==="
+echo $ENV_VERSION > $LOCAL_PKG/.build_env
+
+# Print version numbers
+echo "=== Installed versions are ==="
+clang --version
+g++ --version
+cppcheck --version
+valgrind --version

+ 16 - 16
tools/travis/travis_linux_script.sh

@@ -2,11 +2,11 @@
 set -ev
 
 if [ $ANALYZE = "true" ]; then
-    echo "\n=== Running static code analysis ==="
+    echo "=== Running static code analysis ==="
     if [ "$CC" = "clang" ]; then
         mkdir -p build
         cd build
-        scan-build cmake -G "Unix Makefiles" ..
+        scan-build cmake -G "Unix Makefiles" -DUA_BUILD_EXAMPLES=ON -DUA_BUILD_UNIT_TESTS=ON ..
         scan-build -enable-checker security.FloatLoopCounter \
           -enable-checker security.insecureAPI.UncheckedReturn \
           --status-bugs -v \
@@ -28,18 +28,18 @@ if [ $ANALYZE = "true" ]; then
             --suppress=invalidscanf --inline-suppr \
             -I include src plugins 2> cppcheck.txt
         if [ -s cppcheck.txt ]; then
-            echo "\n\n====== CPPCHECK Static Analysis Errors ======"
+            echo "====== CPPCHECK Static Analysis Errors ======"
             cat cppcheck.txt
             exit 1
         fi
     fi
 else
-    echo "\n=== Building ==="
+    echo "=== Building ==="
 
     echo "Documentation and certificate build"
     mkdir -p build
     cd build
-    cmake -DCMAKE_BUILD_TYPE=Release -DUA_BUILD_EXAMPLESERVER=ON -DUA_BUILD_EXAMPLECLIENT=ON -DUA_BUILD_EXAMPLES=ON -DUA_BUILD_DOCUMENTATION=ON -DUA_BUILD_SELFSIGNED_CERTIFICATE=ON ..
+    cmake -DCMAKE_BUILD_TYPE=Release -DUA_BUILD_EXAMPLES=ON -DUA_BUILD_DOCUMENTATION=ON -DUA_BUILD_SELFSIGNED_CERTIFICATE=ON ..
     make doc
     make selfsigned
     cp -r doc ../../
@@ -50,34 +50,34 @@ else
     if [ "$CC" = "gcc" ]; then
         echo "Cross compile release build for MinGW 32 bit"
         mkdir -p build && cd build
-        cmake -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-mingw32.cmake -DUA_ENABLE_AMALGAMATION=ON -DCMAKE_BUILD_TYPE=Release -DUA_BUILD_EXAMPLESERVER=ON -DUA_BUILD_EXAMPLECLIENT=ON -DUA_BUILD_EXAMPLES=ON ..
+        cmake -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-mingw32.cmake -DUA_ENABLE_AMALGAMATION=ON -DCMAKE_BUILD_TYPE=Release -DUA_BUILD_EXAMPLES=ON ..
         make -j8
-        zip -r open62541-win32.zip ../../doc ../../server_cert.der ../LICENSE ../AUTHORS ../README.md server_static.exe server.exe client.exe client_static.exe libopen62541.dll libopen62541.dll.a open62541.h open62541.c
+        zip -r open62541-win32.zip ../../doc ../../server_cert.der ../LICENSE ../AUTHORS ../README.md examples/server.exe examples/client.exe libopen62541.dll.a open62541.h open62541.c
         cp open62541-win32.zip ..
         cd .. && rm build -rf
 
         echo "Cross compile release build for MinGW 64 bit"
         mkdir -p build && cd build
-        cmake -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-mingw64.cmake -DUA_ENABLE_AMALGAMATION=ON -DCMAKE_BUILD_TYPE=Release -DUA_BUILD_EXAMPLESERVER=ON -DUA_BUILD_EXAMPLECLIENT=ON -DUA_BUILD_EXAMPLES=ON ..
+        cmake -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-mingw64.cmake -DUA_ENABLE_AMALGAMATION=ON -DCMAKE_BUILD_TYPE=Release -DUA_BUILD_EXAMPLES=ON ..
         make -j8
-        zip -r open62541-win64.zip ../../doc ../../server_cert.der ../LICENSE ../AUTHORS ../README.md server_static.exe server.exe client.exe client_static.exe libopen62541.dll libopen62541.dll.a open62541.h open62541.c
+        zip -r open62541-win64.zip ../../doc ../../server_cert.der ../LICENSE ../AUTHORS ../README.md examples/server.exe examples/client.exe libopen62541.dll.a open62541.h open62541.c
         cp open62541-win64.zip ..
         cd .. && rm build -rf
 
         echo "Cross compile release build for 32-bit linux"
         mkdir -p build && cd build
-        cmake -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-gcc-m32.cmake -DUA_ENABLE_AMALGAMATION=ON -DCMAKE_BUILD_TYPE=Release -DUA_BUILD_EXAMPLESERVER=ON -DUA_BUILD_EXAMPLECLIENT=ON ..
+        cmake -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/Toolchain-gcc-m32.cmake -DUA_ENABLE_AMALGAMATION=ON -DCMAKE_BUILD_TYPE=Release -DUA_BUILD_EXAMPLES=ON ..
         make -j8
-        tar -pczf open62541-linux32.tar.gz ../../doc ../../server_cert.der ../LICENSE ../AUTHORS ../README.md server_static server client_static client libopen62541.so open62541.h open62541.c
+        tar -pczf open62541-linux32.tar.gz ../../doc ../../server_cert.der ../LICENSE ../AUTHORS ../README.md examples/server examples/client libopen62541.a open62541.h open62541.c
         cp open62541-linux32.tar.gz ..
         cd .. && rm build -rf
     fi
 
     echo "Compile release build for 64-bit linux"
     mkdir -p build && cd build
-    cmake -DCMAKE_BUILD_TYPE=Release -DUA_ENABLE_AMALGAMATION=ON -DUA_BUILD_EXAMPLESERVER=ON -DUA_BUILD_EXAMPLECLIENT=ON ..
+    cmake -DCMAKE_BUILD_TYPE=Release -DUA_ENABLE_AMALGAMATION=ON -DUA_BUILD_EXAMPLES=ON ..
     make -j8
-    tar -pczf open62541-linux64.tar.gz ../../doc ../../server_cert.der ../LICENSE ../AUTHORS ../README.md server_static server client_static client libopen62541.so open62541.h open62541.c
+    tar -pczf open62541-linux64.tar.gz ../../doc ../../server_cert.der ../LICENSE ../AUTHORS ../README.md examples/server examples/client libopen62541.a open62541.h open62541.c
     cp open62541-linux64.tar.gz ..
     cp open62541.h .. # copy single file-release
     cp open62541.c .. # copy single file-release
@@ -97,17 +97,17 @@ else
 
     echo "Compile multithreaded version"
     mkdir -p build && cd build
-    cmake -DUA_ENABLE_MULTITHREADING=ON -DUA_BUILD_EXAMPLESERVER=ON ..
+    cmake -DUA_ENABLE_MULTITHREADING=ON -DUA_BUILD_EXAMPLESERVER=ON -DUA_BUILD_EXAMPLES=ON ..
     make -j8
     cd .. && rm build -rf
 
     #this run inclides full examples and methodcalls
     echo "Debug build and unit tests (64 bit)"
     mkdir -p build && cd build
-    cmake -DCMAKE_BUILD_TYPE=Debug -DUA_BUILD_EXAMPLES=ON -DUA_ENABLE_METHODCALLS=ON -DUA_BUILD_UNIT_TESTS=ON -DUA_BUILD_EXAMPLESERVER=ON -DUA_ENABLE_COVERAGE=ON ..
+    cmake -DCMAKE_BUILD_TYPE=Debug -DUA_BUILD_EXAMPLES=ON -DUA_BUILD_UNIT_TESTS=ON -DUA_ENABLE_COVERAGE=ON ..
     make -j8 && make test ARGS="-V"
     echo "Run valgrind to see if the server leaks memory (just starting up and closing..)"
-    (valgrind --leak-check=yes --error-exitcode=3 ./server & export pid=$!; sleep 2; kill -INT $pid; wait $pid);
+    (valgrind --leak-check=yes --error-exitcode=3 ./examples/server & export pid=$!; sleep 2; kill -INT $pid; wait $pid);
     # only run coveralls on main repo, otherwise it fails uploading the files
     echo "-> Current repo: ${TRAVIS_REPO_SLUG}"
     if ([ "$CC" = "gcc-4.8" ] || [ "$CC" = "gcc" ]) && [ "${TRAVIS_REPO_SLUG}" = "open62541/open62541" ]; then

+ 12 - 0
tools/travis/travis_notifications.sh

@@ -0,0 +1,12 @@
+#!/bin/bash
+set -ev
+
+IRC_NOTIFY_SUCCESS="never"
+IRC_NOTIFY_FAILURE="never"
+
+if [ ${TRAVIS_OS_NAME} == "linux" ] && [ ${CC} == "gcc" ]; then
+    if [ ${TRAVIS_BRANCH} == "0.2" ] || [ ${TRAVIS_BRANCH} == "master" ]; then
+        IRC_NOTIFY_SUCCESS="always"
+        IRC_NOTIFY_FAILURE="always"
+    fi
+fi

+ 8 - 10
tools/travis/travis_osx_before_install.sh

@@ -2,16 +2,14 @@
 set -ev
 
 if [ $ANALYZE = "true" ]; then
-	echo "Skipping static analysis for OS X"
-	exit 0
+    echo "Skipping static analysis for OS X"
+    exit 0
 else
-	brew install check
-	brew install libxml2
-	brew install userspace-rcu
-	brew install valgrind
-
-	pip install --user sphinx
-	pip install --user breathe
-	pip install --user sphinx_rtd_theme
+    brew install check
+    brew install userspace-rcu
+    brew install valgrind
 
+    pip install --user sphinx
+    pip install --user breathe
+    pip install --user sphinx_rtd_theme
 fi

+ 5 - 5
tools/travis/travis_osx_script.sh

@@ -9,16 +9,16 @@ else
 
     echo "Create certificate for OS X build"
     mkdir -p build && cd build
-    cmake -DCMAKE_BUILD_TYPE=Release -DUA_BUILD_EXAMPLESERVER=OFF -DUA_BUILD_EXAMPLECLIENT=OFF -DUA_BUILD_EXAMPLES=OFF -DUA_BUILD_DOCUMENTATION=OFF -DUA_BUILD_SELFSIGNED_CERTIFICATE=ON ..
+    cmake -DCMAKE_BUILD_TYPE=Release -DUA_BUILD_SELFSIGNED_CERTIFICATE=ON ..
     make selfsigned
     cp server_cert.der ../
     cd .. && rm -rf build
 
     echo "Compile release build for OS X"
     mkdir -p build && cd build
-    cmake -DCMAKE_BUILD_TYPE=Release -DUA_ENABLE_AMALGAMATION=ON -DUA_BUILD_EXAMPLESERVER=ON -DUA_BUILD_EXAMPLECLIENT=ON -DUA_BUILD_DOCUMENTATION=ON -DUA_GENERATE_SELFSIGNED=ON ..
+    cmake -DCMAKE_BUILD_TYPE=Release -DUA_ENABLE_AMALGAMATION=ON -DUA_BUILD_EXAMPLES=ON -DUA_BUILD_DOCUMENTATION=ON -DUA_GENERATE_SELFSIGNED=ON ..
     make -j8
-    tar -pczf open62541-osx.tar.gz ../doc ../server_cert.der ../LICENSE ../AUTHORS ../README.md server_static server client_static client libopen62541.dylib open62541.h open62541.c
+    tar -pczf open62541-osx.tar.gz ../doc ../server_cert.der ../LICENSE ../AUTHORS ../README.md examples/server examples/client libopen62541.a open62541.h open62541.c
     cp open62541-osx.tar.gz ..
     cp open62541.h .. #copy single file-release
     cp open62541.c .. #copy single file-release
@@ -26,13 +26,13 @@ else
 
     echo "Compile multithreaded version"
     mkdir -p build && cd build
-    cmake -DUA_ENABLE_MULTITHREADING=ON -DUA_BUILD_EXAMPLESERVER=ON ..
+    cmake -DUA_ENABLE_MULTITHREADING=ON -DUA_BUILD_EXAMPLES=ON ..
     make -j8
     cd .. && rm -rf build
 
     echo "Debug build and unit tests (64 bit)"
     mkdir -p build && cd build
-    cmake -DCMAKE_BUILD_TYPE=Debug -DUA_BUILD_DEMO_NODESET=ON -DUA_BUILD_UNIT_TESTS=ON -DUA_BUILD_EXAMPLESERVER=ON -DUA_ENABLE_COVERAGE=ON ..
+    cmake -DCMAKE_BUILD_TYPE=Debug -DUA_BUILD_DEMO_NODESET=ON -DUA_BUILD_UNIT_TESTS=ON -DUA_BUILD_EXAMPLES=ON -DUA_ENABLE_COVERAGE=ON ..
     make -j8 && make test
     echo "Run valgrind to see if the server leaks memory (just starting up and closing..)"
     (valgrind --error-exitcode=3 ./server & export pid=$!; sleep 2; kill -INT $pid; wait $pid);