pax_global_header00006660000000000000000000000064147651062560014526gustar00rootroot0000000000000052 comment=2aa764b640c3f049e71e64661ff10eb1f513878c open62541-1.4.11.1/000077500000000000000000000000001476510625600133145ustar00rootroot00000000000000open62541-1.4.11.1/.azure-pipelines/000077500000000000000000000000001476510625600165065ustar00rootroot00000000000000open62541-1.4.11.1/.azure-pipelines/azure-pipelines-dist.yml000066400000000000000000000044051476510625600233110ustar00rootroot00000000000000# Docs see here: # https://aka.ms/yaml jobs: - job: 'dist_debian' displayName: 'Dist (debian)' pool: vmImage: 'ubuntu-20.04' steps: - checkout: self submodules: recursive - task: Bash@3 inputs: targetType: FilePath filePath: ./tools/azure-devops/debian/install.sh failOnStderr: false displayName: Installing required packages - task: Bash@3 inputs: targetType: FilePath filePath: ./tools/azure-devops/debian/build.sh failOnStderr: false displayName: Building & Testing - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: libopen62541-debian # publishing artifacts from PRs from a fork is currently blocked condition: succeeded() displayName: "Publish Artifact: open62541 Debian Packages" # See https://github.com/microsoft/azure-pipelines-tasks/issues/11260#issuecomment-527343172 - bash: echo "##vso[task.setvariable variable=TAG]${BUILD_SOURCEBRANCH##refs/tags/}" displayName: Set TAG variable for $(Build.SourceBranch) condition: startswith(variables['Build.SourceBranch'], 'refs/tags/') - task: GitHubRelease@0 # Only execute this task if a tags build condition: startswith(variables['Build.SourceBranch'], 'refs/tags/') inputs: gitHubConnection: 'open62541-azure-bot' repositoryName: '$(Build.Repository.Name)' action: 'edit' # Options: create, edit, delete target: '$(Build.SourceVersion)' # Required when action == Create || Action == Edit tagSource: 'Git tag' #tagPattern: # Optional tag: $(TAG) # Required when action == Edit || Action == Delete || TagSource == Manual #title: # Optional #releaseNotesSource: 'file' # Optional. Options: file, input #releaseNotesFile: # Optional #releaseNotes: # Optional assets: '$(Build.ArtifactStagingDirectory)/*' # Optional assetUploadMode: 'replace' # Optional. Options: delete, replace #isDraft: false # Optional #isPreRelease: false # Optional addChangeLog: false # Optional #compareWith: 'lastFullRelease' # Required when addChangeLog == True. Options: lastFullRelease, lastRelease, lastReleaseByTag #releaseTag: # Required when compareWith == LastReleaseByTag open62541-1.4.11.1/.azure-pipelines/azure-pipelines-linux.yml000066400000000000000000000011501476510625600234770ustar00rootroot00000000000000# Docs see here: # https://aka.ms/yaml jobs: - job: 'cross_freeRTOS' displayName: 'Arch (freeRTOS)' pool: vmImage: 'ubuntu-20.04' variables: IDF_PATH: $(Build.BinariesDirectory)/esp-idf steps: - checkout: self submodules: recursive - task: Bash@3 inputs: targetType: FilePath filePath: ./tools/azure-devops/freeRTOS/install.sh failOnStderr: false displayName: Installing required packages - task: Bash@3 inputs: targetType: FilePath filePath: ./tools/azure-devops/freeRTOS/build.sh failOnStderr: false displayName: Building & Testing open62541-1.4.11.1/.azure-pipelines/azure-pipelines-win.yml000066400000000000000000000034561476510625600231500ustar00rootroot00000000000000# Docs see here: # https://aka.ms/yaml jobs: - job: 'win_vs2019' displayName: 'Windows (VS2019)' pool: vmImage: 'windows-2019' variables: CC_NAME: Visual Studio 16 2019 CC_SHORTNAME: VS2019 GENERATOR: Visual Studio 16 2019 FORCE_CXX: OFF steps: - checkout: self submodules: recursive - powershell: ./tools/azure-devops/win/install.ps1 displayName: Install Requirements - powershell: ./tools/azure-devops/win/build.ps1 displayName: "Build: $(CC_NAME)" - job: 'win_msys64' displayName: 'Windows (msys64)' pool: vmImage: 'windows-2019' variables: CC_NAME: MinGW Makefiles CC_SHORTNAME: mingw GENERATOR: MinGW Makefiles FORCE_CXX: OFF MSYS2_ROOT: C:/msys64 steps: - checkout: self submodules: recursive - powershell: ./tools/azure-devops/win/install.ps1 displayName: Install Requirements errorActionPreference: continue # Errors are handled in the script - powershell: ./tools/azure-devops/win/build.ps1 displayName: "Build: $(CC_NAME)" errorActionPreference: continue # If set to Stop, we only get a truncated exception message. Error is handled by checking exit code - job: 'win_clang' displayName: 'Windows (clang)' pool: vmImage: 'windows-2019' variables: CC_NAME: Clang CC_SHORTNAME: clang-mingw GENERATOR: MinGW Makefiles FORCE_CXX: OFF MSYS2_ROOT: C:/msys64 steps: - checkout: self submodules: recursive - powershell: ./tools/azure-devops/win/install.ps1 displayName: Install Requirements errorActionPreference: continue # Errors are handled in the script - powershell: ./tools/azure-devops/win/build.ps1 displayName: "Build: $(CC_NAME)" errorActionPreference: continue # If set to Stop, we only get a truncated exception message. Error is handled by checking exit code open62541-1.4.11.1/.clang-format000066400000000000000000000031731476510625600156730ustar00rootroot00000000000000--- Language: Cpp BasedOnStyle: llvm IndentWidth: 4 ColumnLimit: 90 SpacesBeforeTrailingComments: 2 ForEachMacros: [ foreach, LIST_FOREACH, LIST_FOREACH_SAFE ] DisableFormat: false # No space between if and parentheses SpaceBeforeParens: Never # Format function declarations BinPackParameters: true AllowAllParametersOfDeclarationOnNextLine: true AlignAfterOpenBracket: Align AlwaysBreakAfterReturnType: All IndentCaseLabels: true # Order of includes IncludeBlocks: Regroup # Includes are sorted with increasing priority number and then alphabetically # The first regex which matches is the resulting priority # We want something like this: #include #include #include #include #include "server/ua_server_internal.h" #include "ua_network_tcp.h" #include "ua_securechannel.h" #include "ua_types_encoding_binary.h" #include #include #include "testing_clock.h" #include "thread_wrapper.h" IncludeCategories: # Public open62541 includes starting with ' Priority: 40 # The rest - Regex: '.*' Priority: 50 open62541-1.4.11.1/.clang-tidy000066400000000000000000000003271476510625600153520ustar00rootroot00000000000000Checks: 'cert-*,performance-*,readability-*,-readability-braces-around-statements' WarningsAsErrors: 'cert-*,performance-*,readability-*,-readability-braces-around-statements' FormatStyle: file open62541-1.4.11.1/.cquery000066400000000000000000000001071476510625600146230ustar00rootroot00000000000000%clang %c -std=c99 # Includes -I./include -I./src -I./deps -I./pluginsopen62541-1.4.11.1/.dockerignore000066400000000000000000000001311476510625600157630ustar00rootroot00000000000000.github .azure-pipelines .dockerignore .travis* appveyor.yml docker build TinyDockerfile open62541-1.4.11.1/.editorconfig000066400000000000000000000010511476510625600157660ustar00rootroot00000000000000# EditorConfig is awesome: http://EditorConfig.org # top-most EditorConfig file root = true # Unix-style newlines with a newline ending every file [*] end_of_line = lf insert_final_newline = true indent_style = space indent_size = 4 # Matches multiple files with brace expansion notation # Set default charset [*.{js,py}] charset = utf-8 # Tab indentation (no size specified) [Makefile] indent_style = tab # Matches the exact files either package.json or .travis.yml [{package.json,.travis.yml,appveyor.yml}] indent_style = space indent_size = 2 open62541-1.4.11.1/.github/000077500000000000000000000000001476510625600146545ustar00rootroot00000000000000open62541-1.4.11.1/.github/dependabot.yml000066400000000000000000000011251476510625600175030ustar00rootroot00000000000000# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: "gitsubmodule" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "weekly" - package-ecosystem: pip directory: /doc schedule: interval: "weekly" open62541-1.4.11.1/.github/lock.yml000066400000000000000000000022261476510625600163310ustar00rootroot00000000000000# Configuration for Lock Threads - https://github.com/dessant/lock-threads # Number of days of inactivity before a closed issue or pull request is locked daysUntilLock: 365 # Skip issues and pull requests created before a given timestamp. Timestamp must # follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable skipCreatedBefore: false # Issues and pull requests with these labels will be ignored. Set to `[]` to disable exemptLabels: [] # Label to add before locking, such as `outdated`. Set to `false` to disable lockLabel: false # Comment to post before locking. Set to `false` to disable lockComment: false #lockComment: > # This thread has been automatically locked since there has not been # any recent activity after it was closed. Please open a new issue for # related bugs. # Assign `resolved` as the reason for locking. Set to `false` to disable setLockReason: true # Limit to only `issues` or `pulls` # only: issues # Optionally, specify configuration settings just for `issues` or `pulls` # issues: # exemptLabels: # - help-wanted # lockLabel: outdated # pulls: # daysUntilLock: 30 # Repository to extend settings from # _extends: repo open62541-1.4.11.1/.github/reaction.yml000066400000000000000000000012771476510625600172120ustar00rootroot00000000000000# Configuration for Reaction Comments - https://github.com/dessant/reaction-comments # Issues and pull requests with these labels accept reaction comments. # Set to `[]` to disable exemptLabels: [] # Replace matching comments with this message, `{comment-author}` is an # optional placeholder. Set to `false` to disable reactionComment: > :wave: @{comment-author}, did you mean to use a [reaction](https://git.io/vhzhC) instead? # Limit to only `issues` or `pulls` # only: issues # Optionally, specify configuration settings just for `issues` or `pulls` # issues: # exemptLabels: # - party-parrot # pulls: # reactionComment: false # Repository to extend settings from # _extends: repo open62541-1.4.11.1/.github/semantic.yml000066400000000000000000000003301476510625600171760ustar00rootroot00000000000000# Valid scopes for commit messages. scopes: - appveyor - arch - client - core - encrypt - example - fuzz - multithread # Nodeset Compiler - nc - plugin - pack - pubsub - server - travis open62541-1.4.11.1/.github/workflows/000077500000000000000000000000001476510625600167115ustar00rootroot00000000000000open62541-1.4.11.1/.github/workflows/build_linux.yml000066400000000000000000000141061476510625600217540ustar00rootroot00000000000000name: Linux Build & Test on: [push, pull_request] jobs: build: strategy: fail-fast: false matrix: include: - build_name: "Debug Build & Unit Tests (gcc)" cmd_deps: sudo apt-get install -y -qq mosquitto cmd_action: unit_tests - build_name: "Debug Build & Unit Tests (gcc, 32bit)" cmd_deps: | sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get install -y -qq gcc-multilib libsubunit-dev:i386 check:i386 libxml2-dev:i386 cmd_action: unit_tests_32 - build_name: "Debug Build & Unit Tests without Subscriptions (gcc)" cmd_deps: "" cmd_action: unit_tests_nosub - build_name: "Debug Build & Unit Tests with Diagnostics (gcc)" cmd_deps: "" cmd_action: unit_tests_diag - build_name: "Debug Build & Unit Tests with multithreading (gcc)" cmd_deps: "" cmd_action: unit_tests_mt - build_name: "Debug Build & Unit Tests with Alarms&Conditions (gcc)" cmd_deps: "" cmd_action: unit_tests_alarms - build_name: "Debug Build & Unit Tests (clang)" cmd_deps: sudo apt-get install -y -qq clang-11 clang-tools-11 mosquitto cmd_action: CC=clang-11 CXX=clang++-11 unit_tests - build_name: "Debug Build & Unit Tests (tcc)" cmd_deps: sudo apt-get install -y -qq tcc mosquitto cmd_action: CC=tcc unit_tests - build_name: "Encryption (MbedTLS) Build & Unit Tests (gcc)" cmd_deps: sudo apt-get install -y -qq libmbedtls-dev cmd_action: unit_tests_encryption MBEDTLS - build_name: "PubSub Encryption (MbedTLS) Build & Unit Tests (gcc)" cmd_deps: sudo apt-get install -y -qq libmbedtls-dev cmd_action: unit_tests_encryption_mbedtls_pubsub - build_name: "PubSub SKS Build & Unit Tests (gcc)" cmd_deps: sudo apt-get install -y -qq valgrind libmbedtls-dev cmd_action: unit_tests_pubsub_sks - build_name: "Encryption (OpenSSL) Build & Unit Tests (gcc)" cmd_deps: sudo apt-get install -y -qq openssl cmd_action: unit_tests_encryption OPENSSL - build_name: "Encryption (LibreSSL) Build & Unit Tests (gcc)" cmd_deps: | sudo apt-get install -y -qq curl curl https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-3.7.2.tar.gz --output libressl.tar.gz tar -xvz -f libressl.tar.gz cd libressl-3.7.2 ./configure sudo make install cmd_action: unit_tests_encryption LIBRESSL - build_name: "TPM Tool Build" cmd_deps: | sudo apt-get install -y -qq acl autoconf autoconf-archive automake build-essential cmake doxygen gcc git iproute2 libcurl4-openssl-dev libjson-c-dev libcmocka0 libcmocka-dev libgcrypt20-dev libglib2.0-dev libini-config-dev libmbedtls-dev libssl-dev libsqlite3-dev libtool libyaml-dev pkg-config procps python3-pip sqlite3 udev uthash-dev cd ${HOME} git clone https://github.com/tpm2-software/tpm2-tss.git cd ${HOME}/tpm2-tss git checkout 2.4.6 ./bootstrap && ./configure --with-udevrulesdir=/etc/udev/rules.d --with-udevrulesprefix=70- make -j$(nproc) sudo make install sudo ldconfig sudo udevadm control --reload-rules && sudo udevadm trigger sudo apt-get install -y -qq tpm2-tools opensc cd ${HOME} git clone https://github.com/tpm2-software/tpm2-pkcs11.git cd ${HOME}/tpm2-pkcs11 git checkout 1.6.0 ./bootstrap && ./configure make -j$(nproc) sudo make install sudo ldconfig sudo cp ${HOME}/tpm2-pkcs11/src/pkcs11.h /usr/include cd ${HOME}/tpm2-pkcs11/tools/ sudo pip3 install pyasn1_modules pip3 install . cmd_action: build_tpm_tool - build_name: "Release Build" cmd_deps: sudo apt-get install -y -qq libmbedtls-dev cmd_action: build_release - build_name: Amalgamation Build cmd_deps: "" cmd_action: build_amalgamation - build_name: Amalgamation Build with Multithreading cmd_deps: "" cmd_action: build_amalgamation_mt - build_name: "Valgrind Build & Unit Tests with MbedTLS (gcc)" cmd_deps: sudo apt-get install -y -qq valgrind libmbedtls-dev mosquitto cmd_action: unit_tests_valgrind MBEDTLS - build_name: "Valgrind Build & Unit Tests with OpenSSL (gcc)" cmd_deps: sudo apt-get install -y -qq valgrind openssl mosquitto cmd_action: unit_tests_valgrind OPENSSL - build_name: "Valgrind Examples with MbedTLS (gcc)" cmd_deps: sudo apt-get install -y -qq valgrind libmbedtls-dev mosquitto cmd_action: examples_valgrind MBEDTLS - build_name: "Valgrind Examples with OpenSSL (gcc)" cmd_deps: sudo apt-get install -y -qq valgrind openssl libmbedtls-dev mosquitto cmd_action: examples_valgrind OPENSSL - build_name: "Clang Static Analyzer" cmd_deps: sudo apt-get install -y -qq clang-11 clang-tools-11 libmbedtls-dev mosquitto cmd_action: build_clang_analyzer - build_name: "Build All Companion Specifications" cmd_deps: "" cmd_action: build_all_companion_specs name: ${{matrix.build_name}} runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v4 with: submodules: true - name: Install Dependencies run: | sudo apt-get update sudo apt-get install -y -qq python3-sphinx graphviz check ${{ matrix.cmd_deps }} - name: ${{matrix.build_name}} run: source tools/ci.sh && ${{matrix.cmd_action}} env: ETHERNET_INTERFACE: eth0 open62541-1.4.11.1/.github/workflows/build_ubuntu2204.yml000066400000000000000000000014211476510625600224430ustar00rootroot00000000000000name: Linux Build & Test with OpenSSL3.0 on: [push, pull_request] jobs: build: strategy: fail-fast: false matrix: include: - build_name: "Encryption (OpenSSL3.0) Build & Unit Tests (gcc)" cmd_deps: sudo apt-get install -y -qq openssl cmd_action: unit_tests_encryption OPENSSL name: ${{matrix.build_name}} runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 with: submodules: true - name: Install Dependencies run: | sudo apt-get update sudo apt-get install -y -qq python3-sphinx graphviz check ${{ matrix.cmd_deps }} - name: ${{matrix.build_name}} run: source tools/ci.sh && ${{matrix.cmd_action}} env: ETHERNET_INTERFACE: eth0 open62541-1.4.11.1/.github/workflows/cifuzz.yml000066400000000000000000000012231476510625600207440ustar00rootroot00000000000000name: CIFuzz on: [pull_request] jobs: Fuzzing: runs-on: ubuntu-latest steps: - name: Build Fuzzers id: build uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master with: oss-fuzz-project-name: 'open62541' dry-run: false - name: Run Fuzzers uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master with: oss-fuzz-project-name: 'open62541' fuzz-seconds: 600 dry-run: false - name: Upload Crash uses: actions/upload-artifact@v4 if: failure() && steps.build.outcome == 'success' with: name: artifacts path: ./out/artifacts open62541-1.4.11.1/.github/workflows/codeql.yml000066400000000000000000000027561476510625600207150ustar00rootroot00000000000000name: "Code Scanning" on: push: branches: [ master, 1\.1, 1\.2 ] pull_request: branches: [ master, 1\.1, 1\.2 ] paths-ignore: - '**/*.md' - '**/*.txt' schedule: - cron: '30 1 * * 0' jobs: CodeQL-Build: name: Analyze # CodeQL runs on ubuntu-latest, windows-latest, and macos-latest runs-on: ubuntu-latest strategy: fail-fast: false matrix: language: [ 'cpp', 'python' ] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] # Learn more: # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed steps: - name: Checkout open62541 uses: actions/checkout@v4 with: submodules: recursive - name: Install Dependencies run: | sudo apt-get update sudo apt-get install -y -qq python3-sphinx graphviz check sudo apt-get install -y -qq tcc clang-11 clang-tools-11 valgrind mosquitto sudo apt-get install -y -qq libmbedtls-dev openssl - name: Initialize CodeQL uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} - name: Debug Build run: source tools/ci.sh && unit_tests env: ETHERNET_INTERFACE: eth0 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 open62541-1.4.11.1/.github/workflows/coverage.yml000066400000000000000000000013441476510625600212310ustar00rootroot00000000000000name: "Coverage Test" on: push: branches: [ main, master, 1.* ] tags: - v1.* pull_request: branches: [ main, master, 1.* ] jobs: run: runs-on: ubuntu-latest steps: - name: Install Dependencies run: | sudo apt-get update sudo apt-get install -y -qq python3-sphinx graphviz check libmbedtls-dev mosquitto - name: Fetch uses: actions/checkout@v2 with: submodules: true - name: Execute Tests run: source tools/ci.sh && unit_tests_with_coverage env: ETHERNET_INTERFACE: eth0 - name: Debug print run: | tree . - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 open62541-1.4.11.1/.github/workflows/debian_packing.yml000066400000000000000000000034731476510625600223610ustar00rootroot00000000000000name: "Debian Package Generation" on: push: branches: [ main, master ] tags: - 'v1.*' - 'v1.*.*' jobs: Debian-Package-Branch-Preperation: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: submodules: true - uses: actions/setup-python@v5 with: python-version: '3.x' # Version range or exact version of a Python version to use, using SemVer's version range syntax architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified - run: git fetch --prune --unshallow --tags - run: python ./tools/prepare_packaging.py - run: git checkout -b pack-tmp - run: git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" - run: git config --local user.name "github-actions[bot]" - run: cp -r deps/mdnsd deps/mdnsd_back - run: cp -r deps/ua-nodeset deps/ua-nodeset_back - run: git rm -rf --cached deps/mdnsd - run: git rm -rf --cached deps/ua-nodeset - run: mv deps/mdnsd_back deps/mdnsd - run: rm -rf deps/mdnsd/.git - run: mv deps/ua-nodeset_back deps/ua-nodeset - run: rm -rf deps/ua-nodeset/.git - run: rm -rf .gitmodules - run: git add deps/* - run: git add debian/* - run: git add CMakeLists.txt - run: git commit -m "[ci skip] Pack with inline submodules" - name: Branch name run: echo running on branch pack/${GITHUB_REF##*/} - name: Get the current branch name shell: bash run: echo "::set-output name=branch::${GITHUB_REF##*/}" id: myref - name: Push changes uses: ad-m/github-push-action@master with: github_token: ${{ secrets.GITHUB_TOKEN }} branch: pack/${{ steps.myref.outputs.branch }} force: true open62541-1.4.11.1/.github/workflows/dependent-issues.yml000066400000000000000000000022061476510625600227130ustar00rootroot00000000000000name: Dependent Issues on: issues: types: - opened - edited - reopened pull_request_target: types: - opened - edited - reopened # Makes sure we always add status check for PRs. Useful only if # this action is required to pass before merging. Can be removed # otherwise. - synchronize # Schedule a daily check. Useful if you reference cross-repository # issues or pull requests. Can be removed otherwise. schedule: - cron: '0 0 * * *' jobs: check: runs-on: ubuntu-latest steps: - uses: z0al/dependent-issues@v1 env: # (Required) The token to use to make API calls to GitHub. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: # (Optional) The label to use to mark dependent issues label: dependent # (Optional) Enable checking for dependencies in issues. # Enable by setting the value to "on". Default "off" check_issues: off # (Optional) A comma-separated list of keywords. Default # "depends on, blocked by" keywords: depends on, blocked by open62541-1.4.11.1/.github/workflows/doc_upload.yml000066400000000000000000000046571476510625600215610ustar00rootroot00000000000000name: "Documentation Upload" on: push: branches: [ main, master ] tags: - v1.* jobs: Documentation-Generation-And-Upload: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: persist-credentials: false - uses: actions/setup-python@v5 with: python-version: '3.x' # Version range or exact version of a Python version to use, using SemVer's version range syntax architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified - name: Install Dependencies run: | sudo apt-get update sudo apt-get install -y -qq graphviz texlive-fonts-recommended texlive-latex-extra texlive-plain-generic texlive-latex-recommended latexmk texlive-fonts-extra pip install -r doc/requirements.txt - name: Build Documentation run: source tools/ci.sh && build_docs_pdf - name: Checkout Website Repository uses: actions/checkout@v4 with: repository: open62541/open62541-www path: open62541-www ref: main persist-credentials: false - name: Get the current branch name shell: bash run: echo "::set-output name=branch::${GITHUB_REF##*/}" id: myref - name: Copy Documentation Files to Website repository run: | rm -r -f ./open62541-www/static/doc/${{ steps.myref.outputs.branch }} || true # ignore result mkdir ./open62541-www/static/doc/${{ steps.myref.outputs.branch }} || true # ignore result cp -r /home/runner/work/open62541/open62541/build/doc/* ./open62541-www/static/doc/${{ steps.myref.outputs.branch }} cp -r /home/runner/work/open62541/open62541/build/doc_latex/open62541.pdf ./open62541-www/static/doc/open62541-${{ steps.myref.outputs.branch }}.pdf - name: Setup Git-Config Mail run: | cd ./open62541-www git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" git add -A ./static/doc git commit -am "updated generated documentation on webpage by github-action [ci skip]" - name: Push changes uses: ad-m/github-push-action@master with: github_token: ${{ secrets.WWW_PUSH_TOKEN }} directory: open62541-www repository: open62541/open62541-www branch: main force: true open62541-1.4.11.1/.github/workflows/rebase.yml000066400000000000000000000013601476510625600206750ustar00rootroot00000000000000on: issue_comment: types: [created] name: Automatic Rebase jobs: rebase: name: Rebase if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase') runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Automatic Rebase uses: cirrus-actions/rebase@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # https://github.community/t5/GitHub-Actions/Workflow-is-failing-if-no-job-can-be-ran-due-to-condition/m-p/38186#M3250 always_job: name: Always run job runs-on: ubuntu-latest steps: - name: Always run run: echo "This job is used to prevent the workflow to fail when all other jobs are skipped." open62541-1.4.11.1/.github/workflows/release.yml000066400000000000000000000007571476510625600210650ustar00rootroot00000000000000name: Build Release Artifacts on: push: release: types: [published] jobs: build: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 with: submodules: true - run: sudo apt-get install -y -qq libmbedtls-dev - run: source tools/ci.sh && build_release_amalgamation - run: gh release upload ${{ github.ref_name }} build/open62541.{c,h} env: GH_TOKEN: ${{ github.token }} if: github.event_name == 'release' open62541-1.4.11.1/.gitignore000066400000000000000000000020371476510625600153060ustar00rootroot00000000000000# exclude *.log *.guess .in *.sub .status .m4 *.lo *.o *.a *.la *.so* *.Po *.cgen *.hgen *.pyc *.gcno *.gcda *.swp .dirstamp /bin m4 /autom4te.cache Makefile Makefile.in /stamp-h1 /config.status config.log /config.h /aclocal.m4 /config/ /config.h.in /configure /install-sh /compile /depcomp /ltmain.sh /autogen.sh /configure /missing /html /doc/html/* /doc/Doxyfile /doc/doxyfile.stamp *~ GIT_REVISION SVN_REVISION libtool .deps .libs .gcno .gcda coverage_report .project .cproject .pydevproject /INSTALL /.settings .autotools test-driver include/opcua.h include/ua_namespace_0.h src/opcua.c src/ua_namespace_0.c tests/check_builtin tests/check_create tests/check_decode tests/check_delete tests/check_encode tests/check_memory tests/check_namespace tests/coverage Makefile /CMakeCache.txt /CMakeFiles/ /cmake_install.cmake /exampleClient /exampleClient_legacy /src_generated/ **/build /cmake-build* /tools/certs/certs/* Pipfile Pipfile.lock .vscode /.vs **/libxml2 debian/* /CMakeSettings.json # clangd cache .cache/ # project local vim settings .vim/ open62541-1.4.11.1/.gitmodules000066400000000000000000000006741476510625600155000ustar00rootroot00000000000000[submodule "deps/mdnsd"] path = deps/mdnsd url = https://github.com/Pro/mdnsd.git [submodule "deps/ua-nodeset"] path = deps/ua-nodeset url = https://github.com/OPCFoundation/UA-Nodeset branch = latest [submodule "deps/mqtt-c"] path = deps/mqtt-c url = https://github.com/LiamBindle/MQTT-C.git branch = master [submodule "deps/nodesetLoader"] path = deps/nodesetLoader url = https://github.com/open62541/nodesetLoader branch = master open62541-1.4.11.1/.idea/000077500000000000000000000000001476510625600142745ustar00rootroot00000000000000open62541-1.4.11.1/.idea/.gitignore000066400000000000000000000002601476510625600162620ustar00rootroot00000000000000# Default ignored files /shelf/ /workspace.xml # Editor-based HTTP Client requests /httpRequests/ # Datasource local storage ignored files /dataSources/ /dataSources.local.xml open62541-1.4.11.1/.idea/codeStyles/000077500000000000000000000000001476510625600164125ustar00rootroot00000000000000open62541-1.4.11.1/.idea/codeStyles/Project.xml000066400000000000000000000045231476510625600205460ustar00rootroot00000000000000 open62541-1.4.11.1/.idea/codeStyles/codeStyleConfig.xml000066400000000000000000000002161476510625600222140ustar00rootroot00000000000000 open62541-1.4.11.1/.idea/csv-plugin.xml000066400000000000000000000041511476510625600171060ustar00rootroot00000000000000 open62541-1.4.11.1/.idea/deployment.xml000066400000000000000000000006241476510625600172000ustar00rootroot00000000000000 open62541-1.4.11.1/.idea/misc.xml000066400000000000000000000006221476510625600157510ustar00rootroot00000000000000 open62541-1.4.11.1/.idea/modules.xml000066400000000000000000000004161476510625600164670ustar00rootroot00000000000000 open62541-1.4.11.1/.idea/open62541.iml000066400000000000000000000001411476510625600163360ustar00rootroot00000000000000 open62541-1.4.11.1/.idea/open625412.iml000066400000000000000000000001411476510625600164200ustar00rootroot00000000000000 open62541-1.4.11.1/.idea/vcs.xml000066400000000000000000000005671476510625600156210ustar00rootroot00000000000000 open62541-1.4.11.1/AUTHORS000066400000000000000000000010421476510625600143610ustar00rootroot00000000000000The authors of open62541 are (in alphabetical order) Bauer, Maximilian Ebrahimi, Reza Graube, Markus Gruener, Sten Iatrou, Chris Paul Jeromin, Holger Palm, Florian Pfrommer, Julius Profanter, Stefan Stalder, Thomas Urbas, Leon open62541-1.4.11.1/CHANGELOG000066400000000000000000000120041476510625600145230ustar00rootroot00000000000000This changelog reports changes visible through the public API. Internal refactorings and bug fixes are not reported here. 2025-02-18 Andreas Eckerstorfer * PubSub beforeWrite callback A misleading comment about the content of the variable externalDataValue in the PubSub beforeWrite callback has been removed. Please review your beforeWrite callback implementation. The beforeWrite callback is called with the data pointer containing the data before the update. It may be used for a double buffer implementation. The original code change was done with commit 06da5d07bd9a653d32e7a6ed06deae994d29953c. 2023-07-02 Jonas Green * Decoding variant with array of structure When decoding an array of structures the extension objects that each structure is wrapped into is now unwrapped if the array contains only a single type. Previously the decoding API returned an array of extension objects. If the array of extension objects has more than one type the decoding result will be an array of extension objects. 2022-12-03 Julius Pfrommer * KeyValueMap in PubSub configuration The UA_KeyValueMap structure is used everywhere instead of raw arrays of UA_KeyValuePair. 2022-11-19 Julius Pfrommer * Thread-safe client A large portion of the client API is now marked UA_THREADSAFE. For those methods, if multithreading is enabled, an internal mutex protects the client. 2022-08-04 Robert Mak * Saving unknown client certificates 'UA_CertificateVerification_CertFolders()' has been extended with an additional parameter - path to the folder where the rejected certificate should be stored. This change applies if `UA_ENABLE_CERT_REJECTED_DIR` is set. The change was done with pull request #5260. 2022-08-07 Julius Pfrommer * JSON decoding based on JSON5 The JSON decoding can parse the official encoding from the OPC UA specification. It now further allows the following extensions: - The strict JSON format is relaxed to also allow the JSON5 extensions (https://json5.org/). This allows for more human-readable encoding and adds convenience features such as trailing commas in arrays and comments within JSON documents. - If `UA_ENABLE_PARSING` is set, NodeIds and ExpandedNodeIds can be given in the string encoding (see `UA_NodeId_parse`). The standard encoding is to express NodeIds as JSON objects. These extensions are not intended to be used for the OPC UA protocol on the network. They were rather added to allow more convenient configuration file formats that also include data in the OPC UA type system. 2022-07-14 Jannis Voelker * LocaleId support in the server The server now supports that descriptions and display names for different locales are written to a node. The server selects a suitable localization depending on the locale ids that are set for the current session. Locales are added simply by writing a LocalizedText value with a different locale. A locale can be removed by writing a LocalizedText value of the corresponding locale and with an empty text. The change was done with pull request #4165. 2022-07-07 Andreas Eckerstorfer * PubSub publisher id types The union for the PubSub publisher id 'UA_PublisherId' and the enumeration for the PubSub publisher type 'UA_PublisherIdType' have been changed to support all specified publisher id types. The change was done with pull request #5223. 2022-06-09 Andreas Eckerstorfer * PubSub state change functions The following functions in ua_pubsub.h have been extended with an additional parameter for the cause of the state change. Moreover the parameter order has been changed. UA_DataSetWriter_setPubSubState UA_WriterGroup_setPubSubState UA_DataSetReader_setPubSubState UA_ReaderGroup_setPubSubState The change was done with pull request #5162. 2022-05-04 Julius Pfrommer * Server port and hostname configuration Instead of configuring the port number in the server's "NetworkLayer", the server configuration now takes a list of ServerURLs like `opc.tcp://my-server:4840` or `opc.wss://localhost:443`. The URLs are used both for discovery and to set up the server sockets based on the defined hostnames (and ports). The default is to listen on all interfaces with port 4840 for incoming TCP connections. 2022-01-12 Mark Giraud * Empty arrays always match the array dimensions We consider empty arrays (also null-arrays) to have implied array dimensions [0,0,...]. So they always match the array dimensions defined in the variable. With this, the initialization of variables without a defined value has been simplified. We now create a null array if one is required. open62541-1.4.11.1/CMakeLists.txt000066400000000000000000002207141476510625600160620ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.13) if(UA_BUILD_FUZZING OR UA_BUILD_OSS_FUZZ OR UA_BUILD_FUZZING_CORPUS) project(open62541) # We need to have C++ support configured for fuzzing else() project(open62541 C) # Do not look for a C++ compiler endif() # set(CMAKE_VERBOSE_MAKEFILE ON) if(${CMAKE_VERSION} VERSION_LESS 3.12) cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) endif() string(TOLOWER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_LOWER_CASE) set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/tools/cmake") if(${CMAKE_VERSION} VERSION_LESS 3.12) set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${PROJECT_SOURCE_DIR}/tools/cmake3.12") endif() find_package(Python3 REQUIRED) find_package(Git) include(AssignSourceGroup) include(GNUInstallDirs) include(open62541Macros) ############################# # Compiled binaries folders # ############################# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) ########### # Version # ########### # The current version information. On the master branch, we take the version # number from the latest release plus the "-undefined" label. Will be # overwritten with more detailed information if git is available. set(OPEN62541_VER_MAJOR 1) set(OPEN62541_VER_MINOR 4) set(OPEN62541_VER_PATCH 11) set(OPEN62541_VER_LABEL "-undefined") # like "-rc1" or "-g4538abcd" or "-g4538abcd-dirty" set(OPEN62541_VER_COMMIT "unknown-commit") # Overwrite the version information based on git if available include(SetGitBasedVersion) set_open62541_version() # Examples for the version string are: # v1.2 # v1.2.3 # v1.2.3-rc1 # v1.2.3-rc1-dirty # v1.2.3-5-g4538abcd # v1.2.3-5-g4538abcd-dirty set(OPEN62541_VERSION "v${OPEN62541_VER_MAJOR}.${OPEN62541_VER_MINOR}.${OPEN62541_VER_PATCH}${OPEN62541_VER_LABEL}") MESSAGE(STATUS "open62541 Version: ${OPEN62541_VERSION}") ################ # Architecture # ################ set(UA_ARCHITECTURES "none" "posix" "win32") set(UA_ARCHITECTURE "" CACHE STRING "Architecture to build open62541 for") SET_PROPERTY(CACHE UA_ARCHITECTURE PROPERTY STRINGS "" ${UA_ARCHITECTURES}) if("${UA_ARCHITECTURE}" STREQUAL "") if(UNIX) set(UA_ARCHITECTURE "posix" CACHE STRING "" FORCE) elseif(WIN32) set(UA_ARCHITECTURE "win32" CACHE STRING "" FORCE) endif(UNIX) endif() if (NOT UA_ENABLE_AMALGAMATION OR (UA_ENABLE_AMALGAMATION AND NOT UA_AMALGAMATION_MULTIARCH)) message(STATUS "The selected architecture is: ${UA_ARCHITECTURE}") if("${UA_ARCHITECTURE}" STREQUAL "posix") set(UA_ARCHITECTURE_POSIX 1) elseif("${UA_ARCHITECTURE}" STREQUAL "win32") set(UA_ARCHITECTURE_WIN32 1) endif() endif() ################# # Build Options # ################# # 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() option(UA_ENABLE_AMALGAMATION "Concatenate the library to a single file open62541.h/.c" OFF) option(UA_AMALGAMATION_MULTIARCH "Create an architecture-independent amalgamation if UA_ENABLE_AMALGAMATION is ON" OFF) option(BUILD_SHARED_LIBS "Enable building of shared libraries (dll/so)" OFF) set(UA_LOGLEVEL 100 CACHE STRING "Minimal level for logs (in addition to the log plugin settings) (100=TRACE, 200=DEBUG, 300=INFO, 400=WARNING, 500=ERROR, 600=FATAL)") option(UA_ENABLE_DIAGNOSTICS "Enable diagnostics information exposed by the server" ON) option(UA_ENABLE_METHODCALLS "Enable the Method service set" ON) option(UA_ENABLE_SUBSCRIPTIONS "Enable subscriptions support" ON) option(UA_ENABLE_SUBSCRIPTIONS_EVENTS "Enable event monitoring" ON) option(UA_ENABLE_DA "Enable OPC UA DataAccess (Part 8) definitions" ON) option(UA_ENABLE_HISTORIZING "Enable basic support for historical access (client and server)" ON) option(UA_ENABLE_DISCOVERY "Enable Discovery Service (LDS)" ON) option(UA_ENABLE_JSON_ENCODING "Enable JSON encoding" ON) option(UA_ENABLE_XML_ENCODING "Enable XML encoding (EXPERIMENTAL)" OFF) option(UA_ENABLE_NODESETLOADER "Enable nodesetLoader public API" OFF) option(UA_ENABLE_DATATYPES_ALL "Generate all datatypes for namespace zero (uses more binary space)" ON) if(UA_INFORMATION_MODEL_AUTOLOAD AND NOT UA_ENABLE_NODESETLOADER AND NOT UA_BUILD_FUZZING) set(UA_ENABLE_NODESET_INJECTOR ON) endif() set(MULTITHREADING_DEFAULT 0) if(WIN32 OR UNIX) # Enable multithreading by default on Windows and POSIX-like (Unix) systems set(MULTITHREADING_DEFAULT 100) endif() set(UA_MULTITHREADING ${MULTITHREADING_DEFAULT} CACHE STRING "Multithreading support (<100: No multithreading support, >=100: Thread-safety enabled (internal mutexes)") option(UA_ENABLE_ALLOW_REUSEADDR "Enable reuseaddr (only for tests)" OFF) mark_as_advanced(UA_ENABLE_ALLOW_REUSEADDR) option(UA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS "Enable the use of A&C. (EXPERIMENTAL)" OFF) mark_as_advanced(UA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS) option(UA_ENABLE_NODEMANAGEMENT "Enable dynamic addition and removal of nodes at runtime" ON) mark_as_advanced(UA_ENABLE_NODEMANAGEMENT) option(UA_ENABLE_PARSING "Utility functions that require parsing (e.g. NodeId expressions)" ON) mark_as_advanced(UA_ENABLE_PARSING) option(UA_ENABLE_INLINABLE_EXPORT "Export 'static inline' methods as regular API" OFF) mark_as_advanced(UA_ENABLE_INLINABLE_EXPORT) option(UA_ENABLE_DISCOVERY_MULTICAST "Enable Discovery Service with multicast support (LDS-ME)" OFF) mark_as_advanced(UA_ENABLE_DISCOVERY_MULTICAST) # security provider set(UA_ENCRYPTION_PLUGINS "MBEDTLS" "OPENSSL" "LIBRESSL") set(UA_ENABLE_ENCRYPTION "OFF" CACHE STRING "Encryption support (LibreSSL EXPERIMENTAL)") SET_PROPERTY(CACHE UA_ENABLE_ENCRYPTION PROPERTY STRINGS "OFF" ${UA_ENCRYPTION_PLUGINS}) option(UA_ENABLE_ENCRYPTION_OPENSSL "Deprecated: Enable encryption support (uses openssl)" OFF) mark_as_advanced(UA_ENABLE_ENCRYPTION_OPENSSL) option(UA_ENABLE_ENCRYPTION_MBEDTLS "Deprecated: Enable encryption support (uses mbedTLS)" OFF) mark_as_advanced(UA_ENABLE_ENCRYPTION_MBEDTLS) option(UA_ENABLE_CERT_REJECTED_DIR "Enable specifying directory for rejected certificates (with mbedTLS)" OFF) mark_as_advanced(UA_ENABLE_CERT_REJECTED_DIR) list (FIND UA_ENCRYPTION_PLUGINS ${UA_ENABLE_ENCRYPTION} _tmp) if(UA_ENABLE_ENCRYPTION STREQUAL "OFF" OR ${_tmp} GREATER -1) set(UA_ENABLE_ENCRYPTION_OPENSSL OFF) set(UA_ENABLE_ENCRYPTION_MBEDTLS OFF) set(UA_ENABLE_ENCRYPTION_LIBRESSL OFF) if(UA_ENABLE_ENCRYPTION STREQUAL "MBEDTLS") set(UA_ENABLE_ENCRYPTION_MBEDTLS ON) elseif(UA_ENABLE_ENCRYPTION STREQUAL "OPENSSL") set(UA_ENABLE_ENCRYPTION_OPENSSL ON) elseif(UA_ENABLE_ENCRYPTION STREQUAL "LIBRESSL") set(UA_ENABLE_ENCRYPTION_LIBRESSL ON) endif() # Only for backward compatability elseif(UA_ENABLE_ENCRYPTION) message(DEPRECATION "Set UA_ENABLE_ENCRYPTION to the desired encryption library." ) if(NOT UA_ENABLE_ENCRYPTION_OPENSSL) set(UA_ENABLE_ENCRYPTION_MBEDTLS ON) endif() else() message(DEPRECATION "Set UA_ENABLE_ENCRYPTION to the desired encryption library." ) if(UA_ENABLE_ENCRYPTION_MBEDTLS) set(UA_ENABLE_ENCRYPTION "MBEDTLS") set(UA_ENABLE_ENCRYPTION_OPENSSL OFF) endif() if(UA_ENABLE_ENCRYPTION_OPENSSL) set(UA_ENABLE_ENCRYPTION "OPENSSL") set(UA_ENABLE_ENCRYPTION_MBEDTLS OFF) endif() endif() # TPM Security set(UA_ENABLE_ENCRYPTION_TPM2 "OFF" CACHE STRING "TPM encryption support") SET_PROPERTY(CACHE UA_ENABLE_ENCRYPTION_TPM2 PROPERTY STRINGS "ON" "OFF") if(UA_ENABLE_ENCRYPTION_TPM2 STREQUAL "OFF") set(UA_ENABLE_TPM2_SECURITY OFF) set(UA_ENABLE_TPM2_KEYSTORE OFF) else() set(UA_ENABLE_TPM2_SECURITY ON) set(UA_ENABLE_TPM2_KEYSTORE ON) endif() if(UA_ENABLE_TPM2_SECURITY) find_library(TPM2_LIB tpm2_pkcs11) message(${TPM2_LIB}) endif() if(UA_ENABLE_TPM2_SECURITY) if(NOT UA_ENABLE_PUBSUB_ENCRYPTION) message(FATAL_ERROR "TPM2 encryption cannot be used with disabled UA_ENABLE_PUBSUB_ENCRYPTION") endif() endif() if(UA_ENABLE_TPM2_KEYSTORE) if(UA_ENABLE_PUBSUB) if(NOT UA_ENABLE_PUBSUB_ENCRYPTION) message(FATAL_ERROR "TPM2 Keystore for PubSub cannot be used with disabled UA_ENABLE_PUBSUB_ENCRYPTION") endif() else() if(NOT UA_ENABLE_ENCRYPTION) message(FATAL_ERROR "TPM2 Keystore cannot be used with disabled UA_ENABLE_ENCRYPTION") endif() endif() endif() # Namespace Zero set(UA_NAMESPACE_ZERO "REDUCED" CACHE STRING "Completeness of the generated namespace zero (minimal/reduced/full)") SET_PROPERTY(CACHE UA_NAMESPACE_ZERO PROPERTY STRINGS "MINIMAL" "REDUCED" "FULL") if(UA_NAMESPACE_ZERO STREQUAL "MINIMAL") set(UA_GENERATED_NAMESPACE_ZERO OFF) else() set(UA_GENERATED_NAMESPACE_ZERO ON) endif() if(UA_NAMESPACE_ZERO STREQUAL "FULL") set(UA_GENERATED_NAMESPACE_ZERO_FULL ON) else() set(UA_GENERATED_NAMESPACE_ZERO_FULL OFF) endif() if(MSVC AND UA_NAMESPACE_ZERO STREQUAL "FULL") # For the full NS0 we need a stack size of 8MB (as it is default on linux) # See https://github.com/open62541/open62541/issues/1326 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:8000000") endif() if(UA_BUILD_FUZZING OR UA_BUILD_OSS_FUZZ OR UA_BUILD_FUZZING_CORPUS) # Force enable options not passed in the build script, to also fuzzy-test this code set(UA_ENABLE_DISCOVERY ON CACHE STRING "" FORCE) set(UA_ENABLE_DISCOVERY_MULTICAST ON CACHE STRING "" FORCE) set(UA_ENABLE_ENCRYPTION ON CACHE STRING "OFF" FORCE) set(UA_ENABLE_ENCRYPTION_MBEDTLS ON CACHE STRING "" FORCE) set(UA_ENABLE_HISTORIZING ON CACHE STRING "" FORCE) set(UA_ENABLE_JSON_ENCODING ON CACHE STRING "" FORCE) set(UA_ENABLE_SUBSCRIPTIONS ON CACHE STRING "" FORCE) set(UA_ENABLE_SUBSCRIPTIONS_EVENTS ON CACHE STRING "" FORCE) endif() # It should not be possible to enable events without enabling subscriptions and full ns0 #if((UA_ENABLE_SUBSCRIPTIONS_EVENTS) AND (NOT (UA_ENABLE_SUBSCRIPTIONS AND UA_NAMESPACE_ZERO STREQUAL "FULL"))) # message(FATAL_ERROR "Unable to enable events without UA_ENABLE_SUBSCRIPTIONS and full namespace 0") #endif() # It should not be possible to enable Alarms and Condition without enabling Events and full ns0 if((UA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS) AND (NOT (UA_ENABLE_SUBSCRIPTIONS_EVENTS AND UA_NAMESPACE_ZERO STREQUAL "FULL"))) message(FATAL_ERROR "Unable to enable A&C without UA_ENABLE_SUBSCRIPTIONS_EVENTS and full namespace 0") endif() if(UA_ENABLE_COVERAGE) # We are using the scripts provided at for coverage testing: https://github.com/RWTH-HPC/CMake-codecov set(ENABLE_COVERAGE ON) find_package(codecov REQUIRED) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -lgcov") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") endif() if(UA_ENABLE_CLANG_COV) if(NOT CMAKE_C_COMPILER_ID STREQUAL "Clang") message(FATAL_ERROR "Compiler must be clang when compiling for llvm-cov") endif() if(UA_ENABLE_COVERAGE) message(FATAL_ERROR "Only either clang cov or normal coverage is allowed.") endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-instr-generate -fcoverage-mapping") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-instr-generate -fcoverage-mapping") endif() if(UA_ENABLE_DISCOVERY_MULTICAST AND NOT UA_ENABLE_DISCOVERY) MESSAGE(WARNING "UA_ENABLE_DISCOVERY_MULTICAST is enabled, but not UA_ENABLE_DISCOVERY. UA_ENABLE_DISCOVERY_MULTICAST will be set to OFF") SET(UA_ENABLE_DISCOVERY_MULTICAST OFF CACHE BOOL "Enable Discovery Service with multicast support (LDS-ME)" FORCE) endif() # Advanced options option(UA_ENABLE_COVERAGE "Enable gcov coverage" OFF) mark_as_advanced(UA_ENABLE_COVERAGE) option(UA_ENABLE_CLANG_COV "Enable clang coverage" OFF) mark_as_advanced(UA_ENABLE_CLANG_COV) option(UA_ENABLE_QUERY "Enable query support in the client (most servers don't support it)" OFF) mark_as_advanced(UA_ENABLE_QUERY) option(UA_ENABLE_IMMUTABLE_NODES "Nodes in the information model are not edited but copied and replaced" OFF) mark_as_advanced(UA_ENABLE_IMMUTABLE_NODES) option(UA_FORCE_32BIT "Force compilation as 32-bit executable" OFF) mark_as_advanced(UA_FORCE_32BIT) option(UA_FORCE_WERROR "Force compilation with -Werror (or /WX on MSVC)" OFF) option(UA_ENABLE_DEBUG_SANITIZER "Use sanitizer in debug mode" ON) mark_as_advanced(UA_ENABLE_DEBUG_SANITIZER) # General PubSub setup option(UA_ENABLE_PUBSUB "Enable the PubSub protocol" ON) option(UA_ENABLE_PUBSUB_ENCRYPTION "Enable encryption of the PubSub payload" OFF) mark_as_advanced(UA_ENABLE_PUBSUB_ENCRYPTION) option(UA_ENABLE_PUBSUB_SKS "Enable Security Key Service support for publisher and subscriber" OFF) mark_as_advanced(UA_ENABLE_PUBSUB_SKS) if(UA_ENABLE_PUBSUB_SKS) message(WARNING "The PubSub SKS feature is under development and not yet ready.") if(NOT UA_ENABLE_PUBSUB_ENCRYPTION) message(FATAL_ERROR "PubSub SKS cannot be used with disabled UA_ENABLE_PUBSUB_ENCRYPTION") endif() endif() option(UA_ENABLE_PUBSUB_INFORMATIONMODEL "Enable PubSub information model twin" ON) if(UA_ENABLE_PUBSUB_INFORMATIONMODEL) if(NOT UA_ENABLE_PUBSUB) message(FATAL_ERROR "PubSub information model representation cannot be used with disabled PubSub function.") endif() if(UA_NAMESPACE_ZERO STREQUAL "MINIMAL") message(FATAL_ERROR "PubSub information model representation cannot be used with MINIMAL namespace zero.") endif() endif() option(UA_ENABLE_PUBSUB_FILE_CONFIG "Enable loading PubSub Config from file extension" OFF) mark_as_advanced(UA_ENABLE_PUBSUB_FILE_CONFIG) if(UA_ENABLE_PUBSUB_FILE_CONFIG) if(NOT UA_ENABLE_PUBSUB) message(FATAL_ERROR "For UA_ENABLE_PUBSUB_FILE_CONFIG PubSub needs to be enabled") endif() endif() option(UA_ENABLE_PUBSUB_MONITORING "Enable monitoring of PubSub components (e.g. MessageReceiveTimeout)" OFF) mark_as_advanced(UA_ENABLE_PUBSUB_MONITORING) if(UA_ENABLE_PUBSUB_MONITORING) if(NOT UA_ENABLE_PUBSUB) message(FATAL_ERROR "PubSub monitoring cannot be used with PubSub function disabled") endif() endif() option(UA_ENABLE_PUBSUB_BUFMALLOC "Enable allocation with static memory buffer for time critical PubSub parts" OFF) mark_as_advanced(UA_ENABLE_PUBSUB_BUFMALLOC) if(UA_ENABLE_PUBSUB_BUFMALLOC) if(NOT UA_ENABLE_PUBSUB) message(FATAL_ERROR "PubSub buffer allocation cannot be used with PubSub function disabled") endif() if(NOT UA_ENABLE_MALLOC_SINGLETON) message(FATAL_ERROR "PubSub buffer allocation cannot be used without 'UA_ENABLE_MALLOC_SINGLETON' enabled") endif() if(UA_ENABLE_PUBSUB_MONITORING) message(WARNING "PubSub monitoring option 'UA_ENABLE_PUBSUB_MONITORING' can only be used with option 'UA_ENABLE_PUBSUB_BUFMALLOC' if " "a custom monitoring interface is provided, which does not allocate/deallocate memory at start/stopMonitoring callback. " "It can't be used with the built-in ua_timer implementation, because this leads to memory deallocation problems.") endif() endif() option(UA_ENABLE_MQTT "Enable MQTT connections for the EventLoop" OFF) mark_as_advanced(UA_ENABLE_MQTT) if(UA_ENABLE_MQTT) if(NOT EXISTS "${UA_FILE_MQTT}") message(STATUS "Submodule update") execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive RESULT_VARIABLE GIT_SUBMOD_RESULT) if(NOT GIT_SUBMOD_RESULT EQUAL "0") message(FATAL_ERROR "git submodule update --init --recursive failed with ${GIT_SUBMOD_RESULT}") endif() endif() include_directories("${PROJECT_SOURCE_DIR}/deps/mqtt-c/include") endif() option(UA_ENABLE_STATUSCODE_DESCRIPTIONS "Enable conversion of StatusCode to human-readable error message" ON) mark_as_advanced(UA_ENABLE_STATUSCODE_DESCRIPTIONS) option(UA_ENABLE_TYPEDESCRIPTION "Add the type and member names to the UA_DataType structure" ON) mark_as_advanced(UA_ENABLE_TYPEDESCRIPTION) option(UA_ENABLE_NODESET_COMPILER_DESCRIPTIONS "Set node description attribute for nodeset compiler generated nodes" ON) mark_as_advanced(UA_ENABLE_NODESET_COMPILER_DESCRIPTIONS) option(UA_ENABLE_DETERMINISTIC_RNG "Do not seed the random number generator (e.g. for unit tests)." OFF) mark_as_advanced(UA_ENABLE_DETERMINISTIC_RNG) option(UA_ENABLE_MALLOC_SINGLETON "Use a global variable pointer for malloc (and free, ...) that can be switched at runtime" OFF) mark_as_advanced(UA_ENABLE_MALLOC_SINGLETON) option(UA_MSVC_FORCE_STATIC_CRT "Force linking with the static C-runtime library when compiling to static library with MSVC" ON) mark_as_advanced(UA_MSVC_FORCE_STATIC_CRT) option(UA_FILE_NS0 "Override the NodeSet xml file used to generate namespace zero") mark_as_advanced(UA_FILE_NS0) # Blacklist file passed as --blacklist to the nodeset compiler. All the given nodes will be removed from the generated # nodeset, including all the references to and from that node. The format is a node id per line. # Supported formats: "i=123" (for NS0), "ns=2;s=asdf" (matches NS2 in that specific file), or recommended # "ns=http://opcfoundation.org/UA/DI/;i=123" namespace index independent node id option(UA_FILE_NS0_BLACKLIST "File containing blacklisted nodes which should not be included in the generated nodeset code.") mark_as_advanced(UA_FILE_NS0_BLACKLIST) # Semaphores/file system may not be available on embedded devices. It can be # disabled with the following option option(UA_ENABLE_DISCOVERY_SEMAPHORE "Enable Discovery Semaphore support" ON) mark_as_advanced(UA_ENABLE_DISCOVERY_SEMAPHORE) option(UA_ENABLE_UNIT_TESTS_MEMCHECK "Use Valgrind (Linux) or DrMemory (Windows) to detect memory leaks when running the unit tests" OFF) mark_as_advanced(UA_ENABLE_UNIT_TESTS_MEMCHECK) # Build options for debugging option(UA_DEBUG "Enable assertions and additional functionality that should not be included in release builds" OFF) mark_as_advanced(UA_DEBUG) if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(UA_DEBUG ON) endif() option(UA_DEBUG_DUMP_PKGS "Dump every package received by the server as hexdump format" OFF) mark_as_advanced(UA_DEBUG_DUMP_PKGS) option(UA_ENABLE_HARDENING "Enable Hardening measures (e.g. Stack-Protectors and Fortify)" ON) mark_as_advanced(UA_ENABLE_HARDENING) if(CMAKE_VERSION VERSION_GREATER 3.6) set(UA_ENABLE_STATIC_ANALYZER "OFF" CACHE STRING "Enable installed static analyzer during build process (off/minimal/reduced/full)") mark_as_advanced(UA_ENABLE_STATIC_ANALYZER) SET_PROPERTY(CACHE UA_ENABLE_STATIC_ANALYZER PROPERTY STRINGS "OFF" "MINIMAL" "REDUCED" "FULL") endif() option(UA_DEBUG_FILE_LINE_INFO "Enable file and line information as additional debugging output for error messages" OFF) mark_as_advanced(UA_DEBUG_FILE_LINE_INFO) if(CMAKE_BUILD_TYPE MATCHES DEBUG) set(UA_DEBUG_FILE_LINE_INFO ON) endif() # Build Targets option(UA_BUILD_EXAMPLES "Build example servers and clients" OFF) option(UA_BUILD_TOOLS "Build OPC UA shell tools" OFF) option(UA_BUILD_UNIT_TESTS "Build the unit tests" OFF) option(UA_BUILD_FUZZING "Build the fuzzing executables" OFF) mark_as_advanced(UA_BUILD_FUZZING) if(UA_BUILD_FUZZING) # oss-fuzz already defines this by default add_definitions(-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) endif() option(UA_BUILD_FUZZING_CORPUS "Build the fuzzing corpus" OFF) mark_as_advanced(UA_BUILD_FUZZING_CORPUS) if(UA_BUILD_FUZZING_CORPUS) add_definitions(-DUA_DEBUG_DUMP_PKGS_FILE) set(UA_ENABLE_TYPEDESCRIPTION ON CACHE STRING "" FORCE) #set(UA_DEBUG_DUMP_PKGS ON CACHE STRING "" FORCE) endif() option(UA_BUILD_OSS_FUZZ "Special build switch used in oss-fuzz" OFF) mark_as_advanced(UA_BUILD_OSS_FUZZ) ########################## # Advanced Build Targets # ########################## # Building shared libs (dll, so). This option is written into ua_config.h. set(UA_DYNAMIC_LINKING OFF) if(BUILD_SHARED_LIBS) set(UA_DYNAMIC_LINKING ON) if(UA_ENABLE_DISCOVERY_MULTICAST) set(MDNSD_DYNAMIC_LINKING ON) endif() endif() if(UA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS) MESSAGE(WARNING "UA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS is enabled. The feature is under development and marked as EXPERIMENTAL") endif() if(UA_ENABLE_SUBSCRIPTIONS_EVENTS AND (NOT UA_ENABLE_SUBSCRIPTIONS)) MESSAGE(WARNING "UA_ENABLE_SUBSCRIPTIONS_EVENTS needs Subscriptions enabled") set(UA_ENABLE_SUBSCRIPTIONS_EVENTS OFF) endif() if(UA_ENABLE_HISTORIZING AND (NOT UA_ENABLE_SUBSCRIPTIONS)) MESSAGE(FATAL_ERROR "UA_ENABLE_HISTORIZING needs Subscriptions enabled") endif() ###################### # External Libraries # ###################### set(open62541_LIBRARIES "") set(open62541_PUBLIC_LIBRARIES "") if("${UA_ARCHITECTURE}" STREQUAL "posix") list(APPEND open62541_LIBRARIES "m") if(UA_MULTITHREADING GREATER_EQUAL 100 OR UA_BUILD_UNIT_TESTS) list(APPEND open62541_PUBLIC_LIBRARIES "pthread") endif() if(NOT APPLE AND (NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")) list(APPEND open62541_LIBRARIES "rt") endif() elseif("${UA_ARCHITECTURE}" STREQUAL "win32") list(APPEND open62541_LIBRARIES "ws2_32") list(APPEND open62541_LIBRARIES "iphlpapi") endif() if(UA_ENABLE_ENCRYPTION_OPENSSL) # use the OpenSSL encryption library # https://cmake.org/cmake/help/v3.13/module/FindOpenSSL.html find_package(OpenSSL REQUIRED) list(APPEND open62541_LIBRARIES "${OPENSSL_LIBRARIES}") if(WIN32) # Add bestcrypt for windows systems list(APPEND open62541_LIBRARIES bcrypt) endif() endif() if(UA_ENABLE_ENCRYPTION_LIBRESSL) # See https://github.com/libressl-portable/portable/blob/master/FindLibreSSL.cmake find_package(LibreSSL REQUIRED) list(APPEND open62541_LIBRARIES ${LIBRESSL_LIBRARIES}) if(WIN32) # Add bestcrypt for random generator and ws2_32 for crypto list(APPEND open62541_LIBRARIES ws2_32 bcrypt) endif() endif() if(UA_ENABLE_ENCRYPTION_MBEDTLS OR UA_ENABLE_PUBSUB_ENCRYPTION) # The recommended way is to install mbedtls via the OS package manager. If # that is not possible, manually compile mbedTLS and set the cmake variables # defined in /tools/cmake/FindMbedTLS.cmake. find_package(MbedTLS REQUIRED) list(APPEND open62541_LIBRARIES ${MBEDTLS_LIBRARIES}) if(WIN32) # Add bestcrypt for windows systems list(APPEND open62541_LIBRARIES bcrypt) endif() endif() if(UA_ENABLE_TPM2_SECURITY) list(APPEND open62541_LIBRARIES ${TPM2_LIB}) endif() if(MINGW) # GCC stack protector support list(APPEND open62541_LIBRARIES ws2_32 ssp) endif() ##################### # Compiler Settings # ##################### # Check if a C compiler flag is supported and add it (if supported) # Taken from https://stackoverflow.com/a/33266748 include(CheckCCompilerFlag) function(check_add_cc_flag CC_FLAG) string(FIND "${CMAKE_C_FLAGS}" "${CC_FLAG}" flag_already_set) if(flag_already_set EQUAL -1) message(STATUS "Test CC flag ${CC_FLAG}") check_c_compiler_flag("${CC_FLAG}" flag_supported) if(flag_supported) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CC_FLAG}" CACHE INTERNAL "C Compiler Flags") endif() unset(flag_supported CACHE) endif() endfunction() function(add_cc_flag CC_FLAG) string(FIND "${CMAKE_C_FLAGS}" "${CC_FLAG}" flag_already_set) if(flag_already_set EQUAL -1) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CC_FLAG}" CACHE INTERNAL "C Compiler Flags") endif() endfunction() if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang") check_add_cc_flag("-std=c99") # C99 mode check_add_cc_flag("-pipe") # Avoid writing temporary files (for compiler speed) check_add_cc_flag("-Wall") # Warnings check_add_cc_flag("-Wextra") # More warnings check_add_cc_flag("-Wpedantic") # Standard compliance if(UA_FORCE_WERROR) check_add_cc_flag("-Werror") # All warnings are errors check_add_cc_flag("-Wunused-command-line-argument") # Warning for command line args instead of error endif() check_add_cc_flag("-Wno-static-in-inline") # Clang doesn't like the use of static inline methods inside static inline methods check_add_cc_flag("-Wno-overlength-strings") # May happen in the nodeset compiler when complex values are directly encoded check_add_cc_flag("-Wno-unused-parameter") # some methods may require unused arguments to cast to a method pointer check_add_cc_flag("-Wno-maybe-uninitialized") # too many false positives # Use a strict subset of the C and C++ languages check_add_cc_flag("-Wc++-compat") # Check that format strings (printf/scanf) are sane check_add_cc_flag("-Wformat") check_add_cc_flag("-Wformat-security") check_add_cc_flag("-Wformat-nonliteral") # Check prototype definitions check_add_cc_flag("-Wmissing-prototypes") check_add_cc_flag("-Wstrict-prototypes") check_add_cc_flag("-Wredundant-decls") check_add_cc_flag("-Wuninitialized") check_add_cc_flag("-Winit-self") check_add_cc_flag("-Wcast-qual") check_add_cc_flag("-Wstrict-overflow") check_add_cc_flag("-Wnested-externs") check_add_cc_flag("-Wmultichar") check_add_cc_flag("-Wundef") check_add_cc_flag("-fno-strict-aliasing") # fewer compiler assumptions about pointer types check_add_cc_flag("-fexceptions") # recommended for multi-threaded C code, also in combination with C++ code # Generate position-independent code for shared libraries (adds a performance penalty) if(BUILD_SHARED_LIBS) add_cc_flag("-fPIC") endif() if(UA_MULTITHREADING GREATER_EQUAL 100 AND NOT WIN32) check_add_cc_flag("-pthread") endif() # Force 32bit build if(UA_FORCE_32BIT) if(MSVC) message(FATAL_ERROR "Select the 32bit (cross-) compiler instead of forcing compiler options") endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") # GCC and Clang, possibly more endif() if(NOT MINGW AND NOT UA_BUILD_OSS_FUZZ) if(UA_ENABLE_HARDENING) check_add_cc_flag("-fstack-protector-strong") # more performant stack protector, available since gcc 4.9 check_add_cc_flag("-fstack-clash-protection") # increased reliability of stack overflow detection, available since gcc 8 # future use (control flow integrity protection) if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") check_add_cc_flag("-mcet") check_add_cc_flag("-fcf-protection") endif() endif() # IPO requires too much memory for unit tests # GCC docu recommends to compile all files with the same options, therefore ignore it completely if(NOT UA_BUILD_UNIT_TESTS AND NOT DEFINED CMAKE_INTERPROCEDURAL_OPTIMIZATION) # needed to check if IPO is supported (check needs cmake > 3.9) if("${CMAKE_VERSION}" VERSION_GREATER 3.9) cmake_policy(SET CMP0069 NEW) # needed as long as required cmake < 3.9 include(CheckIPOSupported) check_ipo_supported(RESULT CC_HAS_IPO) # Inter Procedural Optimization / Link Time Optimization (should be same as -flto) if(CC_HAS_IPO) set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON) endif() endif() endif() endif() if(UA_ENABLE_AMALGAMATION) add_definitions(-Wno-unused-function) endif() # Linker set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") # cmake sets -rdynamic by default # Debug if(UA_ENABLE_DEBUG_SANITIZER AND BUILD_TYPE_LOWER_CASE STREQUAL "debug" AND UNIX AND NOT UA_BUILD_OSS_FUZZ AND CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT UA_ENABLE_UNIT_TESTS_MEMCHECK) # Add default sanitizer settings when using clang and Debug build. # This allows e.g. CLion to find memory locations for SegFaults message(STATUS "Sanitizer enabled") set(SANITIZER_FLAGS "-g -fno-omit-frame-pointer -gline-tables-only -fsanitize=address -fsanitize-address-use-after-scope -fsanitize=leak -fsanitize=undefined") if(CMAKE_CXX_COMPILER_VERSION AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0) set(SANITIZER_FLAGS "${SANITIZER_FLAGS} -fsanitize-coverage=trace-pc-guard") endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZER_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZER_FLAGS}") endif() if(NOT MINGW AND UA_ENABLE_HARDENING AND ((CMAKE_BUILD_TYPE STREQUAL "Release") OR (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"))) check_add_cc_flag("-D_FORTIFY_SOURCE=2") # run-time buffer overflow detection (needs at least -O1) endif() # Strip release builds if(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" OR CMAKE_BUILD_TYPE STREQUAL "Release") check_add_cc_flag("-ffunction-sections") check_add_cc_flag("-fdata-sections") check_add_cc_flag("-fno-unwind-tables") check_add_cc_flag("-fno-asynchronous-unwind-tables") check_add_cc_flag("-fno-math-errno") # check_add_cc_flag("-fno-ident") # remove stack-protector with MinSizeRel if(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") check_add_cc_flag("-fno-stack-protector") endif() if(NOT OS9) set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -s") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s") endif() 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 /w44996") if(UA_FORCE_WERROR) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX") # Compiler warnings, error on warning endif() if(UA_MSVC_FORCE_STATIC_CRT AND NOT BUILD_SHARED_LIBS) set(CompilerFlags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE) foreach(CompilerFlag ${CompilerFlags}) string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}") endforeach() endif() endif() if(UA_BUILD_FUZZING OR UA_BUILD_OSS_FUZZ) set(UA_ENABLE_MALLOC_SINGLETON ON) endif() ######################### # Generate Main Library # ######################### # Directory for generated sources file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/src_generated") # Generate the config.h configure_file(include/open62541/config.h.in ${PROJECT_BINARY_DIR}/src_generated/open62541/config.h) if(UA_ENABLE_DISCOVERY_MULTICAST) include(GenerateExportHeader) set(MDNSD_LOGLEVEL 300 CACHE STRING "Level at which logs shall be reported" FORCE) # create a "fake" empty library to generate the export header macros if (APPLE) add_library(libmdnsd INTERFACE ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/mdnsd.h) else() add_library(libmdnsd ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/mdnsd.h) endif() set_property(TARGET libmdnsd PROPERTY LINKER_LANGUAGE C) set_property(TARGET libmdnsd PROPERTY DEFINE_SYMBOL "MDNSD_DYNAMIC_LINKING_EXPORT") configure_file("deps/mdnsd/libmdnsd/mdnsd_config_extra.in" "${PROJECT_BINARY_DIR}/src_generated/mdnsd_config_extra") file(READ "${PROJECT_BINARY_DIR}/src_generated/mdnsd_config_extra" MDNSD_CONFIG_EXTRA) generate_export_header(libmdnsd EXPORT_FILE_NAME "${PROJECT_BINARY_DIR}/src_generated/mdnsd_config.h" BASE_NAME MDNSD DEFINE_NO_DEPRECATED CUSTOM_CONTENT_FROM_VARIABLE MDNSD_CONFIG_EXTRA) endif() # Exported headers set(exported_headers ${PROJECT_BINARY_DIR}/src_generated/open62541/config.h ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.h ${PROJECT_BINARY_DIR}/src_generated/open62541/nodeids.h ${PROJECT_SOURCE_DIR}/include/open62541/common.h ${PROJECT_SOURCE_DIR}/include/open62541/types.h ${PROJECT_BINARY_DIR}/src_generated/open62541/types_generated.h ${PROJECT_BINARY_DIR}/src_generated/open62541/types_generated_handling.h ${PROJECT_SOURCE_DIR}/include/open62541/util.h ${PROJECT_SOURCE_DIR}/include/open62541/plugin/log.h ${PROJECT_SOURCE_DIR}/include/open62541/plugin/accesscontrol.h ${PROJECT_SOURCE_DIR}/include/open62541/plugin/pki.h ${PROJECT_SOURCE_DIR}/include/open62541/plugin/securitypolicy.h ${PROJECT_SOURCE_DIR}/include/open62541/plugin/eventloop.h ${PROJECT_SOURCE_DIR}/include/open62541/plugin/nodestore.h ${PROJECT_SOURCE_DIR}/include/open62541/plugin/historydatabase.h ${PROJECT_SOURCE_DIR}/include/open62541/server_pubsub.h ${PROJECT_SOURCE_DIR}/include/open62541/client.h ${PROJECT_SOURCE_DIR}/include/open62541/server.h ${PROJECT_SOURCE_DIR}/include/open62541/client_highlevel.h ${PROJECT_SOURCE_DIR}/include/open62541/client_subscriptions.h ${PROJECT_SOURCE_DIR}/include/open62541/client_highlevel_async.h) # Main Library set(lib_headers ${PROJECT_SOURCE_DIR}/deps/open62541_queue.h ${PROJECT_SOURCE_DIR}/deps/pcg_basic.h ${PROJECT_SOURCE_DIR}/deps/libc_time.h ${PROJECT_SOURCE_DIR}/deps/base64.h ${PROJECT_SOURCE_DIR}/deps/dtoa.h ${PROJECT_SOURCE_DIR}/deps/mp_printf.h ${PROJECT_SOURCE_DIR}/deps/itoa.h ${PROJECT_SOURCE_DIR}/deps/ziptree.h ${PROJECT_SOURCE_DIR}/src/ua_types_encoding_binary.h ${PROJECT_SOURCE_DIR}/src/ua_util_internal.h ${PROJECT_BINARY_DIR}/src_generated/open62541/transport_generated.h ${PROJECT_BINARY_DIR}/src_generated/open62541/transport_generated_handling.h ${PROJECT_SOURCE_DIR}/src/ua_securechannel.h ${PROJECT_SOURCE_DIR}/src/server/ua_session.h ${PROJECT_SOURCE_DIR}/src/server/ua_subscription.h ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_networkmessage.h ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub.h ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_ns0.h ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_keystorage.h ${PROJECT_SOURCE_DIR}/src/server/ua_server_async.h ${PROJECT_SOURCE_DIR}/src/server/ua_server_internal.h ${PROJECT_SOURCE_DIR}/src/server/ua_services.h ${PROJECT_SOURCE_DIR}/src/client/ua_client_internal.h) set(lib_sources ${PROJECT_SOURCE_DIR}/src/ua_types.c ${PROJECT_SOURCE_DIR}/src/ua_types_encoding_binary.c ${PROJECT_BINARY_DIR}/src_generated/open62541/types_generated.c ${PROJECT_BINARY_DIR}/src_generated/open62541/transport_generated.c ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.c ${PROJECT_SOURCE_DIR}/src/ua_util.c ${PROJECT_SOURCE_DIR}/src/ua_securechannel.c ${PROJECT_SOURCE_DIR}/src/ua_securechannel_crypto.c # server ${PROJECT_SOURCE_DIR}/src/server/ua_session.c ${PROJECT_SOURCE_DIR}/src/server/ua_nodes.c ${PROJECT_SOURCE_DIR}/src/server/ua_server.c ${PROJECT_SOURCE_DIR}/src/server/ua_server_ns0.c ${PROJECT_SOURCE_DIR}/src/server/ua_server_ns0_diagnostics.c ${PROJECT_SOURCE_DIR}/src/server/ua_server_config.c ${PROJECT_SOURCE_DIR}/src/server/ua_server_binary.c ${PROJECT_SOURCE_DIR}/src/server/ua_server_utils.c ${PROJECT_SOURCE_DIR}/src/server/ua_server_async.c ${PROJECT_SOURCE_DIR}/src/server/ua_services_view.c ${PROJECT_SOURCE_DIR}/src/server/ua_services_method.c ${PROJECT_SOURCE_DIR}/src/server/ua_services_session.c ${PROJECT_SOURCE_DIR}/src/server/ua_services_attribute.c ${PROJECT_SOURCE_DIR}/src/server/ua_services_discovery.c ${PROJECT_SOURCE_DIR}/src/server/ua_services_subscription.c ${PROJECT_SOURCE_DIR}/src/server/ua_services_monitoreditem.c ${PROJECT_SOURCE_DIR}/src/server/ua_services_securechannel.c ${PROJECT_SOURCE_DIR}/src/server/ua_services_nodemanagement.c # pubsub ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_networkmessage.c ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_eventloop.c ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_connection.c ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_dataset.c ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_writer.c ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_writergroup.c ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_reader.c ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_readergroup.c ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_manager.c ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_ns0.c ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_keystorage.c ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_securitygroup.c ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_config.c # client ${PROJECT_SOURCE_DIR}/src/client/ua_client.c ${PROJECT_SOURCE_DIR}/src/client/ua_client_connect.c ${PROJECT_SOURCE_DIR}/src/client/ua_client_discovery.c ${PROJECT_SOURCE_DIR}/src/client/ua_client_highlevel.c ${PROJECT_SOURCE_DIR}/src/client/ua_client_subscriptions.c # dependencies ${PROJECT_SOURCE_DIR}/deps/libc_time.c ${PROJECT_SOURCE_DIR}/deps/pcg_basic.c ${PROJECT_SOURCE_DIR}/deps/base64.c ${PROJECT_SOURCE_DIR}/deps/dtoa.c ${PROJECT_SOURCE_DIR}/deps/mp_printf.c ${PROJECT_SOURCE_DIR}/deps/itoa.c ${PROJECT_SOURCE_DIR}/deps/ziptree.c) if(UA_GENERATED_NAMESPACE_ZERO) list(APPEND lib_headers ${PROJECT_BINARY_DIR}/src_generated/open62541/namespace0_generated.h) list(APPEND lib_sources ${PROJECT_BINARY_DIR}/src_generated/open62541/namespace0_generated.c) endif() if (NOT "${UA_ARCHITECTURE}" STREQUAL "none") list(PREPEND lib_headers ${PROJECT_SOURCE_DIR}/arch/posix/ua_architecture.h) list(PREPEND lib_headers ${PROJECT_SOURCE_DIR}/arch/win32/ua_architecture.h) endif() if(UA_ENABLE_PARSING) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/ua_types_lex.c) endif() if(UA_ENABLE_PUBSUB) if(UA_ENABLE_MALLOC_SINGLETON AND UA_ENABLE_PUBSUB_BUFMALLOC) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_bufmalloc.c) list(APPEND lib_headers ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_bufmalloc.h) endif() if(UA_ENABLE_PUBSUB_ENCRYPTION) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_security.c) endif() endif() if(UA_ENABLE_JSON_ENCODING) if(UA_ENABLE_PUBSUB_ENCRYPTION) MESSAGE(WARNING "Payload encryption with JSON encoding is not possible according to the specification. The message security is only defined for the UADP message mapping.") endif() if(UA_ENABLE_PUBSUB) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/pubsub/ua_pubsub_networkmessage_json.c) endif() list(APPEND lib_headers ${PROJECT_SOURCE_DIR}/deps/cj5.h ${PROJECT_SOURCE_DIR}/deps/parse_num.h ${PROJECT_SOURCE_DIR}/src/ua_types_encoding_json.h) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/deps/cj5.c ${PROJECT_SOURCE_DIR}/deps/parse_num.c ${PROJECT_SOURCE_DIR}/src/ua_types_encoding_json.c) endif() if(UA_ENABLE_XML_ENCODING) if(NOT UA_ENABLE_JSON_ENCODING) list(APPEND lib_headers ${PROJECT_SOURCE_DIR}/deps/parse_num.h) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/deps/parse_num.c) endif() list(APPEND lib_headers ${PROJECT_SOURCE_DIR}/src/ua_types_encoding_xml.h) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/ua_types_encoding_xml.c) endif() if(UA_ENABLE_SUBSCRIPTIONS) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/server/ua_subscription.c ${PROJECT_SOURCE_DIR}/src/server/ua_subscription_monitoreditem.c ${PROJECT_SOURCE_DIR}/src/server/ua_subscription_datachange.c) if(UA_ENABLE_SUBSCRIPTIONS_EVENTS) if(UA_NAMESPACE_ZERO STREQUAL "MINIMAL") message(FATAL_ERROR "Events require at least the reduced Namespace Zero") endif() list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/server/ua_subscription_events.c ${PROJECT_SOURCE_DIR}/src/server/ua_subscription_events_filter.c) if(UA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/server/ua_subscription_alarms_conditions.c) endif() endif() endif() if(UA_DEBUG_DUMP_PKGS) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/plugins/ua_debug_dump_pkgs.c) endif() if(UA_ENABLE_DISCOVERY_MULTICAST) # prepend in list, otherwise it complains that winsock2.h has to be included before windows.h list(APPEND lib_headers ${PROJECT_BINARY_DIR}/src_generated/mdnsd_config.h ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/1035.h ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/xht.h ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/sdtxt.h ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/mdnsd.h) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/server/ua_discovery_mdns.c ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/1035.c ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/xht.c ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/sdtxt.c ${PROJECT_SOURCE_DIR}/deps/mdnsd/libmdnsd/mdnsd.c) endif() if(UA_BUILD_FUZZING OR UA_BUILD_OSS_FUZZ) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/tests/fuzz/custom_memory_manager.c) endif() # Architecture set(architecture_headers) set(architecture_sources) if(NOT "${UA_ARCHITECTURE}" STREQUAL "none") list(APPEND architecture_headers ${PROJECT_SOURCE_DIR}/arch/common/ua_timer.h ${PROJECT_SOURCE_DIR}/arch/eventloop_common.h ${PROJECT_SOURCE_DIR}/arch/eventloop_posix.h) list(APPEND architecture_sources ${PROJECT_SOURCE_DIR}/arch/posix/ua_clock.c ${PROJECT_SOURCE_DIR}/arch/win32/ua_clock.c ${PROJECT_SOURCE_DIR}/arch/common/ua_timer.c ${PROJECT_SOURCE_DIR}/arch/eventloop_common.c ${PROJECT_SOURCE_DIR}/arch/eventloop_posix.c ${PROJECT_SOURCE_DIR}/arch/eventloop_posix_select.c ${PROJECT_SOURCE_DIR}/arch/eventloop_posix_epoll.c ${PROJECT_SOURCE_DIR}/arch/eventloop_posix_tcp.c ${PROJECT_SOURCE_DIR}/arch/eventloop_posix_udp.c ${PROJECT_SOURCE_DIR}/arch/eventloop_posix_interrupt.c) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR UA_ENABLE_AMALGAMATION) list(APPEND architecture_sources ${PROJECT_SOURCE_DIR}/arch/eventloop_posix_eth.c) endif() if(UA_ENABLE_MQTT) list(APPEND architecture_sources ${PROJECT_SOURCE_DIR}/arch/eventloop_mqtt.c) endif() endif() # Plugins set(plugin_headers ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/accesscontrol_default.h ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/pki_default.h ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/log_stdout.h ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/nodestore_default.h ${PROJECT_SOURCE_DIR}/plugins/include/open62541/server_config_default.h ${PROJECT_SOURCE_DIR}/plugins/include/open62541/client_config_default.h ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/securitypolicy_default.h) set(plugin_sources ${PROJECT_SOURCE_DIR}/plugins/ua_log_stdout.c ${PROJECT_SOURCE_DIR}/plugins/ua_accesscontrol_default.c ${PROJECT_SOURCE_DIR}/plugins/ua_nodestore_ziptree.c ${PROJECT_SOURCE_DIR}/plugins/ua_nodestore_hashmap.c ${PROJECT_SOURCE_DIR}/plugins/ua_config_default.c) # For file based server configuration if(UA_ENABLE_JSON_ENCODING) list(APPEND plugin_headers ${PROJECT_SOURCE_DIR}/plugins/include/open62541/server_config_file_based.h) list(APPEND plugin_sources ${PROJECT_SOURCE_DIR}/plugins/ua_config_json.c) endif() if(UA_ENABLE_HISTORIZING) list(APPEND plugin_headers ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/historydata/history_data_backend.h ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/historydata/history_data_gathering.h ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/historydata/history_database_default.h ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/historydata/history_data_gathering_default.h ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/historydata/history_data_backend_memory.h) list(APPEND plugin_sources ${PROJECT_SOURCE_DIR}/plugins/historydata/ua_history_data_backend_memory.c ${PROJECT_SOURCE_DIR}/plugins/historydata/ua_history_data_gathering_default.c ${PROJECT_SOURCE_DIR}/plugins/historydata/ua_history_database_default.c) endif() # Syslog-logging on Linux and Unices if(UNIX) list(APPEND plugin_headers ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/log_syslog.h) list(APPEND plugin_sources ${PROJECT_SOURCE_DIR}/plugins/ua_log_syslog.c) endif() # Always include encryption plugins into the amalgamation # Use guards in the files to ensure that UA_ENABLE_ENCRYPTON_MBEDTLS and UA_ENABLE_ENCRYPTION_OPENSSL are honored. if(UA_ENABLE_ENCRYPTION_MBEDTLS OR UA_ENABLE_PUBSUB_ENCRYPTION OR UA_ENABLE_AMALGAMATION) list(INSERT plugin_sources 0 ${PROJECT_SOURCE_DIR}/plugins/crypto/mbedtls/securitypolicy_mbedtls_common.h ${PROJECT_SOURCE_DIR}/plugins/crypto/mbedtls/securitypolicy_mbedtls_common.c) endif() if(UA_ENABLE_PUBSUB_ENCRYPTION) list(APPEND plugin_sources ${PROJECT_SOURCE_DIR}/plugins/crypto/mbedtls/securitypolicy_pubsub_aes128ctr.c ${PROJECT_SOURCE_DIR}/plugins/crypto/mbedtls/securitypolicy_pubsub_aes256ctr.c) endif() if(UA_ENABLE_ENCRYPTION_MBEDTLS OR UA_ENABLE_ENCRYPTION_OPENSSL OR UA_ENABLE_ENCRYPTION_LIBRESSL OR UA_ENABLE_AMALGAMATION) list(APPEND plugin_headers ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/create_certificate.h) endif() if(UA_ENABLE_ENCRYPTION_MBEDTLS OR UA_ENABLE_AMALGAMATION) list(APPEND plugin_sources ${PROJECT_SOURCE_DIR}/plugins/crypto/mbedtls/ua_securitypolicy_basic128rsa15.c ${PROJECT_SOURCE_DIR}/plugins/crypto/mbedtls/ua_securitypolicy_basic256.c ${PROJECT_SOURCE_DIR}/plugins/crypto/mbedtls/ua_securitypolicy_basic256sha256.c ${PROJECT_SOURCE_DIR}/plugins/crypto/mbedtls/ua_securitypolicy_aes128sha256rsaoaep.c ${PROJECT_SOURCE_DIR}/plugins/crypto/mbedtls/ua_securitypolicy_aes256sha256rsapss.c ${PROJECT_SOURCE_DIR}/plugins/crypto/mbedtls/ua_mbedtls_create_certificate.c ${PROJECT_SOURCE_DIR}/plugins/crypto/mbedtls/ua_pki_mbedtls.c) endif() if(UA_ENABLE_TPM2_SECURITY) list(INSERT plugin_sources 0 ${PROJECT_SOURCE_DIR}/plugins/crypto/pkcs11/securitypolicy_pubsub_aes128ctr_tpm.c ${PROJECT_SOURCE_DIR}/plugins/crypto/pkcs11/securitypolicy_pubsub_aes256ctr_tpm.c) endif() if(UA_ENABLE_ENCRYPTION_OPENSSL OR UA_ENABLE_ENCRYPTION_LIBRESSL OR UA_ENABLE_AMALGAMATION) list(APPEND plugin_sources ${PROJECT_SOURCE_DIR}/plugins/crypto/openssl/securitypolicy_openssl_common.h ${PROJECT_SOURCE_DIR}/plugins/crypto/openssl/ua_openssl_version_abstraction.h ${PROJECT_SOURCE_DIR}/plugins/crypto/openssl/securitypolicy_openssl_common.c ${PROJECT_SOURCE_DIR}/plugins/crypto/openssl/ua_openssl_basic128rsa15.c ${PROJECT_SOURCE_DIR}/plugins/crypto/openssl/ua_openssl_basic256.c ${PROJECT_SOURCE_DIR}/plugins/crypto/openssl/ua_openssl_basic256sha256.c ${PROJECT_SOURCE_DIR}/plugins/crypto/openssl/ua_openssl_aes128sha256rsaoaep.c ${PROJECT_SOURCE_DIR}/plugins/crypto/openssl/ua_openssl_aes256sha256rsapss.c ${PROJECT_SOURCE_DIR}/plugins/crypto/openssl/ua_openssl_create_certificate.c ${PROJECT_SOURCE_DIR}/plugins/crypto/openssl/ua_pki_openssl.c) endif() # ua_securitypolicy_none.c requires UA_*_LoadCertificate() if encryption is enabled list(APPEND plugin_sources ${PROJECT_SOURCE_DIR}/plugins/crypto/ua_pki_none.c ${PROJECT_SOURCE_DIR}/plugins/crypto/ua_securitypolicy_none.c) if(UA_ENABLE_DISCOVERY) list(APPEND lib_headers ${PROJECT_SOURCE_DIR}/src/server/ua_discovery.h) list(APPEND lib_sources ${PROJECT_SOURCE_DIR}/src/server/ua_discovery.c) endif() if(UA_ENABLE_NODESETLOADER) # This is required because of issues with policy CMP0077. # Source: https://stackoverflow.com/a/54404924 option(ENABLE_BUILD_INTO_OPEN62541 "make nodesetLoader part of the open62541 library" off) set(ENABLE_BUILD_INTO_OPEN62541 on) add_subdirectory(${PROJECT_SOURCE_DIR}/deps/nodesetLoader) list(APPEND lib_sources ${NODESETLOADER_SOURCES}) list(APPEND plugin_headers ${PROJECT_SOURCE_DIR}/plugins/include/open62541/plugin/nodesetloader.h) list(APPEND plugin_sources ${PROJECT_SOURCE_DIR}/plugins/ua_nodesetloader.c) list(APPEND open62541_LIBRARIES ${NODESETLOADER_DEPS_LIBS}) if(UA_ENABLE_AMALGAMATION) list(APPEND exported_headers ${NODESETLOADER_PUBLIC_HEADERS}) list(APPEND lib_headers ${NODESETLOADER_PRIVATE_HEADERS}) endif() endif() ######################### # Generate source files # ######################### # Nodeset files combined into NS0 generated file set(UA_FILE_NODESETS) # List of nodeset-xml files to be considered in the generated information model set(UA_NODESET_DIR ${PROJECT_SOURCE_DIR}/deps/ua-nodeset CACHE STRING "The path to the node-set directory (e.g. from https://github.com/OPCFoundation/UA-Nodeset)") unset(UA_FILE_NS0_PRIVATE) if(UA_FILE_NS0) set(UA_FILE_NS0_PRIVATE "${UA_FILE_NS0}") endif() if(UA_NAMESPACE_ZERO STREQUAL "FULL") # Use the "full" schema files also for datatypes and statuscodes set(UA_SCHEMA_DIR ${UA_NODESET_DIR}/Schema CACHE INTERNAL "") # Set the full Nodeset for NS0 if(NOT UA_FILE_NS0_PRIVATE) set(UA_FILE_NS0_PRIVATE ${UA_SCHEMA_DIR}/Opc.Ua.NodeSet2.xml) endif() # Check that the submodule was checked out or manually downloaded into the folder if(NOT EXISTS "${UA_FILE_NS0_PRIVATE}") message(STATUS "Submodule update") execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive RESULT_VARIABLE GIT_SUBMOD_RESULT) if(NOT GIT_SUBMOD_RESULT EQUAL "0") message(FATAL_ERROR "git submodule update --init --recursive failed with ${GIT_SUBMOD_RESULT}") endif() endif() else() # Directory with the schema files for installation set(UA_SCHEMA_DIR ${PROJECT_SOURCE_DIR}/tools/schema CACHE INTERNAL "") # Set the reduced Nodeset for NS0 if(NOT UA_FILE_NS0_PRIVATE) set(UA_FILE_NS0_PRIVATE ${UA_SCHEMA_DIR}/Opc.Ua.NodeSet2.Reduced.xml CACHE INTERNAL "") endif() # Set feature-specific datatypes definitions and nodesets set(UA_FILE_DATATYPES ${UA_SCHEMA_DIR}/datatypes_minimal.txt ${UA_SCHEMA_DIR}/datatypes_discovery.txt) if(UA_ENABLE_METHODCALLS) list(APPEND UA_FILE_DATATYPES ${UA_SCHEMA_DIR}/datatypes_method.txt) endif() if(UA_ENABLE_DIAGNOSTICS) list(APPEND UA_FILE_NODESETS ${UA_SCHEMA_DIR}/Opc.Ua.NodeSet2.DiagnosticsMinimal.xml) list(APPEND UA_FILE_DATATYPES ${UA_SCHEMA_DIR}/datatypes_diagnostics.txt) endif() if(UA_ENABLE_SUBSCRIPTIONS) list(APPEND UA_FILE_DATATYPES ${UA_SCHEMA_DIR}/datatypes_subscriptions.txt) endif() if(UA_ENABLE_SUBSCRIPTIONS_EVENTS) list(APPEND UA_FILE_NODESETS ${UA_SCHEMA_DIR}/Opc.Ua.NodeSet2.EventsMinimal.xml) endif() if(UA_ENABLE_HISTORIZING) list(APPEND UA_FILE_NODESETS ${UA_SCHEMA_DIR}/Opc.Ua.NodeSet2.HistorizingMinimal.xml) list(APPEND UA_FILE_DATATYPES ${UA_SCHEMA_DIR}/datatypes_historizing.txt) endif() if(UA_ENABLE_QUERY) list(APPEND UA_FILE_DATATYPES ${UA_SCHEMA_DIR}/datatypes_query.txt) endif() if(UA_ENABLE_PUBSUB) list(APPEND UA_FILE_DATATYPES ${UA_SCHEMA_DIR}/datatypes_pubsub.txt) if(UA_ENABLE_PUBSUB_INFORMATIONMODEL) list(APPEND UA_FILE_NODESETS ${UA_SCHEMA_DIR}/Opc.Ua.NodeSet2.PubSubMinimal.xml) endif() endif() if(UA_ENABLE_DA) list(APPEND UA_FILE_DATATYPES ${UA_SCHEMA_DIR}/datatypes_dataaccess.txt) list(APPEND UA_FILE_NODESETS ${UA_SCHEMA_DIR}/Opc.Ua.NodeSet2.Part8_Subset.xml) endif() if(UA_ENABLE_TYPEDESCRIPTION) list(APPEND UA_FILE_DATATYPES ${UA_SCHEMA_DIR}/datatypes_typedescription.txt) endif() endif() list(INSERT UA_FILE_NODESETS 0 "${UA_FILE_NS0_PRIVATE}") set(UA_FILE_NODEIDS ${UA_SCHEMA_DIR}/NodeIds.csv) set(UA_FILE_STATUSCODES ${UA_SCHEMA_DIR}/StatusCode.csv) set(UA_FILE_TYPES_BSD ${UA_SCHEMA_DIR}/Opc.Ua.Types.bsd) # Generate all datatypes -> reset the lists used for filtering if(UA_ENABLE_DATATYPES_ALL) unset(UA_FILE_DATATYPES) endif() # standard-defined data types ua_generate_datatypes(BUILTIN GEN_DOC NAME "types" TARGET_SUFFIX "types" NAMESPACE_IDX 0 FILE_CSV "${UA_FILE_NODEIDS}" FILES_BSD "${UA_FILE_TYPES_BSD}" FILES_SELECTED ${UA_FILE_DATATYPES}) # transport data types ua_generate_datatypes(INTERNAL NAME "transport" TARGET_SUFFIX "transport" NAMESPACE_IDX 1 FILE_CSV "${UA_FILE_NODEIDS}" IMPORT_BSD "TYPES#${UA_FILE_TYPES_BSD}" FILES_BSD "${PROJECT_SOURCE_DIR}/tools/schema/Custom.Opc.Ua.Transport.bsd" FILES_SELECTED "${PROJECT_SOURCE_DIR}/tools/schema/datatypes_transport.txt") # statuscode explanation add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.h ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.c COMMAND ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/generate_statuscode_descriptions.py ${UA_FILE_STATUSCODES} ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_statuscode_descriptions.py ${UA_FILE_STATUSCODES}) # Header containing defines for all NodeIds ua_generate_nodeid_header(NAME "nodeids" ID_PREFIX "NS0" TARGET_SUFFIX "ids-ns0" FILE_CSV "${UA_FILE_NODEIDS}") # we need a custom target to avoid that the generator is called concurrently and # thus overwriting files while the other thread is compiling add_custom_target(open62541-generator-statuscode DEPENDS ${PROJECT_BINARY_DIR}/src_generated/open62541/nodeids.h ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.h ${PROJECT_BINARY_DIR}/src_generated/open62541/statuscodes.c) if(UA_ENABLE_AMALGAMATION) # single-file release add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/open62541.h COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py ${OPEN62541_VERSION} ${CMAKE_CURRENT_BINARY_DIR}/open62541.h ${exported_headers} ${plugin_headers} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py ${exported_headers} ${plugin_headers}) add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/open62541.c COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py ${OPEN62541_VERSION} ${CMAKE_CURRENT_BINARY_DIR}/open62541.c ${lib_headers} ${lib_sources} ${plugin_sources} ${architecture_headers} ${architecture_sources} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py ${lib_headers} ${lib_sources} ${architecture_sources} ${plugin_sources} ${architecture_headers} ${architecture_sources}) add_custom_target(open62541-amalgamation-source DEPENDS ${PROJECT_BINARY_DIR}/open62541.c) add_custom_target(open62541-amalgamation-header DEPENDS ${PROJECT_BINARY_DIR}/open62541.h) add_dependencies(open62541-amalgamation-header open62541-generator-types) add_dependencies(open62541-amalgamation-source open62541-generator-types open62541-generator-transport open62541-generator-statuscode) endif() ua_generate_nodeset(NAME "ns0" FILE ${UA_FILE_NODESETS} INTERNAL BLACKLIST ${UA_FILE_NS0_BLACKLIST} IGNORE "${PROJECT_SOURCE_DIR}/tools/nodeset_compiler/NodeID_NS0_Base.txt" DEPENDS_TARGET "open62541-generator-types") if(UA_ENABLE_NODESET_INJECTOR) message(STATUS "Nodesetinjector feature enabled") cmake_minimum_required(VERSION 3.20) add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/open62541/nodesetinjector.h ${PROJECT_BINARY_DIR}/src_generated/open62541/nodesetinjector.c COMMAND ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/nodeset_injector/generate_nodesetinjector.py ${PROJECT_BINARY_DIR}/src_generated/open62541/nodesetinjector) add_custom_target(open62541-generator-nodesetinjector DEPENDS ${PROJECT_BINARY_DIR}/src_generated/open62541/nodesetinjector.c ${PROJECT_BINARY_DIR}/src_generated/open62541/nodesetinjector.h) set(UA_NODESETINJECTOR_GENERATORS "") set(UA_NODESETINJECTOR_SOURCE_FILES "") set(UA_NODESETINJECTOR_HEADER_FILES "") set(UA_NODESETINJECTOR_EXAMPLE_NAMES "") set(UA_NODESETINJECTOR_TEST_NAMES "") endif() ##################### # Build the Library # ##################### assign_source_group(${exported_headers}) assign_source_group(${lib_headers} ${lib_sources}) assign_source_group(${architecture_headers} ${architecture_sources}) assign_source_group(${plugin_headers} ${plugin_sources}) # When building packages, include the source in the library name to enable parallel # installation of multiple versions. We may break the ABI between minor releases! if(UA_ENABLE_AMALGAMATION) add_library(open62541-object OBJECT ${PROJECT_BINARY_DIR}/open62541.c ${PROJECT_BINARY_DIR}/open62541.h) target_include_directories(open62541-object PRIVATE ${PROJECT_BINARY_DIR}) if(UA_ENABLE_ENCRYPTION_MBEDTLS) target_include_directories(open62541-object PRIVATE ${MBEDTLS_INCLUDE_DIRS}) endif() if(UA_ENABLE_ENCRYPTION_OPENSSL) target_include_directories(open62541-object PRIVATE ${OPENSSL_INCLUDE_DIR}) endif() if(UA_ENABLE_ENCRYPTION_LIBRESSL) target_include_directories(open62541-object PRIVATE ${LIBRESSL_INCLUDE_DIR}) endif() if(UA_ENABLE_NODESETLOADER) target_include_directories(open62541-object PRIVATE ${NODESETLOADER_PUBLIC_INCLUDES} ${NODESETLOADER_PRIVATE_INCLUDES}) endif() # make sure the open62541_amalgamation target builds before so that amalgamation is finished and it is not executed again for open62541-object # and thus may overwrite the amalgamation result during multiprocessor compilation # the header is already a dependency of open62541 target itself add_custom_target(open62541-code-generation DEPENDS open62541-amalgamation-header open62541-generator-types open62541-generator-transport open62541-generator-statuscode open62541-amalgamation-source) add_library(open62541 $) # the only directory that needs to be included if open62541 (amalgameted) target from # the build directory is ${PROJECT_BINARY_DIR}, that contains the generated open62541.h target_include_directories(open62541 PUBLIC $) add_dependencies(open62541-amalgamation-source open62541-generator-namespace) add_dependencies(open62541-amalgamation-header open62541-generator-namespace) else() add_library(open62541-object OBJECT ${lib_sources} ${lib_headers} ${exported_headers}) target_include_directories(open62541-object PRIVATE ${PROJECT_SOURCE_DIR}/src) add_custom_target(open62541-code-generation DEPENDS open62541-generator-types open62541-generator-transport open62541-generator-statuscode open62541-generator-namespace) if(UA_ENABLE_NODESET_INJECTOR) add_dependencies(open62541-code-generation open62541-generator-nodesetinjector) endif() if(UA_ENABLE_COVERAGE) add_coverage(open62541-object) endif() # stack protector and optimization are disabled for the huge ns0 file if(UA_NAMESPACE_ZERO STREQUAL "FULL" AND NOT MSVC) set_source_files_properties(${PROJECT_BINARY_DIR}/src_generated/open62541/namespace0_generated.c PROPERTIES COMPILE_FLAGS "-fno-stack-protector -O0") endif() add_library(open62541-plugins OBJECT ${plugin_sources} ${architecture_sources} ${exported_headers}) add_dependencies(open62541-plugins open62541-generator-types open62541-generator-transport open62541-generator-namespace) target_include_directories(open62541-plugins PRIVATE ${PROJECT_SOURCE_DIR}/plugins) target_include_directories(open62541-plugins PRIVATE ${PROJECT_BINARY_DIR}/src_generated) target_compile_definitions(open62541-plugins PRIVATE -DUA_DYNAMIC_LINKING_EXPORT) set_target_properties(open62541-plugins PROPERTIES FOLDER "open62541/lib") add_library(open62541 $ $) if(UA_ENABLE_ENCRYPTION_LIBRESSL) # Prevent Wincrypt override warning. target_compile_definitions(open62541-plugins PUBLIC NOCRYPT=1) target_compile_definitions(open62541-object PUBLIC NOCRYPT=1) target_compile_definitions(open62541 PUBLIC NOCRYPT=1) endif() # Declare include directories function(include_directories_private) foreach(_include_dir IN ITEMS ${ARGN}) target_include_directories(open62541-object PRIVATE ${_include_dir}) target_include_directories(open62541-plugins PRIVATE ${_include_dir}) endforeach() endfunction() function(include_directories_public) include_directories_private(${ARGN}) foreach(_include_dir IN ITEMS ${ARGN}) target_include_directories(open62541 PUBLIC $) endforeach() endfunction() # Public includes include_directories_public("${PROJECT_SOURCE_DIR}/include" "${PROJECT_SOURCE_DIR}/plugins/include" "${PROJECT_SOURCE_DIR}/deps" "${PROJECT_SOURCE_DIR}/src/pubsub" "${PROJECT_BINARY_DIR}/src_generated") if(UA_ENABLE_NODESETLOADER) include_directories_public(${NODESETLOADER_PUBLIC_INCLUDES}) endif() # Private includes include_directories_private("${PROJECT_BINARY_DIR}") if(UA_ENABLE_ENCRYPTION_MBEDTLS) include_directories_private(${MBEDTLS_INCLUDE_DIRS}) endif() if(UA_ENABLE_ENCRYPTION_OPENSSL) include_directories_private(${OPENSSL_INCLUDE_DIR}) endif() if(UA_ENABLE_ENCRYPTION_LIBRESSL) include_directories_private(${LIBRESSL_INCLUDE_DIR}) endif() if(UA_ENABLE_NODESETLOADER) include_directories_private(${NODESETLOADER_PRIVATE_INCLUDES}) endif() endif() add_dependencies(open62541-object open62541-code-generation) # Ensure that the open62541::open62541 alias can be used inside open62541's build add_library(open62541::open62541 ALIAS open62541) # Export Symbols target_compile_definitions(open62541-object PRIVATE -DUA_DYNAMIC_LINKING_EXPORT) target_compile_definitions(open62541 PRIVATE -DUA_DYNAMIC_LINKING_EXPORT) if(UA_ENABLE_DISCOVERY_MULTICAST) target_compile_definitions(open62541-object PRIVATE -DMDNSD_DYNAMIC_LINKING_EXPORT) target_compile_definitions(open62541 PRIVATE -DMDNSD_DYNAMIC_LINKING_EXPORT) endif() # Generate properly versioned shared library links on Linux SET_TARGET_PROPERTIES(open62541 PROPERTIES SOVERSION "${OPEN62541_VER_MAJOR}.${OPEN62541_VER_MINOR}" VERSION "${OPEN62541_VER_MAJOR}.${OPEN62541_VER_MINOR}.${OPEN62541_VER_PATCH}") # DLL requires linking to dependencies target_link_libraries(open62541 PUBLIC ${open62541_PUBLIC_LIBRARIES}) target_link_libraries(open62541 PRIVATE ${open62541_LIBRARIES}) ########################## # Build Selected Targets # ########################## # always include, builds with make doc add_subdirectory(doc) if(UA_BUILD_EXAMPLES) if(UA_ENABLE_AMALGAMATION) # Cannot compile tests with amalgamation. Not prepared for single header include message(FATAL_ERROR "Examples cannot be built with source amalgamation enabled") endif() add_subdirectory(examples) endif() if(UA_BUILD_UNIT_TESTS) if(UA_ENABLE_AMALGAMATION) # Cannot compile tests with amalgamation. Amalgamation uses the default plugins, not the testing plugins message(FATAL_ERROR "Unit tests cannot be generated with source amalgamation enabled") endif() enable_testing() add_subdirectory(tests) endif() if(UA_BUILD_FUZZING OR UA_BUILD_OSS_FUZZ OR UA_BUILD_FUZZING_CORPUS) add_subdirectory(tests/fuzz) endif() if(UA_BUILD_TOOLS) add_subdirectory(tools/ua-tool) if(UA_ENABLE_JSON_ENCODING) add_subdirectory(tools/ua2json) endif() if(UA_ENABLE_TPM2_KEYSTORE) add_subdirectory(tools/tpm_keystore) endif() endif() ######################## # Linting as target # ######################## set(CMAKE_EXPORT_COMPILE_COMMANDS ON) include(linting_build) include(linting_target) ########################## # Installation # ########################## # invoke via `make install` # specify install location with `-DCMAKE_INSTALL_PREFIX=xyz` # Enable shared library with `-DBUILD_SHARED_LIBS=ON` if(UA_ENABLE_AMALGAMATION) install(CODE "MESSAGE(FATAL_ERROR \"Installation with UA_ENABLE_AMALGAMATION=ON is not possible.\")") endif() # export library (either static or shared depending on BUILD_SHARED_LIBS) install(TARGETS open62541 EXPORT open62541Targets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION include) set(open62541_install_tools_dir share/open62541) set(open62541_install_schema_dir share/open62541/schema) # Create open62541Config.cmake include(CMakePackageConfigHelpers) set(cmake_configfile_install ${CMAKE_INSTALL_LIBDIR}/cmake/open62541) configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/open62541Config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/open62541Config.cmake" INSTALL_DESTINATION "${cmake_configfile_install}" PATH_VARS open62541_install_tools_dir open62541_install_schema_dir) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/open62541Config.cmake" "${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/open62541Macros.cmake" DESTINATION "${cmake_configfile_install}") # Create open62541ConfigVersion.cmake set(open62541_VERSION) get_target_property(open62541_VERSION open62541 VERSION) write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/open62541ConfigVersion.cmake" VERSION ${open62541_VERSION} COMPATIBILITY AnyNewerVersion) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/open62541ConfigVersion.cmake" DESTINATION "${cmake_configfile_install}") # Create open62541Targets.cmake install(EXPORT open62541Targets FILE open62541Targets.cmake DESTINATION "${cmake_configfile_install}" NAMESPACE open62541::) export(TARGETS open62541 NAMESPACE open62541:: FILE ${CMAKE_CURRENT_BINARY_DIR}/open62541Targets.cmake) # Generate and install open62541.pc if(UA_ENABLE_AMALGAMATION) set(PC_EXTRA_CFLAGS "-DUA_ENABLE_AMALGAMATION") endif() set(pkgcfgpubliclibs "") foreach(lib ${open62541_PUBLIC_LIBRARIES}) set(pkgcfgpubliclibs "${pkgcfgpubliclibs}-l${lib} ") endforeach() if(BUILD_SHARED_LIBS) foreach(lib ${open62541_LIBRARIES}) set(pkgcfgpubliclibs "${pkgcfgpubliclibs}-l${lib} ") endforeach() endif() configure_file(tools/open62541.pc.in ${PROJECT_BINARY_DIR}/src_generated/open62541.pc @ONLY) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") install(FILES "${PROJECT_BINARY_DIR}/src_generated/open62541.pc" DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) endif() # Install nodeset compiler install(DIRECTORY "tools/certs" "tools/nodeset_compiler" DESTINATION ${open62541_install_tools_dir} FILES_MATCHING PATTERN "*" PATTERN "__pycache__" EXCLUDE PATTERN "*.pyc" EXCLUDE PATTERN ".git*" EXCLUDE PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE) # Install schemas # Trailing slash to prevent "schema/schema" nesting install(DIRECTORY ${UA_SCHEMA_DIR}/ DESTINATION ${open62541_install_schema_dir} FILES_MATCHING PATTERN "*.xml" PATTERN "*Types.bsd" PATTERN "StatusCode.csv" PATTERN "NodeIds.csv" PERMISSIONS OWNER_READ GROUP_READ) # Install python tools set(UA_install_tools_files "tools/generate_datatypes.py" "tools/generate_nodeid_header.py" "tools/generate_statuscode_descriptions.py") install(FILES ${UA_install_tools_files} DESTINATION ${open62541_install_tools_dir} PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE) # Recreate the include folder structure from the source also in /usr/include/open62541 if(NOT UA_ENABLE_AMALGAMATION) set(FILES_TO_INSTALL ${exported_headers} ${plugin_headers}) set(BASE_PATH_MAIN "${PROJECT_SOURCE_DIR}/include/open62541") set(BASE_PATH_PLUGINS "${PROJECT_SOURCE_DIR}/plugins/include/open62541") set(BASE_PATH_ARCH "${PROJECT_SOURCE_DIR}/arch") set(BASE_PATH_GENERATED "${PROJECT_BINARY_DIR}/src_generated/open62541") set(BASE_PATH_DEPS "${PROJECT_SOURCE_DIR}/deps") foreach ( file ${FILES_TO_INSTALL} ) # Construct a relative path by replacing any occurence of the absolute path set(full_path ${file}) string(REPLACE ${BASE_PATH_MAIN} "" file ${file}) string(REPLACE ${BASE_PATH_PLUGINS} "" file ${file}) string(REPLACE ${BASE_PATH_ARCH} "" file ${file}) string(REPLACE ${BASE_PATH_GENERATED} "" file ${file}) string(REPLACE ${BASE_PATH_DEPS} "" file ${file}) get_filename_component(dir ${file} DIRECTORY) string(FIND "${full_path}" "${BASE_PATH_DEPS}" has_base_path) if("${has_base_path}" EQUAL 0) install(FILES ${full_path} DESTINATION include${dir}) else() install(FILES ${full_path} DESTINATION include/open62541${dir}) endif() endforeach() endif() ################################## # Visual Studio Solution Folders # ################################## set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "_CmakePredifinedTargets") set_target_properties(open62541 PROPERTIES FOLDER "open62541/lib") set_target_properties(open62541-object PROPERTIES FOLDER "open62541/lib") if(UA_ENABLE_AMALGAMATION) set_target_properties(open62541-amalgamation-header PROPERTIES FOLDER "open62541/lib") set_target_properties(open62541-amalgamation-source PROPERTIES FOLDER "open62541/lib") endif() set_target_properties(open62541-generator-namespace PROPERTIES FOLDER "open62541/generators") set_target_properties(open62541-generator-statuscode PROPERTIES FOLDER "open62541/generators") set_target_properties(open62541-generator-transport PROPERTIES FOLDER "open62541/generators") set_target_properties(open62541-generator-types PROPERTIES FOLDER "open62541/generators") if(UA_ENABLE_NODESET_INJECTOR) set_target_properties(open62541-generator-nodesetinjector PROPERTIES FOLDER "open62541/generators") add_subdirectory(tools/nodeset_injector) endif() open62541-1.4.11.1/CODE_OF_CONDUCT.md000066400000000000000000000062341476510625600161200ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: - Using welcoming and inclusive language - Being respectful of differing viewpoints and experiences - Gracefully accepting constructive criticism - Focusing on what is best for the community - Showing empathy towards other community members Examples of unacceptable behavior by participants include: - The use of sexualized language or imagery and unwelcome sexual attention or advances - Trolling, insulting/derogatory comments, and personal or political attacks - Public or private harassment - Publishing others' private information, such as a physical or electronic address, without explicit permission - Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at open62541-core@googlegroups.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ open62541-1.4.11.1/CONTRIBUTING.md000066400000000000000000000510261476510625600155510ustar00rootroot00000000000000# Contributing to open62541 Contributions to open62541 include code, documentation, answering user questions, running the project's infrastructure, and advocating for all types of open62541 users. The open62541 project welcomes all contributions from anyone willing to work in good faith with other contributors and the community. No contribution is too small and all contributions are valued. This guide explains the process for contributing to the open62541 project's core repository and describes what to expect at each step. Thank you for considering these point. Your friendly open62541 community! ## Code of Conduct The open62541 project has a [Code of Conduct](./CODE_OF_CONDUCT.md) that *all* contributors are expected to follow. This code describes the *minimum* behavior expectations for all contributors. ## Pull Requests Everybody can propose a pull request (PR). But only the core-maintainers of the project can merge PR. The following are the minimal requirements that every PR needs to meet. - **Pass Continuous Integration (CI)**: Every PR has to pass our CI. This includes compilation with a range of compilers and for a range of target architectures, passing the unit tests and no detected issues with static code analysis tools. - **Code-Style**: Please consider the [Code-Style](#code-style) recommendations when formatting your code. - **Signed CLA**: Every contributor must sign the Contributor License Agreement (CLA) before we can merge his first PR. The signing can be done online. The link automatically appears on the page of the first PR. In addition, the CLA text can be accessed [here](https://cla-assistant.io/open62541/open62541). - **Separation of Concerns**: Small changes are much easier to review. Typically, small PR are merged much faster. For larger contributions, it might make sense to break them up into a series of PR. For example, a PR with a new feature should not contain other commits with only stylistic improvements to another portion of the code. - **Feature Commits**: The same holds true for the individual PR as well. Every commit inside the PR should do one thing only. If many changes have been applied at the same time, `git add --patch` can be used to partially stage and commit changes that belong together. - **Commit Messages**: Good commit messages help in understanding changes. See the next section. - **Linear Commit History**: Our goal is to maintain a linear commit history where possible. Use the `git rebase` functionality before pushing a PR. Use `git rebase --interactive` to squash bugfix commits. These labels can be used for the PR title to indicate its status. - `[WIP]`: The PR is work in progress and at this point simply informative. - `[Review]`: The PR is ready from the developers perspective. He requests a review from a core-maintainer. - `[Discussion]`: The PR is a contribution to ongoing technical discussions. The PR may be incomplete and is not intended to be merged before the discussion has concluded. The core-maintainers are busy people. If they take especially long to react, feel free to trigger them by additional comments in the PR thread. Again, small PR are much faster to review. It is the job of the developer that posts the PR to rebase the PR on the target branch when the two diverge. ### Changes to the Public API The *public* API is the collection of header files in the /include folder. Changes to the public API are under especially high scrutiny. Public API changes are best discussed with the core-maintainers early on. Simply to avoid duplicate work when changes to the proposed API become necessary. You can create a special issue or PR just for the sake of discussing a proposed API change. The actual implementation can follow later on. Breaking changes are frowned upon. If you cannot avoid API changes, try to create a new one and keep the old API alive (maybe with an addition UA_DEPRECATED macro). Breaking changes have to be mentioned in the CHANGELOG file. ## Commit and PR Hygiene We have very precise rules over how our git commit messages can be formatted. This leads to **more readable messages** that are easy to follow when looking through the **project history**. But also, we use the git commit messages to **generate the change log**. This convention is identical to the [Conventional Commits](https://www.conventionalcommits.org) specification or the one used by Angular. Each commit message consists of a **Header**, a **Body** and a **Footer**. The header has a special format that includes a **Type**, a **Scope** and a **Subject**: ```text ():