Преглед изворни кода

Add `ua_generate_nodeset_and_datatypes` macro to simplify nodeset generation

Stefan Profanter пре 5 година
родитељ
комит
a17733c46c

+ 23 - 0
doc/nodeset_compiler.rst

@@ -286,6 +286,29 @@ If you look into the files generated by the nodeset compiler, you will see that
 
 This is how you can use the nodeset compiler to compile simple NodeSet XMLs to be used by the open62541 stack.
 
+For your convenience and for simpler use we also provide a CMake function which simplifies the use of the ``ua_generate_datatypes`` and ``ua_generate_nodeset`` function even more.
+It is highly recommended to use this function: ``ua_generate_nodeset_and_datatypes``. It uses some best practice settings and you only need to pass a name, the namespace index ``NAMESPACE_IDX`` (as described above) and the nodeset files.
+Passing the .csv and .bsd files is optional and if not given, generating datatypes for that noteset will be skipped. You can also define dependencies between nodesets using the ``DEPENDS`` argument.
+
+Here are some examples for the ``DI`` and ``PLCOpen`` nodesets::
+
+    # Generate types and namespace for DI
+    ua_generate_nodeset_and_datatypes(
+        NAME "di"
+        FILE_CSV "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/OpcUaDiModel.csv"
+        FILE_BSD "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.Types.bsd"
+        NAMESPACE_IDX 2
+        FILE_NS "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.NodeSet2.xml"
+    )
+
+    # generate PLCopen namespace which is using DI
+    ua_generate_nodeset_and_datatypes(
+        NAME "plc"
+        # PLCopen does not define custom types. Only generate the nodeset
+        FILE_NS "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/PLCopen/Opc.Ua.Plc.NodeSet2.xml"
+        # PLCopen depends on the di nodeset, which must be generated before
+        DEPENDS "di"
+    )
 
 Creating object instances
 .........................

+ 13 - 28
examples/nodeset/CMakeLists.txt

@@ -7,11 +7,9 @@
 ###################
 
 # generate namespace from XML file
