From 4d1855fcced103f6eaaf8dbab7e3f43a067e68ae Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:32:52 +0200 Subject: [PATCH 01/13] [INFRA] Add CPM commands to .cmake-format --- .cmake-format.yaml | 77 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/.cmake-format.yaml b/.cmake-format.yaml index d0040eb81f..056fd81402 100644 --- a/.cmake-format.yaml +++ b/.cmake-format.yaml @@ -44,6 +44,83 @@ parse: pargs: 1 kwargs: CYCLIC_DEPENDING_INCLUDES: '+' + cpmaddpackage: + pargs: + nargs: '*' + flags: [] + spelling: CPMAddPackage + kwargs: &cpmaddpackagekwargs + NAME: 1 + FORCE: 1 + VERSION: 1 + GIT_TAG: 1 + DOWNLOAD_ONLY: 1 + GITHUB_REPOSITORY: 1 + GITLAB_REPOSITORY: 1 + GIT_REPOSITORY: 1 + SVN_REPOSITORY: 1 + SVN_REVISION: 1 + SOURCE_DIR: 1 + DOWNLOAD_COMMAND: 1 + FIND_PACKAGE_ARGUMENTS: 1 + NO_CACHE: 1 + GIT_SHALLOW: 1 + URL: 1 + URL_HASH: 1 + URL_MD5: 1 + DOWNLOAD_NAME: 1 + DOWNLOAD_NO_EXTRACT: 1 + HTTP_USERNAME: 1 + HTTP_PASSWORD: 1 + EXCLUDE_FROM_ALL: 1 + SYSTEM: 1 + SOURCE_SUBDIR: 1 + QUIET: 1 + PATCHES: + + OPTIONS: + + cpmfindpackage: + pargs: + nargs: '*' + flags: [] + spelling: CPMFindPackage + kwargs: *cpmaddpackagekwargs + cpmdeclarepackage: + pargs: + nargs: '*' + flags: [] + spelling: CPMDeclarePackage + kwargs: *cpmaddpackagekwargs + packageproject: + pargs: + nargs: '*' + flags: [] + spelling: packageProject + kwargs: + NAME: 1 + VERSION: 1 + NAMESPACE: 1 + INCLUDE_DIR: 1 + INCLUDE_DESTINATION: 1 + INCLUDE_HEADER_PATTERN: 1 + BINARY_DIR: 1 + COMPATIBILITY: 1 + VERSION_HEADER: 1 + EXPORT_HEADER: 1 + DISABLE_VERSION_SUFFIX: 1 + CPACK: 1 + DEPENDENCIES: + + cpmgetpackage: + pargs: 1 + spelling: CPMGetPackage + cpmusepackagelock: + pargs: 1 + spelling: CPMUsePackageLock + cpmregisterpackage: + pargs: 1 + spelling: CPMRegisterPackage + cpmgetpackageversion: + pargs: 2 + spelling: CPMGetPackageVersion _help_override_spec: - Override configurations per-command where available override_spec: {} From 55ea61de6c94253815b6d371c7223e4f1d005f02 Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:34:03 +0200 Subject: [PATCH 02/13] [INFRA] Add CPM --- build_system/CPM.cmake | 22 +++++++++++ build_system/package-lock.cmake | 67 +++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 build_system/CPM.cmake create mode 100644 build_system/package-lock.cmake diff --git a/build_system/CPM.cmake b/build_system/CPM.cmake new file mode 100644 index 0000000000..8f72e92479 --- /dev/null +++ b/build_system/CPM.cmake @@ -0,0 +1,22 @@ +# SPDX-License-Identifier: MIT +# +# SPDX-FileCopyrightText: Copyright (c) 2019-2023 Lars Melchior and contributors + +set (CPM_DOWNLOAD_VERSION 0.40.2) +set (CPM_HASH_SUM "c8cdc32c03816538ce22781ed72964dc864b2a34a310d3b7104812a5ca2d835d") + +if (CPM_SOURCE_CACHE) + set (CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +elseif (DEFINED ENV{CPM_SOURCE_CACHE}) + set (CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +else () + set (CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +endif () + +# Expand relative path. This is important if the provided path contains a tilde (~) +get_filename_component (CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE) + +file (DOWNLOAD https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake + ${CPM_DOWNLOAD_LOCATION} EXPECTED_HASH SHA256=${CPM_HASH_SUM}) + +include (${CPM_DOWNLOAD_LOCATION}) diff --git a/build_system/package-lock.cmake b/build_system/package-lock.cmake new file mode 100644 index 0000000000..900a87feca --- /dev/null +++ b/build_system/package-lock.cmake @@ -0,0 +1,67 @@ +# SPDX-FileCopyrightText: 2006-2024, Knut Reinert & Freie Universität Berlin +# SPDX-FileCopyrightText: 2016-2024, Knut Reinert & MPI für molekulare Genetik +# SPDX-License-Identifier: CC0-1.0 + +# CPM Package Lock +# This file should be committed to version control + +# cereal +set (SEQAN3_CEREAL_VERSION 1.3.2) +CPMDeclarePackage (cereal + NAME cereal + VERSION ${SEQAN3_CEREAL_VERSION} + GITHUB_REPOSITORY USCiLab/cereal + DOWNLOAD_ONLY TRUE + QUIET YES) +# sdsl-lite +# Use URL download of the commit archive such that we do not clone submodules +set (SEQAN3_SDSL_VERSION 14cd017027ea742353fc5b500d1cb1d95896b77e) +CPMDeclarePackage (sdsl-lite + NAME sdsl-lite + GIT_TAG ${SEQAN3_SDSL_VERSION} + URL https://github.com/xxsds/sdsl-lite/archive/${SEQAN3_SDSL_VERSION}.tar.gz + DOWNLOAD_ONLY YES + QUIET YES) +# benchmark +set (SEQAN3_BENCHMARK_VERSION 1.9.0) +CPMDeclarePackage (benchmark + NAME benchmark + VERSION ${SEQAN3_BENCHMARK_VERSION} + GITHUB_REPOSITORY google/benchmark + SYSTEM TRUE + OPTIONS "BENCHMARK_ENABLE_TESTING OFF" "BENCHMARK_ENABLE_WERROR OFF" + "CMAKE_MESSAGE_LOG_LEVEL WARNING") +# googletest +set (SEQAN3_GOOGLETEST_VERSION 1.15.2) +CPMDeclarePackage (googletest + NAME googletest + VERSION ${SEQAN3_GOOGLETEST_VERSION} + GITHUB_REPOSITORY google/googletest + SYSTEM TRUE + OPTIONS "BUILD_GMOCK OFF" "INSTALL_GTEST OFF" "CMAKE_CXX_STANDARD 20" + "CMAKE_MESSAGE_LOG_LEVEL WARNING") +# doxygen-awesome +set (SEQAN3_DOXYGEN_AWESOME_VERSION 2.3.4) +CPMDeclarePackage (doxygen_awesome + NAME doxygen_awesome + VERSION ${SEQAN3_DOXYGEN_AWESOME_VERSION} + GITHUB_REPOSITORY jothepro/doxygen-awesome-css + DOWNLOAD_ONLY TRUE + QUIET YES) +# seqan2 +set (SEQAN3_SEQAN2_VERSION 5f8d538bc6fa5eaaa0b56067abf355ef6f3855dc) +CPMDeclarePackage (seqan2 + NAME seqan2 + GIT_TAG ${SEQAN3_SEQAN2_VERSION} + GITHUB_REPOSITORY seqan/seqan + DOWNLOAD_ONLY YES + QUIET YES) +# use_ccache +set (SEQAN3_USE_CCACHE_VERSION d2a54ef555b6fc2d496a4c9506dbeb7cf899ce37) +CPMDeclarePackage (use_ccache + NAME use_ccache + GIT_TAG ${SEQAN3_USE_CCACHE_VERSION} + GITHUB_REPOSITORY seqan/cmake-scripts + SOURCE_SUBDIR ccache + SYSTEM TRUE + EXCLUDE_FROM_ALL TRUE) From e7c77bab3048e97400de7491ca0d5e2c2e4fe8e9 Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:40:43 +0200 Subject: [PATCH 03/13] [INFRA] Use CPM for cereal and sdsl --- build_system/seqan3-config.cmake | 113 +++++++++++++++++++------------ 1 file changed, 70 insertions(+), 43 deletions(-) diff --git a/build_system/seqan3-config.cmake b/build_system/seqan3-config.cmake index 3983fe4159..e1c6f9b0cb 100644 --- a/build_system/seqan3-config.cmake +++ b/build_system/seqan3-config.cmake @@ -69,7 +69,7 @@ cmake_minimum_required (VERSION 3.5...3.30) # make output globally quiet if required by find_package, this effects cmake functions like `check_*` set (CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET}) -set (CMAKE_REQUIRED_QUIET ${${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY}) +set (CMAKE_REQUIRED_QUIET 1) # ---------------------------------------------------------------------------- # Greeter @@ -112,17 +112,29 @@ macro (seqan3_config_error text) endif () endmacro () +# ---------------------------------------------------------------------------- +# CPM +# ---------------------------------------------------------------------------- + +# This will be true for git clones and source packages, but not for installed packages. +if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/CPM.cmake") + set (SEQAN3_HAS_CPM TRUE) +else () + set (SEQAN3_HAS_CPM FALSE) +endif () + +if (SEQAN3_HAS_CPM) + set (CPM_INDENT " CMake Package Manager CPM: ") + include ("${CMAKE_CURRENT_LIST_DIR}/CPM.cmake") + CPMUsePackageLock ("${CMAKE_CURRENT_LIST_DIR}/package-lock.cmake") +endif () + # ---------------------------------------------------------------------------- # Find SeqAn3 include path # ---------------------------------------------------------------------------- # Note that seqan3-config.cmake can be standalone and thus SEQAN3_CLONE_DIR might be empty. -# * `SEQAN3_CLONE_DIR` was already found in seqan3-config-version.cmake # * `SEQAN3_INCLUDE_DIR` was already found in seqan3-config-version.cmake -find_path (SEQAN3_SUBMODULES_DIR - NAMES submodules/sdsl-lite - HINTS "${SEQAN3_CLONE_DIR}" "${SEQAN3_INCLUDE_DIR}/seqan3") - if (SEQAN3_INCLUDE_DIR) seqan3_config_print ("SeqAn3 include dir found: ${SEQAN3_INCLUDE_DIR}") else () @@ -130,33 +142,35 @@ else () endif () # ---------------------------------------------------------------------------- -# Detect if we are a clone of repository and if yes auto-add submodules +# Require SDSL # ---------------------------------------------------------------------------- -if (SEQAN3_CLONE_DIR) - seqan3_config_print ("Detected as running from a repository checkout…") -endif () +find_path (SEQAN3_SDSL_INCLUDE_DIR + NAMES sdsl/version.hpp + HINTS "${SEQAN3_INCLUDE_DIR}/seqan3/vendor") -if (SEQAN3_SUBMODULES_DIR) - file (GLOB submodules ${SEQAN3_SUBMODULES_DIR}/submodules/*/include) - foreach (submodule ${submodules}) - if (IS_DIRECTORY ${submodule}) - seqan3_config_print (" …adding submodule include: ${submodule}") - set (SEQAN3_DEPENDENCY_INCLUDE_DIRS ${submodule} ${SEQAN3_DEPENDENCY_INCLUDE_DIRS}) - endif () - endforeach () +# 1) Check the vendor directory of SeqAn3. This directory exists for source packages and installed packages. +if (SEQAN3_SDSL_INCLUDE_DIR) + seqan3_config_print ("Required dependency: SDSL found.") + set (SEQAN3_DEPENDENCY_INCLUDE_DIRS ${SEQAN3_SDSL_INCLUDE_DIR} ${SEQAN3_DEPENDENCY_INCLUDE_DIRS}) + # 2) Get package via CPM. +elseif (SEQAN3_HAS_CPM) + CPMGetPackage (sdsl-lite) + + find_path (SEQAN3_SDSL_INCLUDE_DIR + NAMES sdsl/version.hpp + HINTS "${sdsl-lite_SOURCE_DIR}/include") + + if (SEQAN3_SDSL_INCLUDE_DIR) + seqan3_config_print ("Required dependency: SDSL found.") + set (SEQAN3_DEPENDENCY_INCLUDE_DIRS ${SEQAN3_SDSL_INCLUDE_DIR} ${SEQAN3_DEPENDENCY_INCLUDE_DIRS}) + else () + seqan3_config_error ("The SDSL library is required, but wasn't found.") + endif () +else () + seqan3_config_error ("The SDSL library is required, but wasn't found.") endif () -# ---------------------------------------------------------------------------- -# Options for CheckCXXSourceCompiles -# ---------------------------------------------------------------------------- - -# deactivate messages in check_* -set (CMAKE_REQUIRED_QUIET 1) -# use global variables in Check* calls -set (CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH} ${SEQAN3_INCLUDE_DIR} ${SEQAN3_DEPENDENCY_INCLUDE_DIRS}) -set (CMAKE_REQUIRED_FLAGS ${CMAKE_CXX_FLAGS}) - # ---------------------------------------------------------------------------- # Force-deactivate optional dependencies # ---------------------------------------------------------------------------- @@ -254,32 +268,45 @@ else () seqan3_config_print ("Thread support: not found.") endif () -# ---------------------------------------------------------------------------- -# Require SDSL -# ---------------------------------------------------------------------------- - -check_include_file_cxx (sdsl/version.hpp _SEQAN3_HAVE_SDSL) - -if (_SEQAN3_HAVE_SDSL) - seqan3_config_print ("Required dependency: SDSL found.") -else () - seqan3_config_error ( - "The SDSL library is required, but wasn't found. Get it from https://github.com/xxsds/sdsl-lite") -endif () - # ---------------------------------------------------------------------------- # Cereal dependency is optional, but may set as required # ---------------------------------------------------------------------------- if (NOT SEQAN3_NO_CEREAL) - check_include_file_cxx (cereal/cereal.hpp _SEQAN3_HAVE_CEREAL) + find_path (SEQAN3_CEREAL_INCLUDE_DIR + NAMES cereal/version.hpp + HINTS "${SEQAN3_INCLUDE_DIR}/seqan3/vendor") - if (_SEQAN3_HAVE_CEREAL) + # 1) Check the vendor directory of SeqAn3. This directory exists for source packages and installed packages. + if (SEQAN3_CEREAL_INCLUDE_DIR) if (SEQAN3_CEREAL) seqan3_config_print ("Required dependency: Cereal found.") else () seqan3_config_print ("Optional dependency: Cereal found.") endif () + set (SEQAN3_DEPENDENCY_INCLUDE_DIRS ${SEQAN3_CEREAL_INCLUDE_DIR} ${SEQAN3_DEPENDENCY_INCLUDE_DIRS}) + # 2) Get package via CPM. + elseif (SEQAN3_HAS_CPM) + CPMGetPackage (cereal) + + find_path (SEQAN3_CEREAL_INCLUDE_DIR + NAMES cereal/version.hpp + HINTS "${cereal_SOURCE_DIR}/include") + + if (SEQAN3_CEREAL_INCLUDE_DIR) + if (SEQAN3_CEREAL) + seqan3_config_print ("Required dependency: Cereal found.") + else () + seqan3_config_print ("Optional dependency: Cereal found.") + endif () + set (SEQAN3_DEPENDENCY_INCLUDE_DIRS ${SEQAN3_CEREAL_INCLUDE_DIR} ${SEQAN3_DEPENDENCY_INCLUDE_DIRS}) + else () + if (SEQAN3_CEREAL) + seqan3_config_error ("The (optional) cereal library was marked as required, but wasn't found.") + else () + seqan3_config_print ("Optional dependency: Cereal not found.") + endif () + endif () else () if (SEQAN3_CEREAL) seqan3_config_error ("The (optional) cereal library was marked as required, but wasn't found.") From b65f7b289078511d12410302540231b723e75460 Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:41:40 +0200 Subject: [PATCH 04/13] [INFRA] Use CPM for doxygen-awesome --- test/documentation/CMakeLists.txt | 25 + .../doxygen-awesome-darkmode-toggle.js | 160 -- .../doxygen-awesome-fragment-copy-button.js | 88 - .../doxygen-awesome-interactive-toc.js | 84 - .../doxygen-awesome-paragraph-link.js | 54 - .../doxygen-awesome/doxygen-awesome-tabs.js | 72 - .../doxygen-awesome/doxygen-awesome.css | 2525 ----------------- test/documentation/seqan3_doxygen_cfg.in | 12 +- 8 files changed, 31 insertions(+), 2989 deletions(-) delete mode 100644 test/documentation/doxygen-awesome/doxygen-awesome-darkmode-toggle.js delete mode 100644 test/documentation/doxygen-awesome/doxygen-awesome-fragment-copy-button.js delete mode 100644 test/documentation/doxygen-awesome/doxygen-awesome-interactive-toc.js delete mode 100644 test/documentation/doxygen-awesome/doxygen-awesome-paragraph-link.js delete mode 100644 test/documentation/doxygen-awesome/doxygen-awesome-tabs.js delete mode 100644 test/documentation/doxygen-awesome/doxygen-awesome.css diff --git a/test/documentation/CMakeLists.txt b/test/documentation/CMakeLists.txt index e7ee6106e7..284e30c3cc 100644 --- a/test/documentation/CMakeLists.txt +++ b/test/documentation/CMakeLists.txt @@ -9,6 +9,23 @@ cmake_minimum_required (VERSION 3.7...3.30) include (../../build_system/seqan3-config-version.cmake) set (SEQAN3_VERSION "${PACKAGE_VERSION}") +# ---------------------------------------------------------------------------- +# CPM +# ---------------------------------------------------------------------------- + +# This will be true for git clones and source packages. +if (EXISTS "${SEQAN3_INCLUDE_DIR}/../build_system/CPM.cmake") + set (SEQAN3_HAS_CPM TRUE) +else () + set (SEQAN3_HAS_CPM FALSE) +endif () + +if (SEQAN3_HAS_CPM) + set (CPM_INDENT " CMake Package Manager CPM: ") + include ("${SEQAN3_INCLUDE_DIR}/../build_system/CPM.cmake") + CPMUsePackageLock ("${SEQAN3_INCLUDE_DIR}/../build_system/package-lock.cmake") +endif () + project (seqan3 LANGUAGES NONE VERSION "${SEQAN3_PROJECT_VERSION}") @@ -18,6 +35,14 @@ if (NOT EXISTS "${SEQAN3_INCLUDE_DIR}/seqan3/version.hpp") endif () message (STATUS "Found: ${SEQAN3_INCLUDE_DIR} (${SEQAN3_VERSION})") +# 1) Get package via CPM. +if (SEQAN3_HAS_CPM) + CPMGetPackage (doxygen_awesome) +else () + message (FATAL_ERROR "Could not find doxygen-awesome. Not building documentation.") +endif () +message (STATUS "Found: ${doxygen_awesome_SOURCE_DIR}") + set (SEQAN3_DOXYGEN_INPUT_DIR "${CMAKE_SOURCE_DIR}") include (seqan3-doxygen.cmake) diff --git a/test/documentation/doxygen-awesome/doxygen-awesome-darkmode-toggle.js b/test/documentation/doxygen-awesome/doxygen-awesome-darkmode-toggle.js deleted file mode 100644 index e2d7ec6008..0000000000 --- a/test/documentation/doxygen-awesome/doxygen-awesome-darkmode-toggle.js +++ /dev/null @@ -1,160 +0,0 @@ -/* SPDX-FileCopyrightText: 2021 - 2023 jothepro - SPDX-License-Identifier: MIT -*/ -/** - -Doxygen Awesome -https://github.com/jothepro/doxygen-awesome-css - -MIT License - -Copyright (c) 2021 - 2023 jothepro - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ - -class DoxygenAwesomeDarkModeToggle extends HTMLElement { - // SVG icons from https://fonts.google.com/icons - // Licensed under the Apache 2.0 license: - // https://www.apache.org/licenses/LICENSE-2.0.html - static lightModeIcon = `` - static darkModeIcon = `` - static title = "Toggle Light/Dark Mode" - - static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode" - static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode" - - static _staticConstructor = function() { - DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference) - // Update the color scheme when the browsers preference changes - // without user interaction on the website. - window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { - DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() - }) - // Update the color scheme when the tab is made visible again. - // It is possible that the appearance was changed in another tab - // while this tab was in the background. - document.addEventListener("visibilitychange", visibilityState => { - if (document.visibilityState === 'visible') { - DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() - } - }); - }() - - static init() { - $(function() { - $(document).ready(function() { - const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle') - toggleButton.title = DoxygenAwesomeDarkModeToggle.title - toggleButton.updateIcon() - - window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { - toggleButton.updateIcon() - }) - document.addEventListener("visibilitychange", visibilityState => { - if (document.visibilityState === 'visible') { - toggleButton.updateIcon() - } - }); - - $(document).ready(function(){ - document.getElementById("MSearchBox").parentNode.appendChild(toggleButton) - }) - $(window).resize(function(){ - document.getElementById("MSearchBox").parentNode.appendChild(toggleButton) - }) - }) - }) - } - - constructor() { - super(); - this.onclick=this.toggleDarkMode - } - - /** - * @returns `true` for dark-mode, `false` for light-mode system preference - */ - static get systemPreference() { - return window.matchMedia('(prefers-color-scheme: dark)').matches - } - - /** - * @returns `true` for dark-mode, `false` for light-mode user preference - */ - static get userPreference() { - return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) || - (DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)) - } - - static set userPreference(userPreference) { - DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference - if(!userPreference) { - if(DoxygenAwesomeDarkModeToggle.systemPreference) { - localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true) - } else { - localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey) - } - } else { - if(!DoxygenAwesomeDarkModeToggle.systemPreference) { - localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true) - } else { - localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey) - } - } - DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged() - } - - static enableDarkMode(enable) { - if(enable) { - DoxygenAwesomeDarkModeToggle.darkModeEnabled = true - document.documentElement.classList.add("dark-mode") - document.documentElement.classList.remove("light-mode") - } else { - DoxygenAwesomeDarkModeToggle.darkModeEnabled = false - document.documentElement.classList.remove("dark-mode") - document.documentElement.classList.add("light-mode") - } - } - - static onSystemPreferenceChanged() { - DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference - DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) - } - - static onUserPreferenceChanged() { - DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) - } - - toggleDarkMode() { - DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference - this.updateIcon() - } - - updateIcon() { - if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) { - this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon - } else { - this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon - } - } -} - -customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle); diff --git a/test/documentation/doxygen-awesome/doxygen-awesome-fragment-copy-button.js b/test/documentation/doxygen-awesome/doxygen-awesome-fragment-copy-button.js deleted file mode 100644 index 6da6e30df6..0000000000 --- a/test/documentation/doxygen-awesome/doxygen-awesome-fragment-copy-button.js +++ /dev/null @@ -1,88 +0,0 @@ -/* SPDX-FileCopyrightText: 2022 - 2023 jothepro - SPDX-License-Identifier: MIT -*/ -/** - -Doxygen Awesome -https://github.com/jothepro/doxygen-awesome-css - -MIT License - -Copyright (c) 2022 - 2023 jothepro - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ - -class DoxygenAwesomeFragmentCopyButton extends HTMLElement { - constructor() { - super(); - this.onclick=this.copyContent - } - static title = "Copy to clipboard" - static copyIcon = `` - static successIcon = `` - static successDuration = 980 - static init() { - $(function() { - $(document).ready(function() { - if(navigator.clipboard) { - const fragments = document.getElementsByClassName("fragment") - for(const fragment of fragments) { - const fragmentWrapper = document.createElement("div") - fragmentWrapper.className = "doxygen-awesome-fragment-wrapper" - const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button") - fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon - fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title - - fragment.parentNode.replaceChild(fragmentWrapper, fragment) - fragmentWrapper.appendChild(fragment) - fragmentWrapper.appendChild(fragmentCopyButton) - - } - } - }) - }) - } - - - copyContent() { - const content = this.previousSibling.cloneNode(true) - // filter out line number from file listings - content.querySelectorAll(".lineno, .ttc").forEach((node) => { - node.remove() - }) - let textContent = content.textContent - // remove trailing newlines that appear in file listings - let numberOfTrailingNewlines = 0 - while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') { - numberOfTrailingNewlines++; - } - textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines) - navigator.clipboard.writeText(textContent); - this.classList.add("success") - this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon - window.setTimeout(() => { - this.classList.remove("success") - this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon - }, DoxygenAwesomeFragmentCopyButton.successDuration); - } -} - -customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton) diff --git a/test/documentation/doxygen-awesome/doxygen-awesome-interactive-toc.js b/test/documentation/doxygen-awesome/doxygen-awesome-interactive-toc.js deleted file mode 100644 index 35aaa2814c..0000000000 --- a/test/documentation/doxygen-awesome/doxygen-awesome-interactive-toc.js +++ /dev/null @@ -1,84 +0,0 @@ -/* SPDX-FileCopyrightText: 2022 - 2023 jothepro - SPDX-License-Identifier: MIT -*/ -/** - -Doxygen Awesome -https://github.com/jothepro/doxygen-awesome-css - -MIT License - -Copyright (c) 2022 - 2023 jothepro - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ - -class DoxygenAwesomeInteractiveToc { - static topOffset = 38 - static hideMobileMenu = true - static headers = [] - - static init() { - window.addEventListener("load", () => { - let toc = document.querySelector(".contents > .toc") - if(toc) { - toc.classList.add("interactive") - if(!DoxygenAwesomeInteractiveToc.hideMobileMenu) { - toc.classList.add("open") - } - document.querySelector(".contents > .toc > h3")?.addEventListener("click", () => { - if(toc.classList.contains("open")) { - toc.classList.remove("open") - } else { - toc.classList.add("open") - } - }) - - document.querySelectorAll(".contents > .toc > ul a").forEach((node) => { - let id = node.getAttribute("href").substring(1) - DoxygenAwesomeInteractiveToc.headers.push({ - node: node, - headerNode: document.getElementById(id) - }) - - document.getElementById("doc-content")?.addEventListener("scroll", () => { - DoxygenAwesomeInteractiveToc.update() - }) - }) - DoxygenAwesomeInteractiveToc.update() - } - }) - } - - static update() { - let active = DoxygenAwesomeInteractiveToc.headers[0]?.node - DoxygenAwesomeInteractiveToc.headers.forEach((header) => { - let position = header.headerNode.getBoundingClientRect().top - header.node.classList.remove("active") - header.node.classList.remove("aboveActive") - if(position < DoxygenAwesomeInteractiveToc.topOffset) { - active = header.node - active?.classList.add("aboveActive") - } - }) - active?.classList.add("active") - active?.classList.remove("aboveActive") - } -} diff --git a/test/documentation/doxygen-awesome/doxygen-awesome-paragraph-link.js b/test/documentation/doxygen-awesome/doxygen-awesome-paragraph-link.js deleted file mode 100644 index 8006bcb5b5..0000000000 --- a/test/documentation/doxygen-awesome/doxygen-awesome-paragraph-link.js +++ /dev/null @@ -1,54 +0,0 @@ -/* SPDX-FileCopyrightText: 2022 - 2023 jothepro - SPDX-License-Identifier: MIT -*/ -/** - -Doxygen Awesome -https://github.com/jothepro/doxygen-awesome-css - -MIT License - -Copyright (c) 2022 - 2023 jothepro - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ - -class DoxygenAwesomeParagraphLink { - // Icon from https://fonts.google.com/icons - // Licensed under the Apache 2.0 license: - // https://www.apache.org/licenses/LICENSE-2.0.html - static icon = `` - static title = "Permanent Link" - static init() { - $(function() { - $(document).ready(function() { - document.querySelectorAll(".contents a.anchor[id], .contents .groupheader > a[id]").forEach((node) => { - let anchorlink = document.createElement("a") - anchorlink.setAttribute("href", `#${node.getAttribute("id")}`) - anchorlink.setAttribute("title", DoxygenAwesomeParagraphLink.title) - anchorlink.classList.add("anchorlink") - node.classList.add("anchor") - anchorlink.innerHTML = DoxygenAwesomeParagraphLink.icon - node.parentElement.appendChild(anchorlink) - }) - }) - }) - } -} diff --git a/test/documentation/doxygen-awesome/doxygen-awesome-tabs.js b/test/documentation/doxygen-awesome/doxygen-awesome-tabs.js deleted file mode 100644 index 9677897ff9..0000000000 --- a/test/documentation/doxygen-awesome/doxygen-awesome-tabs.js +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-FileCopyrightText: 2023 jothepro -// SPDX-License-Identifier: MIT -/** - -Doxygen Awesome -https://github.com/jothepro/doxygen-awesome-css - -MIT License - -Copyright (c) 2023 jothepro - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ - -class DoxygenAwesomeTabs { - - static init() { - window.addEventListener("load", () => { - document.querySelectorAll(".tabbed:not(:empty)").forEach((tabbed, tabbedIndex) => { - let tabLinkList = [] - tabbed.querySelectorAll("li").forEach((tab, tabIndex) => { - tab.id = "tab_" + tabbedIndex + "_" + tabIndex - let header = tab.querySelector(".tab-title") - let tabLink = document.createElement("button") - tabLink.classList.add("tab-button") - tabLink.appendChild(header) - tabLink.addEventListener("click", () => { - tabbed.querySelectorAll("li").forEach((tab) => { - tab.classList.remove("selected") - }) - tabLinkList.forEach((tabLink) => { - tabLink.classList.remove("active") - }) - tab.classList.add("selected") - tabLink.classList.add("active") - }) - tabLinkList.push(tabLink) - if(tabIndex == 0) { - tab.classList.add("selected") - tabLink.classList.add("active") - } - }) - let tabsOverview = document.createElement("div") - tabsOverview.classList.add("tabs-overview") - let tabsOverviewContainer = document.createElement("div") - tabsOverviewContainer.classList.add("tabs-overview-container") - tabLinkList.forEach((tabLink) => { - tabsOverview.appendChild(tabLink) - }) - tabsOverviewContainer.appendChild(tabsOverview) - tabbed.before(tabsOverviewContainer) - }) - }) - } -} diff --git a/test/documentation/doxygen-awesome/doxygen-awesome.css b/test/documentation/doxygen-awesome/doxygen-awesome.css deleted file mode 100644 index 571b014211..0000000000 --- a/test/documentation/doxygen-awesome/doxygen-awesome.css +++ /dev/null @@ -1,2525 +0,0 @@ -/* SPDX-FileCopyrightText: 2021 - 2023 jothepro - SPDX-License-Identifier: MIT -*/ -/** - -Doxygen Awesome -https://github.com/jothepro/doxygen-awesome-css - -MIT License - -Copyright (c) 2021 - 2023 jothepro - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ - -html { - /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ - --primary-color: #1779c4; - --primary-dark-color: #335c80; - --primary-light-color: #70b1e9; - - /* page base colors */ - --page-background-color: #ffffff; - --page-foreground-color: #2f4153; - --page-secondary-foreground-color: #6f7e8e; - - /* color for all separators on the website: hr, borders, ... */ - --separator-color: #dedede; - - /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ - --border-radius-large: 8px; - --border-radius-small: 4px; - --border-radius-medium: 6px; - - /* default spacings. Most components reference these values for spacing, to provide uniform spacing on the page. */ - --spacing-small: 5px; - --spacing-medium: 10px; - --spacing-large: 16px; - - /* default box shadow used for raising an element above the normal content. Used in dropdowns, search result, ... */ - --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); - - --odd-color: rgba(0,0,0,.028); - - /* font-families. will affect all text on the website - * font-family: the normal font for text, headlines, menus - * font-family-monospace: used for preformatted text in memtitle, code, fragments - */ - --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; - --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; - - /* font sizes */ - --page-font-size: 15.6px; - --navigation-font-size: 14.4px; - --toc-font-size: 13.4px; - --code-font-size: 14px; /* affects code, fragment */ - --title-font-size: 22px; - - /* content text properties. These only affect the page content, not the navigation or any other ui elements */ - --content-line-height: 27px; - /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ - --content-maxwidth: 1050px; - --table-line-height: 24px; - --toc-sticky-top: var(--spacing-medium); - --toc-width: 200px; - --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 85px); - - /* colors for various content boxes: @warning, @note, @deprecated @bug */ - --warning-color: #f8d1cc; - --warning-color-dark: #b61825; - --warning-color-darker: #75070f; - --note-color: #faf3d8; - --note-color-dark: #f3a600; - --note-color-darker: #5f4204; - --todo-color: #e4f3ff; - --todo-color-dark: #1879C4; - --todo-color-darker: #274a5c; - --deprecated-color: #ecf0f3; - --deprecated-color-dark: #5b6269; - --deprecated-color-darker: #43454a; - --bug-color: #e4dafd; - --bug-color-dark: #5b2bdd; - --bug-color-darker: #2a0d72; - --invariant-color: #d8f1e3; - --invariant-color-dark: #44b86f; - --invariant-color-darker: #265532; - - /* blockquote colors */ - --blockquote-background: #f8f9fa; - --blockquote-foreground: #636568; - - /* table colors */ - --tablehead-background: #f1f1f1; - --tablehead-foreground: var(--page-foreground-color); - - /* menu-display: block | none - * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. - * `GENERATE_TREEVIEW` MUST be enabled! - */ - --menu-display: block; - - --menu-focus-foreground: var(--page-background-color); - --menu-focus-background: var(--primary-color); - --menu-selected-background: rgba(0,0,0,.05); - - - --header-background: var(--page-background-color); - --header-foreground: var(--page-foreground-color); - - /* searchbar colors */ - --searchbar-background: var(--side-nav-background); - --searchbar-foreground: var(--page-foreground-color); - - /* searchbar size - * (`searchbar-width` is only applied on screens >= 768px. - * on smaller screens the searchbar will always fill the entire screen width) */ - --searchbar-height: 33px; - --searchbar-width: 210px; - --searchbar-border-radius: var(--searchbar-height); - - /* code block colors */ - --code-background: #f5f5f5; - --code-foreground: var(--page-foreground-color); - - /* fragment colors */ - --fragment-background: #F8F9FA; - --fragment-foreground: #37474F; - --fragment-keyword: #bb6bb2; - --fragment-keywordtype: #8258b3; - --fragment-keywordflow: #d67c3b; - --fragment-token: #438a59; - --fragment-comment: #969696; - --fragment-link: #5383d6; - --fragment-preprocessor: #46aaa5; - --fragment-linenumber-color: #797979; - --fragment-linenumber-background: #f4f4f5; - --fragment-linenumber-border: #e3e5e7; - --fragment-lineheight: 20px; - - /* sidebar navigation (treeview) colors */ - --side-nav-background: #fbfbfb; - --side-nav-foreground: var(--page-foreground-color); - --side-nav-arrow-opacity: 0; - --side-nav-arrow-hover-opacity: 0.9; - - --toc-background: var(--side-nav-background); - --toc-foreground: var(--side-nav-foreground); - - /* height of an item in any tree / collapsible table */ - --tree-item-height: 30px; - - --memname-font-size: var(--code-font-size); - --memtitle-font-size: 18px; - - --webkit-scrollbar-size: 7px; - --webkit-scrollbar-padding: 4px; - --webkit-scrollbar-color: var(--separator-color); -} - -@media screen and (max-width: 767px) { - html { - --page-font-size: 16px; - --navigation-font-size: 16px; - --toc-font-size: 15px; - --code-font-size: 15px; /* affects code, fragment */ - --title-font-size: 22px; - } -} - -@media (prefers-color-scheme: dark) { - html:not(.light-mode) { - color-scheme: dark; - - --primary-color: #1982d2; - --primary-dark-color: #86a9c4; - --primary-light-color: #4779ac; - - --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35); - - --odd-color: rgba(100,100,100,.06); - - --menu-selected-background: rgba(0,0,0,.4); - - --page-background-color: #1C1D1F; - --page-foreground-color: #d2dbde; - --page-secondary-foreground-color: #859399; - --separator-color: #38393b; - --side-nav-background: #252628; - - --code-background: #2a2c2f; - - --tablehead-background: #2a2c2f; - - --blockquote-background: #222325; - --blockquote-foreground: #7e8c92; - - --warning-color: #2e1917; - --warning-color-dark: #ad2617; - --warning-color-darker: #f5b1aa; - --note-color: #3b2e04; - --note-color-dark: #f1b602; - --note-color-darker: #ceb670; - --todo-color: #163750; - --todo-color-dark: #1982D2; - --todo-color-darker: #dcf0fa; - --deprecated-color: #2e323b; - --deprecated-color-dark: #738396; - --deprecated-color-darker: #abb0bd; - --bug-color: #2a2536; - --bug-color-dark: #7661b3; - --bug-color-darker: #ae9ed6; - --invariant-color: #303a35; - --invariant-color-dark: #76ce96; - --invariant-color-darker: #cceed5; - - --fragment-background: #282c34; - --fragment-foreground: #dbe4eb; - --fragment-keyword: #cc99cd; - --fragment-keywordtype: #ab99cd; - --fragment-keywordflow: #e08000; - --fragment-token: #7ec699; - --fragment-comment: #999999; - --fragment-link: #98c0e3; - --fragment-preprocessor: #65cabe; - --fragment-linenumber-color: #cccccc; - --fragment-linenumber-background: #35393c; - --fragment-linenumber-border: #1f1f1f; - } -} - -/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ -html.dark-mode { - color-scheme: dark; - - --primary-color: #1982d2; - --primary-dark-color: #86a9c4; - --primary-light-color: #4779ac; - - --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30); - - --odd-color: rgba(100,100,100,.06); - - --menu-selected-background: rgba(0,0,0,.4); - - --page-background-color: #1C1D1F; - --page-foreground-color: #d2dbde; - --page-secondary-foreground-color: #859399; - --separator-color: #38393b; - --side-nav-background: #252628; - - --code-background: #2a2c2f; - - --tablehead-background: #2a2c2f; - - --blockquote-background: #222325; - --blockquote-foreground: #7e8c92; - - --warning-color: #2e1917; - --warning-color-dark: #ad2617; - --warning-color-darker: #f5b1aa; - --note-color: #3b2e04; - --note-color-dark: #f1b602; - --note-color-darker: #ceb670; - --todo-color: #163750; - --todo-color-dark: #1982D2; - --todo-color-darker: #dcf0fa; - --deprecated-color: #2e323b; - --deprecated-color-dark: #738396; - --deprecated-color-darker: #abb0bd; - --bug-color: #2a2536; - --bug-color-dark: #7661b3; - --bug-color-darker: #ae9ed6; - --invariant-color: #303a35; - --invariant-color-dark: #76ce96; - --invariant-color-darker: #cceed5; - - --fragment-background: #282c34; - --fragment-foreground: #dbe4eb; - --fragment-keyword: #cc99cd; - --fragment-keywordtype: #ab99cd; - --fragment-keywordflow: #e08000; - --fragment-token: #7ec699; - --fragment-comment: #999999; - --fragment-link: #98c0e3; - --fragment-preprocessor: #65cabe; - --fragment-linenumber-color: #cccccc; - --fragment-linenumber-background: #35393c; - --fragment-linenumber-border: #1f1f1f; -} - -body { - color: var(--page-foreground-color); - background-color: var(--page-background-color); - font-size: var(--page-font-size); -} - -body, table, div, p, dl, #nav-tree .label, .title, -.sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, -.SelectItem, #MSearchField, .navpath li.navelem a, -.navpath li.navelem a:hover, p.reference, p.definition { - font-family: var(--font-family); -} - -h1, h2, h3, h4, h5 { - margin-top: .9em; - font-weight: 600; - line-height: initial; -} - -p, div, table, dl, p.reference, p.definition { - font-size: var(--page-font-size); -} - -p.reference, p.definition { - color: var(--page-secondary-foreground-color); -} - -a:link, a:visited, a:hover, a:focus, a:active { - color: var(--primary-color) !important; - font-weight: 500; -} - -a.anchor { - scroll-margin-top: var(--spacing-large); - display: block; -} - -/* - Title and top navigation - */ - -#top { - background: var(--header-background); - border-bottom: 1px solid var(--separator-color); -} - -@media screen and (min-width: 768px) { - #top { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - align-items: center; - } -} - -#main-nav { - flex-grow: 5; - padding: var(--spacing-small) var(--spacing-medium); -} - -#titlearea { - width: auto; - padding: var(--spacing-medium) var(--spacing-large); - background: none; - color: var(--header-foreground); - border-bottom: none; -} - -@media screen and (max-width: 767px) { - #titlearea { - padding-bottom: var(--spacing-small); - } -} - -#titlearea table tbody tr { - height: auto !important; -} - -#projectname { - font-size: var(--title-font-size); - font-weight: 600; -} - -#projectnumber { - font-family: inherit; - font-size: 60%; -} - -#projectbrief { - font-family: inherit; - font-size: 80%; -} - -#projectlogo { - vertical-align: middle; -} - -#projectlogo img { - max-height: calc(var(--title-font-size) * 2); - margin-right: var(--spacing-small); -} - -.sm-dox, .tabs, .tabs2, .tabs3 { - background: none; - padding: 0; -} - -.tabs, .tabs2, .tabs3 { - border-bottom: 1px solid var(--separator-color); - margin-bottom: -1px; -} - -.main-menu-btn-icon, .main-menu-btn-icon:before, .main-menu-btn-icon:after { - background: var(--page-secondary-foreground-color); -} - -@media screen and (max-width: 767px) { - .sm-dox a span.sub-arrow { - background: var(--code-background); - } - - #main-menu a.has-submenu span.sub-arrow { - color: var(--page-secondary-foreground-color); - border-radius: var(--border-radius-medium); - } - - #main-menu a.has-submenu:hover span.sub-arrow { - color: var(--page-foreground-color); - } -} - -@media screen and (min-width: 768px) { - .sm-dox li, .tablist li { - display: var(--menu-display); - } - - .sm-dox a span.sub-arrow { - border-color: var(--header-foreground) transparent transparent transparent; - } - - .sm-dox a:hover span.sub-arrow { - border-color: var(--menu-focus-foreground) transparent transparent transparent; - } - - .sm-dox ul a span.sub-arrow { - border-color: transparent transparent transparent var(--page-foreground-color); - } - - .sm-dox ul a:hover span.sub-arrow { - border-color: transparent transparent transparent var(--menu-focus-foreground); - } -} - -.sm-dox ul { - background: var(--page-background-color); - box-shadow: var(--box-shadow); - border: 1px solid var(--separator-color); - border-radius: var(--border-radius-medium) !important; - padding: var(--spacing-small); - animation: ease-out 150ms slideInMenu; -} - -@keyframes slideInMenu { - from { - opacity: 0; - transform: translate(0px, -2px); - } - - to { - opacity: 1; - transform: translate(0px, 0px); - } -} - -.sm-dox ul a { - color: var(--page-foreground-color) !important; - background: var(--page-background-color); - font-size: var(--navigation-font-size); -} - -.sm-dox>li>ul:after { - border-bottom-color: var(--page-background-color) !important; -} - -.sm-dox>li>ul:before { - border-bottom-color: var(--separator-color) !important; -} - -.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { - font-size: var(--navigation-font-size) !important; - color: var(--menu-focus-foreground) !important; - text-shadow: none; - background-color: var(--menu-focus-background); - border-radius: var(--border-radius-small) !important; -} - -.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { - text-shadow: none; - background: transparent; - background-image: none !important; - color: var(--header-foreground) !important; - font-weight: normal; - font-size: var(--navigation-font-size); - border-radius: var(--border-radius-small) !important; -} - -.sm-dox a:focus { - outline: auto; -} - -.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { - text-shadow: none; - font-weight: normal; - background: var(--menu-focus-background); - color: var(--menu-focus-foreground) !important; - border-radius: var(--border-radius-small) !important; - font-size: var(--navigation-font-size); -} - -.tablist li.current { - border-radius: var(--border-radius-small); - background: var(--menu-selected-background); -} - -.tablist li { - margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); -} - -.tablist a { - padding: 0 var(--spacing-large); -} - - -/* - Search box - */ - -#MSearchBox { - height: var(--searchbar-height); - background: var(--searchbar-background); - border-radius: var(--searchbar-border-radius); - border: 1px solid var(--separator-color); - overflow: hidden; - width: var(--searchbar-width); - position: relative; - box-shadow: none; - display: block; - margin-top: 0; -} - -/* until Doxygen 1.9.4 */ -.left img#MSearchSelect { - left: 0; - user-select: none; - padding-left: 8px; -} - -/* Doxygen 1.9.5 */ -.left span#MSearchSelect { - left: 0; - user-select: none; - margin-left: 8px; - padding: 0; -} - -.left #MSearchSelect[src$=".png"] { - padding-left: 0 -} - -.SelectionMark { - user-select: none; -} - -.tabs .left #MSearchSelect { - padding-left: 0; -} - -.tabs #MSearchBox { - position: absolute; - right: var(--spacing-medium); -} - -@media screen and (max-width: 767px) { - .tabs #MSearchBox { - position: relative; - right: 0; - margin-left: var(--spacing-medium); - margin-top: 0; - } -} - -#MSearchSelectWindow, #MSearchResultsWindow { - z-index: 9999; -} - -#MSearchBox.MSearchBoxActive { - border-color: var(--primary-color); - box-shadow: inset 0 0 0 1px var(--primary-color); -} - -#main-menu > li:last-child { - margin-right: 0; -} - -@media screen and (max-width: 767px) { - #main-menu > li:last-child { - height: 50px; - } -} - -#MSearchField { - font-size: var(--navigation-font-size); - height: calc(var(--searchbar-height) - 2px); - background: transparent; - width: calc(var(--searchbar-width) - 64px); -} - -.MSearchBoxActive #MSearchField { - color: var(--searchbar-foreground); -} - -#MSearchSelect { - top: calc(calc(var(--searchbar-height) / 2) - 11px); -} - -#MSearchBox span.left, #MSearchBox span.right { - background: none; - background-image: none; -} - -#MSearchBox span.right { - padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); - position: absolute; - right: var(--spacing-small); -} - -.tabs #MSearchBox span.right { - top: calc(calc(var(--searchbar-height) / 2) - 12px); -} - -@keyframes slideInSearchResults { - from { - opacity: 0; - transform: translate(0, 15px); - } - - to { - opacity: 1; - transform: translate(0, 20px); - } -} - -#MSearchResultsWindow { - left: auto !important; - right: var(--spacing-medium); - border-radius: var(--border-radius-large); - border: 1px solid var(--separator-color); - transform: translate(0, 20px); - box-shadow: var(--box-shadow); - animation: ease-out 280ms slideInSearchResults; - background: var(--page-background-color); -} - -iframe#MSearchResults { - margin: 4px; -} - -iframe { - color-scheme: normal; -} - -@media (prefers-color-scheme: dark) { - html:not(.light-mode) iframe#MSearchResults { - filter: invert() hue-rotate(180deg); - } -} - -html.dark-mode iframe#MSearchResults { - filter: invert() hue-rotate(180deg); -} - -#MSearchResults .SRPage { - background-color: transparent; -} - -#MSearchResults .SRPage .SREntry { - font-size: 10pt; - padding: var(--spacing-small) var(--spacing-medium); -} - -#MSearchSelectWindow { - border: 1px solid var(--separator-color); - border-radius: var(--border-radius-medium); - box-shadow: var(--box-shadow); - background: var(--page-background-color); - padding-top: var(--spacing-small); - padding-bottom: var(--spacing-small); -} - -#MSearchSelectWindow a.SelectItem { - font-size: var(--navigation-font-size); - line-height: var(--content-line-height); - margin: 0 var(--spacing-small); - border-radius: var(--border-radius-small); - color: var(--page-foreground-color) !important; - font-weight: normal; -} - -#MSearchSelectWindow a.SelectItem:hover { - background: var(--menu-focus-background); - color: var(--menu-focus-foreground) !important; -} - -@media screen and (max-width: 767px) { - #MSearchBox { - margin-top: var(--spacing-medium); - margin-bottom: var(--spacing-medium); - width: calc(100vw - 30px); - } - - #main-menu > li:last-child { - float: none !important; - } - - #MSearchField { - width: calc(100vw - 110px); - } - - @keyframes slideInSearchResultsMobile { - from { - opacity: 0; - transform: translate(0, 15px); - } - - to { - opacity: 1; - transform: translate(0, 20px); - } - } - - #MSearchResultsWindow { - left: var(--spacing-medium) !important; - right: var(--spacing-medium); - overflow: auto; - transform: translate(0, 20px); - animation: ease-out 280ms slideInSearchResultsMobile; - width: auto !important; - } - - /* - * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 - */ - label.main-menu-btn ~ #searchBoxPos1 { - top: 3px !important; - right: 6px !important; - left: 45px; - display: flex; - } - - label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { - margin-top: 0; - margin-bottom: 0; - flex-grow: 2; - float: left; - } -} - -/* - Tree view - */ - -#side-nav { - padding: 0 !important; - background: var(--side-nav-background); -} - -@media screen and (max-width: 767px) { - #side-nav { - display: none; - } - - #doc-content { - margin-left: 0 !important; - } -} - -#nav-tree { - background: transparent; - margin-right: 1px; -} - -#nav-tree .label { - font-size: var(--navigation-font-size); -} - -#nav-tree .item { - height: var(--tree-item-height); - line-height: var(--tree-item-height); -} - -#nav-sync { - bottom: 12px; - right: 12px; - top: auto !important; - user-select: none; -} - -#nav-tree .selected { - text-shadow: none; - background-image: none; - background-color: transparent; - position: relative; -} - -#nav-tree .selected::after { - content: ""; - position: absolute; - top: 1px; - bottom: 1px; - left: 0; - width: 4px; - border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; - background: var(--primary-color); -} - - -#nav-tree a { - color: var(--side-nav-foreground) !important; - font-weight: normal; -} - -#nav-tree a:focus { - outline-style: auto; -} - -#nav-tree .arrow { - opacity: var(--side-nav-arrow-opacity); -} - -.arrow { - color: inherit; - cursor: pointer; - font-size: 45%; - vertical-align: middle; - margin-right: 2px; - font-family: serif; - height: auto; - text-align: right; -} - -#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { - opacity: var(--side-nav-arrow-hover-opacity); -} - -#nav-tree .selected a { - color: var(--primary-color) !important; - font-weight: bolder; - font-weight: 600; -} - -.ui-resizable-e { - background: var(--separator-color); - width: 1px; -} - -/* - Contents - */ - -div.header { - border-bottom: 1px solid var(--separator-color); - background-color: var(--page-background-color); - background-image: none; -} - -@media screen and (min-width: 1000px) { - #doc-content > div > div.contents, - .PageDoc > div.contents { - display: flex; - flex-direction: row-reverse; - flex-wrap: nowrap; - align-items: flex-start; - } - - div.contents .textblock { - min-width: 200px; - flex-grow: 1; - } -} - -div.contents, div.header .title, div.header .summary { - max-width: var(--content-maxwidth); -} - -div.contents, div.header .title { - line-height: initial; - margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; -} - -div.header .summary { - margin: var(--spacing-medium) auto 0 auto; -} - -div.headertitle { - padding: 0; -} - -div.header .title { - font-weight: 600; - font-size: 225%; - padding: var(--spacing-medium) var(--spacing-large); - word-break: break-word; -} - -div.header .summary { - width: auto; - display: block; - float: none; - padding: 0 var(--spacing-large); -} - -td.memSeparator { - border-color: var(--separator-color); -} - -span.mlabel { - background: var(--primary-color); - border: none; - padding: 4px 9px; - border-radius: 12px; - margin-right: var(--spacing-medium); -} - -span.mlabel:last-of-type { - margin-right: 2px; -} - -div.contents { - padding: 0 var(--spacing-large); -} - -div.contents p, div.contents li { - line-height: var(--content-line-height); -} - -div.contents div.dyncontent { - margin: var(--spacing-medium) 0; -} - -@media (prefers-color-scheme: dark) { - html:not(.light-mode) div.contents div.dyncontent img, - html:not(.light-mode) div.contents center img, - html:not(.light-mode) div.contents > table img, - html:not(.light-mode) div.contents div.dyncontent iframe, - html:not(.light-mode) div.contents center iframe, - html:not(.light-mode) div.contents table iframe, - html:not(.light-mode) div.contents .dotgraph iframe { - filter: brightness(89%) hue-rotate(180deg) invert(); - } -} - -html.dark-mode div.contents div.dyncontent img, -html.dark-mode div.contents center img, -html.dark-mode div.contents > table img, -html.dark-mode div.contents div.dyncontent iframe, -html.dark-mode div.contents center iframe, -html.dark-mode div.contents table iframe, -html.dark-mode div.contents .dotgraph iframe - { - filter: brightness(89%) hue-rotate(180deg) invert(); -} - -h2.groupheader { - border-bottom: 0px; - color: var(--page-foreground-color); - box-shadow: - 100px 0 var(--page-background-color), - -100px 0 var(--page-background-color), - 100px 0.75px var(--separator-color), - -100px 0.75px var(--separator-color), - 500px 0 var(--page-background-color), - -500px 0 var(--page-background-color), - 500px 0.75px var(--separator-color), - -500px 0.75px var(--separator-color), - 900px 0 var(--page-background-color), - -900px 0 var(--page-background-color), - 900px 0.75px var(--separator-color), - -900px 0.75px var(--separator-color), - 1400px 0 var(--page-background-color), - -1400px 0 var(--page-background-color), - 1400px 0.75px var(--separator-color), - -1400px 0.75px var(--separator-color), - 1900px 0 var(--page-background-color), - -1900px 0 var(--page-background-color), - 1900px 0.75px var(--separator-color), - -1900px 0.75px var(--separator-color); -} - -blockquote { - margin: 0 var(--spacing-medium) 0 var(--spacing-medium); - padding: var(--spacing-small) var(--spacing-large); - background: var(--blockquote-background); - color: var(--blockquote-foreground); - border-left: 0; - overflow: visible; - border-radius: var(--border-radius-medium); - overflow: visible; - position: relative; -} - -blockquote::before, blockquote::after { - font-weight: bold; - font-family: serif; - font-size: 360%; - opacity: .15; - position: absolute; -} - -blockquote::before { - content: "“"; - left: -10px; - top: 4px; -} - -blockquote::after { - content: "”"; - right: -8px; - bottom: -25px; -} - -blockquote p { - margin: var(--spacing-small) 0 var(--spacing-medium) 0; -} -.paramname { - font-weight: 600; - color: var(--primary-dark-color); -} - -.paramname > code { - border: 0; -} - -table.params .paramname { - font-weight: 600; - font-family: var(--font-family-monospace); - font-size: var(--code-font-size); - padding-right: var(--spacing-small); - line-height: var(--table-line-height); -} - -h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { - text-shadow: 0 0 15px var(--primary-light-color); -} - -.alphachar a { - color: var(--page-foreground-color); -} - -.dotgraph { - max-width: 100%; - overflow-x: scroll; -} - -.dotgraph .caption { - position: sticky; - left: 0; -} - -/* Wrap Graphviz graphs with the `interactive_dotgraph` class if `INTERACTIVE_SVG = YES` */ -.interactive_dotgraph .dotgraph iframe { - max-width: 100%; -} - -/* - Table of Contents - */ - -div.contents .toc { - max-height: var(--toc-max-height); - min-width: var(--toc-width); - border: 0; - border-left: 1px solid var(--separator-color); - border-radius: 0; - background-color: transparent; - box-shadow: none; - position: sticky; - top: var(--toc-sticky-top); - padding: 0 var(--spacing-large); - margin: var(--spacing-small) 0 var(--spacing-large) var(--spacing-large); -} - -div.toc h3 { - color: var(--toc-foreground); - font-size: var(--navigation-font-size); - margin: var(--spacing-large) 0 var(--spacing-medium) 0; -} - -div.toc li { - padding: 0; - background: none; - line-height: var(--toc-font-size); - margin: var(--toc-font-size) 0 0 0; -} - -div.toc li::before { - display: none; -} - -div.toc ul { - margin-top: 0 -} - -div.toc li a { - font-size: var(--toc-font-size); - color: var(--page-foreground-color) !important; - text-decoration: none; -} - -div.toc li a:hover, div.toc li a.active { - color: var(--primary-color) !important; -} - -div.toc li a.aboveActive { - color: var(--page-secondary-foreground-color) !important; -} - - -@media screen and (max-width: 999px) { - div.contents .toc { - max-height: 45vh; - float: none; - width: auto; - margin: 0 0 var(--spacing-medium) 0; - position: relative; - top: 0; - position: relative; - border: 1px solid var(--separator-color); - border-radius: var(--border-radius-medium); - background-color: var(--toc-background); - box-shadow: var(--box-shadow); - } - - div.contents .toc.interactive { - max-height: calc(var(--navigation-font-size) + 2 * var(--spacing-large)); - overflow: hidden; - } - - div.contents .toc > h3 { - -webkit-tap-highlight-color: transparent; - cursor: pointer; - position: sticky; - top: 0; - background-color: var(--toc-background); - margin: 0; - padding: var(--spacing-large) 0; - display: block; - } - - div.contents .toc.interactive > h3::before { - content: ""; - width: 0; - height: 0; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 5px solid var(--primary-color); - display: inline-block; - margin-right: var(--spacing-small); - margin-bottom: calc(var(--navigation-font-size) / 4); - transform: rotate(-90deg); - transition: transform 0.25s ease-out; - } - - div.contents .toc.interactive.open > h3::before { - transform: rotate(0deg); - } - - div.contents .toc.interactive.open { - max-height: 45vh; - overflow: auto; - transition: max-height 0.2s ease-in-out; - } - - div.contents .toc a, div.contents .toc a.active { - color: var(--primary-color) !important; - } - - div.contents .toc a:hover { - text-decoration: underline; - } -} - -/* - Code & Fragments - */ - -code, div.fragment, pre.fragment { - border-radius: var(--border-radius-small); - border: 1px solid var(--separator-color); - overflow: hidden; -} - -code { - display: inline; - background: var(--code-background); - color: var(--code-foreground); - padding: 2px 6px; -} - -div.fragment, pre.fragment { - margin: var(--spacing-medium) 0; - padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large); - background: var(--fragment-background); - color: var(--fragment-foreground); - overflow-x: auto; -} - -@media screen and (max-width: 767px) { - div.fragment, pre.fragment { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-right: 0; - } - - .contents > div.fragment, - .textblock > div.fragment, - .textblock > pre.fragment, - .contents > .doxygen-awesome-fragment-wrapper > div.fragment, - .textblock > .doxygen-awesome-fragment-wrapper > div.fragment, - .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment { - margin: var(--spacing-medium) calc(0px - var(--spacing-large)); - border-radius: 0; - border-left: 0; - } - - .textblock li > .fragment, - .textblock li > .doxygen-awesome-fragment-wrapper > .fragment { - margin: var(--spacing-medium) calc(0px - var(--spacing-large)); - } - - .memdoc li > .fragment, - .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment { - margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); - } - - .textblock ul, .memdoc ul { - overflow: initial; - } - - .memdoc > div.fragment, - .memdoc > pre.fragment, - dl dd > div.fragment, - dl dd pre.fragment, - .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment, - .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment, - dl dd > .doxygen-awesome-fragment-wrapper > div.fragment, - dl dd .doxygen-awesome-fragment-wrapper > pre.fragment { - margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); - border-radius: 0; - border-left: 0; - } -} - -code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { - font-family: var(--font-family-monospace); - font-size: var(--code-font-size) !important; -} - -div.line:after { - margin-right: var(--spacing-medium); -} - -div.fragment .line, pre.fragment { - white-space: pre; - word-wrap: initial; - line-height: var(--fragment-lineheight); -} - -div.fragment span.keyword { - color: var(--fragment-keyword); -} - -div.fragment span.keywordtype { - color: var(--fragment-keywordtype); -} - -div.fragment span.keywordflow { - color: var(--fragment-keywordflow); -} - -div.fragment span.stringliteral { - color: var(--fragment-token) -} - -div.fragment span.comment { - color: var(--fragment-comment); -} - -div.fragment a.code { - color: var(--fragment-link) !important; -} - -div.fragment span.preprocessor { - color: var(--fragment-preprocessor); -} - -div.fragment span.lineno { - display: inline-block; - width: 27px; - border-right: none; - background: var(--fragment-linenumber-background); - color: var(--fragment-linenumber-color); -} - -div.fragment span.lineno a { - background: none; - color: var(--fragment-link) !important; -} - -div.fragment .line:first-child .lineno { - box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); -} - -div.line { - border-radius: var(--border-radius-small); -} - -div.line.glow { - background-color: var(--primary-light-color); - box-shadow: none; -} - -/* - dl warning, attention, note, deprecated, bug, ... - */ - -dl.bug dt a, dl.deprecated dt a, dl.todo dt a { - font-weight: bold !important; -} - -dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.post, dl.todo, dl.remark { - padding: var(--spacing-medium); - margin: var(--spacing-medium) 0; - color: var(--page-background-color); - overflow: hidden; - margin-left: 0; - border-radius: var(--border-radius-small); -} - -dl.section dd { - margin-bottom: 2px; -} - -dl.warning, dl.attention { - background: var(--warning-color); - border-left: 8px solid var(--warning-color-dark); - color: var(--warning-color-darker); -} - -dl.warning dt, dl.attention dt { - color: var(--warning-color-dark); -} - -dl.note, dl.remark { - background: var(--note-color); - border-left: 8px solid var(--note-color-dark); - color: var(--note-color-darker); -} - -dl.note dt, dl.remark dt { - color: var(--note-color-dark); -} - -dl.todo { - background: var(--todo-color); - border-left: 8px solid var(--todo-color-dark); - color: var(--todo-color-darker); -} - -dl.todo dt { - color: var(--todo-color-dark); -} - -dl.bug dt a { - color: var(--todo-color-dark) !important; -} - -dl.bug { - background: var(--bug-color); - border-left: 8px solid var(--bug-color-dark); - color: var(--bug-color-darker); -} - -dl.bug dt a { - color: var(--bug-color-dark) !important; -} - -dl.deprecated { - background: var(--deprecated-color); - border-left: 8px solid var(--deprecated-color-dark); - color: var(--deprecated-color-darker); -} - -dl.deprecated dt a { - color: var(--deprecated-color-dark) !important; -} - -dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { - margin-inline-start: 0px; -} - -dl.invariant, dl.pre, dl.post { - background: var(--invariant-color); - border-left: 8px solid var(--invariant-color-dark); - color: var(--invariant-color-darker); -} - -dl.invariant dt, dl.pre dt, dl.post dt { - color: var(--invariant-color-dark); -} - -/* - memitem - */ - -div.memdoc, div.memproto, h2.memtitle { - box-shadow: none; - background-image: none; - border: none; -} - -div.memdoc { - padding: 0 var(--spacing-medium); - background: var(--page-background-color); -} - -h2.memtitle, div.memitem { - border: 1px solid var(--separator-color); - box-shadow: var(--box-shadow); -} - -h2.memtitle { - box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow); -} - -div.memitem { - transition: none; -} - -div.memproto, h2.memtitle { - background: var(--fragment-background); -} - -h2.memtitle { - font-weight: 500; - font-size: var(--memtitle-font-size); - font-family: var(--font-family-monospace); - border-bottom: none; - border-top-left-radius: var(--border-radius-medium); - border-top-right-radius: var(--border-radius-medium); - word-break: break-all; - position: relative; -} - -h2.memtitle:after { - content: ""; - display: block; - background: var(--fragment-background); - height: var(--spacing-medium); - bottom: calc(0px - var(--spacing-medium)); - left: 0; - right: -14px; - position: absolute; - border-top-right-radius: var(--border-radius-medium); -} - -h2.memtitle > span.permalink { - font-size: inherit; -} - -h2.memtitle > span.permalink > a { - text-decoration: none; - padding-left: 3px; - margin-right: -4px; - user-select: none; - display: inline-block; - margin-top: -6px; -} - -h2.memtitle > span.permalink > a:hover { - color: var(--primary-dark-color) !important; -} - -a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { - border-color: var(--primary-light-color); -} - -div.memitem { - border-top-right-radius: var(--border-radius-medium); - border-bottom-right-radius: var(--border-radius-medium); - border-bottom-left-radius: var(--border-radius-medium); - overflow: hidden; - display: block !important; -} - -div.memdoc { - border-radius: 0; -} - -div.memproto { - border-radius: 0 var(--border-radius-small) 0 0; - overflow: auto; - border-bottom: 1px solid var(--separator-color); - padding: var(--spacing-medium); - margin-bottom: -1px; -} - -div.memtitle { - border-top-right-radius: var(--border-radius-medium); - border-top-left-radius: var(--border-radius-medium); -} - -div.memproto table.memname { - font-family: var(--font-family-monospace); - color: var(--page-foreground-color); - font-size: var(--memname-font-size); - text-shadow: none; -} - -div.memproto div.memtemplate { - font-family: var(--font-family-monospace); - color: var(--primary-dark-color); - font-size: var(--memname-font-size); - margin-left: 2px; - text-shadow: none; -} - -table.mlabels, table.mlabels > tbody { - display: block; -} - -td.mlabels-left { - width: auto; -} - -td.mlabels-right { - margin-top: 3px; - position: sticky; - left: 0; -} - -table.mlabels > tbody > tr:first-child { - display: flex; - justify-content: space-between; - flex-wrap: wrap; -} - -.memname, .memitem span.mlabels { - margin: 0 -} - -/* - reflist - */ - -dl.reflist { - box-shadow: var(--box-shadow); - border-radius: var(--border-radius-medium); - border: 1px solid var(--separator-color); - overflow: hidden; - padding: 0; -} - - -dl.reflist dt, dl.reflist dd { - box-shadow: none; - text-shadow: none; - background-image: none; - border: none; - padding: 12px; -} - - -dl.reflist dt { - font-weight: 500; - border-radius: 0; - background: var(--code-background); - border-bottom: 1px solid var(--separator-color); - color: var(--page-foreground-color) -} - - -dl.reflist dd { - background: none; -} - -/* - Table - */ - -.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname), -.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { - display: inline-block; - max-width: 100%; -} - -.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) { - margin-left: calc(0px - var(--spacing-large)); - margin-right: calc(0px - var(--spacing-large)); - max-width: calc(100% + 2 * var(--spacing-large)); -} - -table.fieldtable, -table.markdownTable tbody, -table.doxtable tbody { - border: none; - margin: var(--spacing-medium) 0; - box-shadow: 0 0 0 1px var(--separator-color); - border-radius: var(--border-radius-small); -} - -table.markdownTable, table.doxtable, table.fieldtable { - padding: 1px; -} - -table.doxtable caption { - display: block; -} - -table.fieldtable { - border-collapse: collapse; - width: 100%; -} - -th.markdownTableHeadLeft, -th.markdownTableHeadRight, -th.markdownTableHeadCenter, -th.markdownTableHeadNone, -table.doxtable th { - background: var(--tablehead-background); - color: var(--tablehead-foreground); - font-weight: 600; - font-size: var(--page-font-size); -} - -th.markdownTableHeadLeft:first-child, -th.markdownTableHeadRight:first-child, -th.markdownTableHeadCenter:first-child, -th.markdownTableHeadNone:first-child, -table.doxtable tr th:first-child { - border-top-left-radius: var(--border-radius-small); -} - -th.markdownTableHeadLeft:last-child, -th.markdownTableHeadRight:last-child, -th.markdownTableHeadCenter:last-child, -th.markdownTableHeadNone:last-child, -table.doxtable tr th:last-child { - border-top-right-radius: var(--border-radius-small); -} - -table.markdownTable td, -table.markdownTable th, -table.fieldtable td, -table.fieldtable th, -table.doxtable td, -table.doxtable th { - border: 1px solid var(--separator-color); - padding: var(--spacing-small) var(--spacing-medium); -} - -table.markdownTable td:last-child, -table.markdownTable th:last-child, -table.fieldtable td:last-child, -table.fieldtable th:last-child, -table.doxtable td:last-child, -table.doxtable th:last-child { - border-right: none; -} - -table.markdownTable td:first-child, -table.markdownTable th:first-child, -table.fieldtable td:first-child, -table.fieldtable th:first-child, -table.doxtable td:first-child, -table.doxtable th:first-child { - border-left: none; -} - -table.markdownTable tr:first-child td, -table.markdownTable tr:first-child th, -table.fieldtable tr:first-child td, -table.fieldtable tr:first-child th, -table.doxtable tr:first-child td, -table.doxtable tr:first-child th { - border-top: none; -} - -table.markdownTable tr:last-child td, -table.markdownTable tr:last-child th, -table.fieldtable tr:last-child td, -table.fieldtable tr:last-child th, -table.doxtable tr:last-child td, -table.doxtable tr:last-child th { - border-bottom: none; -} - -table.markdownTable tr, table.doxtable tr { - border-bottom: 1px solid var(--separator-color); -} - -table.markdownTable tr:last-child, table.doxtable tr:last-child { - border-bottom: none; -} - -.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { - display: block; -} - -.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { - display: table; - width: 100%; -} - -table.fieldtable th { - font-size: var(--page-font-size); - font-weight: 600; - background-image: none; - background-color: var(--tablehead-background); - color: var(--tablehead-foreground); -} - -table.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fielddoc, .fieldtable th { - border-bottom: 1px solid var(--separator-color); - border-right: 1px solid var(--separator-color); -} - -table.fieldtable tr:last-child td:first-child { - border-bottom-left-radius: var(--border-radius-small); -} - -table.fieldtable tr:last-child td:last-child { - border-bottom-right-radius: var(--border-radius-small); -} - -.memberdecls td.glow, .fieldtable tr.glow { - background-color: var(--primary-light-color); - box-shadow: none; -} - -table.memberdecls { - display: block; - -webkit-tap-highlight-color: transparent; -} - -table.memberdecls tr[class^='memitem'] { - font-family: var(--font-family-monospace); - font-size: var(--code-font-size); -} - -table.memberdecls tr[class^='memitem'] .memTemplParams { - font-family: var(--font-family-monospace); - font-size: var(--code-font-size); - color: var(--primary-dark-color); - white-space: normal; -} - -table.memberdecls .memItemLeft, -table.memberdecls .memItemRight, -table.memberdecls .memTemplItemLeft, -table.memberdecls .memTemplItemRight, -table.memberdecls .memTemplParams { - transition: none; - padding-top: var(--spacing-small); - padding-bottom: var(--spacing-small); - border-top: 1px solid var(--separator-color); - border-bottom: 1px solid var(--separator-color); - background-color: var(--fragment-background); -} - -table.memberdecls .memTemplItemLeft, -table.memberdecls .memTemplItemRight { - padding-top: 2px; -} - -table.memberdecls .memTemplParams { - border-bottom: 0; - border-left: 1px solid var(--separator-color); - border-right: 1px solid var(--separator-color); - border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; - padding-bottom: var(--spacing-small); -} - -table.memberdecls .memTemplItemLeft { - border-radius: 0 0 0 var(--border-radius-small); - border-left: 1px solid var(--separator-color); - border-top: 0; -} - -table.memberdecls .memTemplItemRight { - border-radius: 0 0 var(--border-radius-small) 0; - border-right: 1px solid var(--separator-color); - padding-left: 0; - border-top: 0; -} - -table.memberdecls .memItemLeft { - border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); - border-left: 1px solid var(--separator-color); - padding-left: var(--spacing-medium); - padding-right: 0; -} - -table.memberdecls .memItemRight { - border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; - border-right: 1px solid var(--separator-color); - padding-right: var(--spacing-medium); - padding-left: 0; - -} - -table.memberdecls .mdescLeft, table.memberdecls .mdescRight { - background: none; - color: var(--page-foreground-color); - padding: var(--spacing-small) 0; -} - -table.memberdecls .memItemLeft, -table.memberdecls .memTemplItemLeft { - padding-right: var(--spacing-medium); -} - -table.memberdecls .memSeparator { - background: var(--page-background-color); - height: var(--spacing-large); - border: 0; - transition: none; -} - -table.memberdecls .groupheader { - margin-bottom: var(--spacing-large); -} - -table.memberdecls .inherit_header td { - padding: 0 0 var(--spacing-medium) 0; - text-indent: -12px; - color: var(--page-secondary-foreground-color); -} - -table.memberdecls img[src="closed.png"], -table.memberdecls img[src="open.png"], -div.dynheader img[src="open.png"], -div.dynheader img[src="closed.png"] { - width: 0; - height: 0; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 5px solid var(--primary-color); - margin-top: 8px; - display: block; - float: left; - margin-left: -10px; - transition: transform 0.25s ease-out; -} - -table.memberdecls img { - margin-right: 10px; -} - -table.memberdecls img[src="closed.png"], -div.dynheader img[src="closed.png"] { - transform: rotate(-90deg); - -} - -.compoundTemplParams { - font-family: var(--font-family-monospace); - color: var(--primary-dark-color); - font-size: var(--code-font-size); -} - -@media screen and (max-width: 767px) { - - table.memberdecls .memItemLeft, - table.memberdecls .memItemRight, - table.memberdecls .mdescLeft, - table.memberdecls .mdescRight, - table.memberdecls .memTemplItemLeft, - table.memberdecls .memTemplItemRight, - table.memberdecls .memTemplParams { - display: block; - text-align: left; - padding-left: var(--spacing-large); - margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large)); - border-right: none; - border-left: none; - border-radius: 0; - white-space: normal; - } - - table.memberdecls .memItemLeft, - table.memberdecls .mdescLeft, - table.memberdecls .memTemplItemLeft { - border-bottom: 0; - padding-bottom: 0; - } - - table.memberdecls .memTemplItemLeft { - padding-top: 0; - } - - table.memberdecls .mdescLeft { - margin-bottom: calc(0px - var(--page-font-size)); - } - - table.memberdecls .memItemRight, - table.memberdecls .mdescRight, - table.memberdecls .memTemplItemRight { - border-top: 0; - padding-top: 0; - padding-right: var(--spacing-large); - overflow-x: auto; - } - - table.memberdecls tr[class^='memitem']:not(.inherit) { - display: block; - width: calc(100vw - 2 * var(--spacing-large)); - } - - table.memberdecls .mdescRight { - color: var(--page-foreground-color); - } - - table.memberdecls tr.inherit { - visibility: hidden; - } - - table.memberdecls tr[style="display: table-row;"] { - display: block !important; - visibility: visible; - width: calc(100vw - 2 * var(--spacing-large)); - animation: fade .5s; - } - - @keyframes fade { - 0% { - opacity: 0; - max-height: 0; - } - - 100% { - opacity: 1; - max-height: 200px; - } - } -} - - -/* - Horizontal Rule - */ - -hr { - margin-top: var(--spacing-large); - margin-bottom: var(--spacing-large); - height: 1px; - background-color: var(--separator-color); - border: 0; -} - -.contents hr { - box-shadow: 100px 0 0 var(--separator-color), - -100px 0 0 var(--separator-color), - 500px 0 0 var(--separator-color), - -500px 0 0 var(--separator-color), - 1500px 0 0 var(--separator-color), - -1500px 0 0 var(--separator-color), - 2000px 0 0 var(--separator-color), - -2000px 0 0 var(--separator-color); -} - -.contents img, .contents .center, .contents center, .contents div.image object { - max-width: 100%; - overflow: auto; -} - -@media screen and (max-width: 767px) { - .contents .dyncontent > .center, .contents > center { - margin-left: calc(0px - var(--spacing-large)); - margin-right: calc(0px - var(--spacing-large)); - max-width: calc(100% + 2 * var(--spacing-large)); - } -} - -/* - Directories - */ -div.directory { - border-top: 1px solid var(--separator-color); - border-bottom: 1px solid var(--separator-color); - width: auto; -} - -table.directory { - font-family: var(--font-family); - font-size: var(--page-font-size); - font-weight: normal; - width: 100%; -} - -table.directory td.entry, table.directory td.desc { - padding: calc(var(--spacing-small) / 2) var(--spacing-small); - line-height: var(--table-line-height); -} - -table.directory tr.even td:last-child { - border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; -} - -table.directory tr.even td:first-child { - border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); -} - -table.directory tr.even:last-child td:last-child { - border-radius: 0 var(--border-radius-small) 0 0; -} - -table.directory tr.even:last-child td:first-child { - border-radius: var(--border-radius-small) 0 0 0; -} - -table.directory td.desc { - min-width: 250px; -} - -table.directory tr.even { - background-color: var(--odd-color); -} - -table.directory tr.odd { - background-color: transparent; -} - -.icona { - width: auto; - height: auto; - margin: 0 var(--spacing-small); -} - -.icon { - background: var(--primary-color); - border-radius: var(--border-radius-small); - font-size: var(--page-font-size); - padding: calc(var(--page-font-size) / 5); - line-height: var(--page-font-size); - transform: scale(0.8); - height: auto; - width: var(--page-font-size); - user-select: none; -} - -.iconfopen, .icondoc, .iconfclosed { - background-position: center; - margin-bottom: 0; - height: var(--table-line-height); -} - -.icondoc { - filter: saturate(0.2); -} - -@media screen and (max-width: 767px) { - div.directory { - margin-left: calc(0px - var(--spacing-large)); - margin-right: calc(0px - var(--spacing-large)); - } -} - -@media (prefers-color-scheme: dark) { - html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { - filter: hue-rotate(180deg) invert(); - } -} - -html.dark-mode .iconfopen, html.dark-mode .iconfclosed { - filter: hue-rotate(180deg) invert(); -} - -/* - Class list - */ - -.classindex dl.odd { - background: var(--odd-color); - border-radius: var(--border-radius-small); -} - -.classindex dl.even { - background-color: transparent; -} - -/* - Class Index Doxygen 1.8 -*/ - -table.classindex { - margin-left: 0; - margin-right: 0; - width: 100%; -} - -table.classindex table div.ah { - background-image: none; - background-color: initial; - border-color: var(--separator-color); - color: var(--page-foreground-color); - box-shadow: var(--box-shadow); - border-radius: var(--border-radius-large); - padding: var(--spacing-small); -} - -div.qindex { - background-color: var(--odd-color); - border-radius: var(--border-radius-small); - border: 1px solid var(--separator-color); - padding: var(--spacing-small) 0; -} - -/* - Footer and nav-path - */ - -#nav-path { - width: 100%; -} - -#nav-path ul { - background-image: none; - background: var(--page-background-color); - border: none; - border-top: 1px solid var(--separator-color); - border-bottom: 1px solid var(--separator-color); - border-bottom: 0; - box-shadow: 0 0.75px 0 var(--separator-color); - font-size: var(--navigation-font-size); -} - -img.footer { - width: 60px; -} - -.navpath li.footer { - color: var(--page-secondary-foreground-color); -} - -address.footer { - color: var(--page-secondary-foreground-color); - margin-bottom: var(--spacing-large); -} - -#nav-path li.navelem { - background-image: none; - display: flex; - align-items: center; -} - -.navpath li.navelem a { - text-shadow: none; - display: inline-block; - color: var(--primary-color) !important; -} - -.navpath li.navelem b { - color: var(--primary-dark-color); - font-weight: 500; -} - -li.navelem { - padding: 0; - margin-left: -8px; -} - -li.navelem:first-child { - margin-left: var(--spacing-large); -} - -li.navelem:first-child:before { - display: none; -} - -#nav-path li.navelem:after { - content: ''; - border: 5px solid var(--page-background-color); - border-bottom-color: transparent; - border-right-color: transparent; - border-top-color: transparent; - transform: translateY(-1px) scaleY(4.2); - z-index: 10; - margin-left: 6px; -} - -#nav-path li.navelem:before { - content: ''; - border: 5px solid var(--separator-color); - border-bottom-color: transparent; - border-right-color: transparent; - border-top-color: transparent; - transform: translateY(-1px) scaleY(3.2); - margin-right: var(--spacing-small); -} - -.navpath li.navelem a:hover { - color: var(--primary-color); -} - -/* - Scrollbars for Webkit -*/ - -#nav-tree::-webkit-scrollbar, -div.fragment::-webkit-scrollbar, -pre.fragment::-webkit-scrollbar, -div.memproto::-webkit-scrollbar, -.contents center::-webkit-scrollbar, -.contents .center::-webkit-scrollbar, -.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar, -div.contents .toc::-webkit-scrollbar, -.contents .dotgraph::-webkit-scrollbar, -.contents .tabs-overview-container::-webkit-scrollbar { - background: transparent; - width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); - height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); -} - -#nav-tree::-webkit-scrollbar-thumb, -div.fragment::-webkit-scrollbar-thumb, -pre.fragment::-webkit-scrollbar-thumb, -div.memproto::-webkit-scrollbar-thumb, -.contents center::-webkit-scrollbar-thumb, -.contents .center::-webkit-scrollbar-thumb, -.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-thumb, -div.contents .toc::-webkit-scrollbar-thumb, -.contents .dotgraph::-webkit-scrollbar-thumb, -.contents .tabs-overview-container::-webkit-scrollbar-thumb { - background-color: transparent; - border: var(--webkit-scrollbar-padding) solid transparent; - border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); - background-clip: padding-box; -} - -#nav-tree:hover::-webkit-scrollbar-thumb, -div.fragment:hover::-webkit-scrollbar-thumb, -pre.fragment:hover::-webkit-scrollbar-thumb, -div.memproto:hover::-webkit-scrollbar-thumb, -.contents center:hover::-webkit-scrollbar-thumb, -.contents .center:hover::-webkit-scrollbar-thumb, -.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody:hover::-webkit-scrollbar-thumb, -div.contents .toc:hover::-webkit-scrollbar-thumb, -.contents .dotgraph:hover::-webkit-scrollbar-thumb, -.contents .tabs-overview-container:hover::-webkit-scrollbar-thumb { - background-color: var(--webkit-scrollbar-color); -} - -#nav-tree::-webkit-scrollbar-track, -div.fragment::-webkit-scrollbar-track, -pre.fragment::-webkit-scrollbar-track, -div.memproto::-webkit-scrollbar-track, -.contents center::-webkit-scrollbar-track, -.contents .center::-webkit-scrollbar-track, -.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-track, -div.contents .toc::-webkit-scrollbar-track, -.contents .dotgraph::-webkit-scrollbar-track, -.contents .tabs-overview-container::-webkit-scrollbar-track { - background: transparent; -} - -#nav-tree::-webkit-scrollbar-corner { - background-color: var(--side-nav-background); -} - -#nav-tree, -div.fragment, -pre.fragment, -div.memproto, -.contents center, -.contents .center, -.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, -div.contents .toc { - overflow-x: auto; - overflow-x: overlay; -} - -#nav-tree { - overflow-x: auto; - overflow-y: auto; - overflow-y: overlay; -} - -/* - Scrollbars for Firefox -*/ - -#nav-tree, -div.fragment, -pre.fragment, -div.memproto, -.contents center, -.contents .center, -.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, -div.contents .toc, -.contents .dotgraph, -.contents .tabs-overview-container { - scrollbar-width: thin; -} - -/* - Optional Dark mode toggle button -*/ - -doxygen-awesome-dark-mode-toggle { - display: inline-block; - margin: 0 0 0 var(--spacing-small); - padding: 0; - width: var(--searchbar-height); - height: var(--searchbar-height); - background: none; - border: none; - border-radius: var(--searchbar-height); - vertical-align: middle; - text-align: center; - line-height: var(--searchbar-height); - font-size: 22px; - display: flex; - align-items: center; - justify-content: center; - user-select: none; - cursor: pointer; -} - -doxygen-awesome-dark-mode-toggle > svg { - transition: transform .1s ease-in-out; -} - -doxygen-awesome-dark-mode-toggle:active > svg { - transform: scale(.5); -} - -doxygen-awesome-dark-mode-toggle:hover { - background-color: rgba(0,0,0,.03); -} - -html.dark-mode doxygen-awesome-dark-mode-toggle:hover { - background-color: rgba(0,0,0,.18); -} - -/* - Optional fragment copy button -*/ -.doxygen-awesome-fragment-wrapper { - position: relative; -} - -doxygen-awesome-fragment-copy-button { - opacity: 0; - background: var(--fragment-background); - width: 28px; - height: 28px; - position: absolute; - right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); - top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); - border: 1px solid var(--fragment-foreground); - cursor: pointer; - border-radius: var(--border-radius-small); - display: flex; - justify-content: center; - align-items: center; -} - -.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success { - opacity: .28; -} - -doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success { - opacity: 1 !important; -} - -doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg { - transform: scale(.91); -} - -doxygen-awesome-fragment-copy-button svg { - fill: var(--fragment-foreground); - width: 18px; - height: 18px; -} - -doxygen-awesome-fragment-copy-button.success svg { - fill: rgb(14, 168, 14); -} - -doxygen-awesome-fragment-copy-button.success { - border-color: rgb(14, 168, 14); -} - -@media screen and (max-width: 767px) { - .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, - .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, - .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, - .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, - dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button { - right: 0; - } -} - -/* - Optional paragraph link button -*/ - -a.anchorlink { - font-size: 90%; - margin-left: var(--spacing-small); - color: var(--page-foreground-color) !important; - text-decoration: none; - opacity: .15; - display: none; - transition: opacity .1s ease-in-out, color .1s ease-in-out; -} - -a.anchorlink svg { - fill: var(--page-foreground-color); -} - -h3 a.anchorlink svg, h4 a.anchorlink svg { - margin-bottom: -3px; - margin-top: -4px; -} - -a.anchorlink:hover { - opacity: .45; -} - -h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink { - display: inline-block; -} - -/* - Optional tab feature -*/ - -.tabbed ul { - padding-inline-start: 0px; - margin: 0; - padding: var(--spacing-small) 0; - border-bottom: 1px solid var(--separator-color); -} - -.tabbed li { - display: none; -} - -.tabbed li.selected { - display: block; -} - -.tabs-overview-container { - overflow-x: auto; - display: block; - overflow-y: visible; -} - -.tabs-overview { - border-bottom: 1px solid var(--separator-color); - display: flex; - flex-direction: row; -} - -.tabs-overview button.tab-button { - color: var(--page-foreground-color); - margin: 0; - border: none; - background: transparent; - padding: var(--spacing-small) 0; - display: inline-block; - font-size: var(--page-font-size); - cursor: pointer; - box-shadow: 0 1px 0 0 var(--separator-color); -} - -.tabs-overview button.tab-button .tab-title { - float: left; - white-space: nowrap; - padding: var(--spacing-small) var(--spacing-large); - border-radius: var(--border-radius-medium); -} - -.tabs-overview button.tab-button:not(:last-child) .tab-title { - box-shadow: 8px 0 0 -7px var(--separator-color); -} - -.tabs-overview button.tab-button:hover .tab-title { - background: var(--primary-color); - color: var(--page-background-color); - box-shadow: none; -} - -.tabs-overview button.tab-button.active { - color: var(--primary-color); - box-shadow: 0 1px 0 0 var(--primary-color), inset 0 -1px 0 0 var(--primary-color); -} - -@media (prefers-color-scheme: dark) { - html:not(.light-mode) .tabs-overview button.tab-button:hover .tab-title { - color: var(--page-foreground-color); - } -} - -html.dark-mode .tabs-overview button.tab-button:hover .tab-title { - color: var(--page-foreground-color); -} diff --git a/test/documentation/seqan3_doxygen_cfg.in b/test/documentation/seqan3_doxygen_cfg.in index 5ad92b5ee7..88f57408e1 100644 --- a/test/documentation/seqan3_doxygen_cfg.in +++ b/test/documentation/seqan3_doxygen_cfg.in @@ -202,13 +202,13 @@ HTML_FILE_EXTENSION = .html HTML_HEADER = ${SEQAN3_DOXYGEN_SOURCE_DIR}/test/documentation/seqan3_header.html HTML_FOOTER = ${SEQAN3_DOXYGEN_OUTPUT_DIR}/seqan3_footer.html HTML_STYLESHEET = -HTML_EXTRA_STYLESHEET = ${SEQAN3_DOXYGEN_SOURCE_DIR}/test/documentation/doxygen-awesome/doxygen-awesome.css \ +HTML_EXTRA_STYLESHEET = ${doxygen_awesome_SOURCE_DIR}/doxygen-awesome.css \ ${SEQAN3_DOXYGEN_SOURCE_DIR}/test/documentation/seqan3.css -HTML_EXTRA_FILES = ${SEQAN3_DOXYGEN_SOURCE_DIR}/test/documentation/doxygen-awesome/doxygen-awesome-darkmode-toggle.js \ - ${SEQAN3_DOXYGEN_SOURCE_DIR}/test/documentation/doxygen-awesome/doxygen-awesome-fragment-copy-button.js \ - ${SEQAN3_DOXYGEN_SOURCE_DIR}/test/documentation/doxygen-awesome/doxygen-awesome-paragraph-link.js \ - ${SEQAN3_DOXYGEN_SOURCE_DIR}/test/documentation/doxygen-awesome/doxygen-awesome-interactive-toc.js \ - ${SEQAN3_DOXYGEN_SOURCE_DIR}/test/documentation/doxygen-awesome/doxygen-awesome-tabs.js \ +HTML_EXTRA_FILES = ${doxygen_awesome_SOURCE_DIR}/doxygen-awesome-darkmode-toggle.js \ + ${doxygen_awesome_SOURCE_DIR}/doxygen-awesome-fragment-copy-button.js \ + ${doxygen_awesome_SOURCE_DIR}/doxygen-awesome-paragraph-link.js \ + ${doxygen_awesome_SOURCE_DIR}/doxygen-awesome-interactive-toc.js \ + ${doxygen_awesome_SOURCE_DIR}/doxygen-awesome-tabs.js \ ${SEQAN3_DOXYGEN_SOURCE_DIR}/doc/tutorial/10_sam_file/example.sam \ ${SEQAN3_DOXYGEN_SOURCE_DIR}/test/documentation/version.js \ ${SEQAN3_DOXYGEN_SOURCE_DIR}/test/documentation/version.php \ From b901768e1f866de57e1d2743f8857fdc4f7005d6 Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:43:44 +0200 Subject: [PATCH 05/13] [INFRA] Use CPM for tests --- test/cmake/seqan3_require_ccache.cmake | 24 +++--------------------- test/seqan3-test.cmake | 11 +++++++---- 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/test/cmake/seqan3_require_ccache.cmake b/test/cmake/seqan3_require_ccache.cmake index 39986f12d8..f50278cb58 100644 --- a/test/cmake/seqan3_require_ccache.cmake +++ b/test/cmake/seqan3_require_ccache.cmake @@ -4,24 +4,6 @@ cmake_minimum_required (VERSION 3.15...3.30) -# Uses `ccache` to cache build results. -# -# See also -# * https://ccache.dev/ -# * https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_LAUNCHER.html -macro (seqan3_require_ccache) - find_program (CCACHE_PROGRAM ccache) - find_package_message (CCACHE_PROGRAM_PRE "Finding program ccache" "[${CCACHE_PROGRAM}]") - - if (NOT CCACHE_PROGRAM) - find_package_message (CCACHE_PROGRAM "Finding program ccache - Failed" "[${CCACHE_PROGRAM}]") - else () - find_package_message (CCACHE_PROGRAM "Finding program ccache - Success" "[${CCACHE_PROGRAM}]") - - list (PREPEND CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") - - # use ccache in external cmake projects - list (APPEND SEQAN3_EXTERNAL_PROJECT_CMAKE_ARGS "-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}") - endif () - unset (CCACHE_PROGRAM) -endmacro () +# This file's only purpose is to be replaced with the content of the use_ccache CMakeLists.txt file +# when creating the source package. +CPMGetPackage (use_ccache) diff --git a/test/seqan3-test.cmake b/test/seqan3-test.cmake index 510b0d3fe0..d813f3163a 100644 --- a/test/seqan3-test.cmake +++ b/test/seqan3-test.cmake @@ -11,6 +11,11 @@ cmake_minimum_required (VERSION 3.10...3.30) # require SeqAn3 package find_package (SeqAn3 REQUIRED HINTS ${CMAKE_CURRENT_LIST_DIR}/../build_system) +enable_testing () + +set (CPM_INDENT "CMake Package Manager CPM: ") +CPMUsePackageLock ("${CMAKE_CURRENT_LIST_DIR}/../build_system/package-lock.cmake") + include (CheckCXXCompilerFlag) include (CheckCXXSourceCompiles) include (FindPackageHandleStandardArgs) @@ -89,7 +94,7 @@ endif () # needed for performance test cases in seqan3/test/performance if (NOT TARGET seqan3::test::performance) add_library (seqan3_test_performance INTERFACE) - target_link_libraries (seqan3_test_performance INTERFACE "seqan3::test" "benchmark_main" "benchmark") + target_link_libraries (seqan3_test_performance INTERFACE "seqan3::test" "benchmark::benchmark_main") # std::views::join is experimental in libc++ target_compile_definitions (seqan3_test_performance INTERFACE _LIBCPP_ENABLE_EXPERIMENTAL) @@ -105,7 +110,7 @@ endif () # needed for unit test cases in seqan3/test/unit if (NOT TARGET seqan3::test::unit) add_library (seqan3_test_unit INTERFACE) - target_link_libraries (seqan3_test_unit INTERFACE "seqan3::test" "gtest_main" "gtest") + target_link_libraries (seqan3_test_unit INTERFACE "seqan3::test" "GTest::gtest_main") add_library (seqan3::test::unit ALIAS seqan3_test_unit) endif () @@ -139,6 +144,4 @@ list (APPEND SEQAN3_EXTERNAL_PROJECT_CMAKE_ARGS "-DCMAKE_VERBOSE_MAKEFILE=${CMAK include (seqan3_test_component) include (seqan3_test_files) include (seqan3_require_ccache) -include (seqan3_require_benchmark) -include (seqan3_require_test) include (add_subdirectories) From c488856aa6d645deaa1dc8a44cc0cf21df28f679 Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:45:15 +0200 Subject: [PATCH 06/13] [INFRA] Use CPM for seqan2 --- test/seqan3-test.cmake | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/test/seqan3-test.cmake b/test/seqan3-test.cmake index d813f3163a..9cc8a3a710 100644 --- a/test/seqan3-test.cmake +++ b/test/seqan3-test.cmake @@ -18,6 +18,7 @@ CPMUsePackageLock ("${CMAKE_CURRENT_LIST_DIR}/../build_system/package-lock.cmake include (CheckCXXCompilerFlag) include (CheckCXXSourceCompiles) +include (CMakeDependentOption) include (FindPackageHandleStandardArgs) include (FindPackageMessage) @@ -28,6 +29,27 @@ option (SEQAN3_TEST_BUILD_OFFLINE "Skip the update step of external projects." O # have to be adapted or the option deactivated. option (SEQAN3_BENCHMARK_ALIGN_LOOPS "Pass -falign-loops=32 to the benchmark builds." ON) +option (SEQAN3_WITH_SEQAN2 "Build tests with SeqAn2." OFF) +# Will be on if environment variable CI is set. +# Can be toggled off if initially set to on. +# Cannot be toggled on if initially set to off. +cmake_dependent_option (SEQAN3_WITH_SEQAN2_CI "Build tests with SeqAn2." ON "DEFINED ENV{CI}" OFF) + +if (SEQAN3_WITH_SEQAN2 OR SEQAN3_WITH_SEQAN2_CI) + CPMGetPackage (seqan2) + find_path (SEQAN3_SEQAN2_INCLUDE_DIR + NAMES seqan/version.h + HINTS "${seqan2_SOURCE_DIR}/include") + + if (SEQAN3_SEQAN2_INCLUDE_DIR) + message (STATUS "Building tests with SeqAn2.") + target_include_directories (seqan3_seqan3 SYSTEM INTERFACE ${SEQAN3_SEQAN2_INCLUDE_DIR}) + target_compile_definitions (seqan3_seqan3 INTERFACE "SEQAN3_HAS_SEQAN2=1") + else () + message (FATAL_ERROR "Could not find SeqAn2.") + endif () +endif () + # ---------------------------------------------------------------------------- # Custom Build types # ---------------------------------------------------------------------------- From ad6ca74d14ce639542a5824643e455cd93b5ed69 Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:45:54 +0200 Subject: [PATCH 07/13] [INFRA] Add option for building with Werror --- test/seqan3-test.cmake | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/seqan3-test.cmake b/test/seqan3-test.cmake index 9cc8a3a710..35641043ef 100644 --- a/test/seqan3-test.cmake +++ b/test/seqan3-test.cmake @@ -50,6 +50,9 @@ if (SEQAN3_WITH_SEQAN2 OR SEQAN3_WITH_SEQAN2_CI) endif () endif () +# If the default is ever changed to `OFF`, add a check for the CI, similar to SEQAN3_WITH_SEQAN2_CI. +option (SEQAN3_WITH_WERROR "Report compiler warnings as errors." ON) + # ---------------------------------------------------------------------------- # Custom Build types # ---------------------------------------------------------------------------- @@ -86,7 +89,12 @@ list (APPEND CMAKE_MODULE_PATH "${SEQAN3_TEST_CMAKE_MODULE_DIR}") # libraries which are in common for **all** seqan3 tests if (NOT TARGET seqan3::test) add_library (seqan3_test INTERFACE) - target_compile_options (seqan3_test INTERFACE "-pedantic" "-Wall" "-Wextra" "-Werror") + target_compile_options (seqan3_test INTERFACE "-pedantic" "-Wall" "-Wextra") + + if (SEQAN3_WITH_WERROR) + target_compile_options (seqan3_test INTERFACE "-Werror") + message (STATUS "Building tests with -Werror.") + endif () if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") # GCC12 and above: Disable warning about std::hardware_destructive_interference_size not being ABI-stable. From 7852e8662089948fed4d32ff12d07ad481c1864b Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:46:32 +0200 Subject: [PATCH 08/13] [INFRA] Remove unused cmake scripts --- test/cmake/seqan3_require_benchmark.cmake | 38 ----------------------- test/cmake/seqan3_require_test.cmake | 36 --------------------- 2 files changed, 74 deletions(-) delete mode 100644 test/cmake/seqan3_require_benchmark.cmake delete mode 100644 test/cmake/seqan3_require_test.cmake diff --git a/test/cmake/seqan3_require_benchmark.cmake b/test/cmake/seqan3_require_benchmark.cmake deleted file mode 100644 index 4ad12fa1e2..0000000000 --- a/test/cmake/seqan3_require_benchmark.cmake +++ /dev/null @@ -1,38 +0,0 @@ -# SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin -# SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required (VERSION 3.16...3.30) - -# Exposes the google-benchmark target `benchmark` and `benchmark_main`. -# CMake 3.24: https://cmake.org/cmake/help/latest/module/FetchContent.html#variable:FETCHCONTENT_TRY_FIND_PACKAGE_MODE -macro (seqan3_require_benchmark) - enable_testing () - - set (SEQAN3_BENCHMARK_TAG "v1.8.2") - - find_package (benchmark QUIET) - - # Also ensure that Google Benchmark if fetched for the latest library cron, which sets the tag to "main". - if (NOT benchmark_FOUND OR "${SEQAN3_BENCHMARK_TAG}" STREQUAL "main") - message (STATUS "Fetching Google Benchmark ${SEQAN3_BENCHMARK_TAG}") - - include (FetchContent) - FetchContent_Declare ( - gbenchmark_fetch_content - GIT_REPOSITORY "https://github.com/google/benchmark.git" - GIT_TAG "${SEQAN3_BENCHMARK_TAG}") - option (BENCHMARK_ENABLE_TESTING "" OFF) - option (BENCHMARK_ENABLE_WERROR "" OFF) # Does not apply to Debug builds. - option (BENCHMARK_ENABLE_INSTALL "" OFF) - FetchContent_MakeAvailable (gbenchmark_fetch_content) - else () - message (STATUS " Test dependency: Google Benchmark ${benchmark_VERSION} found.") - endif () - - # NOTE: google benchmark's CMakeLists.txt already defines Shlwapi - if (NOT TARGET gbenchmark_build) - add_custom_target (gbenchmark_build DEPENDS benchmark_main benchmark) - endif () - -endmacro () diff --git a/test/cmake/seqan3_require_test.cmake b/test/cmake/seqan3_require_test.cmake deleted file mode 100644 index 2146d68ce8..0000000000 --- a/test/cmake/seqan3_require_test.cmake +++ /dev/null @@ -1,36 +0,0 @@ -# SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin -# SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required (VERSION 3.16...3.30) - -# Exposes the google-test targets `gtest` and `gtest_main`. -# CMake 3.24: https://cmake.org/cmake/help/latest/module/FetchContent.html#variable:FETCHCONTENT_TRY_FIND_PACKAGE_MODE -macro (seqan3_require_test) - enable_testing () - - set (SEQAN3_GTEST_TAG "v1.13.0") - - find_package (GTest QUIET) - - # Also ensure that Google Test if fetched for the latest library cron, which sets the tag to "main". - if (NOT GTest_FOUND OR "${SEQAN3_GTEST_TAG}" STREQUAL "main") - message (STATUS "Fetching Google Test ${SEQAN3_GTEST_TAG}") - - include (FetchContent) - FetchContent_Declare ( - gtest_fetch_content - GIT_REPOSITORY "https://github.com/google/googletest.git" - GIT_TAG "${SEQAN3_GTEST_TAG}") - option (BUILD_GMOCK "" OFF) - option (INSTALL_GTEST "" OFF) - FetchContent_MakeAvailable (gtest_fetch_content) - else () - message (STATUS " Test dependency: Google Test ${GTest_VERSION} found.") - endif () - - if (NOT TARGET gtest_build) - add_custom_target (gtest_build DEPENDS gtest_main gtest) - endif () - -endmacro () From 3f3687469e163178973c0c72aa11d5c32a8598c9 Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:47:18 +0200 Subject: [PATCH 09/13] [INFRA] Use CPM packages in tests --- test/header/CMakeLists.txt | 7 +++---- test/macro_benchmark/CMakeLists.txt | 5 ++--- test/performance/CMakeLists.txt | 5 ++--- test/snippet/CMakeLists.txt | 5 ++--- test/unit/CMakeLists.txt | 5 ++--- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/test/header/CMakeLists.txt b/test/header/CMakeLists.txt index 3498f90018..a22e07b459 100644 --- a/test/header/CMakeLists.txt +++ b/test/header/CMakeLists.txt @@ -7,6 +7,9 @@ project (seqan3_header_test CXX) include (../seqan3-test.cmake) +CPMGetPackage (googletest) +CPMGetPackage (benchmark) + option (SEQAN3_FULL_HEADER_TEST "Test seqan3 headers as well as the headers of external libraries" OFF) # We compile each header twice in separate compilation units, where the second compilation omits the header guard (check @@ -126,10 +129,6 @@ macro (seqan3_header_test component header_base_path exclude_regex) unset (header_target) endmacro () -seqan3_require_ccache () -seqan3_require_benchmark () -seqan3_require_test () - # note: seqan3/contrib/std/* will not be tested, because they use local (#include "file") includes # note: seqan3/version.hpp is one of the only header that is not required to have a seqan3/core/platform.hpp include seqan3_header_test (seqan3 "${SEQAN3_CLONE_DIR}/include" "seqan3/version.hpp|seqan3/contrib/std") diff --git a/test/macro_benchmark/CMakeLists.txt b/test/macro_benchmark/CMakeLists.txt index 0ac73fcc43..d3679b45c9 100644 --- a/test/macro_benchmark/CMakeLists.txt +++ b/test/macro_benchmark/CMakeLists.txt @@ -7,9 +7,8 @@ project (seqan3_test_unit CXX) include (../seqan3-test.cmake) -include (seqan3_macro_benchmark) +CPMGetPackage (benchmark) -seqan3_require_ccache () -seqan3_require_benchmark () +include (seqan3_macro_benchmark) add_subdirectories () diff --git a/test/performance/CMakeLists.txt b/test/performance/CMakeLists.txt index 320298afb1..7cf9072b7f 100644 --- a/test/performance/CMakeLists.txt +++ b/test/performance/CMakeLists.txt @@ -7,6 +7,8 @@ project (seqan3_test_performance CXX) include (../seqan3-test.cmake) +CPMGetPackage (benchmark) + set (SEQAN3_BENCHMARK_MIN_TIME "1" CACHE STRING "Set --benchmark_min_time= for each bechmark. Timings are unreliable in CI.") @@ -25,7 +27,4 @@ macro (seqan3_benchmark benchmark_cpp) unset (test_name) endmacro () -seqan3_require_ccache () -seqan3_require_benchmark () - add_subdirectories () diff --git a/test/snippet/CMakeLists.txt b/test/snippet/CMakeLists.txt index db9a8afde5..bb111f878e 100644 --- a/test/snippet/CMakeLists.txt +++ b/test/snippet/CMakeLists.txt @@ -8,6 +8,8 @@ project (seqan3_test_snippet CXX) include (../seqan3-test.cmake) include (../cmake/diagnostics/list_unused_snippets.cmake) +CPMGetPackage (googletest) + option (SEQAN3_GENERATE_SNIPPETS "Whether seqan3 snippets should be generated and overwritten within the source tree." ON) @@ -56,9 +58,6 @@ macro (seqan3_snippets test_name_prefix snippet_base_path) endforeach () endmacro () -seqan3_require_ccache () -seqan3_require_test () - seqan3_snippets ("snippet" "${CMAKE_CURRENT_SOURCE_DIR}") seqan3_snippets ("doc/snippet" "${CMAKE_CURRENT_SOURCE_DIR}/../../doc") diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index fcb9746ed6..652794ad8e 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -8,6 +8,8 @@ project (seqan3_test_unit CXX) include (../seqan3-test.cmake) include (GoogleTest OPTIONAL) +CPMGetPackage (googletest) + include (diagnostics/list_missing_unit_tests) include (diagnostics/list_unused_unit_tests) include (include_dependencies/add_include_dependencies) @@ -43,9 +45,6 @@ macro (seqan3_test unit_test_cpp) unset (test_name) endmacro () -seqan3_require_ccache () -seqan3_require_test () - add_subdirectories () list_missing_unit_tests () From d787120b5e6a349871dc96d23603d4665d21926b Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:47:43 +0200 Subject: [PATCH 10/13] [INFRA] Update install target --- build_system/seqan3-install.cmake | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/build_system/seqan3-install.cmake b/build_system/seqan3-install.cmake index 48ab1dcf8e..24781ecaa3 100644 --- a/build_system/seqan3-install.cmake +++ b/build_system/seqan3-install.cmake @@ -24,15 +24,5 @@ install (FILES "${SEQAN3_CLONE_DIR}/build_system/seqan3-config.cmake" # install seqan3 header files in /include/seqan3 install (DIRECTORY "${SEQAN3_INCLUDE_DIR}/seqan3" TYPE INCLUDE) -# install submodule header files, e.g. all external dependencies in /home/user/seqan3/submodules/*, -# in /include/seqan3/submodules//include -foreach (submodule_dir ${SEQAN3_DEPENDENCY_INCLUDE_DIRS}) - # e.g. submodule_dir: (1) /home/user/seqan3/submodules/sdsl-lite/include or (2) /usr/include - # strip /home/user/seqan3/submodules/ and /include part. - file (RELATIVE_PATH submodule "${SEQAN3_SUBMODULES_DIR}/submodules" "${submodule_dir}/..") - # submodule is either a single module name, like sdsl-lite or a relative path to a folder ../../../usr - # skip relative folders and only keep submodules that reside in the submodules folder - if (NOT submodule MATCHES "^\\.\\.") # skip relative folders - install (DIRECTORY "${submodule_dir}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/seqan3/submodules/${submodule}") - endif () -endforeach () +install (DIRECTORY "${SEQAN3_SDSL_INCLUDE_DIR}/sdsl" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/seqan3/vendor") +install (DIRECTORY "${SEQAN3_CEREAL_INCLUDE_DIR}/cereal" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/seqan3/vendor") From f079f755ec397bc43f407153e64e6bee58c49524 Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:47:59 +0200 Subject: [PATCH 11/13] [INFRA] Update cpack target --- build_system/cpack_install.cmake.in | 15 +++++++++++++++ build_system/seqan3-package.cmake | 20 +++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 build_system/cpack_install.cmake.in diff --git a/build_system/cpack_install.cmake.in b/build_system/cpack_install.cmake.in new file mode 100644 index 0000000000..5cefefde1b --- /dev/null +++ b/build_system/cpack_install.cmake.in @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2006-2024, Knut Reinert & Freie Universität Berlin +# SPDX-FileCopyrightText: 2016-2024, Knut Reinert & MPI für molekulare Genetik +# SPDX-License-Identifier: BSD-3-Clause + +# Only if creating the source package (`make package_source`): +# Copy dependency include directories into package's staging folder +if (CPACK_SOURCE_INSTALLED_DIRECTORIES) + file (COPY "@SEQAN3_SDSL_INCLUDE_DIR@/" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/include/seqan3/vendor") + file (COPY "@SEQAN3_CEREAL_INCLUDE_DIR@/" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/include/seqan3/vendor") + configure_file ("@CPM_DOWNLOAD_LOCATION@" "${CMAKE_CURRENT_BINARY_DIR}/build_system/CPM.cmake" COPYONLY) + if ("@use_ccache_ADDED@" STREQUAL "YES") + configure_file ("@use_ccache_SOURCE_DIR@/ccache/CMakeLists.txt" + "${CMAKE_CURRENT_BINARY_DIR}/test/cmake/seqan3_require_ccache.cmake" COPYONLY) + endif () +endif () diff --git a/build_system/seqan3-package.cmake b/build_system/seqan3-package.cmake index ed4b97dfd0..31b45cfc1f 100644 --- a/build_system/seqan3-package.cmake +++ b/build_system/seqan3-package.cmake @@ -17,8 +17,26 @@ set (CPACK_PACKAGE_ICON "${SEQAN3_CLONE_DIR}/test/documentation/seqan_logo.svg") set (CPACK_RESOURCE_FILE_LICENSE "${SEQAN3_CLONE_DIR}/LICENSE.md") set (CPACK_RESOURCE_FILE_README "${SEQAN3_CLONE_DIR}/README.md") +# Already being called on source package, i.e. CPM is already downloaded. +if (NOT CPM_DOWNLOAD_LOCATION) + set (CPM_DOWNLOAD_LOCATION "${SEQAN3_CLONE_DIR}/build_system/CPM.cmake") +else () + CPMGetPackage (use_ccache) +endif () + +configure_file ("${SEQAN3_CLONE_DIR}/build_system/cpack_install.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cpack_install.cmake" @ONLY) +set (CPACK_INSTALL_SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/cpack_install.cmake") + # Source Package set (CPACK_SOURCE_GENERATOR "TXZ") -set (CPACK_SOURCE_IGNORE_FILES "\\\\.git($|/)") +# Next 2 lines would overwrite copy in cpack_install.cmake +list (APPEND CPACK_SOURCE_IGNORE_FILES "/build_system/CPM.cmake") +list (APPEND CPACK_SOURCE_IGNORE_FILES "/test/cmake/seqan3_require_ccache.cmake") +list (APPEND CPACK_SOURCE_IGNORE_FILES "/\.git($|/)") +list (APPEND CPACK_SOURCE_IGNORE_FILES "/\.github/") +list (APPEND CPACK_SOURCE_IGNORE_FILES "/\.vscode/") +list (APPEND CPACK_SOURCE_IGNORE_FILES "/build/") +list (APPEND CPACK_SOURCE_IGNORE_FILES "/submodules/") include (CPack) From ddd89a7d41b76a1214a96d20dce4c0e95b479db8 Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:48:34 +0200 Subject: [PATCH 12/13] [INFRA] Update CI --- .github/workflows/ci_cmake.yml | 10 +- .github/workflows/ci_coverage.yml | 9 +- .github/workflows/ci_linux.yml | 11 +- .github/workflows/ci_macos.yml | 10 +- .github/workflows/ci_misc.yml | 14 +-- .github/workflows/cron_api.yml | 8 -- .github/workflows/cron_avx2.yml | 17 +-- .github/workflows/cron_latest_libraries.yml | 127 ++++++++------------ .github/workflows/ram_usage.yml | 8 -- 9 files changed, 65 insertions(+), 149 deletions(-) diff --git a/.github/workflows/ci_cmake.yml b/.github/workflows/ci_cmake.yml index 4818351dbb..dfdc65316b 100644 --- a/.github/workflows/ci_cmake.yml +++ b/.github/workflows/ci_cmake.yml @@ -52,14 +52,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - submodules: true - - - name: Checkout SeqAn2 - uses: actions/checkout@v4 - with: - repository: seqan/seqan - path: submodules/seqan - name: Configure tests run: | @@ -68,7 +60,7 @@ jobs: -DCMAKE_DEPENDS_USE_COMPILER="${{ matrix.cmake_depends_use_compiler }}" \ -DSEQAN3_USE_INCLUDE_DEPENDENCIES="${{ matrix.use_include_dependencies }}" case "${{ matrix.build }}" in - unit) make gtest_build;; + unit) make gtest_main;; external_project) make seqan3_test_prerequisite sharg_test_prerequisite;; esac diff --git a/.github/workflows/ci_coverage.yml b/.github/workflows/ci_coverage.yml index dd42a6a849..6d4b94d372 100644 --- a/.github/workflows/ci_coverage.yml +++ b/.github/workflows/ci_coverage.yml @@ -42,15 +42,8 @@ jobs: - name: Checkout uses: actions/checkout@v4 with: - submodules: true fetch-depth: 0 - - name: Checkout SeqAn2 - uses: actions/checkout@v4 - with: - repository: seqan/seqan - path: submodules/seqan - - name: Load ccache uses: actions/cache@v4 with: @@ -68,7 +61,7 @@ jobs: run: | mkdir build && cd build cmake ../test/coverage -DCMAKE_BUILD_TYPE=Coverage - make gtest_build + make gtest_main - name: Build tests working-directory: build diff --git a/.github/workflows/ci_linux.yml b/.github/workflows/ci_linux.yml index 26294f313e..e6438f7eb7 100644 --- a/.github/workflows/ci_linux.yml +++ b/.github/workflows/ci_linux.yml @@ -44,14 +44,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - submodules: true - - - name: Checkout SeqAn2 - uses: actions/checkout@v4 - with: - repository: seqan/seqan - path: submodules/seqan - name: Load ccache uses: actions/cache@v4 @@ -66,10 +58,11 @@ jobs: - name: Configure tests run: | $CXX --version || true + cmake --version || true mkdir build && cd build cmake ../test/unit -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="${{ matrix.cxx_flags }}" - make gtest_build + make gtest_main - name: Build tests working-directory: build diff --git a/.github/workflows/ci_macos.yml b/.github/workflows/ci_macos.yml index 8e1d47eaee..b949e64dfa 100644 --- a/.github/workflows/ci_macos.yml +++ b/.github/workflows/ci_macos.yml @@ -37,14 +37,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - submodules: true - - - name: Checkout SeqAn2 - uses: actions/checkout@v4 - with: - repository: seqan/seqan - path: submodules/seqan - name: Setup toolchain uses: seqan/actions/setup-toolchain@main @@ -56,7 +48,7 @@ jobs: run: | mkdir build && cd build cmake ../test/unit -DCMAKE_BUILD_TYPE=Release - make gtest_build + make gtest_main - name: Build tests working-directory: build diff --git a/.github/workflows/ci_misc.yml b/.github/workflows/ci_misc.yml index f990943084..7e7b457e44 100644 --- a/.github/workflows/ci_misc.yml +++ b/.github/workflows/ci_misc.yml @@ -45,14 +45,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - submodules: true - - - name: Checkout SeqAn2 - uses: actions/checkout@v4 - with: - repository: seqan/seqan - path: submodules/seqan - name: Load ccache uses: actions/cache@v4 @@ -71,9 +63,9 @@ jobs: -DCMAKE_CXX_FLAGS="${{ matrix.cxx_flags }}" \ -DSEQAN3_BENCHMARK_MIN_TIME=0.01 case "${{ matrix.build }}" in - snippet) make gtest_build;; - performance) make gbenchmark_build;; - header) make gtest_build gbenchmark_build;; + snippet) make gtest_main;; + performance) make benchmark_main;; + header) make gtest_main benchmark_main;; esac - name: Build tests diff --git a/.github/workflows/cron_api.yml b/.github/workflows/cron_api.yml index 2eb74af835..94f6b2eeed 100644 --- a/.github/workflows/cron_api.yml +++ b/.github/workflows/cron_api.yml @@ -40,14 +40,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - submodules: true - - - name: Checkout SeqAn2 - uses: actions/checkout@v4 - with: - repository: seqan/seqan - path: submodules/seqan - name: Configure tests run: | diff --git a/.github/workflows/cron_avx2.yml b/.github/workflows/cron_avx2.yml index 14d76cdf4b..fdeb836d7f 100644 --- a/.github/workflows/cron_avx2.yml +++ b/.github/workflows/cron_avx2.yml @@ -41,13 +41,6 @@ jobs: uses: actions/checkout@v4 with: path: seqan3 - submodules: true - - - name: Checkout SeqAn2 - uses: actions/checkout@v4 - with: - repository: seqan/seqan - path: seqan3/submodules/seqan - name: Setup compiler uses: seqan/actions/setup-compiler@main @@ -67,16 +60,16 @@ jobs: -DSEQAN3_BENCHMARK_MIN_TIME=0.01 \ -DCMAKE_CXX_FLAGS="-mavx2" case "${{ matrix.build }}" in - unit) make -j2 gtest_build;; - snippet) make -j2 gtest_build;; - performance) make -j2 gbenchmark_build;; - header) make -j2 gtest_build gbenchmark_build;; + unit) make gtest_main;; + snippet) make gtest_main;; + performance) make benchmark_main;; + header) make gtest_main benchmark_main;; esac - name: Build tests run: | cd seqan3-build - make -k -j2 2>&1 | tee build.log + make -k 2>&1 | tee build.log - name: Setup Python if: ${{ failure() }} diff --git a/.github/workflows/cron_latest_libraries.yml b/.github/workflows/cron_latest_libraries.yml index 7539a6c548..795991890a 100644 --- a/.github/workflows/cron_latest_libraries.yml +++ b/.github/workflows/cron_latest_libraries.yml @@ -5,9 +5,6 @@ name: Latest Libraries on: - # Will always run on the default branch - schedule: - - cron: "0 4 * * SUN" # Enables a manual trigger, may run on any branch workflow_dispatch: @@ -33,73 +30,44 @@ jobs: strategy: fail-fast: false matrix: - compiler: [11, 12, 13] + compiler: ["clang-18", "clang-17", "gcc-14", "gcc-13", "gcc-12", "gcc-11", "intel"] build: [unit, snippet, performance, header] include: - - compiler: 12 - build: unit - cxx_flags: "-Wno-restrict" # Bogus errors in gtest that won't be fixed upstream - + - compiler: "intel" + cxx_flags: "-fp-model=strict -Wno-overriding-option" + container: + image: ghcr.io/seqan/${{ matrix.compiler }} + volumes: + - /home/runner:/home/runner steps: - - name: Checkout SeqAn3 + - name: Checkout uses: actions/checkout@v4 - with: - path: seqan3 - submodules: true - - - name: Update all submodules - run: | - cd seqan3 - git submodule status - git submodule update --recursive --remote - git submodule status - - - name: Update googletest - run: | - grep 'SEQAN3_GTEST_TAG ".*"' seqan3/test/cmake/seqan3_require_test.cmake - sed -i 's/SEQAN3_GTEST_TAG ".*"/SEQAN3_GTEST_TAG "main"/' seqan3/test/cmake/seqan3_require_test.cmake - grep 'SEQAN3_GTEST_TAG ".*"' seqan3/test/cmake/seqan3_require_test.cmake - - name: Update googlebenchmark + - name: Update dependencies run: | - grep 'SEQAN3_BENCHMARK_TAG ".*"' seqan3/test/cmake/seqan3_require_benchmark.cmake - sed -i 's/SEQAN3_BENCHMARK_TAG ".*"/SEQAN3_BENCHMARK_TAG "main"/' seqan3/test/cmake/seqan3_require_benchmark.cmake - grep 'SEQAN3_BENCHMARK_TAG ".*"' seqan3/test/cmake/seqan3_require_benchmark.cmake - - - name: Checkout SeqAn2 - uses: actions/checkout@v4 - with: - repository: seqan/seqan - path: seqan3/submodules/seqan - - - name: Setup compiler - uses: seqan/actions/setup-compiler@main - with: - compiler: gcc-${{ matrix.compiler }} - - - name: Install CMake - uses: seqan/actions/setup-cmake@main - with: - cmake: 3.16.9 + FILE="build_system/package-lock.cmake" + sed -i -E 's@(set \(SEQAN3_\S+_VERSION )[^\)]+\)@\1main)@g' $FILE + sed -i -E 's@VERSION( \$\{SEQAN3_\S+_VERSION\})@GIT_TAG\1@g' $FILE + sed -i -E 's@SEQAN3_(SDSL|CEREAL)_VERSION main@SEQAN3_\1_VERSION master@g' $FILE + cat $FILE - name: Configure tests run: | - mkdir seqan3-build - cd seqan3-build + mkdir build && cd build cmake ../seqan3/test/${{ matrix.build }} -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="${{ matrix.cxx_flags }}" \ -DSEQAN3_BENCHMARK_MIN_TIME=0.01 case "${{ matrix.build }}" in - unit) make -j2 gtest_build;; - snippet) make -j2 gtest_build;; - performance) make -j2 gbenchmark_build;; - header) make -j2 gtest_build gbenchmark_build;; + unit) make gtest_main;; + snippet) make gtest_main;; + performance) make benchmark_main;; + header) make gtest_main benchmark_main;; esac - name: Build tests + working-directory: build run: | - cd seqan3-build - make -k -j2 2>&1 | tee build.log + make -k 2>&1 | tee build.log - name: Setup Python if: ${{ failure() }} @@ -110,38 +78,47 @@ jobs: - name: Process Log if: ${{ failure() }} run: | - FILE="seqan3/.github/ISSUE_TEMPLATE/cron_comment_template.md" - python3 seqan3/.github/workflows/scripts/process_compiler_error_log.py seqan3-build/build.log >> $FILE + FILE=".github/ISSUE_TEMPLATE/cron_comment_template.md" + python3 .github/workflows/scripts/process_compiler_error_log.py build/build.log >> $FILE - name: Create comment body if: ${{ failure() }} id: comment-body run: | - FILE="seqan3/.github/ISSUE_TEMPLATE/cron_comment_template.md" - URL="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" - sed -i "s@{{ build }}@${{ matrix.build }}@" $FILE - sed -i "s@{{ compiler }}@${{ matrix.compiler }}@" $FILE - sed -i "s@{{ url }}@$URL@" $FILE - echo "body<> $GITHUB_OUTPUT - cat $FILE >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT + if [[ "${{ job.status }}" == "success" ]]; then + echo "body=Success ${{ matrix.build }} on ${{ matrix.compiler }}" >> $GITHUB_OUTPUT + else + FILE=".github/ISSUE_TEMPLATE/cron_comment_template.md" + URL="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" + sed -i "s@{{ build }}@${{ matrix.build }}@" $FILE + sed -i "s@{{ compiler }}@${{ matrix.compiler }}@" $FILE + sed -i "s@{{ url }}@$URL@" $FILE + echo "body<> $GITHUB_OUTPUT + cat $FILE >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + fi - name: Reopen issue - if: ${{ failure() }} - uses: octokit/request-action@v2.x - with: - route: PATCH /repos/{owner}/{repo}/issues/{issue_number} - owner: ${{ github.repository_owner }} - repo: seqan3 - issue_number: ${{ env.ISSUE }} - state: "open" + if: failure() + run: gh issue reopen ${{ env.ISSUE }} env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ secrets.SEQAN_ACTIONS_PAT }} + GH_REPO: ${{ github.repository }} - - name: Create comment - if: ${{ failure() }} + - name: Find Comment + if: always() + uses: peter-evans/find-comment@v3 + id: find_comment + with: + issue-number: ${{ env.ISSUE }} + body-includes: ${{ matrix.build }} on ${{ matrix.compiler }} + + - name: Update comment + if: always() uses: peter-evans/create-or-update-comment@v4 with: + comment-id: ${{ steps.find_comment.outputs.comment-id }} issue-number: ${{ env.ISSUE }} body: ${{ steps.comment-body.outputs.body }} - + edit-mode: replace + token: ${{ secrets.SEQAN_ACTIONS_PAT }} diff --git a/.github/workflows/ram_usage.yml b/.github/workflows/ram_usage.yml index df30178822..1c0034de6d 100644 --- a/.github/workflows/ram_usage.yml +++ b/.github/workflows/ram_usage.yml @@ -38,14 +38,6 @@ jobs: uses: actions/checkout@v4 with: path: seqan3 - submodules: true - - - name: Checkout SeqAn2 - uses: actions/checkout@v4 - with: - repository: seqan/seqan - path: seqan3/submodules/seqan - fetch-depth: 1 - name: Setup compiler uses: seqan/actions/setup-compiler@main From d4a98571b79374b1ceceee5dff06d36bb203f78a Mon Sep 17 00:00:00 2001 From: Enrico Seiler Date: Tue, 15 Oct 2024 14:49:06 +0200 Subject: [PATCH 13/13] [INFRA] Remove submodules --- .gitmodules | 9 --------- submodules/cereal | 1 - submodules/sdsl-lite | 1 - 3 files changed, 11 deletions(-) delete mode 100644 .gitmodules delete mode 160000 submodules/cereal delete mode 160000 submodules/sdsl-lite diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index f9615a8e0e..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,9 +0,0 @@ -# SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin -# SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik -# SPDX-License-Identifier: CC0-1.0 -[submodule "sdsl-lite"] - path = submodules/sdsl-lite - url = https://github.com/xxsds/sdsl-lite -[submodule "cereal"] - path = submodules/cereal - url = https://github.com/USCiLab/cereal diff --git a/submodules/cereal b/submodules/cereal deleted file mode 160000 index ebef1e9298..0000000000 --- a/submodules/cereal +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ebef1e929807629befafbb2918ea1a08c7194554 diff --git a/submodules/sdsl-lite b/submodules/sdsl-lite deleted file mode 160000 index 7e07a14579..0000000000 --- a/submodules/sdsl-lite +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7e07a14579c31cefad0ec6fa2b2e3e78dbbc1a68