-ua_generate_nodeset(
+ua_generate_nodeset_and_datatypes(
     NAME "example"
-    FILE "${PROJECT_SOURCE_DIR}/examples/nodeset/server_nodeset.xml"
-    DEPENDS_TYPES "UA_TYPES"
-    DEPENDS_NS    "${UA_FILE_NS0}"
+    FILE_NS "${PROJECT_SOURCE_DIR}/examples/nodeset/server_nodeset.xml"
 )
 
 # The .csv file can be created from within UaModeler or manually
@@ -35,37 +33,24 @@ endif()
 # PLCopen requires the full ns0 as basis
 if(UA_NAMESPACE_ZERO STREQUAL "FULL")
 
-    # Generate types for DI namespace
-    ua_generate_datatypes(
-        NAME "ua_types_di"
-        TARGET_SUFFIX "types-di"
-        NAMESPACE_IDX 2
-        FILE_CSV "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/OpcUaDiModel.csv"
-        FILES_BSD "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.Types.bsd"
-    )
-
-    # generate DI namespace
-    ua_generate_nodeset(
+    # Generate types and namespace for DI
+    ua_generate_nodeset_and_datatypes(
         NAME "di"
-        FILE "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.NodeSet2.xml"
-        TYPES_ARRAY "UA_TYPES_DI"
+        FILE_CSV "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/OpcUaDiModel.csv"
+        FILE_BSD "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.Types.bsd"
+        NAMESPACE_IDX 2
+        FILE_NS "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.NodeSet2.xml"
         INTERNAL
-        DEPENDS_TYPES "UA_TYPES"
-        DEPENDS_NS    "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml"
-        DEPENDS_TARGET "open62541-generator-types-di"
     )
 
     # generate PLCopen namespace which is using DI
-    ua_generate_nodeset(
+    ua_generate_nodeset_and_datatypes(
         NAME "plc"
-        FILE "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/PLCopen/Opc.Ua.Plc.NodeSet2.xml"
+        # PLCopen does not define custom types. Only generate the nodeset
+        FILE_NS "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/PLCopen/Opc.Ua.Plc.NodeSet2.xml"
+        # PLCopen depends on the di nodeset, which must be generated before
+        DEPENDS "di"
         INTERNAL
-        DEPENDS_TYPES
-            "UA_TYPES" "UA_TYPES_DI"
-        DEPENDS_NS
-            "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml"
-            "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.NodeSet2.xml"
-        DEPENDS_TARGET "open62541-generator-ns-di"
     )
 
     add_example(server_nodeset_plcopen server_nodeset_plcopen.c

+ 8 - 5
tests/nodeset-compiler/CMakeLists.txt

@@ -33,6 +33,7 @@ if(UA_NAMESPACE_ZERO STREQUAL "FULL")
         FILE "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.NodeSet2.xml"
         TYPES_ARRAY "UA_TYPES_DI"
         INTERNAL
+        OUTPUT_DIR "${PROJECT_BINARY_DIR}/src_generated/tests"
         DEPENDS_TYPES "UA_TYPES"
         DEPENDS_NS    "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml"
         DEPENDS_TARGET "open62541-generator-tests-types-di"
@@ -44,6 +45,7 @@ if(UA_NAMESPACE_ZERO STREQUAL "FULL")
         FILE "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/ADI/Opc.Ua.Adi.NodeSet2.xml"
         TYPES_ARRAY "UA_TYPES_ADI"
         INTERNAL
+        OUTPUT_DIR "${PROJECT_BINARY_DIR}/src_generated/tests"
         DEPENDS_TYPES
         "UA_TYPES" "UA_TYPES_DI"
         DEPENDS_NS
@@ -58,19 +60,20 @@ if(UA_NAMESPACE_ZERO STREQUAL "FULL")
         NAME "tests-plc"
         FILE "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/PLCopen/Opc.Ua.Plc.NodeSet2.xml"
         INTERNAL
+        OUTPUT_DIR "${PROJECT_BINARY_DIR}/src_generated/tests"
         DEPENDS_TYPES
         "UA_TYPES" "UA_TYPES_DI"
         DEPENDS_NS
         "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml"
         "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/DI/Opc.Ua.Di.NodeSet2.xml"
-        DEPENDS_TARGET "open62541-generator-ns-di"
+        DEPENDS_TARGET "open62541-generator-ns-tests-di"
     )
 
     add_executable(check_nodeset_compiler_adi check_nodeset_compiler_adi.c
                    ${PROJECT_BINARY_DIR}/src_generated/tests/ua_types_di_generated.c
-                   ${PROJECT_BINARY_DIR}/src_generated/tests/ua_namespace_di.c
+                   ${PROJECT_BINARY_DIR}/src_generated/tests/ua_namespace_tests_di.c
                    ${PROJECT_BINARY_DIR}/src_generated/tests/ua_types_adi_generated.c
-                   ${PROJECT_BINARY_DIR}/src_generated/tests/ua_namespace_adi.c
+                   ${PROJECT_BINARY_DIR}/src_generated/tests/ua_namespace_tests_adi.c
                    $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
     add_dependencies(check_nodeset_compiler_adi open62541-generator-ns-tests-adi)
     target_link_libraries(check_nodeset_compiler_adi ${LIBS})
@@ -78,8 +81,8 @@ if(UA_NAMESPACE_ZERO STREQUAL "FULL")
 
     add_executable(check_nodeset_compiler_plc check_nodeset_compiler_plc.c
                    ${PROJECT_BINARY_DIR}/src_generated/tests/ua_types_di_generated.c
-                   ${PROJECT_BINARY_DIR}/src_generated/tests/ua_namespace_di.c
-                   ${PROJECT_BINARY_DIR}/src_generated/tests/ua_namespace_plc.c
+                   ${PROJECT_BINARY_DIR}/src_generated/tests/ua_namespace_tests_di.c
+                   ${PROJECT_BINARY_DIR}/src_generated/tests/ua_namespace_tests_plc.c
                    $<TARGET_OBJECTS:open62541-object> $<TARGET_OBJECTS:open62541-testplugins>)
     add_dependencies(check_nodeset_compiler_plc open62541-generator-ns-tests-plc)
     target_link_libraries(check_nodeset_compiler_plc ${LIBS})

+ 4 - 4
tests/nodeset-compiler/check_nodeset_compiler_adi.c

@@ -5,8 +5,8 @@
 #include "ua_server.h"
 #include "ua_config_default.h"
 
-#include "tests/ua_namespace_di.h"
-#include "tests/ua_namespace_adi.h"
+#include "tests/ua_namespace_tests_di.h"
+#include "tests/ua_namespace_tests_adi.h"
 
 #include "check.h"
 #include "testing_clock.h"
@@ -28,13 +28,13 @@ static void teardown(void) {
 
 
 START_TEST(Server_addDiNodeset) {
-    UA_StatusCode retval = ua_namespace_di(server);
+    UA_StatusCode retval = ua_namespace_tests_di(server);
     ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
 }
 END_TEST
 
 START_TEST(Server_addAdiNodeset) {
-    UA_StatusCode retval = ua_namespace_adi(server);
+    UA_StatusCode retval = ua_namespace_tests_adi(server);
     ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
 }
 END_TEST

+ 4 - 4
tests/nodeset-compiler/check_nodeset_compiler_plc.c

@@ -7,8 +7,8 @@
 
 #include "ua_types.h"
 
-#include "tests/ua_namespace_di.h"
-#include "tests/ua_namespace_plc.h"
+#include "tests/ua_namespace_tests_di.h"
+#include "tests/ua_namespace_tests_plc.h"
 
 #include "check.h"
 #include "testing_clock.h"
@@ -32,13 +32,13 @@ static void teardown(void) {
 
 
 START_TEST(Server_addDiNodeset) {
-    UA_StatusCode retval = ua_namespace_di(server);
+    UA_StatusCode retval = ua_namespace_tests_di(server);
     ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
 }
 END_TEST
 
 START_TEST(Server_addPlcNodeset) {
-    UA_StatusCode retval = ua_namespace_plc(server);
+    UA_StatusCode retval = ua_namespace_tests_plc(server);
     ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
 }
 END_TEST

+ 152 - 8
tools/cmake/macros.cmake

@@ -98,8 +98,7 @@ function(ua_generate_datatypes)
     set(options BUILTIN)
     set(oneValueArgs NAME TARGET_SUFFIX NAMESPACE_IDX OUTPUT_DIR FILE_CSV)
     set(multiValueArgs FILES_BSD FILES_SELECTED)
-    cmake_parse_arguments(PARSE_ARGV 0 UA_GEN_DT "${options}" "${oneValueArgs}"
-                          "${multiValueArgs}")
+    cmake_parse_arguments(UA_GEN_DT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
 
 
     # ------ Argument checking -----
@@ -165,6 +164,11 @@ function(ua_generate_datatypes)
                       ${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated_encoding_binary.h
                       )
 
+    string(TOUPPER "${UA_GEN_DT_NAME}" GEN_NAME_UPPER)
+    set(${GEN_NAME_UPPER}_SOURCES "${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated.c" CACHE INTERNAL "${UA_GEN_DT_NAME} source files")
+    set(${GEN_NAME_UPPER}_HEADERS "${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated.h;${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated_handling.h;${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated_encoding_binary.h"
+        CACHE INTERNAL "${UA_GEN_DT_NAME} header files")
+
     if(UA_COMPILE_AS_CXX)
         set_source_files_properties(${UA_GEN_DT_OUTPUT_DIR}/${UA_GEN_DT_NAME}_generated.c PROPERTIES LANGUAGE CXX)
     endif()
@@ -190,7 +194,7 @@ endfunction()
 #
 #   Arguments taking one value:
 #
-#   NAME            Full name of the generated files, e.g. ua_types_di
+#   NAME            Name of the nodeset, e.g. 'di'
 #   [TYPES_ARRAY]   Optional name of the types array containing the custom datatypes of this node set.
 #   [OUTPUT_DIR]    Optional target directory for the generated files. Default is '${PROJECT_BINARY_DIR}/src_generated'
 #   [ENCODE_BINARY_SIZE]    Optional array size for binary encoding extension objects.
@@ -209,8 +213,7 @@ function(ua_generate_nodeset)
     set(options INTERNAL )
     set(oneValueArgs NAME TYPES_ARRAY OUTPUT_DIR ENCODE_BINARY_SIZE IGNORE)
     set(multiValueArgs FILE DEPENDS_TYPES DEPENDS_NS DEPENDS_TARGET)
-    cmake_parse_arguments(PARSE_ARGV 0 UA_GEN_NS "${options}" "${oneValueArgs}"
-                          "${multiValueArgs}")
+    cmake_parse_arguments(UA_GEN_NS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
 
 
 
@@ -245,6 +248,7 @@ function(ua_generate_nodeset)
     set(GEN_NS0 "")
     set(TARGET_SUFFIX "ns-${UA_GEN_NS_NAME}")
     set(FILE_SUFFIX "_${UA_GEN_NS_NAME}")
+    string(REPLACE "-" "_" FILE_SUFFIX ${FILE_SUFFIX})
 
     if ("${UA_GEN_NS_NAME}" STREQUAL "ns0")
         set(GEN_NS0 "--generate-ns0")
@@ -291,7 +295,7 @@ function(ua_generate_nodeset)
                        ${TYPES_ARRAY_LIST}
                        ${DEPENDS_FILE_LIST}
                        ${FILE_LIST}
-                       ${PROJECT_BINARY_DIR}/src_generated/ua_namespace${FILE_SUFFIX}
+                       ${UA_GEN_NS_OUTPUT_DIR}/ua_namespace${FILE_SUFFIX}
                        DEPENDS
                        ${PROJECT_SOURCE_DIR}/tools/nodeset_compiler/nodeset_compiler.py
                        ${PROJECT_SOURCE_DIR}/tools/nodeset_compiler/nodes.py
@@ -306,8 +310,8 @@ function(ua_generate_nodeset)
 
     add_custom_target(open62541-generator-${TARGET_SUFFIX}
                       DEPENDS
-                      ${PROJECT_BINARY_DIR}/src_generated/ua_namespace${FILE_SUFFIX}.c
-                      ${PROJECT_BINARY_DIR}/src_generated/ua_namespace${FILE_SUFFIX}.h)
+                      ${UA_GEN_NS_OUTPUT_DIR}/ua_namespace${FILE_SUFFIX}.c
+                      ${UA_GEN_NS_OUTPUT_DIR}/ua_namespace${FILE_SUFFIX}.h)
     if (UA_GEN_NS_DEPENDS_TARGET)
         add_dependencies(open62541-generator-${TARGET_SUFFIX} ${UA_GEN_NS_DEPENDS_TARGET})
     endif()
@@ -315,4 +319,144 @@ function(ua_generate_nodeset)
     if(UA_COMPILE_AS_CXX)
         set_source_files_properties(${UA_GEN_NS_OUTPUT_DIR}/ua_namespace${FILE_SUFFIX}.c PROPERTIES LANGUAGE CXX)
     endif()
+
+    set_property(GLOBAL PROPERTY "UA_GEN_NS_DEPENDS_FILE_${UA_GEN_NS_NAME}" ${UA_GEN_NS_DEPENDS_NS} ${UA_GEN_NS_FILE})
+    set_property(GLOBAL PROPERTY "UA_GEN_NS_DEPENDS_TYPES_${UA_GEN_NS_NAME}" ${UA_GEN_NS_DEPENDS_TYPES} ${UA_GEN_NS_TYPES_ARRAY})
+
+    string(TOUPPER "${UA_GEN_NS_NAME}" GEN_NAME_UPPER)
+    set(UA_NODESET_${GEN_NAME_UPPER}_SOURCES "${UA_GEN_NS_OUTPUT_DIR}/ua_namespace${FILE_SUFFIX}.c" CACHE INTERNAL "UA_NODESET_${GEN_NAME_UPPER} source files")
+    set(UA_NODESET_${GEN_NAME_UPPER}_HEADERS "${UA_GEN_NS_OUTPUT_DIR}/ua_namespace${FILE_SUFFIX}.h" CACHE INTERNAL "UA_NODESET_${GEN_NAME_UPPER} header files")
+    set(UA_NODESET_${GEN_NAME_UPPER}_TARGET "open62541-generator-${TARGET_SUFFIX}" CACHE INTERNAL "UA_NODESET_${GEN_NAME_UPPER} target")
+
+endfunction()
+
+
+# --------------- Generate Nodeset and Datatypes ---------------------
+#
+# Generates C code for the given NodeSet2.xml and Datatype file.
+# This C code can be used to initialize the server.
+#
+# This is a combination of the ua_generate_datatypes and ua_generate_nodeset macros.
+# This function can also be used to just create a nodeset without datatypes by
+# omitting the CSV, BSD, and NAMESPACE_IDX parameter.
+# If only one of the previous parameters is given, all of them are required.
+#
+# It is possible to define dependencies of nodesets by using the DEPENDS argument.
+# E.g. the PLCOpen nodeset depends on the 'di' nodeset. Thus it is enough to just
+# pass 'DEPENDS di' to the function. The 'di' nodeset then first needs to be generated
+# with this function or with the ua_generate_nodeset function.
+#
+# The resulting cmake target will be named like this:
+#   open62541-generator-ns-${NAME}
+#
+# The following arguments are accepted:
+#
+#   Options:
+#
+#   INTERNAL        Include internal headers. Required if custom datatypes are added.
+#
+#   Arguments taking one value:
+#
+#   NAME            Short name of the nodeset. E.g. 'di'
+#   FILE_NS         Path to the NodeSet2.xml file. Multiple values can be passed. These nodesets will be combined into one output.
+#
+#   [FILE_CSV]      Optional path to the .csv file containing the node ids, e.g. 'OpcUaDiModel.csv'
+#   [FILE_BSD]      Optional path to the .bsd file containing the type definitions, e.g. 'Opc.Ua.Di.Types.bsd'. Multiple files can be
+#                   passed which will all combined to one resulting code.
+#   [NAMESPACE_IDX] Optional namespace index of the nodeset, when it is loaded into the server. This parameter is mandatory if FILE_CSV
+#                   or FILE_BSD is set. See ua_generate_datatypes function.
+#
+#   Arguments taking multiple values:
+#   [DEPENDS]       Optional list of nodeset names on which this nodeset depends. These names must match any name from a previous
+#                   call to this funtion. E.g. 'di' if you are generating the 'plcopen' nodeset
+#
+#
+function(ua_generate_nodeset_and_datatypes)
+
+    set(options INTERNAL)
+    set(oneValueArgs NAME FILE_NS FILE_CSV FILE_BSD NAMESPACE_IDX)
+    set(multiValueArgs DEPENDS)
+    cmake_parse_arguments(UA_GEN "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
+
+
+    # ------ Argument checking -----
+    if(NOT UA_GEN_NAME OR "${UA_GEN_NAME}" STREQUAL "")
+        message(FATAL_ERROR "ua_generate_nodeset_and_datatypes function requires a value for the NAME argument")
+    endif()
+
+    if(NOT UA_GEN_FILE_NS OR "${UA_GEN_FILE_NS}" STREQUAL "")
+        message(FATAL_ERROR "ua_generate_nodeset_and_datatypes function requires a value for the FILE_NS argument")
+    endif()
+
+    if((NOT UA_GEN_FILE_CSV OR "${UA_GEN_FILE_CSV}" STREQUAL "") AND
+        (NOT "${UA_GEN_FILE_BSD}" STREQUAL "" OR
+        NOT "${UA_GEN_NAMESPACE_IDX}" STREQUAL ""))
+        message(FATAL_ERROR "ua_generate_nodeset_and_datatypes function requires FILE_CSV argument if any of FILE_BSD or NAMESPACE_IDX are set")
+    endif()
+
+    if((NOT UA_GEN_FILE_BSD OR "${UA_GEN_FILE_BSD}" STREQUAL "") AND
+        (NOT "${UA_GEN_FILE_CSV}" STREQUAL "" OR
+        NOT "${UA_GEN_NAMESPACE_IDX}" STREQUAL ""))
+        message(FATAL_ERROR "ua_generate_nodeset_and_datatypes function requires FILE_BSD argument if any of FILE_CSV or NAMESPACE_IDX are set")
+    endif()
+        
+    if(NOT UA_GEN_NAMESPACE_IDX OR "${UA_GEN_NAMESPACE_IDX}" STREQUAL "" AND
+        (NOT "${UA_GEN_FILE_CSV}" STREQUAL "" OR
+        NOT "${UA_GEN_FILE_BSD}" STREQUAL ""))
+        message(FATAL_ERROR "ua_generate_nodeset_and_datatypes function requires NAMESPACE_IDX argument if any of FILE_CSV or FILE_BSD are set")
+    endif()
+
+
+    set(NODESET_DEPENDS_TARGET "")
+    set(NODESET_TYPES_ARRAY "UA_TYPES")
+
+    if(NOT "${UA_GEN_FILE_BSD}" STREQUAL "")
+        # Generate Datatypes for nodeset
+
+        ua_generate_datatypes(
+            NAME "ua_types_${UA_GEN_NAME}"
+            TARGET_SUFFIX "types-${UA_GEN_NAME}"
+            NAMESPACE_IDX ${UA_GEN_NAMESPACE_IDX}
+            FILE_CSV "${UA_GEN_FILE_CSV}"
+            FILES_BSD "${UA_GEN_FILE_BSD}"
+        )
+        set(NODESET_DEPENDS_TARGET "open62541-generator-types-${UA_GEN_NAME}")
+        string(TOUPPER "${UA_GEN_NAME}" GEN_UPPER_NAME)
+        set(NODESET_TYPES_ARRAY "UA_TYPES_${GEN_UPPER_NAME}")
+    endif()
+
+    # Create a list of nodesets on which this nodeset depends on
+    if (NOT UA_GEN_DEPENDS OR "${UA_GEN_DEPENDS}" STREQUAL "" )
+        set(NODESET_DEPENDS "${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml")
+        set(TYPES_DEPENDS "UA_TYPES")
+    else()
+        foreach(f ${UA_GEN_DEPENDS})
+            get_property(DEPENDS_FILE GLOBAL PROPERTY "UA_GEN_NS_DEPENDS_FILE_${f}")
+            if(NOT DEPENDS_FILE OR "${DEPENDS_FILE}" STREQUAL "")
+                message(FATAL_ERROR "Nodeset dependency ${f} needs to be generated before ${UA_GEN_NAME}")
+            endif()
+
+            set(NODESET_DEPENDS ${NODESET_DEPENDS} "${DEPENDS_FILE}")
+            get_property(DEPENDS_TYPES GLOBAL PROPERTY "UA_GEN_NS_DEPENDS_TYPES_${f}")
+            set(TYPES_DEPENDS ${TYPES_DEPENDS} "${DEPENDS_TYPES}")
+            set(NODESET_DEPENDS_TARGET ${NODESET_DEPENDS_TARGET} "open62541-generator-ns-${f}")
+        endforeach()
+    endif()
+
+
+    set(NODESET_INTERNAL "")
+    if (${UA_GEN_INTERNAL})
+        set(NODESET_INTERNAL "INTERNAL")
+    endif()
+
+    ua_generate_nodeset(
+        NAME "${UA_GEN_NAME}"
+        FILE "${UA_GEN_FILE_NS}"
+        TYPES_ARRAY "${NODESET_TYPES_ARRAY}"
+        ${NODESET_INTERNAL}
+        DEPENDS_TYPES ${TYPES_DEPENDS}
+        DEPENDS_NS ${NODESET_DEPENDS}
+        DEPENDS_TARGET ${NODESET_DEPENDS_TARGET}
+    )
+
 endfunction()