Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • anhodges/Gaudi
  • holau/Gaudi
  • dmagdali/Gaudi
  • pmunozpa/Gaudi
  • ssottoco/Gaudi
  • cvarni/Gaudi
  • mafila/Gaudi
  • admorris/Gaudi
  • staider/Gaudi
  • gunther/Gaudi
  • bstanisl/Gaudi
  • jtorasso/Gaudi
  • wochung/Gaudi
  • mveghel/Gaudi
  • averbyts/Gaudi
  • dguest/Gaudi
  • alboyer/Gaudi
  • dkonst/Gaudi
  • jcarcell/Gaudi
  • elmsheus/Gaudi
  • hpxgaudi/Gaudi
  • ganis/Gaudi
  • tadej/Gaudi
  • hahansen/Gaudi
  • juesseiv/Gaudi
  • imjelde/gaudida
  • jheuel/Gaudi
  • mimazure/Gaudi
  • masato/Gaudi
  • dcasperfaser/Gaudi
  • faser/offline/Gaudi
  • axu/Gaudi
  • sailer/Gaudi
  • amete/Gaudi
  • ponyisi/Gaudi
  • vavolkl/Gaudi
  • mstahl/Gaudi
  • wlampl/Gaudi
  • kreczko/Gaudi
  • emoyse/Gaudi
  • dhynds/Gaudi
  • sstahl/Gaudi
  • rcurrie/Gaudi
  • smh/Gaudi
  • valassi/Gaudi
  • bwynne/Gaudi_gaudi
  • abarton/Gaudi
  • tsulaia/gaudigaudi
  • mnowak/Gaudi
  • roiser/Gaudi
  • merrenst/Gaudi
  • mato/Gaudi
  • christos/Gaudi
  • goetz/Gaudi
  • goetz/AtlasGaudi
  • tsulaia/atlasgaudi
  • olupton/Gaudi
  • pseyfert/Gaudi
  • graemes/Gaudi
  • akraszna/AtlasGaudi
  • cattanem/Gaudi
  • skluth/Gaudi
  • will/Gaudi
  • ssnyder/Gaudi
  • agonzale/Gaudi
  • leggett/AtlasGaudi
  • apearce/Gaudi
  • mnowak/Gaudi-ORIG
  • fwinkl/AtlasGaudi
  • bwynne/Gaudi_atlas
  • chamont/Gaudi
  • rmatev/Gaudi
  • lhcb/Gaudi
  • atlas/Gaudi
  • akraszna/GaudiGaudi
  • fwinkl/Gaudi
  • jonrob/Gaudi
  • azaborow/Gaudi
  • clemenci/Gaudi
  • hgraslan/Gaudi
  • srimanob/Gaudi
  • graven/Gaudi
  • hegner/Gaudi
  • gaudi/Gaudi
84 results
Show changes
Commits on Source (2361)
Showing
with 2838 additions and 589 deletions
......@@ -112,4 +112,15 @@ SpacesInParentheses: true
Standard: Cpp11
TabWidth: 8
UseTab: Never
---
Language: Json
IndentWidth: 4
ColumnLimit: 120
---
Language: JavaScript
ColumnLimit: 120
---
Language: ObjC
# Don't format Objective-C, Objective-C++ files.
DisableFormat: true
...
# Formatting, extracted from #1268
766b187feb138c152ed02b8d8256f1c61ccde4ce
14a63e0a0d68fef767e9988aac418a260ae3d6e7
# Formatting
0e0deb974401d70dd16b151a0983d184aaee75e9
# clang-format
225ae7fa984f6e34c47ffadefa5ae2e344430920
cmake/GaudiProjectConfig.cmake export-subst
release.notes export-subst
*.icpp gitlab-language=cpp
......@@ -7,6 +7,8 @@ InstallArea/
# Centrally managed files and helpers
cache_preload.cmake
toolchain.cmake
Makefile
# CMake temporary files
build*/
......@@ -16,6 +18,7 @@ CTestTestfile.cmake
CPackSourceConfig.cmake
CPackConfig.cmake
cmake_install.cmake
Testing/
# common byproducts
*.pyc
......@@ -28,9 +31,10 @@ DoxyWarnings.log
*.launch
*.launch.py
*.launch.opts
*_cache
# QMTest byproducts
**/tests/qmtest/*
**/tests/qmtest/*.*
!**/tests/qmtest/*.qms
!**/tests/qmtest/*.qmt
......
stages:
- build
- test
- deploy
image: gitlab-registry.cern.ch/lhcb-core/lbdocker/centos7-build
#####################################################################################
# (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations #
# #
# This software is distributed under the terms of the Apache version 2 licence, #
# copied verbatim in the file "LICENSE". #
# #
# In applying this licence, CERN does not waive the privileges and immunities #
# granted to it by virtue of its status as an Intergovernmental Organization #
# or submit itself to any jurisdiction. #
#####################################################################################
variables:
NO_LBLOGIN: "1"
CMAKE_GENERATOR: 'Ninja' # default build system
TARGET_BRANCH: master
BINARY_TAG: x86_64-centos7-gcc8-opt
BUILDDIR: build-opt
TESTS_REPORT: "test_report"
LCG_hostos: "x86_64-centos7"
LCG_release_area: "/cvmfs/sft.cern.ch/lcg/releases"
LCG_contrib: "/cvmfs/sft.cern.ch/lcg/contrib"
CCACHE_VERSION: "3.3.4-e92e5"
build:gcc8:opt:
stage: build
TARGET_REPOSITORY: https://gitlab.cern.ch/gaudi/Gaudi.git
# Job templates
.build: &template_build
tags:
- cvmfs
variables:
BINARY_TAG: x86_64-centos7-gcc8-opt
BUILDDIR: build-opt
before_script:
# Add Ninja and CMake to the PATH
- export PATH="/cvmfs/sft.cern.ch/lcg/contrib/CMake/3.20.0/Linux-$(uname -m)/bin:/cvmfs/sft.cern.ch/lcg/contrib/ninja/1.11.1/Linux-$(uname -m)/bin:$PATH"
- export CCACHE_DIR=$PWD/.ccache
- "export LCG_VERSION=$(cut -d: -f2 <<< $CI_JOB_NAME)"
- "export platform=$(cut -d: -f3 <<< $CI_JOB_NAME)"
- "export PRESET=$(cut -d: -f4 <<< $CI_JOB_NAME)"
- if [ -z "$PRESET" ] ; then PRESET=full ; fi
script:
- ci-utils/build
- git clone https://gitlab.cern.ch/lhcb-core/lcg-toolchains.git
- cmake --version
- cmake -S . -B build -Wno-dev -DCMAKE_TOOLCHAIN_FILE=lcg-toolchains/LCG_${LCG_VERSION}/${platform}.cmake -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DGAUDI_TEST_PUBLIC_HEADERS_BUILD=yes -C ci-utils/preset-${PRESET}.cmake
- ccache -z
# pre-heat ccache cache for GaudiKernel
- jobs=$(nproc)
- while [[ $jobs -ge 1 ]] ; do
- cmake --build build -j $jobs --target GaudiKernel && break || true
- jobs=$(( $jobs / 2 ))
- done
# build from scratch
- cmake --build build --target clean
- cmake --build build 2>&1 | tee build.log
- ccache -s
- cp build/compile_commands.json .
# run the tests
- cd build
- if ctest -T test -j $(nproc) --repeat until-pass:3 --no-compress-output ; then result=success ; else result=failure ; fi
- cp Testing/$(head -1 Testing/TAG)/Test.xml ..
- cd ..
- xsltproc ci-utils/CTest2JUnit.xslt Test.xml > results.xml
- echo "Test results can be browsed at https://lhcb-nightlies.web.cern.ch/utils/test_report?url=${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/Test.xml"
- test "$result" = "success"
artifacts:
paths:
- ${BUILDDIR}
- .ccache
- build.log
- compile_commands.json
- Test.xml
reports:
junit:
- results.xml
when: always
expire_in: 1 week
cache:
key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
paths:
- .ccache
- build/Testing
build:gcc8:dbg:
stage: build
tags:
- cvmfs
variables:
BINARY_TAG: x86_64-centos7-gcc8-dbg
BUILDDIR: build-dbg
.lhcb_build: &template_lhcb_build
<<: *template_build
script:
- ci-utils/build
- shopt -s expand_aliases
- . /cvmfs/lhcb.cern.ch/lib/LbEnv
- cmake --version
- lb-set-platform $platform
- lb-project-init --overwrite
- ccache -z
- mkdir build.${BINARY_TAG}
- if [ -e build/Testing ] ; then mv build/Testing build.${BINARY_TAG} ; fi
# pre-heat ccache cache for GaudiKernel
- jobs=$(nproc)
- while [[ $jobs -ge 1 ]] ; do
- make BUILDFLAGS=-j$jobs GaudiKernel && break || true
- jobs=$(( $jobs / 2 ))
- done
# build from scratch
- make clean
- make 2>&1 | tee build.log
- ccache -s
# run the tests
- if make test ARGS="-j $(nproc) --repeat until-pass:3 --no-compress-output" ; then result=success ; else result=failure ; fi
- cp build.${BINARY_TAG}/Testing/$(head -1 build.${BINARY_TAG}/Testing/TAG)/Test.xml .
- mkdir -p build && mv build.${BINARY_TAG}/Testing build
- cp build.${BINARY_TAG}/compile_commands.json .
- mv build.${BINARY_TAG}/html .
- xsltproc ci-utils/CTest2JUnit.xslt Test.xml > results.xml
- echo "Test results can be browsed at https://lhcb-nightlies.web.cern.ch/utils/test_report?url=${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/Test.xml"
- test "$result" = "success"
artifacts:
paths:
- ${BUILDDIR}
- .ccache
- build.log
- compile_commands.json
- Test.xml
- html
reports:
junit:
- results.xml
when: always
expire_in: 1 week
check-formatting:
stage: build
dependencies: []
image: debian:testing
.lcg_view_build: &template_lcg_view_build
<<: *template_build
script:
- apt update && apt install -y clang-format-7 python-pip git
- pip install yapf==0.24.0
- ci-utils/check-formatting
artifacts:
paths:
- apply-formatting.patch
when: on_failure
expire_in: 1 day
- . /cvmfs/sft.cern.ch/lcg/views/LCG_${LCG_VERSION}/${platform}/setup.sh
- export CONFIGURABLE_DB_IGNORE=/cvmfs/sft.cern.ch/lcg/views/LCG_${LCG_VERSION}/${platform}/lib/Gaudi.confdb
- cmake --version
- cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
- ccache -z
# pre-heat ccache cache for GaudiKernel
- jobs=$(nproc)
- while [[ $jobs -ge 1 ]] ; do
- cmake --build build -j $jobs --target GaudiKernel && break || true
- jobs=$(( $jobs / 2 ))
- done
# build from scratch
- cmake --build build --target clean
- cmake --build build 2>&1 | tee build.log
- ccache -s
- cp build/compile_commands.json .
# run the tests
- cd build
- if ctest -T test -j $(nproc) --repeat until-pass:3 --no-compress-output ; then result=success ; else result=failure ; fi
- cp Testing/$(head -1 Testing/TAG)/Test.xml ..
- cd ..
- xsltproc ci-utils/CTest2JUnit.xslt Test.xml > results.xml
- echo "Test results can be browsed at https://lhcb-nightlies.web.cern.ch/utils/test_report?url=${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/Test.xml"
- test "$result" = "success"
doxygen:
stage: test
dependencies:
- build:gcc8:opt
tags:
- cvmfs
only:
- master
- tags
.warnings-check: &template_warnings_check
image: gitlab-registry.cern.ch/linuxsupport/alma9-base:latest
variables:
BINARY_TAG: x86_64-centos7-gcc8-opt
BUILDDIR: build-opt
LOG: build.log
script:
- . ci-utils/env_setup.sh
- find ${BUILDDIR} -type f -exec touch -d $(date +@%s) \{} \;
- make BUILDDIR=${BUILDDIR} doc
- rm -rf public
- mkdir -p public/doxygen
- mv ${BUILDDIR}/doxygen/html ${CI_COMMIT_REF_SLUG}
- zip -r -q public/doxygen/${CI_COMMIT_REF_SLUG}.zip ${CI_COMMIT_REF_SLUG}
artifacts:
paths:
- public
expire_in: 1 day
- ci-utils/build-check ${LOG}
allow_failure: true
test:gcc8:opt:
stage: test
dependencies:
- build:gcc8:opt
tags:
- cvmfs
### Regular builds
lcg:105c:x86_64-el9-gcc13-opt:
<<: *template_build
image: gitlab-registry.cern.ch/lhcb-docker/os-base/alma9-devel:latest
warnings-check:lcg:105c:x86_64-el9-gcc13-opt:
<<: *template_warnings_check
needs:
- job: "lcg:105c:x86_64-el9-gcc13-opt"
artifacts: true
lcg:105c:x86_64-el9-gcc13-dbg:
<<: *template_build
image: gitlab-registry.cern.ch/lhcb-docker/os-base/alma9-devel:latest
warnings-check:lcg:105c:x86_64-el9-gcc13-dbg:
<<: *template_warnings_check
needs:
- job: "lcg:105c:x86_64-el9-gcc13-dbg"
artifacts: true
### Special builds
lcg:105c:x86_64-el9-gcc13-opt:minimal:
<<: *template_build
image: gitlab-registry.cern.ch/lhcb-docker/os-base/alma9-devel:latest
warnings-check:lcg:105c:x86_64-el9-gcc13-opt:minimal:
<<: *template_warnings_check
needs:
- job: "lcg:105c:x86_64-el9-gcc13-opt:minimal"
artifacts: true
lcg:105c:x86_64-el9-gcc13-opt:no-AIDA:
<<: *template_build
image: gitlab-registry.cern.ch/lhcb-docker/os-base/alma9-devel:latest
warnings-check:lcg:105c:x86_64-el9-gcc13-opt:no-AIDA:
<<: *template_warnings_check
needs:
- job: "lcg:105c:x86_64-el9-gcc13-opt:no-AIDA"
artifacts: true
lcg:105c:x86_64-el9-gcc13-opt:no-examples:
<<: *template_build
image: gitlab-registry.cern.ch/lhcb-docker/os-base/alma9-devel:latest
warnings-check:lcg:105c:x86_64-el9-gcc13-opt:no-examples:
<<: *template_warnings_check
needs:
- job: "lcg:105c:x86_64-el9-gcc13-opt:no-examples"
artifacts: true
# LHCb-style build
lhcb:105c:x86_64_v3-el9-gcc13-opt+g:
<<: *template_lhcb_build
image: gitlab-registry.cern.ch/lhcb-docker/os-base/alma9-devel:latest
warnings-check:lhcb:105c:x86_64_v3-el9-gcc13-opt+g:
<<: *template_warnings_check
needs:
- job: "lhcb:105c:x86_64_v3-el9-gcc13-opt+g"
artifacts: true
# Build on LCG View
lcg-view:105c:x86_64-el9-gcc13-opt:
<<: *template_lcg_view_build
image: gitlab-registry.cern.ch/lhcb-docker/os-base/alma9-devel:latest
warnings-check:lcg-view:105c:x86_64-el9-gcc13-opt:
<<: *template_warnings_check
needs:
- job: "lcg-view:105c:x86_64-el9-gcc13-opt"
artifacts: true
# Compatibility
lcg-view:105c:x86_64-el9-clang16-opt:
<<: *template_lcg_view_build
image: gitlab-registry.cern.ch/lhcb-docker/os-base/alma9-devel:latest
warnings-check:lcg-view:105c:x86_64-el9-clang16-opt:
<<: *template_warnings_check
needs:
- job: "lcg-view:105c:x86_64-el9-clang16-opt"
artifacts: true
lcg-view:106:x86_64-el9-gcc13-opt:
<<: *template_lcg_view_build
image: gitlab-registry.cern.ch/lhcb-docker/os-base/alma9-devel:latest
warnings-check:lcg-view:106:x86_64-el9-gcc13-opt:
<<: *template_warnings_check
needs:
- job: "lcg-view:106:x86_64-el9-gcc13-opt"
artifacts: true
lcg-view:104:x86_64-el9-gcc13-opt:
<<: *template_lcg_view_build
image: gitlab-registry.cern.ch/lhcb-docker/os-base/alma9-devel:latest
warnings-check:lcg-view:104:x86_64-el9-gcc13-opt:
<<: *template_warnings_check
needs:
- job: "lcg-view:104:x86_64-el9-gcc13-opt"
artifacts: true
### Misc checks
check-unused:
image: gitlab-registry.cern.ch/lhcb-docker/os-base/alma9-devel:latest
needs:
- job: "lcg:105c:x86_64-el9-gcc13-opt"
artifacts: true
script:
- ci-utils/check-sources compile_commands.json
allow_failure: true
pre-commit-checks:
image: registry.cern.ch/docker.io/library/python:3.9
variables:
BINARY_TAG: x86_64-centos7-gcc8-opt
BUILDDIR: build-opt
PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit
cache:
paths:
- ${PRE_COMMIT_HOME}
before_script:
- |
set -x
python -m venv ${CI_PROJECT_DIR}/.cache/pre-commit-venv
. ${CI_PROJECT_DIR}/.cache/pre-commit-venv/bin/activate
pip install pre-commit
git fetch $TARGET_REPOSITORY $TARGET_BRANCH
git config user.name "Gitlab CI"
git config user.email "noreply@cern.ch"
script:
- ci-utils/test
- |
if ! pre-commit run --show-diff-on-failure --from-ref FETCH_HEAD --to-ref HEAD ; then
echo ""
echo "Generating patch file..."
git commit -a -m "pre-commit fixes
patch generated by ${CI_JOB_URL}" > /dev/null
git format-patch HEAD~
cat <<EOF
=======================================
You can apply these changes with:
curl ${CI_JOB_URL}/artifacts/raw/0001-pre-commit-fixes.patch | git am
=======================================
EOF
exit 1
fi
artifacts:
paths:
- ${TESTS_REPORT}
when: always
- 0001-pre-commit-fixes.patch
when: on_failure
expire_in: 1 week
test:gcc8:dbg:
stage: test
dependencies:
- build:gcc8:dbg
tags:
- cvmfs
variables:
BINARY_TAG: x86_64-centos7-gcc8-dbg
BUILDDIR: build-dbg
### Documentation
website:
image: registry.cern.ch/docker.io/library/python:3.9
script:
- ci-utils/test
- rm -rf public
- mkdir -p public
- cd docs
- pip install -r source/requirements.txt
- make html
- cp -a build/html/. ../public/.
artifacts:
paths:
- ${TESTS_REPORT}
when: always
expire_in: 1 week
- public
expire_in: 1 day
test_public_headers_build:
stage: test
dependencies:
- build:gcc8:opt
tags:
- cvmfs
variables:
BINARY_TAG: x86_64-centos7-gcc8-opt
BUILDDIR: build-opt
doxygen:105c:x86_64-el9-gcc13-opt:
<<: *template_build
image: gitlab-registry.cern.ch/lhcb-docker/os-base/alma9-devel:latest
script:
- ci-utils/test_public_headers_build
- . /cvmfs/sft.cern.ch/lcg/views/LCG_${LCG_VERSION}/${platform}/setup.sh
- cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
- cmake --build build --target doc
- rm -rf public
- mkdir -p public/doxygen
- cp -r GaudiRelease/web_helpers/. public/doxygen/.
- mv build/doxygen/html ${CI_COMMIT_REF_SLUG}
- zip -r -q public/doxygen/${CI_COMMIT_REF_SLUG}.zip ${CI_COMMIT_REF_SLUG}
artifacts:
paths:
- .ccache
expire_in: 1 week
- public
expire_in: 1 day
# see https://gitlab.cern.ch/gitlabci-examples/deploy_eos for the details
# of the configuration
deploy-doxygen:
stage: deploy
dependencies:
- doxygen
only:
- master
- tags
deploy-website:
needs:
- job: "website"
artifacts: true
- job: "doxygen:105c:x86_64-el9-gcc13-opt"
artifacts: true
rules:
- if: $CI_COMMIT_BRANCH == "master"
- if: $CI_COMMIT_TAG
image: gitlab-registry.cern.ch/ci-tools/ci-web-deployer:latest
script:
- test -z "$EOS_ACCOUNT_USERNAME" -o -z "$EOS_ACCOUNT_PASSWORD" -o -z "$EOS_PATH" && exit 0 || true
# Script that performs the deploy to EOS. Makes use of the variables defined in the project
# It will copy the generated content to the folder in EOS
- export CI_OUTPUT_DIR=public/
- deploy-eos
# do not run any globally defined before_script or after_script for this step
before_script: []
......
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
exclude: "\\.clang-format$"
- id: check-toml
- id: check-added-large-files
- repo: https://gitlab.cern.ch/lhcb-core/dev-tools/check-include-convention.git
rev: 0.1.0
hooks:
- id: check-include-convention
- repo: https://github.com/pre-commit/mirrors-clang-format
rev: v16.0.6
hooks:
- id: clang-format
- id: clang-format
name: clang-format (non-standard extensions)
types_or: [file]
files: \.(icc|icpp)$
- repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version.
rev: v0.4.4
hooks:
# Run the linter.
- id: ruff
args: [ --fix ]
exclude: "^.*/options/.*$"
# Run the formatter.
- id: ruff-format
- repo: local
hooks:
- id: copyright-year
name: update copyright year
language: script
entry: utils/update_copyright_year.py
types_or: [c++, c, python, cmake, xml, yaml]
exclude: |
(?x)(
ci-utils/preset-.*\.cmake|
lhcbproject\.yml|
tests/.*\.yaml|
\.clang-format
)
......@@ -5,7 +5,1354 @@ Project Coordinators: Marco Clemencic @clemenci, Charles Leggett @leggett
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
## [Unreleased][]
## [v39r4](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v39r4) - 2025-03-20
Another minor release to pick up some bug fixes and minor improvements in preparation
for 2025 data taking (for LHCb).
A special thanks to all the people that contributed to this release:
@fwinkl,
@graven,
@jcarcell,
@jonrob,
@sponce,
@staider.
### Changed
- Replace SFINAE with concepts / requires clauses (gaudi/Gaudi!1714)
- Remove checks for a version of the C++ standard lower than 20 (gaudi/Gaudi!1707)
- Histograming/Sink/Utils.h: Truncate histogram name as required during printout (gaudi/Gaudi!1704)
- Clean up a few headers, remove unused headers, add headers that are used (gaudi/Gaudi!1706)
- DataObjID: on-demand lookup of className (gaudi/Gaudi!1700)
- Remove the deprecated put with a raw pointer in DataObjectHandle.h (gaudi/Gaudi!1701)
### Fixed
- Fixed unused argument warning in local_valgrind on ARM (gaudi/Gaudi!1716)
- Allow concrete services to be used in ServiceHandle<T> (gaudi/Gaudi#344, gaudi/Gaudi!1715)
- Define BOOST_ALLOW_DEPRECATED_HEADERS when including qi.hpp (gaudi/Gaudi!1705)
- Fix CI warnings for builds without AIDA (gaudi/Gaudi#357, gaudi/Gaudi!1708)
- Fix test name when gaudi_add_pytest is passed a test file (gaudi/Gaudi#354, gaudi/Gaudi!1713)
- fix spelling of PREFETCH (gaudi/Gaudi!1711)
- Fix Histogram Summaries Parsing to Remove Empty Lines (gaudi/Gaudi!1703)
- GaudiTestSuite: fix missing definition of static member (gaudi/Gaudi!1699)
## [v39r3](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v39r3) - 2025-02-21
This is a minor release meant to pick up a few fixes and, in particular, small improvements on
the pytest helpers that are required by LHCb to start migrating from QMTest to pytest.
A special thanks to all the people that contributed to this release:
@jcarcell,
@jonrob,
@sponce,
@staider.
### Changed
- Remove the deprecated PropertyMgr (gaudi/Gaudi!1693)
### Added
- Add the `gaudi-test-run` script to run just the job from a pytest/GaudiExeTest test class (gaudi/Gaudi#332, gaudi/Gaudi!1690)
- Add support for switching between `FIXTURES_REQUIRED` and `DEPENDS` in pytest (gaudi/Gaudi#330, gaudi/Gaudi!1692)
### Fixed
- Fixed support for tuples and containers in Properties (gaudi/Gaudi!1696)
- Fix bin value determination when computing stats for int type histograms (gaudi/Gaudi!1688)
- Add code tags for stdout/stderr and correctly escape diff blocks (gaudi/Gaudi!1694)
- Prevent pytes` to hang on large stdout (gaudi/Gaudi!1695)
- Modify `test_issue_213` to test what it is supposed to test (gaudi/Gaudi!1691)
- Remove two unused includes (gaudi/Gaudi!1689)
- `FiberManager`: Remove unused lambda capture (gaudi/Gaudi!1687)
## [v39r2](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v39r2) - 2024-12-19
This is a minor update just to wrap up 2024. We have some clean up, but mostly
bug fixes.
A special thanks to all the people that contributed to this release:
@bstanisl,
@dabacher,
@fwinkl,
@jcarcell,
@jonrob,
@sailer,
@sponce.
### Changed
- New AsynchronousAlgorithms API (gaudi/Gaudi!1680)
- Histograming/Sink/Utils.h: Use double as type for internal histogram stats calculations (gaudi/Gaudi!1682)
- THistSvc: abort job in case file size is too large (gaudi/Gaudi!1681)
- CompressionSetting: replace deprecated and removed enums (gaudi/Gaudi!1678)
### Added
- Add parser for `std::map<std::string, std::pair<int, int>>` properties (!1676)
### Fixed
- `Histograming/Sink/Utils.h`: Fix calculation of stats for (profile) histograms (gaudi/Gaudi#351, gaudi/Gaudi!1684)
- Cleanup headers and imports (gaudi/Gaudi!1645)
- Fixed ROOT Sink for Profile histograms 1D (gaudi/Gaudi#347, gaudi/Gaudi!1675)
- Improve pytest coverage report modules selection (gaudi/Gaudi!1679)
- Polishing of GaudiHistoArray and its test based on #346 (gaudi/Gaudi#346, gaudi/Gaudi!1674)
- Fixes for various cppcheck defects (gaudi/Gaudi!1670, gaudi/Gaudi!1672, gaudi/Gaudi!1673)
- Fix potential overflow in sscanf usage (gaudi/Gaudi!1669)
- SmartDataObjectPtr: fix assignment operator (gaudi/Gaudi!1668)
## [v39r1](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v39r1) - 2024-10-31
Today we have a minor release collecting a number of bugfixes and improvements.
In particular there are several fixes and usability improvements for
`Accumulators::Histogram` (gaudi/Gaudi!1643, gaudi/Gaudi!1639, gaudi/Gaudi!1646,
gaudi/Gaudi!1641, gaudi/Gaudi!1652, gaudi/Gaudi!1651) and in the new `pytest`
based tests (gaudi/Gaudi!1631, gaudi/Gaudi!1659, gaudi/Gaudi!1644, gaudi/Gaudi!1660).
We have a couple of important changes worth mentioning:
- an improvement that was added to [v38r1p1](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v39r0) (gaudi/Gaudi!1648)
- a fix for the new asynchronous algorithms (gaudi/Gaudi!1653)
Please, note that a few old (deprecated) APIs noe issue deprecation warnings and
will be removes in v40r0 (gaudi/Gaudi!1637).
A special thanks to all the people that contributed to this release:
@bstanisl,
@dmagdali,
@fwinkl,
@jonrob,
@rquaglia,
@sponce,
@staider,
@jcarcell.
### Changed
- Improved usability of HistogramArray (lhcb/Lbcom#12, gaudi/Gaudi!1643)
- Print more informations about histograms in the MessageSvc (gaudi/Gaudi!1639)
- Deprecate obsolete ISvcLocator APIs (Gaudi < v22) (gaudi/Gaudi!1637)
- Use pytest_runtest_logreport instead of pytest_runtest_makereport (gaudi/Gaudi!1631)
- Make NTupleName a property of the NTupleWriter (gaudi/Gaudi!1650)
- Improvements to pytest helpers (gaudi/Gaudi!1659)
- Remove compatibility with Python 2 in genconf.cpp (gaudi/Gaudi!1642)
- Convert existing pytest tests using run_gaudi to GaudiExeTest (gaudi/Gaudi#335, gaudi/Gaudi!1644)
### Added
- Add default 'count messages' test in GaudiExeTest (gaudi/Gaudi!1660)
- Port changes in v38r1-patches to master (gaudi/Gaudi!1655)
- Add `NTupleSvc.BasketSize` property and forward in RCWNTupleCnv Branch creation (gaudi/Gaudi!1648)
- Expose buffer type via histogram (gaudi/Gaudi!1646)
- Expose axis in the new Histogram API (gaudi/Gaudi!1641)
- Added testing for std::optional functionality of Gaudi::NamedRange (gaudi/Gaudi#340, gaudi/Gaudi!1640)
### Fixed
- Restore fix for #233 (gaudi/Gaudi!1665)
- Fix handling of env variables in options arguments (gaudi/Gaudi#343, gaudi/Gaudi!1661)
- Fixed definition of StaticWeightedProfileHistogram. The InputTransform was not correct (gaudi/Gaudi!1652)
- Fix handling of 'path/to/file:some_suffix' in test arguments (gaudi/Gaudi!1658, gaudi/Gaudi!1666)
- Add missing std::move in Buffer move constructor and add unit test for moving a histogram buffer (gaudi/Gaudi!1651)
- Asynchronous algorithm fixes (gaudi/Gaudi!1653)
- Prevent spurious failures from pre-commit in MRs from forks (gaudi/Gaudi!1662)
## [v39r0](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v39r0) - 2024-09-23
This major release of Gaudi features a number of backward incompatible changes that have been waiting
for a chance of being integrated, like
- remove the deprecated GaudiAlg (gaudi/Gaudi#322)
- replace *blocking* algorithms with *asynchronous* algorithms (gaudi/Gaudi!1553)
- allow delayed initialization of counter based histograms and configure them via properties (gaudi/Gaudi!1586)
- note: `Gaudi::Accumulators::Histogram` etc. is now constructed at initialization time
and implies the declaration of a property to be able to set axes properties. The old behaviour
is available through `Gaudi::Accumulators::StaticHistogram` etc.
- update baseline version of dependencies to LCG 104 (gaudi/Gaudi#289)
- the code is tested against, for example, Boost >= 1.82, ROOT >= 6.28/04, Python >= 3.9.12, fmtlib >= 10
- compilation requires gcc >= 13, C++ >= 20, CMake >= 3.19
- deprecate some old APIs and headers (gaudi/Gaudi!1634, gaudi/Gaudi!761)
- to be removed in gaudi/Gaudi%v40r0
I also want to mention that as of this release we are enforcing the convention that
the form `#include "some_header.h"` is only used for actual relative paths while for all other
includes we must use `#include <some_header.h>`. See gaudi/Gaudi#300 for the details.
Note that the fact that we do not run test builds with C++17 means that we do not
require anymore merge requests to be C++17 compatible.
These big backward incompatible changes are accompanied by some backward compatible new features
- `AvalancheSchedulerSvc` now can dump the data dependencies in a graph file (`.dot` or `.md`) (gaudi/Gaudi!1561)
- QMTest (`.qmt`) tests have been migrated to pytest thanks to new helper classes and plugins (gaudi/Gaudi!1605)
Of course, we also have a fair collection of fixes (listed below).
A special thanks to all the people that contributed to this release:
@bstanisl,
@cvarni,
@dmagdali,
@elmsheus,
@fwinkl,
@graven,
@jcarcell,
@sponce,
@staider.
### Changed
- Deprecate hacks needed to support Gaudi v20 API (gaudi/Gaudi!1634)
- Use include with quotes only for relative paths (gaudi/Gaudi#300, gaudi/Gaudi!1572)
- Remove GaudiAlg and all references to it (gaudi/Gaudi#322, gaudi/Gaudi!1628)
- Make Histograms configurable via properties (gaudi/Gaudi#206, gaudi/Gaudi!1586)
- Deprecate old parsers headers (gaudi/Gaudi!761)
- Replace the copyright check in gitlab-ci with with a pre-commit hook (gaudi/Gaudi!1635)
- Drop compatibility with fmtlib < 8 (gaudi/Gaudi#268, gaudi/Gaudi!1630)
- Reduce the visibility of operator<< and several others (gaudi/Gaudi!1623)
- HiveDataBroker: make dependency resolution deterministic (lhcb/DaVinci#215, lhcb/DaVinci#216, gaudi/Gaudi!1617)
- Delete deprecated `DataObjIDProperty.h` header (gaudi/Gaudi!1614)
- Drop `StalledEventMonitor` and `WatchdogThread` (gaudi/Gaudi#312, gaudi/Gaudi!1592)
- Remove comparison of `SmartRef` to integer (gaudi/Gaudi!1554)
- ToolSvc: replace two separate members which _must_ be in sync with a single dedicated type (gaudi/Gaudi!1547)
- ITHistSvc: remove one deprecated regHist interface (gaudi/Gaudi#319, gaudi/Gaudi!1610)
- Introduce asynchronous algorithms (gaudi/Gaudi!1553)
- Update versions of LCG (gaudi/Gaudi#289, gaudi/Gaudi!1606)
- Remove the requirement of having an `__init__.py` in every Python directory (gaudi/Gaudi#307, gaudi/Gaudi!1607)
### Added
- Added `std::optional` functionality to Gaudi::NamedRange (gaudi/Gaudi!1624)
- Parsers: instantiate property parser for vector<vector<int>> (gaudi/Gaudi!1633)
- Extend `gaudi_add_pytest` with coverage support (gaudi/Gaudi#274, gaudi/Gaudi!1551)
- Implement `GaudiExeTest` base test class and migrate QMTest tests to pytest (gaudi/Gaudi!1605)
- Declare parsers for `std::[unordered_]set` properties (gaudi/Gaudi!1613)
- Implementation of the File Service (gaudi/Gaudi!1599, gaudi/Gaudi!1615)
- Add option to dump data dependencies as `.dot` or `.md` files (gaudi/Gaudi!1561)
- genconf: add command line option to select configurable types to generate (gaudi/Gaudi!1601)
- Added callback feature in Gaudi Algorithms (gaudi/Gaudi!1585)
### Fixed
- MessageSvcSink: fix entities filter to correctly include histograms (gaudi/Gaudi!1638)
- Use report_error for newer versions of fmt (gaudi/Gaudi!1627, gaudi/Gaudi#328, gaudi/Gaudi!1622)
- Fix use of `gaudirun.py path/to/file.py:func` in case the module uses `__file__` (gaudi/Gaudi#336, gaudi/Gaudi!1629)
- Fix tests when `CMAKE_BUILD_TYPE` is not set (gaudi/Gaudi#326, gaudi/Gaudi!1626)
- Fix the `NTupleWriter` algorithm to handle `DataObject*` and `AnyDataWrapperBase*` correctly in `BranchWrapper` (gaudi/Gaudi!1625)
- THistSvc: fix object types on read-back (gaudi/Gaudi!1620)
- Fixed `nEntries` for weighted histograms (gaudi/Gaudi#325, gaudi/Gaudi!1619)
- Improvements to `gaudi_add_pytest` (gaudi/Gaudi!1621)
- Add missing fstream includes triggered by using boost 1.86 (gaudi/Gaudi!1618)
- Add missing include for clang19 (gaudi/Gaudi!1616)
- Set Service semantics to ApplicationMgr Runable and EventLoopMgr properties (gaudi/Gaudi#309, gaudi/Gaudi!1611)
- Add fmtlib support to EventContext (gaudi/Gaudi#311, gaudi/Gaudi!1597)
- Improve compiler detection for pragma directives (gaudi/Gaudi!1565)
- Fix clang warning introduced with gaudi/Gaudi!1553 (gaudi/Gaudi!1612)
- cppcheck fixes (code quality) (gaudi/Gaudi!1609)
## [v38r3p1](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v38r3p1) - 2024-10-22
This release is integrating the changes from [v38r1p1](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v38r1p1)
into v38r3.
### Added
- Add `NTupleSvc.BasketSize` property and forward in RCWNTupleCnv Branch creation (gaudi/Gaudi!1648)
## [v38r3](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v38r3) - 2024-06-28
This is a minor release to collect all pending backward compatible changes and fixes
before integrating the backward incompatible changes scheduled for v39r0.
### Changed
- Use `string_view` consistently in parse methods (gaudi/Gaudi!1594)
- Add hard limit on test stdout/err size (gaudi/Gaudi#313, gaudi/Gaudi!1595)
- Introduce a new way to check timeout on events (gaudi/Gaudi#287, gaudi/Gaudi!1589)
- Use Ruff for Python linting and formatting (gaudi/Gaudi#298, gaudi/Gaudi!1591)
### Fixed
- `listcomponents`: skip factories from other libraries (gaudi/Gaudi!1603)
- Fix building with Catch2 v3 (gaudi/Gaudi!1600)
- `GaudiTestSuite`: pre-commit fixes (gaudi/Gaudi!1602)
- Fix race condition in `PersistencySvc::addCnvService` (gaudi/Gaudi#314, gaudi/Gaudi!1598)
- Improve `BranchWrapper` implementation (gaudi/Gaudi!1596)
## [v38r2](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v38r2) - 2024-05-16
A minor release with a number of fixes and some new features.
In particular I want to highlight the addition of a new algorithm that allows
thread-safe writing of NTuples (gaudi/Gaudi!1577). For the moment it uses TTree as
backend but we plan to add RNTuple support soon. A minor issue is that it cannot
share the output file with the `HistogramSvc` or `Gaudi::Histograming::Sink::Root`,
but there are plans to address it.
Also worth noticing that we started to populate the GaudiExample directory.
It will require some structure and polishing, but it's a start.
### Added
- Implement the `NTuple::Writer` and `NTuple::GenericWriter` algorithms for thread-safe NTuple writing (gaudi/Gaudi!1577, gaudi/Gaudi!1588)
- `AvalancheSchedulerSvc`: include eventID in scheduler dump (gaudi/Gaudi!1579)
- Added a first example in GaudiExample featuring a tiny experiment code (gaudi/Gaudi!1575)
- Add `RootCnvSvc` option to write ROOT files in 'forward compatibility' mode (gaudi/Gaudi#303, gaudi/Gaudi!1573)
- Introduced extra parameter to `ThreadPoolSvc` initPool to allow increase the max allowed parallelism of TBB. (gaudi/Gaudi!1567)
### Fixed
- Fix a couple of weird method signatures in `AlgorithmNode` (gaudi/Gaudi!1590)
- Fix the `HiveSlimEventLoopMgr` exit code when there is a failure in the algorithms (gaudi/Gaudi!1576)
- Fix some includes to build against boost v1.85.0 with gcc12.3 (gaudi/Gaudi!1587)
- Resolve "`AlgContextSvc` may dereference a `nullptr`" (gaudi/Gaudi#304, gaudi/Gaudi!1583)
- Don't use the deprecated `PySys_SetArgv` (gaudi/Gaudi!1578)
- Use the value of `m_scheduledStop` instead of simply ignoring it in `HiveSlimEventLoopMgr` (gaudi/Gaudi#288, gaudi/Gaudi!1545)
- Improved performance of conversion of profile histograms to ROOT (gaudi/Gaudi#305, gaudi/Gaudi!1574)
- Add missing includes for gcc14 (gaudi/Gaudi!1580, gaudi/Gaudi!1581)
- Correctly detect and report a special case of corrupted ROOT file (gaudi/Gaudi#301, gaudi/Gaudi!1571)
- Use Boost IO State Saver to restore initial ostream flags (gaudi/Gaudi#295, gaudi/Gaudi!1570)
- Avoid implicit conversion from float to double (gaudi/Gaudi#299, gaudi/Gaudi!1569)
## [v38r1p1](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v38r1p1) - 2024-10-18
This patch release is needed by LHCb to pick up a small extension to `NTupleSvc`
so that we can fine tune the basket size of the `TTree`s we produce.
### Added
- Add `NTupleSvc.BasketSize` property and forward in RCWNTupleCnv Branch creation (gaudi/Gaudi!1648)
## [v38r1](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v38r1) - 2024-03-15
This backward compatible release of Gaudi features a few fixes and improvements, and a
major step towards some proper polishing an refreshing of the examples.
The `GaudiExamples` directory started as a place to host examples, but evolved in a
collection of tests. Examples should be tested, of course, but we ended up keeping
there tests for backward compatibility with legacy code that were not meant to be
used as examples (see gaudi/Gaudi#254). With this release `GaudiExamples` becomes
`GaudiTestSuite`, leaving the room for development of proper examples. For backward
compatibility we kept some of the exported classes, which are considered deprecated
and will be removed in v39r0 (see gaudi/Gaudi#293).
### Changed
- Rename (Gaudi)Examples to (Gaudi)TestSuite (gaudi/Gaudi!1557)
- Fix node properties in `PrecedenceGraph`, update precedence related scripts (gaudi/Gaudi!1560)
- GaudiPython: sort `set` properties before storing in catalogue (gaudi/Gaudi!1549)
### Added
- Add the possibility to have variable bin size in Monitoring histograms (gaudi/Gaudi!1564)
- Add a `.git-blame-ignore-revs` file with a few formatting commits (gaudi/Gaudi!1558)
### Fixed
- More reliable handling of `\n` in test stdout diff (gaudi/Gaudi#291, gaudi/Gaudi!1563)
- Reset `std::hex` immediately (gaudi/Gaudi!1555)
- Use `fmt::runtime` when compiling with GCC 11 (gaudi/Gaudi!1559)
- Make reproducible_write test work when `GAUDIAPPNAME` is set (gaudi/Gaudi#290, gaudi/Gaudi!1562)
- Fixed behavior of `reset` in Monitoring Hub (gaudi/Gaudi!1552)
## [v38r0](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v38r0) - 2024-01-25
This new major release includes a number of small/technical backward incompatible changes
(meaning that you may or may not be affected by them depending of which parts of Gaudi you use),
but also a couple of more visible changes:
- GaudiAlg is not built anymore by default, but still present and will be removed in a future release
- GaudiPartProp has been updated backporting the changes developed in the LHCb fork (optional and enabled by default)
This release also features a number of speed and memory improvements, fixes and some clean up.
### Changed
- Remove the code which allows to specify 'alternate' TES locations to be resolved at runtime (gaudi/Gaudi!1543)
- Reorganize Gitlab-CI jobs and update LCG baseline versions (gaudi/Gaudi!1539)
- Avoid warnings for "non-failure" exceptions in functional algorithms (gaudi/Gaudi!1523)
- Streamline MonitoringHub and Sink implementations (gaudi/Gaudi!1535)
- GaudiHandles: use dict as storage for GaudiHandleArray (gaudi/Gaudi!1532)
- Disable GaudiAlg by default (gaudi/Gaudi!1531)
- Remove deprecated OutStreamType property (gaudi/Gaudi!1528)
- Remove remaining Python2 compatibility code (gaudi/Gaudi!1527)
- Remove support of and dependency on nosetests (gaudi/Gaudi!1520)
- Add support for unordered set properties (gaudi/Gaudi!1503)
### Added
- New version of PartProp service (gaudi/Gaudi!1493)
- Add buffer method for CounterArray (gaudi/Gaudi!1544)
- GaudiHandleArray: support for slice-based access (gaudi/Gaudi!1541)
- Add `ISequencerTimerTool::scopedTimer` to get an RAII wrapper which starts&stops a timer (gaudi/Gaudi!1536)
- Implemented Root like histograms (gaudi/Gaudi#281, gaudi/Gaudi!1530)
### Fixed
- Speed up and clean up HiveDataBrokerSvc, AlgorithmMgr and ToolSvc (gaudi/Gaudi!1508)
- Fix builds with GCC 11 and C++20 (gaudi/Gaudi!1537)
- Improved interface of BaseSink to lower memory usage (gaudi/Gaudi#279, gaudi/Gaudi!1505)
- Use ROOT_CXX_STANDARD if it is already defined by ROOT, otherwise preserve previous behaviour (gaudi/Gaudi!1538)
- Add missing include mutex (gaudi/Gaudi!1534)
- Support GaudiHive in GaudiPython (gaudi/Gaudi!1526)
- Add missing include for gcc14 (gaudi/Gaudi!1533)
- PropertyProxy: fix append to empty default HandleArray (gaudi/Gaudi!1529)
## [v37r2](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v37r2) - 2023-11-28
Minor fixes in preparation for the next major release.
### Changed
- Deprecate no longer required `concat_alternatives` (gaudi/Gaudi!1513)
- Migrate tests to pytest and various fixes (gaudi/Gaudi!1517 gaudi/Gaudi!1519)
### Fixed
- `GaudiConfig2`: strict type checking for list properties (gaudi/Gaudi!1518)
- Fix booking of n-tuple columns with and without ranges (gaudi/Gaudi#282 gaudi/Gaudi!1522)
- Prefer `std::abs` over `abs` (gaudi/Gaudi!1516, gaudi/Gaudi!1524)
- Fix include for catch2 3.1 and above (gaudi/Gaudi!1515)
- Cleanup of `SmartRef` (gaudi/Gaudi!1512)
- Work around libstdc++ bug (gaudi/Gaudi!1514)
## [v37r1](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v37r1) - 2023-10-30
This is a minor release meant mostly to address issues with compilation on gcc 13, clang 16 and C++20.
It features as well a number of other fixes and improvements and some clean up.
As of this release I added machine readable citation instructions (see https://citation-file-format.github.io/).
### Changed
- Remove `FindTBB.cmake` to rely on the official `TBBConfig.cmake` (gaudi/Gaudi!1510)
- `genconf`: remove property type comment from Conf files (gaudi/Gaudi!1502)
### Added
- Add citation instructions and helper to prepare new releases (gaudi/Gaudi!1494)
### Fixed
- Work around issue with clang implicit instantiation in C++20 mode. (gaudi/Gaudi!1511)
- `JobOptionSvc`: use stringstream to read job options file (gaudi/Gaudi!1509)
- Fixes for gcc 13, clang 16 and C++20 (gaudi/Gaudi!1501)
- Remove name argument from GaudiConfig2 PropertySemantics (gaudi/Gaudi#275, gaudi/Gaudi!1492)
- Drop a Python 2 compatibility hack and fix handling of bool properties in GaudiPython (gaudi/Gaudi#276, gaudi/Gaudi!1507)
- Fixed unsafe floating point comparisons (gaudi/Gaudi!1490)
- `GaudiConfig2`: minor performance optimizations for Configurable (gaudi/Gaudi!1500)
- Fixed JSON counter dumps validation to ignore changes in order of entries (gaudi/Gaudi!1496)
- Support oneTBB (gaudi/Gaudi#270, gaudi/Gaudi!1495)
## [v37r0](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v37r0) - 2023-09-14
This is the first major release of Gaudi in a while. This was made necessary to be able to incorporate
a number of backward incompatible changes that have been kept in the backburner until now.
The main (backward incompatible) changes are:
- clean up and improvements to the new monitoring infrastructure
- custom sinks have to be adapted
- drop of `LIKELY` and `UNLIKELY` preprocessor macros
- they have been deprecated for long, but waiting for a major release to effectively
remove the implementation
- make the subdirectory `GaudiAlg` optional
- still enabled by default, it's not really backward incompatible, but the refactoring
implies that some minor adaptations might be needed in downstream code
Since this a major release we took the occasion to update the versions of the hooks in
`pre-commit-config.yaml` and that caused some minor changes in the formatting.
In addition we have the usual batch of fixes and some new features.
### Changed
- Update versions in `pre-commit` hooks (gaudi/Gaudi!1415)
- Remove old warning message referring to `CMT` (gaudi/Gaudi!1486)
- Cleanup, fixes and new features around monitoring sinks (gaudi/Gaudi!1439)
- Reorganize files and refactor code to make GaudiAlg optional (gaudi/Gaudi!1444)
- Dropped (UN)LIKELY macro (gaudi/Gaudi!1227)
- Update and simplify gitlab-ci (gaudi/Gaudi!1476)
### Added
- Added support for the HepPDT vesion 3 (gaudi/Gaudi!1488)
- Implement helper class for arrays of counters (gaudi/Gaudi!1484)
- Fire ContextIncident `CONNECTED_NTUPLE_OUTPUT` when opening a ntuple file in RFileCnv (gaudi/Gaudi!1478)
- Check errors in histograms unit tests on top of bin content (gaudi/Gaudi!1480)
- Add `GAUDI_PGO` CMake options to enable builds with Profile Guided Optimizations (gaudi/Gaudi!1472)
### Fixed
- Fix missing Property name in error messages (gaudi/Gaudi#265 gaudi/Gaudi!1468)
- Fix TTree output reading in tests (gaudi/Gaudi#273 gaudi/Gaudi!1489)
- Use `inspect.signature` (if possible) instead of the deprecated `getargspec` (gaudi/Gaudi!1485)
- Never rely on default Gitlab Docker image in gitlab-ci (gaudi/Gaudi!1491)
- Fix performance of Counter destructor by using appropriate containers in Sink (gaudi/Gaudi!1477)
- Hide `RdtscClock.h` to non x86_64 builds, needed for aarch64 (gaudi/Gaudi!1479)
- Minor fix in a CMake error message (gaudi/Gaudi!1481)
- GaudiMP: few minor fixes for Python3 (gaudi/Gaudi!1473)
- Fixed clang12 warnings (gaudi/Gaudi!1471)
- Fix finally helper with C++20 (gaudi/Gaudi!1475)
- Fix build with GAUDI_USE_AIDA=OFF (gaudi/Gaudi!1474)
## [v36r16](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r16) - 2023-07-28
Release requested by LHCb to backport gaudi/Gaudi!1478
### Added
- Fire ContextIncident `CONNECTED_NTUPLE_OUTPUT` when opening a ntuple file in
RFileCnv (gaudi/Gaudi!1482)
## [v36r15](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r15) - 2023-07-24
This release is needed so that LHCb can pick up a backward compatible version
of gaudi/Gaudi!1477.
### Fixed
- Fix performance of Counter destructor by using appropriate containers in Sink
(adaptation of gaudi/Gaudi!1477)
## [v36r14](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r14) - 2023-06-19
This release features a number of minor fixes to help downstream projects
work with C++20, plus a few minor fixes.
### Changed
- Make sure `OutputStream` instances are configured with and explicit `Output`
option (gaudi/Gaudi#262 gaudi/Gaudi!1467)
### Added
- Allow disabling of `FIXTURES_REQUIRED` for qmtests (gaudi/Gaudi!1465)
- Made more methods public in Histograms (gaudi/Gaudi!1460)
- Add support for Gaudi::Property to fmtlib (gaudi/Gaudi!1462)
### Fixed
- Fix delegation of `T == Property&lt;T&gt;` for C++20 (gaudi/Gaudi!1466)
- Fixed improper ordering of stops methods in Sinks (gaudi/Gaudi!1464)
- Fixed usage of histograms with integer Arithmetic (gaudi/Gaudi!1461)
## [v36r13](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r13) - 2023-06-05
This is a minor bugfix release needed by LHCb to pick up some additions.
The most interesting changes in this release are:
- fixes to Python code addressing flake8 reports (now flake8 is also in the pre-commit hooks)
- fixes to be able to compile with C++20
- fixes to be able to run on macOS (some usability improvements are still needed, but no blocker left)
### Changed
- Use `GAUDI_LIBRARY_PATH` instead of `LD_LIBRARY_PATH` on macOS (gaudi/Gaudi!1452)
- Cleanup `SmartRef` (in)equality comparisons (gaudi/Gaudi!1451)
- Remove unused indirection for creating new `LinkManagers` (gaudi/Gaudi!1450)
- Avoid spurious copy of `Stream` (gaudi/Gaudi!1449)
- EventContext: make constructor explicit (gaudi/Gaudi!1446)
### Added
- Add new incident `CONNECTED_INPUT` to detect opening of ROOT files for read (gaudi/Gaudi!1456)
- Add flake8 pre-commit hook (gaudi/Gaudi#263 gaudi/Gaudi!1441)
- Add specialized function to declare pytest tests (gaudi/Gaudi!1440, gaudi/Gaudi!1448, gaudi/Gaudi!1457)
- Add move constructor/assignment to `LinkManager` (gaudi/Gaudi!1447)
- Adds the ability to show the data dependencies of AlgTools (gaudi/Gaudi!1348)
### Fixed
- C++20 fixes (gaudi/Gaudi#266 gaudi/Gaudi!1455)
- Fix compiler error with fmt 10.0.0 (gaudi/Gaudi!1454)
- Fix corner case in QMT file parsing (gaudi/Gaudi!1453)
- GaudiConfig2: fix comparison of sequence properties (gaudi/Gaudi#264 gaudi/Gaudi!1445)
- flake8 fixes (gaudi/Gaudi!1443, gaudi/Gaudi!1442, gaudi/Gaudi!1438, gaudi/Gaudi!1437)
- Fix genconf on macOS (gaudi/Gaudi!1406)
## [v36r12][] - 2023-03-20
Another minor release requested by LHCb. The main change is that now
`OutputStream` creates the output file during the *start* transition instead of
when trying to write the first selected event. This means that output files
might be created and left empty rather than not created. The rationale for
this change is to have a more predictable behaviour (one that does not depend
on the job details).
### Changed
- Always write output files (gaudi/Gaudi!1432)
### Added
- GaudiConfig2: add clone for Configurable (gaudi/Gaudi!1433)
### Fixed
- GaudiKernel: flake8 fixes (gaudi/Gaudi!1434)
## [v36r11][] - 2023-02-27
Just a minor update to pick up some changes that didn't make it for v36r10.
### Added
- Adds `CheckedNamedToolsConfigured` functionality (gaudi/Gaudi!1424)
### Fixed
- Fix log file messages when using `Histograming::Sink::Base` (gaudi/Gaudi!1426)
- Remove `TWebFile` access for http(s) `TURL`s and use default `TFile::Open`
via davix instead (gaudi/Gaudi!1427)
- Update version of `isort` used in `pre-commit` (gaudi/Gaudi!1429)
## [v36r10][] - 2023-02-14
This is a small maintenance release focusing on fixing bugs. In particular we fixed a
number of issues affecting builds on MacOS.
There are a few changes that should be mostly transparent from the code point of view,
but may produce slightly different printouts.
### Changed
- Use `python3` instead of `python` (gaudi/Gaudi!1418)
- Use MessageSvc to handle ROOT messages (gaudi/Gaudi!1412)
- Switching from histogramPersistencySvc to new Sinks (gaudi/Gaudi!1401)
### Added
- Add algorithm to programmatically enable/disable perf (gaudi/Gaudi!1408)
- PluginServiceV2: allow factories to be deprecated (gaudi/Gaudi!1395)
### Fixed
- Various fixes for MacOS (gaudi/Gaudi!1422 gaudi/Gaudi!1405 gaudi/Gaudi#249)
- Fix gcc11 anonymous namespace warnings (gaudi/Gaudi!1425)
- Fix use of Boost unit test framework in AttribStringParser_test (gaudi/Gaudi!1420)
- Fixes in preparation for LCG 103 (gaudi/Gaudi!1419)
- Fixed minimal build of Gaudi and added CI test job to validate it (gaudi/Gaudi!1417)
- ProcStats: Use mutex lock to make fetch() thread safe. (gaudi/Gaudi!1410)
- Fix fmt for StatEntity for latest fmt versions (gaudi/Gaudi!1409)
- Property: remove deprecation comment on value() (gaudi/Gaudi!1416)
- Fix issue when building Gaudi with Boost 1.81 (gaudi/Gaudi#255 gaudi/Gaudi!1413)
- Make Catch2 based test compatible with Catch2 v3 (gaudi/Gaudi#252 gaudi/Gaudi!1407)
- Fix gcc12 warnings (gaudi/Gaudi!1403)
## v36r9p1 - 2023-02-03
Strictly identical to v36r9 (except for the version number), needed by LHCb for
a special deployment.
## [v36r9][] - 2022-11-21
Just some minor bugfixes and a few (mostly backword compatible) changes in behaviour.
To be noted:
- ROOT file produced by `RootCnvSvc` are now more reproducible
(gaudi/Gaudi!1380), thanks to a special flag from
[TFile](https://root.cern/doc/master/classTFile.html#ae82abd48570a83d8aecb2af32eaa324ea31be021b9a54c95db15121c28b69f242),
in case of problems or for backward compatibility the new behaviour can be
turned off with the `RootCnvSvc` property `ProduceReproducibleFiles` (dafalt
is `true`)
- `RootCnvSvc` improves compressibility of files by using larger basket sizes
(see gaudi/Gaudi!1381), the side effect is that one may notice al larger use
of VMEM from the job
- we added a few missing `const` in `LinkManager` interface (gaudi/Gaudi!1386),
but that means that downstream code might fail to build if it was relying on
`const` instances returning pointer to non-`const` objects
- you will get a runtime error when trying to create histograms with heading or
trailing whitespaces in titles and labels (gaudi/Gaudi!1397)
### Changed
- Create reproducible ROOT files and clean up tests (gaudi/Gaudi!1380)
- Do not allow whitespace at front or back of histogram titles or labels (lhcb/Gaudi#3 gaudi/Gaudi!1397)
- Optimise basket sizes created by `RootCnvSvc` (gaudi/Gaudi!1381)
- Avoid unneccessary work if tests are not requested (gaudi/Gaudi!1391)
- Use Gitlab CI DAG pipelines (gaudi/Gaudi!1393)
- More const-correct `LinkManager` interface (gaudi/Gaudi!1386)
### Added
- Add test build of public headers (again) (gaudi/Gaudi!1394)
- Add support for `.json` options to `Gaudi.exe` (gaudi/Gaudi!1388)
- Add output dependency checks to `AvalancheSchedulerSvc` (gaudi/Gaudi!1384)
### Fixed
- Fixes to support builds on ARM processors (gaudi/Gaudi!1396)
- Fix use of deprecated Boost headers (gaudi/Gaudi!1400)
- Fix `UnboundLocalError` in `GaudiKernel/Configurable.py` (gaudi/Gaudi!1399)
- Fix detection of platform specific reference files (gaudi/Gaudi#236 gaudi/Gaudi!1398)
- Fix access to Python binary modules from the build tree (gaudi/Gaudi#240 gaudi/Gaudi!1392)
- Fix TProfile creation in ROOT monitoring sink when SetDefaultSumw2 is used (gaudi/Gaudi!1390)
- Use actual counter type when registering to monitoring (gaudi/Gaudi!1389)
- Release the GIL when bootstrapping with `Gaudi.Application` (gaudi/Gaudi!1387)
## [v36r8][] - 2022-10-12
Minor release to pick up some fixes for ATLAS and LHCb.
This release also features some clean up and some improvements to monitoring and testing infrastructure.
### Changed
- Separated `RootHistogramSinkBase` from `RootHistogramSink` (gaudi/Gaudi!1377)
- Avoid worse-case performance issues when computing test diffs (gaudi/Gaudi!1375)
- Remove long deprecated header `CArrayAsProperty.h` (gaudi/Gaudi!1373)
### Added
- Add method to update `Monitoring::Hub::Entity` from JSON data (gaudi/Gaudi!1379)
- Implemented `HistogramArray` class to ease the use of arrays of histograms (gaudi/Gaudi!1372)
- Add execution time of `ValidateOutput` to `BaseTest` output (gaudi/Gaudi!1360)
### Fixed
- Prevent hanging on test timeout with ASan builds (gaudi/Gaudi!1383)
- DataBroker: avoid entering the same producer multiple times as scheduling dependency (gaudi/Gaudi!1382)
- Avoid deprecated `std::iterator` (gaudi/Gaudi!1371)
- Fix race condition in `ServiceManager` (gaudi/Gaudi#237 gaudi/Gaudi!1376)
- Fix test failures when `GAUDIAPPNAME` or `GAUDIAPPVERSION` are set (gaudi/Gaudi#233 gaudi/Gaudi!1374)
- Fix deprecation warnings with Boost 1.79 (gaudi/Gaudi!1370)
- Bootstrap.cpp: Relinquish Python's GIL before calling `executeRun` to allow Python algs in MT mode (gaudi/Gaudi!1369)
- Ensure `MessageSvc` and `JobOptionsSvc` are cleaned up when terminating `ApplicationMgr` (gaudi/Gaudi!1368)
## [v36r7][] - 2022-07-29
Minor release needed by LHCb to pick up some fixes.
Note that the re-write of `Gaudi::Monitoring::JSONSink` is not backward compatible.
### Changed
- New improved `Gaudi::Monitoring::JSONSink` (with support for histograms) (gaudi/Gaudi!1362)
### Fixed
- Allow calling `init()` twice on a `DataHandle` (gaudi/Gaudi#221 gaudi/Gaudi!1366)
- Add missing include of `<utility>` (gaudi/Gaudi#235 gaudi/Gaudi!1365)
- Avoid floating point exception during printing in `EventSelector` (gaudi/Gaudi!1364)
- Forward forgotten `InhibitPathes` property from `HiveWhiteBoard` to `DataSvc` (gaudi/Gaudi!1361)
- Fix check for finding PkgConfig (gaudi/Gaudi!1363)
- Replace `std::result_of_t` with `std::invoke_result_t` following its deprecation in C++17 (gaudi/Gaudi!1359)
## [v36r6][] - 2022-07-11
Same as [v36r5][], we have several small changes and fixes in this release, as well as the removal of some deprecated and unused code.
### Changed
- Modify `FetchLeavesFromFile` to use `IDataManagerSvc::traverseSubTree` (gaudi/Gaudi#232 gaudi/Gaudi!1357)
- Accumulators: drop unused Boost includes (gaudi/Gaudi#228 gaudi/Gaudi!1349)
- Use pkgconfig to find gperftools (gaudi/Gaudi#210 gaudi/Gaudi!1354)
- Delete `StatusCodeSvc` and its interface (gaudi/Gaudi!1310)
- EventIDRange c'tor: Don't reset UNDEF values to 0 (gaudi/Gaudi!1347)
- Cleanup old, unsed and deprecated code in DataHandles (gaudi/Gaudi!1337)
- Update version of Black used in pre-commit (gaudi/Gaudi!1334)
### Added
- Allow histograms to be saved in custom directories (gaudi/Gaudi!1353)
- Support writing ROOT files with LZ4 and ZSTD compression (gaudi/Gaudi!1346)
- Include GaudiException `tag()` strings in GaudiAlg functional warning/error messages when caught (gaudi/Gaudi!1345)
- AvalancheSchedulerSvc: Print also event number if a stall is detected (gaudi/Gaudi!1339)
- Add erase method to PluginSvc Registry class (gaudi/Gaudi!1338)
- Provide diagnostic information instead of SEGV when a bound tool is disabled (gaudi/Gaudi!1330)
### Fixed
- Resolve race conditions in tests (gaudi/Gaudi#211 gaudi/Gaudi!1356)
- Improve memory footprint of `JobOptionsSvc` (gaudi/Gaudi#194 gaudi/Gaudi!1304)
- Do not use anonymous namespaces in Histograms headers (gaudi/Gaudi!1351)
- Fix for allowing full customization of Histograms (gaudi/Gaudi!1352)
- Prevent usage of histograms with wrong number of coordinates (gaudi/Gaudi#226 gaudi/Gaudi!1350)
- Fix a possible uninitialized variable warning (gaudi/Gaudi!1344)
- Fix invalid SUCCESS in `[Ts]DataSvc::retrieveEntry` (gaudi/Gaudi!1333)
- Make `Rndm::Numbers` methods const (gaudi/Gaudi!1343)
- Fix compilation with gcc12. (gaudi/Gaudi!1341)
- Fix clang warning. (gaudi/Gaudi!1340)
- Fix and deprecate histogram filling with `operator+=` (gaudi/Gaudi!1336)
- Use ofstream from std (gaudi/Gaudi!1335)
- Change `AlgResourcePool` to obey isReEntrant() (gaudi/Gaudi!1331)
## [v36r5][] - 2022-04-04
Several small changes and fixes in this release. It also features the removal of some deprecated and unused code.
### Changed
- Suppress Initialize/Finalize (mis)balance messages (gaudi/Gaudi#215 gaudi/Gaudi!1313)
- GaudiKernel: remove deprecated `setProperties` methods (gaudi/Gaudi!1311)
- StatusCode: remove deprecated checking code (gaudi/Gaudi!1309)
- Changes for LHCb super project builds (gaudi/Gaudi!1308)
- Dropped usage of `(UN)LIKELY` macro (gaudi/Gaudi!1307)
### Added
- Add Trait to write an *OpaqueView* to the TES which makes the underlying object inaccessible (gaudi/Gaudi!1318)
- Message: cleanup and add accessors for event ID (gaudi/Gaudi!1325)
- Extend `IFileAccess` interface with a `read` function (gaudi/Gaudi!1317)
- Add another `Gaudi::Functional` transformer: `SplittingMergingTransformer` (gaudi/Gaudi!1315)
### Fixed
- Remove unused lambda captures (clang warning) (gaudi/Gaudi!1326)
- Fix compilation with nlohman_json 3.10.5 (gaudi/Gaudi#220 gaudi/Gaudi!1324)
- Fix `PluginService` segfault at initialize when `LD_LIBRARY_PATH` is not defined (gaudi/Gaudi!1316)
- Add missing `front()` and `back()` to `Functional::vector_of_const_` (gaudi/Gaudi!1323)
- Fixed computation of &quot;levels&quot; in EvtStoreSvc (gaudi/Gaudi!1322)
- Remove clearing of seed at initialization (gaudi/Gaudi!1321)
- Improvements to the `Configurable` method `merge` (gaudi/Gaudi!1319)
- Fix spurious / irrelevant data race in `DataObjectHandle` and remove unused state (gaudi/Gaudi!1314)
- Remove redundant lines from Gaudi{Tuple,Histo}Alg definition (gaudi/Gaudi!1312)
## [v36r4][] - 2022-01-20
This minor release features a few bugfixes, some usability improvements and some small backward incompatible changes
that could be as well classified as bugfixes.
### Changed
- Remove unused `LinkManager::removeLink` (gaudi/Gaudi!1294)
- {Merging,Splitting}Transformer: replace vector&lt;string&gt; property with vector&lt;DataObjID&gt; (gaudi/Gaudi!1297)
- ToolBinder: prefer function pointer in constructor over pure virtual inheritance (gaudi/Gaudi!1292)
- GaudiConfig2: apply OrderedSetSemantics to `std::[unordered_]set` (gaudi/Gaudi!1298)
- Change GaudiConfig2 default semantics to use deepcopy of the default (gaudi/Gaudi#114 gaudi/Gaudi!1296)
### Added
- Add example of consuming/producing `std::shared_ptr` with `Gaudi::Functional` (gaudi/Gaudi!1303)
- Allow use of `ConfigurableUser` specializations in configuration functions (gaudi/Gaudi#213 gaudi/Gaudi!1302)
- Record the source location of `DECLARE_COMPONENT` in Python configurables (gaudi/Gaudi#203 gaudi/Gaudi!1299)
- Extend the `gaudirun.py` `GaudiConfig2` file lookup to allow full path to modules (gaudi/Gaudi#192 gaudi/Gaudi!1301)
- Add support for multiple input arguments to Merging{,Multi}Transformer (gaudi/Gaudi!1291)
### Fixed
- Fix spurious options mismatch between old and new configurables (gaudi/Gaudi#191 gaudi/Gaudi!1300)
- `IBinder::Box` call destruct with the right pointer. (gaudi/Gaudi!1293)
- Fixes for running tests with LHCb test class (gaudi/Gaudi!1289)
- Correct conversion to Root histograms in RootHistogramSink (gaudi/Gaudi#212 gaudi/Gaudi!1290)
## [v36r3][] - 2021-12-09
This is a bugfix release with a couple of changes that technically are backward incompatible
because they fix issues that might have gone unnoticed:
- gaudi/Gaudi!1265 makes the property parser throw an exception in case of problems,
instead of silently doing nothing (see gaudi/Gaudi#163)
- `Gaudi::Accumulators` counters were copiable but not movable, which was not correct:
they should be neither and we fixed it, but this means you cannot use them in
vectors and the postfix `++` operator has been removed
An interesting addition in this release is also the support for getting `AlgTool`s as
arguments to the `operator()` of `Gaudi::Functional` algorithms. Although it might seem
strange at first, it allows reducing boilerplate and opens the possibility of introducing
tool wrappers that bind a tool with event or condition data, so that the fact that a tool
needs some event data is both explicit (event data has to be passed to the tool methods)
and hidden from the end user (as the wrapper takes care of the details of data passing).
After the introduction of `pre-commit` support (gaudi/Gaudi!1261) the merge request
review became more difficult as the reformatting of changed files add too much noise,
so in this release we reformatted the code with clang-format-11 for C++ and
[Black](https://github.com/psf/black)+[isort](https://pycqa.github.io/isort/) for Python
(see gaudi/Gaudi!1286).
### Changed
- Change default parsing error policy to *Exception* (gaudi/Gaudi#163 gaudi/Gaudi!1265)
- Disable move and copy semantic for the counters (gaudi/Gaudi!1258)
### Added
- Support for binding tools to event and/or conditions data (gaudi/Gaudi!1270 gaudi/Gaudi!1285)
- Add support to retrieve Tools through `Gaudi::Functional`'s call operator (gaudi/Gaudi!1268)
### Fixed
- `THistSvc`: cache `TObject` types (gaudi/Gaudi!1284)
- Re-organize `struct THistID` to avoid padding (gaudi/Gaudi!1284)
- Do not link GaudiGoogleProfiling against tcmalloc and profiler (gaudi/Gaudi!1282)
- Make sure `WorkManager.pool` is closed at exit (gaudi/Gaudi!1279)
- Improve configurables db exclusion (gaudi/Gaudi#209 gaudi/Gaudi!1280)
- Better (and working) implementation of non mergeable objects in Sinks (gaudi/Gaudi!1278)
- `genconf`: remove NaN warning (gaudi/Gaudi!1281)
- ConfigurableService: copy private tools of services (gaudi/Gaudi#208 gaudi/Gaudi!1277)
- Fix confusing stray space in printout of HiveDataBroker (gaudi/Gaudi!1276)
- Allow writing of Gaudi::Range and Gaudi::NamedRange in Gaudi::Functional (gaudi/Gaudi!1275)
- More natural syntax for histogram constructor (gaudi/Gaudi!1273)
- Fix tests for change in NetworkX 2.4 (gaudi/Gaudi!1274)
- Avoid ConfigurableUser leak (gaudi/Gaudi!1269)
- Allow entities with internal counters not implementing mergeAndRequest (gaudi/Gaudi!1267)
## [v36r2][] - 2021-10-18
This is a minor release with a bunch of bugfixes and improvements, mostly needed for LHCb test beam.
### Changed
- Use `pre-commit` to check C++ and Python formatting (gaudi/Gaudi!1261)
- Faster alg states search (gaudi/Gaudi!1250)
- Make `Gaudi::Functional` constructors more paranoid about # of inputs/outputs (gaudi/Gaudi!1249)
### Added
- Add support dumping and loading from JSON/YAML in `gaudirun.py` (gaudi/Gaudi#200 gaudi/Gaudi!1264)
- Update `Entity` to expose `mergeAndReset` method of internal object (gaudi/Gaudi!1253)
- Add sink service to dump counter info into a JSON file (gaudi/Gaudi!1248)
### Fixed
- Fix bug in bin indexing for &gt;1D Histograms (gaudi/Gaudi!1266)
- Do not use `FeatureSummary` to report found packages (gaudi/Gaudi#181 gaudi/Gaudi!1263)
- Make `BaseTest` properly handle tests which return skipped return code (gaudi/Gaudi!1262)
## [v36r1][] - 2021-09-20
This is a minor release with a bunch of bugfixes and improvements.
### Changed
- Dropped *Updater* mode for `DataHandles` (gaudi/Gaudi!1239)
- Truncate stall output on alg error (gaudi/Gaudi!1245)
- Replaced last instances of `boost::string_ref` and `boost::optional` with `std` counterparts (gaudi/Gaudi#4, gaudi/Gaudi!1244)
### Added
- Add optional bin labels to Histogram accumulators axes (gaudi/Gaudi!1235)
- Define some additional matrix types (gaudi/Gaudi!1232)
- Added TH3 support to histo to/from string conversion (gaudi/Gaudi!1226)
### Fixed
- Fix: private tool used by public tool thinks it is public (gaudi/Gaudi!1251)
- Type fixes related to `-Wconversion` (gaudi/Gaudi!1246)
- Fixes number of entries in ROOT histograms created by RootSink (gaudi/Gaudi!1240)
- Move computation of bin id from HistoInputType to Axis (gaudi/Gaudi!1236)
- Fix `scan_dict_deps.py` to not use directories (gaudi/Gaudi!1241)
- Fix clang11 warnings (gaudi/Gaudi!1247)
- Fix memory leak in `IncidentSvc` and more (gaudi/Gaudi!1238)
- Correctly group histograms in ROOT files (gaudi/Gaudi!1234)
- Extend `GaudiConfig2` configurable to match Configurables API (gaudi/Gaudi!1230)
- Optimize `TupleObj` (gaudi/Gaudi!1228)
- Use `CTest` fixtures and `--repeat` (gaudi/Gaudi!1192)
- Fixed out of date documentation of the new Histograms (gaudi/Gaudi!1229)
- Misc fixes and improvement (gaudi/Gaudi!1252, gaudi/Gaudi!1233, gaudi/Gaudi!1231)
## [v36r0][] - 2021-06-21
This is a major release of Gaudi that introduces some backward incompatible changes (mostly clean up).
### Changed
- More use of `std::string_view` (gaudi/Gaudi!1039)
- Removed unused properties in `GaudiCommon` (gaudi/Gaudi#143, gaudi/Gaudi!1138)
- Remove obsolete `IJobOptionsSvc` (gaudi/Gaudi#140, gaudi/Gaudi!1217)
- Drop `StatusCode` checking via `StatusCodeSvc` (gaudi/Gaudi!989)
- Remove unused public interface methods from `GaudiCommon` (gaudi/Gaudi!1140, gaudi/Gaudi#186, gaudi/Gaudi!1220)
- `JobOptionSvc`: remove case insensitivity (gaudi/Gaudi#155, gaudi/Gaudi!1179)
- Use TBB task_arena to replace deprecated components (gaudi/Gaudi!1067, gaudi/Gaudi!1193)
- `IClassIDSvc`: remove set/get package information (gaudi/Gaudi!1200)
### Added
- Improve unused options report from `JobOptionsSvc` (gaudi/Gaudi!1222)
- Introduced `DeprecatedDynamicDataObjectHandle` (gaudi/Gaudi!1202)
- Added `removeEntity` interface to `MonitoringHub` (gaudi/Gaudi!1208)
### Fixed
- `gaudirun.py`: Correctly handle `--all-opts` when mixing `GaudiConfig2` with old Configurables (gaudi/Gaudi#188, gaudi/Gaudi!1224)
- Doc: Add Sphinx-based Documentation (gaudi/Gaudi!1152, gaudi/Gaudi#190, gaudi/Gaudi!1223)
- Avoid double delete in `THistSvc::finalize` (gaudi/Gaudi!1221)
- Fix spurious clang warning (gaudi/Gaudi!1219)
- `has_fetch_add_v` should take a value type, not an `atomic<>`. (gaudi/Gaudi!1167)
- Fix semantics of `Gaudi::Accumulators::Counter` (gaudi/Gaudi#144, gaudi/Gaudi!1136)
- Remove newlines within fatal message for easier log grepping (gaudi/Gaudi!1215)
- Fixes for LCG 100 (gaudi/Gaudi!1214)
- `THistSvc` threading improvement (gaudi/Gaudi#179, gaudi/Gaudi!1212)
- `IncidentSvc`: handle rethrow for asychronous incidents (gaudi/Gaudi!1198)
- Fix StatusCodeFail tests when using GNU Make instead of Ninja (gaudi/Gaudi!1213)
## [v35r4][] - 2021-05-25
Minor release including gaudi/Gaudi!1210, needed for an LHCb release.
### Added
- Add a `MultiMergingTransformerFilter` (gaudi/Gaudi!1210)
### Fixed
- Fix CMake 3.20 warnigns (gaudi/Gaudi!1211)
- Replace `sys_siglist` (deprecated) with `strsignal` to allow build with newer glibc (> 2.32) (gaudi/Gaudi!1207)
- Always set TBB_LIBRARIES when TBB_FOUND (gaudi/Gaudi!1209)
- Simplify `StatusCode` compilation failure test (gaudi/Gaudi!1206, gaudi/Gaudi!1211)
## [v35r3][] - 2021-04-20
Another minor bugfix release with more fixes for ROOT 6.22 and improvements to the CMake configuration.
Here is a summary of the changes (see the [full list of changes](https://gitlab.cern.ch/gaudi/Gaudi/compare/v35r2...v35r3)).
### Changed
- Change how optional dependencies are handled in downstream projects (gaudi/Gaudi!1194)
- Remove serial task queue (gaudi/Gaudi!1195)
- Switch to latest ATLAS task precedence scenario in a test (gaudi/Gaudi!1190)
- Change `DevBuildType` to also enable `-Wsuggest-override` on clang if version >= 11 (gaudi/Gaudi!1191)
### Added
- Test algorithm with internal multithreading (gaudi/Gaudi!1196)
- Added a cardinality setting for `AtlasMCRecoScenario` (gaudi/Gaudi!1201)
- Extend the task precedence tracer for dumping dynamic graphs (gaudi/Gaudi!1189)
- Allow use of local targets instead of imported ones (gaudi/Gaudi!1186)
### Fixed
- Allow returning void in a `MergingTransformer` (gaudi/Gaudi!1199)
- Add small test and fix for GaudiPython.Bindings.iDataSvc traversal (gaudi/Gaudi!1178)
- Fix handling of properties for tuples and arrays of size 1 (gaudi/Gaudi#21, gaudi/Gaudi!1197)
- Add dynamic dependencies scan for `genreflex` dictionaries (gaudi/Gaudi#152 gaudi/Gaudi!1183)
- Improvements on Monitoring::Hub::Entity and accumulators (gaudi/Gaudi!1185)
- Suppress warnings about `nodiscard` in dictionary generation with ROOT 6.22 (gaudi/Gaudi!1182)
- Add custom pythonization callback to SmartRefVector (gaudi/Gaudi!1180)
- Fixed bug in Histogram filling (gaudi/Gaudi!1176)
- Improve support for new style CMake projects (gaudi/Gaudi!1177)
## [v35r2][] - 2021-03-10
Just a minor bugfix release with changes required for
- ROOT 6.22 (updated PyROOT/cppyy)
- modernization of CMake configuration of LHCb projects
- use of new monitoring interfaces in LHCb Online system
Here is a summary of the changes (see the [full list of changes](https://gitlab.cern.ch/gaudi/Gaudi/compare/v35r1...v35r2)).
### Changed
- Allow use of local targets instead of imported ones (gaudi/Gaudi!1186)
- Improvements on `Monitoring::Hub::Entity` and accumulators (gaudi/Gaudi!1185)
- Improve support for new style `CMake` downstream projects (gaudi/Gaudi!1177)
### Fixed
- Add dynamic dependencies scan for `genreflex` dictionaries (gaudi/Gaudi#152, gaudi/Gaudi!1183)
- Supress warnings about `__nodiscard__` attribute in dictionary generation with ROOT 6.22 (gaudi/Gaudi!1182)
- Add custom pythonization callback to `SmartRefVector` (gaudi/Gaudi!1180)
- Fixed bug in Histogram filling (gaudi/Gaudi!1176)
## [v35r1][] - 2021-01-28
This is mostly a bugfix release, with a couple of backward incompatible changes in
Python `DataHandle` class (gaudi/Gaudi!1144, gaudi/Gaudi!1159) and deprecation warnings
from `IJobOptionsSvc`, which will be dropped in v36r0 (gaudi/Gaudi#140).
Here is a summary of the [full list of changes](https://gitlab.cern.ch/gaudi/Gaudi/compare/v35r0...v35r1).
### Changed
- DataHandle: use all members for `==` and improve unit test (gaudi/Gaudi!1159)
- Deprecate use of `IJobOptionsSvc` (gaudi/Gaudi#139, gaudi/Gaudi!1156)
- DataHandle: Remove `__add__` operators (gaudi/Gaudi#146, gaudi/Gaudi!1144)
### Added
- Add support to `DataWriteHandle` for writing (partially type erased) 'views' into the TES (gaudi/Gaudi!1151)
### Fixed
- Adapt tests to a change in TFile "file not found" error message (gaudi/Gaudi!1174)
- ARM Fixes (gaudi/Gaudi!1153)
- IncidentSvc: fix ever-growing incident map (gaudi/Gaudi!1164)
- Fix CF bug arising from empty sequence (gaudi/Gaudi#135, gaudi/Gaudi!1106)
- Re-enabled the installation of the `PartPropSvc` auxiliary files (gaudi/Gaudi!1172)
- Make iteration ordering predictable (gaudi/Gaudi!1169)
- StatusCode tweaks (gaudi/Gaudi!1171)
- GaudiToolbox: Fix generated `__init__` files to handle symlinks (gaudi/Gaudi!1170)
- Check result of `dynamic_cast<>` for null before dereferencing (gaudi/Gaudi!1168)
- Fix build instructions (gaudi/Gaudi#159, gaudi/Gaudi#161, gaudi/Gaudi!1162)
- Resolve "GAUDI_GENCONF_NO_FAIL option not working" (gaudi/Gaudi#160, gaudi/Gaudi!1161)
- Fix clang 10 warnings (gaudi/Gaudi!1166)
- Fix MacOS compilation (gaudi/Gaudi!1158)
- Do not set `Python_FIND_STRATEGY` (gaudi/Gaudi#157, gaudi/Gaudi!1157)
- Property: Catch all parsing errors (gaudi/Gaudi!1165)
- simplify `iid_cast` implementation (gaudi/Gaudi!1154)
- Monitor Algorithm instance misses (gaudi/Gaudi!1148)
- Fix GaudiPython classes (follows up gaudi/Gaudi!1116) (gaudi/Gaudi!1155)
- Fix py-formatting of exec (gaudi/Gaudi!1160)
- Fix Algorithm destructor invocation in multithreading applications (gaudi/Gaudi#150, gaudi/Gaudi!1149)
## [v35r0][] - 2020-11-10
This version features a complete rewrite of the CMake configuration. See gaudi/Gaudi!986 and gaudi/Gaudi!922 for details.
Here is a summary of the [full list of changes](https://gitlab.cern.ch/gaudi/Gaudi/compare/v34r1...v35r0).
### Changed
- Complete rewrite of CMake configuration in *modern* CMake (gaudi/Gaudi!986, gaudi/Gaudi!922)
### Fixed
- Restore use of `GENREFLEX_JOB_POOL` (gaudi/Gaudi#151, gaudi/Gaudi!1150)
- Improve resilience of CI build jobs (gaudi/Gaudi#149, gaudi/Gaudi!1146)
- Fix test checking the wrong thing (gaudi/Gaudi!1142)
- Resolve "test wrapper report logic is the wrong way around" (gaudi/Gaudi#3, gaudi/Gaudi!1132)
- Ignore relative paths when generating the run script (gaudi/Gaudi#147, gaudi/Gaudi!1145)
- Fix QMTest reference filename lookup (gaudi/Gaudi!1143)
## [v34r1][] - 2020-10-16
This is mostly a bugfix release meant as a checkpoint before the tag of [v35r0][]
(which will introduce the refactoring of the CMake configuration, gaudi/Gaudi!986, gaudi/Gaudi!922).
We anyway have some important changes:
- update of physics constants to match the current release of CLHEP (gaudi/Gaudi!1101)
- a new way of dealing with monitorable quantities like counters and histograms (gaudi/Gaudi!1112, gaudi/Gaudi!1113, gaudi/Gaudi!1129)
- `DataObjectHandleProperty` renamed to `DataHandleProperty` (gaudi/Gaudi!1091)
- allow services to *autoretrieve* tool handles (gaudi/Gaudi!1124)
- new helper class to recursively renounce inputs from all tools of an algorithm or tool (gaudi/Gaudi!1118, gaudi/Gaudi!1130, gaudi/Gaudi!1135)
Here is a summary of the [full list of changes](https://gitlab.cern.ch/gaudi/Gaudi/compare/v34r0...v34r1).
### Changed
- Autoretrieve `AlgTools` in `Services`, check for data deps (gaudi/Gaudi!1124)
- Change `DataObjectHandleProperty` to `DataHandleProperty` (gaudi/Gaudi!1091)
- Update units and constants (gaudi/Gaudi!1101)
- Deprecate `put` with a plain pointer as argument (gaudi/Gaudi!1086)
### Added
- Add helper class to renounce recursively inputs from all tools of an algorithm or tool (gaudi/Gaudi!1118, gaudi/Gaudi!1130, gaudi/Gaudi!1135)
- New monitoring facility for counters and histograms (gaudi/Gaudi!1112, gaudi/Gaudi!1113, gaudi/Gaudi!1129)
- Messages: Refine source field truncation (gaudi/Gaudi!1125)
- DataObjID: Add accessor for class name (gaudi/Gaudi!1126)
### Fixed
- Fixes for new ROOT/cppyy (gaudi/Gaudi!1116)
- Resolve "Use of (private) `ToolHandles` may trigger the configuration of spurious public tools" (#141, !1131)
- Fixes for clang builds (gaudi/Gaudi!1121)
- Add test reference files for AVX2/AVX512 builds (gaudi/Gaudi!1122)
- Avoid output file conflict in `MetaDataSvc` test (gaudi/Gaudi!1123)
- Use Boost filesystem instead of std::fs with clang 10 (gaudi/Gaudi!1120)
- Tweak leak sanitizer suppressions for Cling, XrootD and TStreamerInfo with LCG97a (gaudi/Gaudi!1104)
- IUpdateManagerSvc: do not specify unnecessary template arguments (gaudi/Gaudi!1090)
- Update some python examples to python 3 syntax (gaudi/Gaudi!1088)
- Test for the scheduler hang on alg exceptions (gaudi/Gaudi!979, gaudi/Gaudi!1078, gaudi/Gaudi!1107)
- Check build warnings in GitLab CI (gaudi/Gaudi!1109)
- Remove deprecation warnings on old `IJobOptionsSvc` (gaudi/Gaudi!1114)
- Explicitly flush standard output in `MessageSvc::finalize()` (gaudi/Gaudi!1117)
- Use `Gaudi/Property.h` instead of `GaudiKernel/Property` (gaudi/Gaudi!1105)
- Algorithm state profiling (gaudi/Gaudi!1072)
## [v34r0][] - 2020-08-04
This is a release meant to introduce a major rewrite of the *Job Options Service*, as described in the merge request gaudi/Gaudi!577, plus, of course, some fixes.
### Changed
- Bump version to v34r0 (gaudi/Gaudi!1096)
- Redesign of job options management (gaudi/Gaudi!577, gaudi/Gaudi#105)
- Re-apply gaudi/Gaudi!1064: Isolate sub-slot data from the parent slot (gaudi/Gaudi!1095)
### Added
- Add CopyInputStream (gaudi/Gaudi!1077, gaudi/Gaudi#102)
### Fixed
- FMT Library Usage Improvement (gaudi/Gaudi!1103)
- Minor fixes for Clang 10 build, adapt BinaryTagUtils to allow compiler version >10 (gaudi/Gaudi!1097)
- Do not tinker with output file names in GaudiMP (gaudi/Gaudi!1098)
- Add support for special LCG versions (gaudi/Gaudi!1099)
- Fix Python 3 compatibility issues (gaudi/Gaudi!1102, b87519600879cde3be7694d9fd7567c6efd8db1c)
- Protect messages in event loop (gaudi/Gaudi!1100)
## [v33r2][] - 2020-06-19
This is a bugfix release with just a couple of minor backward compatible improvements.
We also updated the LCG baseline version to [LCG 97a](http://lcginfo.cern.ch/release/97a/) (ROOT 6.20/06).
This is the last release with the legacy CMake configuration. From the next release (v34r0)
we will use a modern CMake configuration (see gaudi/Gaudi!922 and gaudi/Gaudi!986 for details).
### Added
- Improve event context extension management (gaudi/Gaudi!1080)
- Introducing Set-semantics (gaudi/Gaudi!1066)
- Make gitlab use cpp syntax highlighting for icpp files (gaudi/Gaudi!1057)
### Fixed
- Fixes for ROOT master (gaudi/Gaudi!1071)
- Use fmtlib instead of `boost::format` (where possible) (gaudi/Gaudi!1046, gaudi/Gaudi#112)
- Conditions alg test, with stall debug info (gaudi/Gaudi!1092)
- Make sure the TES is cleaned by `EventLoopMgr` before finalize (gaudi/Gaudi!1082, LHCBPS-1850)
- Fix race condition between tests (gaudi/Gaudi!1074)
- Fix propagation of `StopIteration` exception (gaudi/Gaudi!1093, gaudi/Gaudi#129)
- Update HiveDataBroker to use C++20 ranges if available. (gaudi/Gaudi!1089)
- Fixes for C++20 (gaudi/Gaudi!1085)
- Fix thread-safety problem in GaudiHandle (gaudi/Gaudi!1084)
- Misc. sanitiser improvements (gaudi/Gaudi!1081)
- Make `GaudiHandleArray.__str__` consistent with `GaudiHandle.__str__` (gaudi/Gaudi!1070)
- Fix trivial typo in message (gaudi/Gaudi!1087)
- `GaudiConfig2`: fix unpickling of derived Configurables (gaudi/Gaudi!1076, gaudi/Gaudi#124)
- Remove data flow dumps or make them configurable (gaudi/Gaudi!1075)
- Change `StatusCode::orThrow` so that the return value can be ignored (gaudi/Gaudi!1073, gaudi/Gaudi#118)
- Fix bugs in `ThreadPoolSvc` (gaudi/Gaudi!1068)
- Sequence semantics update (gaudi/Gaudi!1069)
- Remove now unused `ATLAS_GAUDI_V21` and `HAVE_GAUDI_PLUGINSVC` definitions (gaudi/Gaudi!1062)
- Few fixes to `GaudiConfig2` (gaudi/Gaudi!1061)
- Fix compatibility with C++ GSL 3 (gaudi/Gaudi!1063, gaudi/Gaudi#121)
- Consolidate and optimize scheduling of blocking tasks (gaudi/Gaudi!1051)
- Do not run public headers build test on generated headers (gaudi/Gaudi!974)
- Add array `operator<<` into `SerializeSTL.h` (gaudi/Gaudi!1049)
- Dereference instead of `operator*` in `get_from_handle` to enable `Gaudi::Ranges` in `MergingTransformer`s (gaudi/Gaudi!1047)
- Fixes for `GetHostBinaryTag` (gaudi/Gaudi!1058)
- Remove unused capture of `this` in `MultiTransformerFilter` (gaudi/Gaudi!1059)
- Fix deprecated copy constructor warning in `StreamBuffer::ContainedLink` (gaudi/Gaudi!1060)
- `AlgExecStateSvc`: require minimum state size to be 1 (gaudi/Gaudi!1055)
- `IncidentSvc`: improve error reporting (gaudi/Gaudi!1054)
- Remove mention of deprecated `tbb::recursive_mutex` (gaudi/Gaudi!1053)
## [v33r1][] - 2020-03-23
This release contains multiple fixes and some ABI changes, in particular:
- `StatusCode` values not checked now produce a compile time warning.
- some interfaces have been changed to accept `std::string_view` instead of `const std::string&`
By default, Gaudi now uses LCG 97 (ROOT 6.20/02).
### Changed
- Removed `FindXercesC.cmake` now that new versions of Xerces are integrated with CMake (!1048)
- Add `[[nodiscard]]` attribute to `StatusCode` (!763)
- Use local memory pool in EvtStoreSvc (!1026)
- Deprecate use of `AnyDataHandle` (!1029)
- Cleanup some string handling & remove long deprecated functions (!1016)
- confDB2: Use 'PublicToolHandle', 'PrivateToolHandle' and 'ServiceHandle' instead of GaudiHandleBase as cpp_type (!1034)
### Added
- Add options to EvtStoreSvc to restrict registering addresses (#84, !1032)
### Fixed
- Make formatting check more stable and fast (!1050)
- Fix propagation of `GaudiSequencer` `RootInTES` (#94, !990)
- Fix handling of const vector in `DataObjectHandle` for `MergingTransformer` (!1045)
- Minor fixes to build on MacOS (!1044)
- Avoid explicit call to `EnableAutoLoading` for ROOT > 6.18 (!1036)
- Use PyROOT nullptr instead of None (1035)
- Support `DataObjectHandle<Gaudi::NamedRange_<T>>` (!1043)
- AlgExecStateSvc: Remove a fatal message and minor cleanups (!1037)
- Improve memory management in `ParticlePropertySvc` (!1040)
- JobOptionSvc: Fix DUMPFILE option (!1041)
- Resolve "GaudiConfigDB2: Fragile handling of templated components" (#115, !1042)
- Prefer `std::scoped_lock` over `lock_guard` (!1030, !1038)
- Reduce dynamic allocation in `GaudiKernel/Time.h` (!1033)
- Allow legacy algorithms to work with LHCb condition handles (!1031)
- Fix Cling warnings when using `GaudiPython::Helper` struct (!1028)
- Define a module `__spec__` for Configurables (!1027)
- clang requires -ffp-contract=fast with -mfma to actually enable FMA instructions (!1022)
- genconf: Fixing the handling of NAN (!1025)
## [v33r0][] - 2019-12-16
This major release of Gaudi contains additions, improvements and fixes, but most of all it adds
the agreed on copyright statement and license:
> © 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations,
> Apache version 2 license
Among the new features I'd like to highlight:
- new Python Configurables implementation (!721)
- experimental `Gaudi::Accumulators::Histogram<...>` (!1020)
- `StatusCode::{andThen|orElse|orThrow}` chaining functions (!988)
### Changed
- Enable sse 4.2 by default for clang >= 6.0 (!1019)
- Use gcc9 in Gilab-CI builds (!1013)
- Remove begin/endRun methods (!1008)
- Make `HistogramPersistencySvc` a little quieter (!992)
- Reorganization of Counters headers (!1006)
- Add new `StatusCode` category to return *filter passed* states from functional algorithms (!981)
- Use `xenv` 1.0.0 if not available from the system (!984)
- Remove const-incorrect `ToolHandle`s exception for ATLAS (!978)
### Added
- Set Gaudi copyright and license (!1018)
- Add experimental support for histograms as counters (!1020)
- Add detection of strongly connected components in the data flow precedence rules (!998)
- Debug output for a stall expecting conditions data (!994)
- Add PRG validators for detection of unconditional "editing" of data objects (!980)
- Prototype for a renewed Python Configurables implementation (!721)
- Add helpers to chain `StatusCode` dependent executions (!988)
- Update `THistSvc` to support `TEfficiency` (!1011)
- Support bulk increment of `BinomialAccumulator` (!999)
### Fixed
- `genconf`: fix quoting of strings containing quotes (!1023)
- Ignore unicode decode errors in test stdout (!1021)
- Do not use `xenv` from LCG (!1005)
- Properly escape strings with embedded quotes in `Gaudi::Utils::toStream` (!1012)
- Detect ROOT C++ standard from `ROOTConfig.cmake` (!985)
- Adjust clang warning suppression pragmas in `Transformer.h` (!1014)
- Improve scheduler performance with fewer calls to updateState (!870)
- `Gaudi::Functional`: Add possibility to query input/output location by type (!1009, !1015)
- Enable `Gaudi::Functional::Transformer<Result(const EventContext&)>` (!1007)
- More precise message for multiple algorithms having the same output in `HiveDataBroker` (!1003)
- Add flag to turn on/off use of `std::filesystem` (!987)
- `IoComponentMgr`: Only release components during finalize (!1004)
- Allow calling `f(std::string_view)` with a `Gaudi::Property<std::string>` (!1002)
- Specify file encoding when reading (!1000)
- Suppress printout of unused `MsgCounter` instances (!996)
- Do not print `SequencerTimerTool` header in finalize if there are no timing results (!997)
- Support for latest TBB and fixes for C++GSL and Range-v3 (!982)
- Fixes for "defects" detected by Coverity (!939)
## [v32r2][] - 2019-09-27
This is mostly a bugfix release, but there are nonetheless a couple of
important changes:
- now Gaudi can be used with Python 3 (#56)
- the `IAsyncEventProcessor`experimental interface introduced in v32r0 (!878)
has been replaced with `IQueueingEventProcessor` (!966)
- it's now possible to get type information from Python version of `DataHandle`s
### Changed
- Replace `IAsyncEventProcessor` with `IQueueingEventProcessor` (!966)
### Added
- GaudiKernel `instructionsetLevel`: Add additional AVX512 levels (!954)
- Add Python 3 support (#56, !875, !975, #88, !976)
- Add vecwid256 microarchitecture option to enable `-mprefer-vector-width=256` (!965)
- Add type information to Python representation of `DataHandle`s (!951)
### Fixed
- Backward compatible interface of `IAlgorithm` for `GaudiPython` (#75, !977)
- Misc fixes for `GaudiMP` (#87, #75, !973)
- Remove unneeded change in refactoring of TES handling (#70, !971)
- Various ToolHandleArray bug fixes (!960)
- Functional ranges v3 0.9.x warning suppression (!968)
- Fix clang `-Wpotentially-evaluated-expression` warning (!970)
- Switch from Boost test minimal (deprecated) to single header variant (!948)
- Fixes for MacOS (!956)
- Make `ContainedObject` assignment consistent with copy construction (!967)
- `THistSvc::io_reinit`: Handle case of empty new filename (!959)
- `EventSelector` - Always set context ptr to null on release (!961)
- Minor improvements to sanitizers (!955)
- `ChronoStatSvc` - Clear maps in finalize (!958)
- Minor updates to `Gaudi::Functional` implementation (!952)
- `THistSvc`: Fix crash in MP if root file already exists (!949)
- Fix gcc9 warnings (!962)
## [v32r1][] - 2019-07-18
Bugfix release, with some backward compatible changes, mostly meant to pick up
[LCG 96](http://lcginfo.cern.ch/release/96/) and [ROOT 6.18/00](https://root.cern.ch/content/release-61800).
**Note**: Because of the updated version of Boost in LCG 96, you should use a recent version of CMake (>= 3.14).
### Changed
- Add algorithm name to warning in `HiveDataBroker` (!923)
- Make `Configurable.getGaudiType` a `classmethod` (!929)
- Prefer `xyz_v<T>` over `xyz<T>::value`, and `xyz_t<T>` over `typename xyz<T>::type` (!925)
- Prefer `std::{variant,optional}` over `boost::{variant,optional}` (!926)
### Added
- Specify `JOB_POOL` for `genreflex` custom commands (!933)
- Add an example `MergingTransformer` algorithm (!934)
- Add loop unroll hint macros to `GaudiKernel/Kernel.h` (!931)
- Add `MsgCounter` (!921)
- Introduce a `MergingMultiTransformer` (!901)
### Fixed
- Removed a few unused `.cpp` files (!945)
- Print counters in Gaudi::Algorithm::finalize (!943, !946, !947)
- Make asynceventprocessor tests more stable (!940)
- Small fixes to toolchain (!938)
- Use the `AlgContext` guard constructor without `EventContext` for single thread (!973, #72, #73)
- Hide spurious warning from `clang-8` (!941)
- Check that the `clang-format` command found can be executed (!935)
- Improve scheduler stall debug output (!930)
- Fix `CMake` modules test on special architectures (!927)
- Fix handling of strings with quotes in properties (!919)
- Remove reference to removed `gaudimain.runSerialOld` (!918)
- Restore backward compatibility after !878 (!917)
- Revert !869: *Create a queue for all schedule-able algorithms* (!924)
- Add `GaudiKernel` linkage to Counters unit test (!920)
- Misc. sanitizer fixes (!916)
- Fix `distcc`/`icecc` support (!911)
- Made the `LibLZMA` dependency in `GaudiKernel` optional (!909)
- `GaudiKernel`: check *likely* macros before defining them (!912)
- Fix `IOpaqueAddress` lifetime in `EvtStoreSvc` (!914)
## [v32r0][] - 2019-05-18
This release features many fixes and improvements, but also a few backward incompatible changes:
- removed `GaudiGSL` package (in preparation for the licensing under Apache 2) (!879)
- change of `IEventProcessor` interface (!877)
- change (const correctness) of custom containers interfaces (!896)
- removed a few unused components: `HLTEventLoopMgr` (!876), `AlgErrorAuditor` (!874)
- drop support for Python *custom event loop* in `gaudirun.py` (!878)
Among the various additions you can find:
- `Counter`-based timers (!787)
- example of an interface for accessing conditions, which require experiment specific implementation (!838)
- a new interface (`Gaudi::Interfaces::IAsyncEventProcessor`) to allow decoupling of
the main thread from the event processing thread(s) (!878)
- a simplified application steering class (`Gaudi::Application`) (!878)
### Changed
- Update `clang-format` to 8 (!872)
- Factor TES path related code out of `GaudiCommon` (!904)
- More explicit management of `EventContext` in `IEventProcessor` (!877)
- Small clean up in `EventLoopMgr` implementations (!876)
- Remove `GaudiGSL` (!879)
- Do not return non-const pointers to elements of const containers (!896)
- Drop backwards compatibility code (!883, !900)
- `HiveDataBroker`: throw exception in case of same output locations in two different algorithms (!858)
- Delete `AlgErrorAuditor` (!874)
- `PrecedenceSvc`: demote 'Verifying rules' message to debug (!873)
- Replace `boost::string_ref` with `std::string_view` (!859)
### Added
- Add optional extension of `EventProcessor` for asynchronous processing (!878)
- Add example of `ConditionAccessorHolder` implementation for integration in Functional (!838)
- Bits for the cross-experiment study on heterogeneous workflows (!828)
- Generalize `Gaudi::Functional` to support LHCb-style conditions handles (!899)
- Add a synthetic performance stress test for the scheduler (!865)
- New Minimal Event Store: `EvtStoreSvc` (!882)
- Add Counter-based timers (!787)
- Add support for `Gaudi::Algorithm` as base class of `Functional` algorithms (!897)
- Create a queue for all schedule-able algorithms (!869)
- Add support for specific architectures in BINARY_TAG (!853)
- Add `getIfExits` for `DataHandle`s with `AnyDataWrapper` (!854)
- Add support for `std::chrono::duration` in counters (!849)
- Add the possibility to ask for Mode in python data handle property (!845)
### Fixed
- Tweaks to `Gaudi::Functional` (!903)
- `HiveDataBroker`: Improve error message when unknown requested input (!906)
- Avoid copy of `EventContext` in `Gaudi::Utils::AlgContext` (!902)
- Reverse order of tbb `task_scheduler_init` and `global_control` (!895)
- Make `StatusCodeSvc` thread-safe (!885)
- `ThreadPoolSvc`: prefer `std::unique_ptr` (!889)
- Ensure thread termination tools only run in initialized threads (!887)
- Updates for MacOS and clang (!888, !894, !893)
- Enable `std::iterator_traits<vector_of_const_<T>::iterator>` (!855)
- Fix `MessageSvc::reinitialize` (!871)
- Fixes to `EventIDRange` (!860)
- `ApplicationMgr`: Call all state transition for `MessageSvc` and `JobOptionsSvc` (!866)
- Fix tunneling of CF decisions to inactive graph regions in multi-parent configurations (!863)
- Use `[[fallthrough]]` attribute instead of the _fallthrough_ comment (!862)
- Restructure PRG sources and add visitor for Concurrent/Prompt CF inconsistency detection (!861)
- Sort data dependencies in `HiveDataBroker` debug printout (!868)
- Avoid displaying unused Binomial counters (!830)
- Python 2 & 3 compatibility (!832, !852)
## [v29r5][] - 2019-03-06
This is a bugfix release only to fix a warning with the most recent version of
CMake (3.13), see the changes on
[Gitlab](https://gitlab.cern.ch/gaudi/Gaudi/compare/v29r4...v29r5).
## [v31r0][] - 2019-02-11
The main reason for this major release is to the change of the `Algorithm` base
......@@ -242,10 +1589,36 @@ Details about old versions of the project can be found in the
[GaudiRelease/doc](GaudiRelease/doc).
[Unreleased]: https://gitlab.cern.ch/gaudi/Gaudi/compare/v31r0...master
[v31r0]: https://gitlab.cern.ch/gaudi/Gaudi/compare/v30r5...v31r0
[v30r5]: https://gitlab.cern.ch/gaudi/Gaudi/compare/v30r4...v30r5
[v30r4]: https://gitlab.cern.ch/gaudi/Gaudi/compare/v30r3...v30r4
[v30r3]: https://gitlab.cern.ch/gaudi/Gaudi/compare/v30r2...v30r3
[v29r4]: https://gitlab.cern.ch/gaudi/Gaudi/compare/v29r3...v29r4
[v28r2p1]: https://gitlab.cern.ch/gaudi/Gaudi/compare/v28r2...v28r2p1
[v36r12]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r12
[v36r11]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r11
[v36r10]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r10
[v36r9]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r9
[v36r8]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r8
[v36r7]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r7
[v36r6]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r6
[v36r5]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r5
[v36r4]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r4
[v36r3]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r3
[v36r2]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r2
[v36r1]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r1
[v36r0]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v36r0
[v35r4]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v35r4
[v35r3]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v35r3
[v35r2]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v35r2
[v35r1]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v35r1
[v35r0]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v35r0
[v34r1]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v34r1
[v34r0]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v34r0
[v33r2]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v33r2
[v33r1]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v33r1
[v33r0]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v33r0
[v32r2]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v32r2
[v32r1]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v32r1
[v32r0]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v32r0
[v31r0]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v31r0
[v30r5]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v30r5
[v30r4]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v30r4
[v30r3]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v30r3
[v29r5]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v29r5
[v29r4]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v29r4
[v28r2p1]: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v28r2p1
cff-version: 1.2.0
title: Gaudi
message: >-
If you use this software, please cite it using the
metadata from this file.
type: software
authors:
- name: LHCb Collaboration
- name: ATLAS Collaboration
identifiers:
- type: doi
value: 10.5281/zenodo.3660963
repository-code: 'https://gitlab.cern.ch/gaudi/Gaudi'
url: 'https://cern.ch/gaudi'
abstract: >-
Gaudi is a software architecture and framework that can be
used to facilitate the development of data processing
applications for High Energy Physics experiments.
keywords:
- Gaudi
- LHCb
- ATLAS
- CERN
- HEP
- Software Framework
license: Apache-2.0
version: v39r4
date-released: '2025-03-20'
cmake_minimum_required(VERSION 3.6)
#####################################################################################
# (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations #
# #
# This software is distributed under the terms of the Apache version 2 licence, #
# copied verbatim in the file "LICENSE". #
# #
# In applying this licence, CERN does not waive the privileges and immunities #
# granted to it by virtue of its status as an Intergovernmental Organization #
# or submit itself to any jurisdiction. #
#####################################################################################
#[========================================================================[.rst:
Gaudi
-----
# Configurable options for building Gaudi in the ATLAS software stack:
option( GAUDI_ATLAS "Enable ATLAS-specific settings" OFF )
set( GAUDI_ATLAS_BASE_PROJECT "AthenaExternals" CACHE STRING
"Name of the ATLAS base project to build Gaudi against" )
This file is the top level CMakeLists.txt that describes the whole
configuration of the build of Gaudi.
# Ensure that we can find GaudiProjectConfig.cmake
# (this works only for projects embedding GaudiProjectConfig.cmake)
if(NOT GaudiProject_DIR AND ("$ENV{GaudiProject_DIR}" STREQUAL ""))
set(GaudiProject_DIR ${CMAKE_SOURCE_DIR}/cmake)
A few commands
^^^^^^^^^^^^^^
* Configure: ``cmake -S . -B build.$BINARY_TAG -D CMAKE_BUILD_TYPE=Developer [-G Ninja]``
* Compile: ``cmake --build build.$BINARY_TAG -j `nproc` ``
* Run tests: ``cd build.$BINARY_TAG ; ctest -j `nproc` ; cd ..``
* Install: ``cmake --install build.$BINARY_TAG [--prefix path/to/where/you/want]``
* Package (zip+rpm): ``cmake --build build.$BINARY_TAG -t package``
List of available options
^^^^^^^^^^^^^^^^^^^^^^^^^
An option is a cached variable that can be turned ON or OFF.
To get descriptions and values of these options:
``cmake -N -LH build.$BINARY_TAG``
after the configuration or use ccmake or cmake-gui.
* Optional dependencies
* GAUDI_USE_AIDA
* GAUDI_USE_XERCESC
* GAUDI_USE_CLHEP
* GAUDI_USE_HEPPDT
* GAUDI_USE_CPPUNIT
* GAUDI_USE_UNWIND
* GAUDI_USE_GPERFTOOLS
* GAUDI_USE_DOXYGEN
* GAUDI_USE_INTELAMPLIFIER
* GAUDI_USE_JEMALLOC
* GAUDI_USE_CUDA
* Install options
* GAUDI_INSTALL_OPTIONAL
* Install layout variables
* CMAKE_INSTALL_BINDIR
* CMAKE_INSTALL_LIBDIR
* CMAKE_INSTALL_INCLUDEDIR
* GAUDI_INSTALL_PLUGINDIR
* GAUDI_INSTALL_PYTHONDIR
* GAUDI_INSTALL_CONFIGDIR
* For sanitized build
* GAUDI_GENCONF_NO_FAIL
* Compile options
* GAUDI_BUILD_EXAMPLES
* GAUDI_ENABLE_GAUDIPARTPROP
* GAUDI_REFLEX_COMPONENT_ALIASES
* Doxygen
* DOXYGEN_WITH_LOCAL_MATHJAX
* DOXYGEN_WITH_CPPREFERENCE_LINKS
To disable the build of tests, set the option ``BUILD_TESTING`` to FALSE.
When to re-configure the project manually?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* When a new .qmt file is added.
* When a new python package is added in a python/ folder that already
had one installed python package.
* When a new release.notes*.html is added to GaudiRelease/doc/.
TWiki documentation
^^^^^^^^^^^^^^^^^^^
Developer's guide: `<https://twiki.cern.ch/twiki/bin/view/LHCb/GaudiCMake315Configuration>`_
Maintainer's guide: `<https://twiki.cern.ch/twiki/bin/view/LHCb/MaintainGaudiCMake315Configuration>`_
#]========================================================================]
cmake_minimum_required(VERSION 3.19)
# Optional CUDA
option(GAUDI_USE_CUDA "Build AsynchronousAlgorithm features that require CUDA")
if(GAUDI_USE_CUDA)
set(optionalCUDA CUDA)
else()
set(optionalCUDA)
endif()
#---------------------------------------------------------------
# Load macros and functions for Gaudi-based projects
find_package(GaudiProject REQUIRED)
#---------------------------------------------------------------
project(Gaudi VERSION 39.4
LANGUAGES CXX ${optionalCUDA}
DESCRIPTION "Gaudi Software Framework"
HOMEPAGE_URL "https://cern.ch/gaudi")
# Base Gaudi on "the ATLAS base project" (AtlasExternals by default) when
# building for ATLAS:
if( GAUDI_ATLAS )
find_package( ${GAUDI_ATLAS_BASE_PROJECT} )
gaudi_ctest_setup() # Needed for correct CTest usage in this setup
# Add the "Developer" build type
include(cmake/DeveloperBuildType.cmake)
# set RPATH (currently only on macOS)
if(APPLE)
include(cmake/GaudiRPath.cmake)
endif()
# Find/set up some needed externals:
include(${CMAKE_SOURCE_DIR}/cmake/externals.cmake)
# Set up the GAUDI_ATOMIC_LIBS variable
include(cmake/GaudiAtomicLibs.cmake)
# Declare project name and version
gaudi_project(Gaudi v31r0)
# Import Gaudi functions (gaudi_*) ==> for documentation look in the file
include(cmake/GaudiToolbox.cmake)
# These tests do not really fit in a subdirectory.
add_test(NAME cmake.CMakeModules
COMMAND nosetests ${CMAKE_SOURCE_DIR}/cmake/tests)
gaudi_add_test(cmake.QMTDeps
COMMAND nosetests --with-doctest ${CMAKE_SOURCE_DIR}/cmake/extract_qmtest_metadata.py)
# Export the list of compile commands
set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE BOOL "Enable/Disable output of compile_commands.json" FORCE)
# Configure how CPack should run:
find_file( _cpack_config NAMES GaudiCPackSettings.cmake
PATHS ${CMAKE_MODULE_PATH} )
if( _cpack_config )
include( ${_cpack_config} )
else()
message( WARNING "Could not find GaudiCPackSettings.cmake" )
set(GAUDI_USE_PYTHON_MAJOR 3 CACHE STRING "Major version of Python to use")
string(APPEND GAUDI_OPTIONAL_DEPENDENCIES "set(GAUDI_USE_PYTHON_MAJOR ${GAUDI_USE_PYTHON_MAJOR})\n")
# Find all the dependencies of the project
list(PREPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/modules") # (Find*.cmake)
include(cmake/GaudiDependencies.cmake)
string(APPEND GAUDI_OPTIONAL_DEPENDENCIES "
set(GAUDI_BUILD_EXAMPLES ${GAUDI_BUILD_EXAMPLES})
set(GAUDI_ENABLE_GAUDIPARTPROP ${GAUDI_ENABLE_GAUDIPARTPROP})
")
# The C++ standard used must be the same as ROOT's
if(NOT GAUDI_CXX_STANDARD)
# Check if ROOT_CXX_STANDARD is already defined
if(DEFINED ROOT_CXX_STANDARD)
message(STATUS "ROOT_CXX_STANDARD is already defined by ROOT. Using it...")
else()
# Deduce CXX_STANDARD from ROOT_CXX_FLAGS
set(ROOT_CXX_FLAGS_TEMP ${ROOT_CXX_FLAGS}) # Use a temporary variable to avoid modifying the original
separate_arguments(ROOT_CXX_FLAGS_TEMP)
list(FILTER ROOT_CXX_FLAGS_TEMP INCLUDE REGEX "-std=(c|gnu)\\+\\+[0-9]+")
list(TRANSFORM ROOT_CXX_FLAGS_TEMP REPLACE "-std=(c|gnu)\\+\\+([0-9]+)" "\\2")
if(NOT ROOT_CXX_FLAGS_TEMP)
message(FATAL_ERROR "Cannot find the C++ standard of ROOT")
endif()
list(GET ROOT_CXX_FLAGS_TEMP 0 ROOT_CXX_STANDARD)
endif()
set(GAUDI_CXX_STANDARD ${ROOT_CXX_STANDARD} CACHE STRING "The version of C++ used to compile Gaudi")
endif()
message(STATUS "Gaudi will be built using C++${GAUDI_CXX_STANDARD} standard.")
set(CMAKE_CXX_STANDARD ${GAUDI_CXX_STANDARD})
set(CMAKE_CXX_STANDARD_REQUIRED TRUE) # do not fall back on older version
set(CMAKE_CXX_EXTENSIONS OFF) # strict c++.. instead of gnu++..
if(GAUDI_USE_CUDA)
set(CMAKE_CUDA_STANDARD ${GAUDI_CXX_STANDARD})
set(CMAKE_CUDA_STANDARD_REQUIRED TRUE)
set(CMAKE_CUDA_EXTENSIONS OFF)
endif()
# Enable testing with CTest/CDash
include(CTest)
# These are test-only, private dependencies
if(BUILD_TESTING)
find_package(Catch2 REQUIRED)
include(Catch)
endif()
# Include sub-projects one by one without introducing dependency conflicts
add_subdirectory(GaudiPluginService)
add_subdirectory(GaudiPolicy)
add_subdirectory(GaudiKernel)
add_subdirectory(GaudiConfiguration)
add_subdirectory(GaudiCoreSvc)
add_subdirectory(GaudiUtils)
add_subdirectory(Gaudi)
add_subdirectory(GaudiFunctional)
add_subdirectory(GaudiAud)
add_subdirectory(GaudiCommonSvc)
add_subdirectory(GaudiHive)
add_subdirectory(GaudiMonitor)
add_subdirectory(GaudiMP)
add_subdirectory(GaudiPartProp)
add_subdirectory(GaudiProfiling)
add_subdirectory(GaudiPython)
add_subdirectory(GaudiRelease)
add_subdirectory(GaudiSvc)
add_subdirectory(PartPropSvc)
add_subdirectory(RootCnv)
add_subdirectory(RootHistCnv)
add_subdirectory(GaudiTestSuite)
add_subdirectory(GaudiExamples)
if(GAUDI_USE_CUDA)
add_subdirectory(GaudiCUDA)
endif()
# Generate GAUDI_VERSION.h
gaudi_generate_version_header_file()
# Framework level tests
# Test scripts inside cmake/
gaudi_add_pytest(cmake/extract_qmtest_metadata.py
PREFIX cmake.doctest.
ROOT_DIR cmake
OPTIONS --doctest-modules
)
if(NOT PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME) # If we are building the full stack as one project
# we do not install nor package nor register CMake tests
# but we add Gaudi's CMake modules to the CMAKE_MODULE_PATH for downstream projects
list(PREPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} PARENT_SCOPE)
# Set the version of the project as a cache variable to be seen by other
# projects in the same super-project.
set(${PROJECT_NAME}_VERSION "${PROJECT_VERSION}" CACHE STRING "Version of ${PROJECT_NAME}" FORCE)
return()
endif()
# Unit tests of gaudi_* functions
include(cmake/tests/testGaudiToolbox.cmake)
# Unit tests of the installation
include(cmake/tests/testGaudiInstallation.cmake)
# Unit tests of Gaudi as dependency in a downstream project (with config files)
include(cmake/tests/testGaudiDownstream.cmake)
# Installation of Gaudi
include(CMakePackageConfigHelpers)
# Generate the config files
configure_package_config_file(cmake/GaudiConfig.cmake.in ${PROJECT_NAME}Config.cmake
INSTALL_DESTINATION "${GAUDI_INSTALL_CONFIGDIR}"
PATH_VARS CMAKE_INSTALL_BINDIR CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_INCLUDEDIR
GAUDI_INSTALL_PLUGINDIR GAUDI_INSTALL_PYTHONDIR
NO_CHECK_REQUIRED_COMPONENTS_MACRO)
write_basic_package_version_file(${PROJECT_NAME}ConfigVersion.cmake
COMPATIBILITY AnyNewerVersion)
# Install the set of exported targets
install(EXPORT ${PROJECT_NAME} NAMESPACE ${PROJECT_NAME}::
DESTINATION "${CMAKE_INSTALL_PREFIX}"
FILE "${PROJECT_NAME}Targets.cmake"
DESTINATION "${GAUDI_INSTALL_CONFIGDIR}")
# Install cmake files for downstream project to be able to use Gaudi
gaudi_install(CMAKE cmake/GaudiToolbox.cmake
cmake/header_build_test.tpl
cmake/GaudiDependencies.cmake
cmake/DeveloperBuildType.cmake
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
cmake/modules) # Find*.cmake
install(PROGRAMS
cmake/extract_qmtest_metadata.py # used in gaudi_add_tests(QMTest)
cmake/scan_dict_deps.py # used in gaudi_add_dictionary(...)
DESTINATION "${GAUDI_INSTALL_CONFIGDIR}"
)
# Add an uninstall target
add_custom_target(uninstall
COMMAND test -f ${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt &&
xargs rm < ${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt &&
rm ${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt &&
echo ${PROJECT_NAME} uninstalled successfully. ||
echo ${PROJECT_NAME} has not been installed yet or you need to be root to uninstall.
COMMENT "Uninstalling ${PROJECT_NAME}")
# CPack configuration
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
set(CPACK_PACKAGE_VENDOR "CERN-LHCb")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
foreach(v IN ITEMS MAJOR MINOR PATCH)
set(CPACK_PACKAGE_VERSION_${v} ${PROJECT_VERSION_${v}})
endforeach()
if(DEFINED BINARY_TAG)
set(CPACK_SYSTEM_NAME ${BINARY_TAG})
elseif(DEFINED ENV{BINARY_TAG})
set(CPACK_SYSTEM_NAME $ENV{BINARY_TAG})
endif()
set(CPACK_GENERATOR "ZIP;RPM") # package format
# The following line is needed to prevent the compilation of python modules before packaging (an incorrect version of python may be used).
# FIXME: the day we can tell CMake to prepend the call to rpm by the run script, do it and remove this line (something like ``set(CPACK_RPM_LAUNCHER ${CMAKE_BINARY_DIR}/run)``)
set(CPACK_RPM_SPEC_MORE_DEFINE "%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g')")
# -- for the sources
set(CPACK_SOURCE_IGNORE_FILES "/InstallArea/;/build\\\\..*/;/\\\\.git/;/\\\\.git.*")
set(CPACK_SOURCE_GENERATOR "ZIP;RPM")
include(CPack)
# Optionally enable compatibility with old-style CMake configurations, via helper module
option(GAUDI_LEGACY_CMAKE_SUPPORT "Enable compatibility with old-style CMake builds" "$ENV{GAUDI_LEGACY_CMAKE_SUPPORT}")
if(GAUDI_LEGACY_CMAKE_SUPPORT)
find_file(legacy_cmake_config_support NAMES LegacyGaudiCMakeSupport.cmake)
if(legacy_cmake_config_support)
include(${legacy_cmake_config_support})
else()
message(FATAL_ERROR "GAUDI_LEGACY_CMAKE_SUPPORT set to TRUE, but cannot find LegacyGaudiCMakeSupport.cmake")
endif()
endif()
unset( _cpack_config )
mark_as_advanced( _cpack_config )
Gaudi Contribution Guide
========================
The Gaudi project is open source (see the LICENSE) and welcomes
contributions from experiments and users.
To contribute to Gaudi development you can *fork* the project from
CERN GitLab, where the Gaudi source is held.
Bug fixes and features should be developed in your own branch, then
a *merge request* made back to the upstream Gaudi repository.
By submitting a merge request to the Gaudi repository you agree that
your contribution will be copyrighted to CERN and covered by the Apache 2
licence, as per the LICENSE.
Coding Style Guidelines
-----------------------
Code contributions to Gaudi should adhere to the ``clang-format`` rules
(an automatic check is part of the Continuous Integration system).
gaudi_subdir(Gaudi)
gaudi_depends_on_subdirs(GaudiKernel)
#---Executables-------------------------------------------------------------
gaudi_add_executable(Gaudi src/main.cpp LINK_LIBRARIES GaudiKernel)
#---Installation------------------------------------------------------------
gaudi_install_python_modules()
gaudi_install_scripts()
#---Tests-------------------------------------------------------------------
# FIXME: these variables must be unset in the tests for compatibility with CMT
gaudi_build_env(UNSET GAUDIAPPNAME
UNSET GAUDIAPPVERSION)
gaudi_add_test(QMTest QMTEST
ENVIRONMENT
JOBOPTSEARCHPATH=${CMAKE_CURRENT_SOURCE_DIR}/tests/pyjobopts:${CMAKE_CURRENT_SOURCE_DIR}/tests
PYTHONPATH+=${CMAKE_CURRENT_SOURCE_DIR}/tests/python)
gaudi_add_test(nose
COMMAND nosetests --with-doctest -v
${CMAKE_CURRENT_SOURCE_DIR}/tests/nose
${CMAKE_CURRENT_SOURCE_DIR}/python/Gaudi)
# Settings relating to sanitizer builds
if (SANITIZER_ENABLED)
message(STATUS "Enabled sanitizer ${SANITIZER_ENABLED}")
# Enable automatic LD_PRELOAD
gaudi_env( SET PRELOAD_SANITIZER_LIB ${SANITIZER_ENABLED})
gaudi_build_env(SET PRELOAD_SANITIZER_LIB ${SANITIZER_ENABLED})
# Address sanitizer runtime options
set(GAUDI_ASAN_OPTS detect_leaks=0,alloc_dealloc_mismatch=0,halt_on_error=0,suppressions=\${GAUDIROOT}/job/Gaudi-ASan.supp
CACHE STRING "Runtime options for AddressSanitizer")
message(STATUS "ASAN OPTIONS ${GAUDI_ASAN_OPTS}")
gaudi_env( SET ASAN_OPTIONS ${GAUDI_ASAN_OPTS} )
gaudi_build_env(SET ASAN_OPTIONS ${GAUDI_ASAN_OPTS} )
# Leak sanitizer runtime options
set(GAUDI_LSAN_OPTS print_suppressions=0,halt_on_error=0,suppressions=\${GAUDIROOT}/job/Gaudi-LSan.supp
CACHE STRING "Runtime options for LeakSanitizer")
message(STATUS "LSAN OPTIONS ${GAUDI_LSAN_OPTS}")
gaudi_env( SET LSAN_OPTIONS ${GAUDI_LSAN_OPTS} )
gaudi_build_env(SET LSAN_OPTIONS ${GAUDI_LSAN_OPTS} )
# Thread sanitizer runtime options
# Note this sanitizer is known to prefer to be run with *everything* built using the
# sanitizer, which is not possible here (i.e. LCG externals). See
# https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual#non-instrumented-code
# Using the options ignore_interceptors_accesses=1,ignore_noninstrumented_modules=1
# seems to help reduce the noise a bit, but might remove real issues..
set(GAUDI_TSAN_OPTS print_suppressions=0,halt_on_error=0,ignore_interceptors_accesses=1,ignore_noninstrumented_modules=1,suppressions=\${GAUDIROOT}/job/Gaudi-TSan.supp
CACHE STRING "Runtime options for ThreadSanitizer")
message(STATUS "TSAN OPTIONS ${GAUDI_TSAN_OPTS}")
gaudi_env( SET TSAN_OPTIONS ${GAUDI_TSAN_OPTS} )
gaudi_build_env(SET TSAN_OPTIONS ${GAUDI_TSAN_OPTS} )
# Undefined Behaviour sanitizer runtime options
set(GAUDI_UBSAN_OPTS print_stacktrace=1,print_suppressions=0,halt_on_error=0,suppressions=\${GAUDIROOT}/job/Gaudi-UBSan.supp
CACHE STRING "Runtime options for UndefinedSanitizer")
message(STATUS "UBSAN OPTIONS ${GAUDI_UBSAN_OPTS}")
gaudi_env( SET UBSAN_OPTIONS ${GAUDI_UBSAN_OPTS} )
gaudi_build_env(SET UBSAN_OPTIONS ${GAUDI_UBSAN_OPTS} )
endif()
#####################################################################################
# (c) Copyright 1998-2024 CERN for the benefit of the LHCb and ATLAS collaborations #
# #
# This software is distributed under the terms of the Apache version 2 licence, #
# copied verbatim in the file "LICENSE". #
# #
# In applying this licence, CERN does not waive the privileges and immunities #
# granted to it by virtue of its status as an Intergovernmental Organization #
# or submit itself to any jurisdiction. #
#####################################################################################
# Gaudi subdirectory
# Build binaries
gaudi_add_executable(Gaudi
SOURCES src/main.cpp
LINK GaudiKernel)
# Add a symlink Gaudi.exe -> Gaudi because some tests expect to use Gaudi.exe
file(CREATE_LINK Gaudi ${CMAKE_CURRENT_BINARY_DIR}/Gaudi.exe SYMBOLIC)
# Generate Gaudi_user.confdb
gaudi_generate_confuserdb(Gaudi.ConfUser)
# Python tests
gaudi_add_pytest(tests/pytest)
gaudi_add_pytest(python/Gaudi/Main.py
OPTIONS --doctest-modules
ROOT_DIR python
PREFIX Gaudi.doctest.python.
)
# Install python modules
gaudi_install(PYTHON)
# Install other scripts
gaudi_install(SCRIPTS)
......@@ -3,7 +3,7 @@
# Address sanitizer specific suppressions
# http://clang.llvm.org/docs/AddressSanitizer.html
#
# Note the leak sanitizer options in Gaudi-LSan.supp
# Note the leak sanitizer options in Gaudi-LSan.supp
# are also used by the address sanitizer.
# --------------------------------------------------
......
......@@ -4,6 +4,102 @@
# http://clang.llvm.org/docs/LeakSanitizer.html
# --------------------------------------------------
# Gaudi leaks -- Should really be looked into, but proving difficult to
# isolate and these errors cause a lot of noise downstream so mask
# until properly fixed.
#Indirect leak of 1528 byte(s) in 1 object(s) allocated from:
# #0 0x7f700694bda8 in operator new(unsigned long) /afs/cern.ch/cms/CAF/CMSCOMM/COMM_ECAL/dkonst/GCC/build/contrib/gcc-8.2.0/src/gcc/8.2.0/libsanitizer/lsan/lsan_interceptors.cc:229
# #1 0x7f6fd24faa20 in std::_MakeUniq<LHCb::RawDataCnvSvc>::__single_object std::make_unique<LHCb::RawDataCnvSvc, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, ISvcLocator*>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&&, ISvcLocator*&&) /cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/8.2.0-3fa06/x86_64-centos7/include/c++/8.2.0/bits/unique_ptr.h:831
# #2 0x7f6fd24faa20 in Gaudi::PluginService::v2::Details::DefaultFactory<LHCb::RawDataCnvSvc, Gaudi::PluginService::v2::Factory<IService* (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ISvcLocator*)> >::operator()(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ISvcLocator*) /usera/jonesc/LHCbCMake/Feature/Gaudi/InstallArea/x86_64-centos7-gcc8-dbg+lsan/include/Gaudi/Details/PluginServiceDetailsV2.h:204
# #3 0x7f6fd24faa20 in std::_Function_handler<std::unique_ptr<IService, std::default_delete<IService> > (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ISvcLocator*), Gaudi::PluginService::v2::Details::DefaultFactory<LHCb::RawDataCnvSvc, Gaudi::PluginService::v2::Factory<IService* (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ISvcLocator*)> > >::_M_invoke(std::_Any_data const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ISvcLocator*&&) /cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/8.2.0-3fa06/x86_64-centos7/include/c++/8.2.0/bits/std_function.h:283
# #4 0x7f6fe86121e1 in std::function<std::unique_ptr<IService, std::default_delete<IService> > (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ISvcLocator*)>::operator()(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ISvcLocator*) const /cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/8.2.0-3fa06/x86_64-centos7/include/c++/8.2.0/bits/std_function.h:687
# #5 0x7f6fe788282b in std::unique_ptr<IService, std::default_delete<IService> > Gaudi::PluginService::v2::Factory<IService* (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ISvcLocator*)>::create<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ISvcLocator*) ../GaudiPluginService/Gaudi/PluginServiceV2.h:47
# #6 0x7f6fe788282b in ServiceManager::createService(Gaudi::Utils::TypeNameString const&) ../GaudiCoreSvc/src/ApplicationMgr/ServiceManager.cpp:81
# #7 0x7f6fe7880ed3 in ServiceManager::addService(Gaudi::Utils::TypeNameString const&, int) ../GaudiCoreSvc/src/ApplicationMgr/ServiceManager.cpp:123
# #8 0x7f6fe7882306 in ServiceManager::service(Gaudi::Utils::TypeNameString const&, bool) ../GaudiCoreSvc/src/ApplicationMgr/ServiceManager.cpp:197
leak:Gaudi::PluginService::v2::Details::DefaultFactory*
# Direct leak of 48 byte(s) in 1 object(s) allocated from:
# #0 0x7fe26d832da8 in operator new(unsigned long) /afs/cern.ch/cms/CAF/CMSCOMM/COMM_ECAL/dkonst/GCC/build/contrib/gcc-8.2.0/src/gcc/8.2.0/libsanitizer/lsan/lsan_interceptors.cc:229
# #1 0x41082b in Gaudi::PluginService::v1::Factory<Base2*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int>::ReturnType Gaudi::PluginService::v1::Details::Factory<Component2>::create<Gaudi::PluginService::v1::Factory<Base2*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&&) ../GaudiPluginService/Gaudi/Details/PluginServiceDetailsV1.h:40
# #2 0x40505a in Gaudi::PluginService::v1::Factory<Base2*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int>::create(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) ../GaudiPluginService/Gaudi/PluginServiceV1.h:62
# #3 0x40505a in Base2* Gaudi::PluginService::v1::Factory<Base2*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int>::create<char [11]>(char const (&) [11], std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) ../GaudiPluginService/Gaudi/PluginServiceV1.h:69
leak:Gaudi::PluginService::v1::Factory*
# Direct leak of 48 byte(s) in 2 object(s) allocated from:
# #0 0x7f36dab12da8 in operator new(unsigned long) /afs/cern.ch/cms/CAF/CMSCOMM/COMM_ECAL/dkonst/GCC/build/contrib/gcc-8.2.0/src/gcc/8.2.0/libsanitizer/lsan/lsan_interceptors.cc:229
# #1 0x7f36cca8cf7e in EventCollectionSelector::connectTuple(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, NTuple::Tuple*&, NTuple::Item<IOpaqueAddress*>*&) const ../GaudiCoreSvc/src/EventSelector/EventCollectionSelector.cpp:104
# #2 0x7f36cca8c27f in EventCollectionSelector::connectCollection(EventCollectionSelector::MyContextType*) const ../GaudiCoreSvc/src/EventSelector/EventCollectionSelector.cpp:183
# #3 0x7f36cca8c808 in EventCollectionSelector::createContext(IEvtSelector::Context*&) const ../GaudiCoreSvc/src/EventSelector/EventCollectionSelector.cpp:209
leak:EventCollectionSelector::connectTuple
# Suppress a number of leaks from ntuple booking... not clear if these are ROOT or Gaudi issues...
# Indirect leak of 160 byte(s) in 2 object(s) allocated from:
# #0 0x7ff846fbbec8 in operator new[](unsigned long) /afs/cern.ch/cms/CAF/CMSCOMM/COMM_ECAL/dkonst/GCC/build/contrib/gcc-8.2.0/src/gcc/8.2.0/libsanitizer/lsan/lsan_interceptors.cc:231
# #1 0x7ff8336e7653 in TBranch::Init(char const*, char const*, int) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/tree/tree/src/TBranch.cxx:309
# #2 0x7ff8336e7039 in TBranch::TBranch(TTree*, char const*, void*, char const*, int, int) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/tree/tree/src/TBranch.cxx:239
# #3 0x7ff833773ceb in TTree::Branch(char const*, void*, char const*, int) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/tree/tree/src/TTree.cxx:1893
# #4 0x7ff831763748 in RootHistCnv::RRWNTupleCnv::book(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, INTuple*, TTree*&) ../RootHistCnv/src/RRWNTupleCnv.cpp:27
leak:RootHistCnv::RRWNTupleCnv::book
# Appears to be an issue with the mutex ownsership with LockedHandle
# Direct leak of 40 byte(s) in 1 object(s) allocated from:
# #0 0x7f09944fcda8 in operator new(unsigned long) /afs/cern.ch/cms/CAF/CMSCOMM/COMM_ECAL/dkonst/GCC/build/contrib/gcc-8.2.0/src/gcc/8.2.0/libsanitizer/lsan/lsan_interceptors.cc:229
# #1 0x7f0987aa2e6d in StatusCode THistSvc::regHist_i<TH1>(std::unique_ptr<TH1, std::default_delete<TH1> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, THistSvc::THistID*&) ../GaudiSvc/src/THistSvc/THistSvc.icc:139
# #2 0x7f0987aa3375 in LockedHandle<TH1, std::mutex> THistSvc::regShared_i<TH1>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unique_ptr<TH1, std::default_delete<TH1> >) ../GaudiSvc/src/THistSvc/THistSvc.icc:264
# #3 0x7f0987a8f8ef in THistSvc::regShared(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unique_ptr<TH1, std::default_delete<TH1> >, LockedHandle<TH1, std::mutex>&) ../GaudiSvc/src/THistSvc/THistSvc.cpp:430
leak:THistSvc::regHist_i
# THistWrite GaudiTestSuite test generates a lot of leaks during histogram creation :((
# Indirect leak of 816 byte(s) in 1 object(s) allocated from:
# #0 0x7f817fd0aec8 in operator new[](unsigned long) /afs/cern.ch/cms/CAF/CMSCOMM/COMM_ECAL/dkonst/GCC/build/contrib/gcc-8.2.0/src/gcc/8.2.0/libsanitizer/lsan/lsan_interceptors.cc:231
# #1 0x7f817bedf4b6 in TArrayD::Set(int) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/core/cont/src/TArrayD.cxx:112
# #2 0x7f81796c52bf in TH1D::TH1D(char const*, char const*, int, double, double) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/hist/hist/src/TH1.cxx:9627
# #3 0x7f817782ab5d in THistWrite::initialize() ../GaudiTestSuite/src/THist/THistWrite.cpp:94
leak:THistWrite::initialize
# Note sure where in this lot the leak is ...
#Indirect leak of 160 byte(s) in 1 object(s) allocated from:
# #0 0x7fde515afec8 in operator new[](unsigned long) /afs/cern.ch/cms/CAF/CMSCOMM/COMM_ECAL/dkonst/GCC/build/contrib/gcc-8.2.0/src/gcc/8.2.0/libsanitizer/lsan/lsan_interceptors.cc:231
# #1 0x7fde41c7610f in TString::Clobber(int) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/core/base/src/TString.cxx:1198
# #2 0x7fde3f8b675b in TBufferFile::ReadTString(TString&) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/io/io/src/TBufferFile.cxx:200
# #3 0x7fde41c76609 in TString::Streamer(TBuffer&) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/core/base/src/TString.cxx:1348
# #4 0x7fde3f9b15d8 in TStreamerInfoActions::ReadTString(TBuffer&, void*, TStreamerInfoActions::TConfiguration const*) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/io/io/src/TStreamerInfoActions.cxx:924
# #5 0x7fde3f8c1204 in TStreamerInfoActions::TConfiguredAction::operator()(TBuffer&, void*) const /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT-6.18.00-build/include/TStreamerInfoActions.h:124
# #6 0x7fde3f8bf0e0 in TBufferFile::ApplySequence(TStreamerInfoActions::TActionSequence const&, void*) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/io/io/src/TBufferFile.cxx:3564
# #7 0x7fde3f8beb59 in TBufferFile::ReadClassBuffer(TClass const*, void*, TClass const*) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/io/io/src/TBufferFile.cxx:3485
# #8 0x7fde41bbc5aa in TObjString::Streamer(TBuffer&) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT-6.18.00-build/core/G__Core.cxx:21610
# #9 0x7fde41d294c7 in TClass::StreamerTObjectInitialized(TClass const*, void*, TBuffer&, TClass const*) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/core/meta/src/TClass.cxx:6537
# #10 0x7fde3f8bf920 in TClass::Streamer(void*, TBuffer&, TClass const*) const /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT-6.18.00-build/include/TClass.h:570
# #11 0x7fde3f8bbdb3 in TBufferFile::ReadObjectAny(TClass const*) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/io/io/src/TBufferFile.cxx:2471
# #12 0x7fde41c3e813 in TBuffer& operator>><TObject>(TBuffer&, TObject*&) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT-6.18.00-build/include/TBuffer.h:394
# #13 0x7fde41cdaaea in TList::Streamer(TBuffer&) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/core/cont/src/TList.cxx:1209
# #14 0x7fde41d294c7 in TClass::StreamerTObjectInitialized(TClass const*, void*, TBuffer&, TClass const*) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/core/meta/src/TClass.cxx:6537
# #15 0x7fde3f8bf920 in TClass::Streamer(void*, TBuffer&, TClass const*) const /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT-6.18.00-build/include/TClass.h:570
# #16 0x7fde3f8bbdb3 in TBufferFile::ReadObjectAny(TClass const*) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/io/io/src/TBufferFile.cxx:2471
# #17 0x7fde41c3e813 in TBuffer& operator>><TObject>(TBuffer&, TObject*&) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT-6.18.00-build/include/TBuffer.h:394
# #18 0x7fde41cdaaea in TList::Streamer(TBuffer&) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/core/cont/src/TList.cxx:1209
# #19 0x7fde3f965a72 in TKey::ReadObjWithBuffer(char*) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/io/io/src/TKey.cxx:936
# #20 0x7fde3f92ba2e in TFile::GetStreamerInfoListImpl(bool) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/io/io/src/TFile.cxx:1355
# #21 0x7fde3f92bc79 in TFile::GetStreamerInfoList() /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/io/io/src/TFile.cxx:1392
# #22 0x7fde3f92b64a in TFile::GetStreamerInfoCache() /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/io/io/src/TFile.cxx:1315
# #23 0x7fde3f3f4a78 in TBranchElement::FindOnfileInfo(TClass*, TObjArray const&) const /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/tree/tree/src/TBranchElement.cxx:1929
# #24 0x7fde3f3f6b7d in TBranchElement::InitInfo() /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/tree/tree/src/TBranchElement.cxx:2354
# #25 0x7fde3f4073ed in TBranchElement::GetInfoImp() const /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/tree/tree/src/TBranchElement.cxx:1002
# #26 0x7fde3f3f9113 in TBranchElement::InitializeOffsets() /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/tree/tree/src/TBranchElement.cxx:3123
# #27 0x7fde3f401e15 in TBranchElement::SetAddress(void*) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/tree/tree/src/TBranchElement.cxx:5323
# #28 0x7fde3f401edf in TBranchElement::SetAddress(void*) /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Debug/COMPILER/gcc8binutils/LABEL/centos7/build/projects/ROOT-6.18.00/src/ROOT/6.18.00/tree/tree/src/TBranchElement.cxx:5334
# #29 0x7fde3ae1fc5a in Gaudi::RootDataConnection::loadObj(std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> >, unsigned long, DataObject*&) ../RootCnv/src/RootDataConnection.cpp:507
leak:Gaudi::RootDataConnection::loadObj
#Direct leak of 176 byte(s) in 1 object(s) allocated from:
# #0 0x7f56e2dc2da8 in operator new(unsigned long) /afs/cern.ch/cms/CAF/CMSCOMM/COMM_ECAL/dkonst/GCC/build/contrib/gcc-8.2.0/src/gcc/8.2.0/libsanitizer/lsan/lsan_interceptors.cc:229
# #1 0x7f56cb992ae4 in Gaudi::RootCnvSvc::createAddress(long, unsigned int const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const*, unsigned long const*, IOpaqueAddress*&) ../RootCnv/src/RootCnvSvc.cpp:349
# #2 0x7f56cb993530 in Gaudi::RootCnvSvc::connectDatabase(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, Gaudi::RootDataConnection**) ../RootCnv/src/RootCnvSvc.cpp:242
# #3 0x7f56cb9b5230 in Gaudi::RootEvtSelector::next(IEvtSelector::Context&) const ../RootCnv/src/RootEvtSelector.cpp:168
leak:Gaudi::RootCnvSvc::connectDatabase
# PyROOT
leak:PyROOT::MethodProxy_New
leak:PyROOT::CreateConverter
......@@ -24,9 +120,22 @@ leak:^mp_new$
leak:^pp_new$
leak:^mp_setthreaded$
leak:TFormula::HandleParamRanges
leak:TDirectoryFile::GetDirectory
leak:TBuffer::TBuffer
leak:TObject::operator
leak:TStorage::Alloc
#leak:TBranch::Init
leak:TGenCollectionProxy::Allocate
leak:TStreamerInfoActions::TActionSequence::CreateReadMemberWiseActions
leak:TClass::New
leak:TTree::CreateBasket
leak:TNetXNGFile::TNetXNGFile
leak:cling::Interpreter::ShutDown
leak:TStreamerInfo::ReadBuffer<TVirtualCollectionProxy>
# XrootD
leak:XrdSys
#leak:XrdSys
leak:Xrd*
# Xerces
leak:xercesc_3_1::MemoryManagerImpl::allocate
......@@ -62,3 +171,13 @@ leak:std::vector<unsigned int, std::allocator<unsigned int> >::_M_fill_insert
# Suppresses *everything* that comes via the runtime interceptor.
leak:_interceptor_
#Direct leak of 48 byte(s) in 2 object(s) allocated from:
# #0 0x7f9fde9b458f in operator new(unsigned long, std::nothrow_t const&) /build/gcc/build/contrib/gcc-9.2.0/src/gcc/9.2.0/libsanitizer/lsan/lsan_interceptors.cc:227
# #1 0x7f9fdd3675bd in __cxa_thread_atexit /build/gcc/build/contrib/gcc-9.2.0/src/gcc/9.2.0/libstdc++-v3/libsupc++/atexit_thread.cc:146
leak:__cxa_thread_atexit
#Indirect leak of 2560 byte(s) in 10 object(s) allocated from:
# #0 0x7f7edaccf333 in operator new(unsigned long) /build/gcc/build/contrib/gcc-9.2.0/src/gcc/9.2.0/libsanitizer/lsan/lsan_interceptors.cc:222
# #1 0x7f7ecb4679ad in std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::operator=(std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) (/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCG_96b/ROOT/6.18.04/x86_64-centos7-gcc9-dbg/lib/libCling.so+0xacb9ad)
leak:std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::operator=(std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)
# --------------------------------------------------
# -----------------------------------------------------------
# Undefined Behaviour sanitizer suppressions
# http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
# --------------------------------------------------
# -----------------------------------------------------------
# Boost - https://svn.boost.org/trac10/ticket/13233
# Boost
# https://svn.boost.org/trac10/ticket/13233
vptr:boost/log/attributes/attribute_value.hpp
vptr:boost/smart_ptr/detail/shared_count.hpp
# /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-cc8f0/x86_64-centos7-gcc8-dbg/include/boost/any.hpp:249:17: runtime error: downcast of address 0x000001169570 which does not point to an object of type 'holder'
vptr:boost/any.hpp
# Xerces / XMLFileCatalog
# /workspace/build/GAUDI/GAUDI_HEAD/GaudiUtils/src/component/XMLFileCatalog.cpp:84:67: runtime error: downcast of address 0x000001927a58 which does not point to an object of type 'DOMElement'
......@@ -25,10 +28,7 @@ vptr:GaudiUtils/src/component/XMLFileCatalog.cpp
# #0 0x7fd5ce2fb0d9 in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/8.1.0/x86_64-centos7/include/c++/8.1.0/bits/shared_ptr_base.h:161
# #1 0x7fd5aecaed10 in (anonymous namespace)::RealFileSystem::dir_begin(llvm::Twine const&, std::error_code&) (/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCG_94/ROOT/6.14.04/x86_64-centos7-gcc8-dbg/lib/libCling.so+0x249cd10)
# #2 0x7fd5ad2e5981 in clang::driver::toolchains::Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(llvm::Triple const&, llvm::opt::ArgList const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, llvm::StringRef, bool) (/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCG_94/ROOT/6.14.04/x86_64-centos7-gcc8-dbg/lib/libCling.so+0xad3981)
# Include gcc version so we don't automatically
# apply these to newer releases.
vptr:include/c++/7.3.0/bits/shared_ptr_base.h
vptr:include/c++/8.1.0/bits/shared_ptr_base.h
vptr:bits/shared_ptr_base.h
# TBB
# /cvmfs/lhcb.cern.ch/lib/lcg/releases/tbb/2018_U1-d3621/x86_64-centos7-gcc7-dbg/include/tbb/task.h:780:34: runtime error: member call on address 0x7fccb4ac8e00 which does not point to an object of type 'scheduler'
......@@ -37,3 +37,50 @@ vptr:include/c++/8.1.0/bits/shared_ptr_base.h
# ^~~~~~~~~~~~~~~~~~~~~~~
# vptr for 'tbb::internal::custom_scheduler<tbb::internal::IntelSchedulerTraits>'
vptr:include/tbb/task.h
# Gaudi - listcomponents
#/cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/serialization/singleton.hpp:181:12: runtime error: reference binding to null pointer of type 'const struct extended_type_info_typeid'
# #0 0x7f1847675979 in boost::serialization::singleton<boost::serialization::extended_type_info_typeid<std::vector<std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::get_instance() /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/serialization/singleton.hpp:181
# #1 0x7f1847675b21 in boost::serialization::singleton<boost::serialization::extended_type_info_typeid<std::vector<std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::get_const_instance() /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/serialization/singleton.hpp:196
# #2 0x7f1847675b21 in boost::archive::detail::oserializer<boost::archive::text_oarchive, std::vector<std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >::oserializer() /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/archive/detail/oserializer.hpp:116
# #3 0x7f1847675b21 in boost::serialization::detail::singleton_wrapper<boost::archive::detail::oserializer<boost::archive::text_oarchive, std::vector<std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::singleton_wrapper() /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/serialization/singleton.hpp:147
# #4 0x7f1847675b21 in boost::serialization::singleton<boost::archive::detail::oserializer<boost::archive::text_oarchive, std::vector<std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::get_instance() /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/serialization/singleton.hpp:171
# #5 0x7f184754d477 in __static_initialization_and_destruction_0 /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/serialization/singleton.hpp:207
# #6 0x7f184754ef44 in _GLOBAL__sub_I_TestSerializationAlgo.cpp Online/ZeroMQ/component/TestSerializationAlgo.cpp:99
# #7 0x7f1849d7c9b2 in _dl_init_internal (/lib64/ld-linux-x86-64.so.2+0xf9b2)
# #8 0x7f1849d8158d in dl_open_worker (/lib64/ld-linux-x86-64.so.2+0x1458d)
# #9 0x7f1849d7c7c3 in _dl_catch_error (/lib64/ld-linux-x86-64.so.2+0xf7c3)
# #10 0x7f1849d80b7a in _dl_open (/lib64/ld-linux-x86-64.so.2+0x13b7a)
# #11 0x7f1848aacfaa in dlopen_doit (/lib64/libdl.so.2+0xfaa)
# #12 0x7f1849d7c7c3 in _dl_catch_error (/lib64/ld-linux-x86-64.so.2+0xf7c3)
# #13 0x7f1848aad5ac in _dlerror_run (/lib64/libdl.so.2+0x15ac)
# #14 0x7f1848aad040 in __dlopen_check (/lib64/libdl.so.2+0x1040)
# #15 0x4089e4 in main Gaudi/GaudiPluginService/src/listcomponents.cpp:114
# #16 0x7f1848109554 in __libc_start_main (/lib64/libc.so.6+0x22554)
# #17 0x403348 (Gaudi/InstallArea/x86_64-centos7-gcc9-dbg+ubsan/bin/listcomponents.exe+0x403348)
vptr:Gaudi/GaudiPluginService/src/listcomponents.cpp
#/cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/serialization/singleton.hpp:181:12: runtime error: reference binding to null pointer of type 'const struct extended_type_info_typeid'
# #0 0x7f1b07822066 in boost::serialization::singleton<boost::serialization::extended_type_info_typeid<std::map<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<int>, std::allocator<std::pair<int const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::get_instance() /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/serialization/singleton.hpp:181
# #1 0x7f1b0782220e in boost::serialization::singleton<boost::serialization::extended_type_info_typeid<std::map<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<int>, std::allocator<std::pair<int const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::get_const_instance() /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/serialization/singleton.hpp:196
# #2 0x7f1b0782220e in boost::archive::detail::oserializer<boost::archive::text_oarchive, std::map<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<int>, std::allocator<std::pair<int const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >::oserializer() /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/archive/detail/oserializer.hpp:116
# #3 0x7f1b0782220e in boost::serialization::detail::singleton_wrapper<boost::archive::detail::oserializer<boost::archive::text_oarchive, std::map<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<int>, std::allocator<std::pair<int const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::singleton_wrapper() /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/serialization/singleton.hpp:147
# #4 0x7f1b0782220e in boost::serialization::singleton<boost::archive::detail::oserializer<boost::archive::text_oarchive, std::map<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<int>, std::allocator<std::pair<int const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::get_instance() /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/serialization/singleton.hpp:171
# #5 0x7f1b076f14c3 in __static_initialization_and_destruction_0 /cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.70.0-eebf1/x86_64-centos7-gcc9-dbg/include/boost/serialization/singleton.hpp:207
# #6 0x7f1b076f2f44 in _GLOBAL__sub_I_TestSerializationAlgo.cpp Online/ZeroMQ/component/TestSerializationAlgo.cpp:99
# #7 0x7f1b141079b2 in _dl_init_internal (/lib64/ld-linux-x86-64.so.2+0xf9b2)
# #8 0x7f1b1410c58d in dl_open_worker (/lib64/ld-linux-x86-64.so.2+0x1458d)
# #9 0x7f1b141077c3 in _dl_catch_error (/lib64/ld-linux-x86-64.so.2+0xf7c3)
# #10 0x7f1b1410bb7a in _dl_open (/lib64/ld-linux-x86-64.so.2+0x13b7a)
# #11 0x7f1b0cab3faa in dlopen_doit (/lib64/libdl.so.2+0xfaa)
# #12 0x7f1b141077c3 in _dl_catch_error (/lib64/ld-linux-x86-64.so.2+0xf7c3)
# #13 0x7f1b0cab45ac in _dlerror_run (/lib64/libdl.so.2+0x15ac)
# #14 0x7f1b0cab4040 in __dlopen_check (/lib64/libdl.so.2+0x1040)
# #15 0x7f1b11cdbca0 in doLoad Gaudi/GaudiKernel/src/Lib/System.cpp:98
# #16 0x7f1b11ce3378 in loadWithoutEnvironment Gaudi/GaudiKernel/src/Lib/System.cpp:141
# #17 0x7f1b11ce3b31 in System::loadDynamicLib(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void**) Gaudi/GaudiKernel/src/Lib/System.cpp:174
# #18 0x459b01 in configGenerator::genConfig(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) Gaudi/GaudiKernel/src/Util/genconf.cpp:501
# #19 0x4724f5 in main Gaudi/GaudiKernel/src/Util/genconf.cpp:434
# #20 0x7f1b0ccd9554 in __libc_start_main (/lib64/libc.so.6+0x22554)
# #21 0x436fa8 (Gaudi/InstallArea/x86_64-centos7-gcc9-dbg+ubsan/bin/genconf.exe+0x436fa8)
vptr:Gaudi/GaudiKernel/src/Util/genconf.cpp
#####################################################################################
# (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations #
# #
# This software is distributed under the terms of the Apache version 2 licence, #
# copied verbatim in the file "LICENSE". #
# #
# In applying this licence, CERN does not waive the privileges and immunities #
# granted to it by virtue of its status as an Intergovernmental Organization #
# or submit itself to any jurisdiction. #
#####################################################################################
import sys
import Gaudi.Configurables
sys.modules[__name__] = Gaudi.Configurables
#####################################################################################
# (c) Copyright 1998-2024 CERN for the benefit of the LHCb and ATLAS collaborations #
# #
# This software is distributed under the terms of the Apache version 2 licence, #
# copied verbatim in the file "LICENSE". #
# #
# In applying this licence, CERN does not waive the privileges and immunities #
# granted to it by virtue of its status as an Intergovernmental Organization #
# or submit itself to any jurisdiction. #
#####################################################################################
# File: Gaudi/CommonGaudiConfigurables.py
# Author: Pere Mato (pere.mato@cern.ch)
"""
This module would scan all known Gaudi configurable modules for
'Configurable' classes and fill __all__ such that it can be imported
by any module requiring it.
This module would scan all known Gaudi configurable modules for
'Configurable' classes and fill __all__ such that it can be imported
by any module requiring it.
"""
from GaudiKernel.Configurable import Configurable
from GaudiKernel.ConfigurableMeta import ConfigurableMeta
__all__ = []
packages = [
'GaudiCoreSvc', 'GaudiCommonSvc', 'GaudiSvc', 'GaudiAlg', 'GaudiAud',
'GaudiPoolDb', 'RootHistCnv', 'GaudiUtils', 'RootCnv'
"GaudiCoreSvc",
"GaudiCommonSvc",
"GaudiSvc",
"GaudiAud",
"GaudiPoolDb",
"RootHistCnv",
"GaudiUtils",
"RootCnv",
]
# --Loop open all listed packages and populate __all__ with the names and
# the local scope with the Configurable classes
for package in packages:
try:
mod = __import__('%s.%sConf' % (package, package), globals(), locals(),
['%sConf' % package])
mod = __import__(
"%s.%sConf" % (package, package), globals(), locals(), ["%sConf" % package]
)
for nam in dir(mod):
cls = getattr(mod, nam)
if type(cls) is ConfigurableMeta and issubclass(cls, Configurable):
......@@ -32,26 +50,26 @@ for package in packages:
# --Fix some of the name idiosyncrasies in Gaudi
aliases = {
'EventDataSvc': 'EvtDataSvc',
'DetectorDataSvc': 'DetDataSvc',
'HistogramDataSvc': 'HistogramSvc',
'HbookHistSvc': 'HbookCnv__PersSvc',
'RootHistSvc': 'RootHistCnv__PersSvc',
'EventPersistencySvc': 'EvtPersistencySvc',
'DetectorPersistencySvc': 'DetPersistencySvc',
'HistogramPersistencySvc': 'HistogramPersistencySvc',
'FileRecordPersistencySvc': 'PersistencySvc',
'FileCatalog': 'Gaudi__MultiFileCatalog',
'IODataManager': 'Gaudi__IODataManager',
'RootCnvSvc': 'Gaudi__RootCnvSvc',
'RootEvtSelector': 'Gaudi__RootEvtSelector',
"EventDataSvc": "EvtDataSvc",
"DetectorDataSvc": "DetDataSvc",
"HistogramDataSvc": "HistogramSvc",
"HbookHistSvc": "HbookCnv__PersSvc",
"RootHistSvc": "RootHistCnv__PersSvc",
"EventPersistencySvc": "EvtPersistencySvc",
"DetectorPersistencySvc": "DetPersistencySvc",
"HistogramPersistencySvc": "HistogramPersistencySvc",
"FileRecordPersistencySvc": "PersistencySvc",
"FileCatalog": "Gaudi__MultiFileCatalog",
"IODataManager": "Gaudi__IODataManager",
"RootCnvSvc": "Gaudi__RootCnvSvc",
"RootEvtSelector": "Gaudi__RootEvtSelector",
}
_gbl = globals() # optimization
# This would be nicer with dict comprehension (http://www.python.org/dev/peps/pep-0274)
# but it is available only in Python 2.7
aliases = dict([(new, _gbl[old]) for new, old in aliases.items() if old in _gbl
]) # do the aliasing only if the original is available
# do the aliasing only if the original is available
aliases = {new: _gbl[old] for new, old in aliases.items() if old in _gbl}
# change the default name
for new in aliases:
aliases[new].DefaultedName = new
......@@ -59,4 +77,8 @@ for new in aliases:
_gbl.update(aliases)
__all__.extend(aliases)
# remove temporaries
del _gbl, new
del _gbl
try:
del new # only available if len(aliases)>0
except NameError:
pass
#####################################################################################
# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations #
# #
# This software is distributed under the terms of the Apache version 2 licence, #
# copied verbatim in the file "LICENSE". #
# #
# In applying this licence, CERN does not waive the privileges and immunities #
# granted to it by virtue of its status as an Intergovernmental Organization #
# or submit itself to any jurisdiction. #
#####################################################################################
from GaudiKernel.Configurable import ConfigurableUser
class GaudiPersistency(ConfigurableUser):
"""Configurable to enable ROOT-based persistency.
Note: it requires Gaudi::RootCnvSvc (package RootCnv).
"""
__slots__ = {}
def __apply_configuration__(self):
"""Apply low-level configuration"""
# aliased names
from Configurables import (
ApplicationMgr,
EventPersistencySvc,
FileCatalog,
FileRecordDataSvc,
IODataManager,
PersistencySvc,
RootCnvSvc,
)
cnvSvcs = [RootCnvSvc()]
EventPersistencySvc().CnvServices += cnvSvcs
PersistencySvc("FileRecordPersistencySvc").CnvServices += cnvSvcs
app = ApplicationMgr()
app.SvcOptMapping += [FileCatalog(), IODataManager(), RootCnvSvc()]
app.ExtSvc += [FileRecordDataSvc()]
#####################################################################################
# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations #
# #
# This software is distributed under the terms of the Apache version 2 licence, #
# copied verbatim in the file "LICENSE". #
# #
# In applying this licence, CERN does not waive the privileges and immunities #
# granted to it by virtue of its status as an Intergovernmental Organization #
# or submit itself to any jurisdiction. #
#####################################################################################
# File: Gaudi/python/Gaudi/Configuration.py
# Author: Pere Mato (pere.mato@cern.ch)
from GaudiKernel.Constants import *
from GaudiKernel.Configurable import *
from GaudiKernel.ConfigurableDb import loadConfigurableDb, cfgDb
import logging
# Make these available in our namespace
from Gaudi.CommonGaudiConfigurables import * # noqa: F401 F403
from GaudiKernel.Configurable import * # noqa: F401 F403
from GaudiKernel.Configurable import Configurable
from GaudiKernel.ConfigurableDb import cfgDb, loadConfigurableDb
from GaudiKernel.ConfigurableDb import getConfigurable as confDbGetConfigurable
from CommonGaudiConfigurables import *
from GaudiKernel.ProcessJobOptions import importOptions, importUnits
from GaudiKernel.ProcessJobOptions import InstallRootLoggingHandler as _InstallRootLoggingHandler
from GaudiKernel.Constants import * # noqa: F401 F403
from GaudiKernel.ProcessJobOptions import (
InstallRootLoggingHandler as _InstallRootLoggingHandler,
)
from GaudiKernel.ProcessJobOptions import importOptions, importUnits # noqa: F401
import logging
log = logging.getLogger(__name__)
# Ensure that a root logging handler is always present.
_InstallRootLoggingHandler()
......@@ -19,23 +34,33 @@ allConfigurables = Configurable.allConfigurables
def _fillConfDict():
nFiles = loadConfigurableDb()
log = logging.getLogger('PropertyProxy')
log.debug("Read module info for %d configurables from %d genConfDb files",
len(cfgDb), nFiles)
log = logging.getLogger("PropertyProxy")
log.debug(
"Read module info for %d configurables from %d genConfDb files",
len(cfgDb),
nFiles,
)
if len(cfgDb.duplicates()) > 0:
log.warning("Found %d duplicates among the %d genConfDb files :",
len(cfgDb.duplicates()), nFiles)
log.warning(
"Found %d duplicates among the %d genConfDb files :",
len(cfgDb.duplicates()),
nFiles,
)
log.warning("--------------------------------------------------")
log.warning(" -%s: %s - %s", "<component name>", "<module>",
"[ <duplicates> ]")
log.warning(
" -%s: %s - %s", "<component name>", "<module>", "[ <duplicates> ]"
)
log.warning("--------------------------------------------------")
dups = cfgDb.duplicates()
for cfgName in dups.keys():
log.warning(" -%s: %s - %s", cfgName, cfgDb[cfgName]['module'],
str([d['module'] for d in dups[cfgName]]))
log.warning(
" -%s: %s - %s",
cfgName,
cfgDb[cfgName]["module"],
str([d["module"] for d in dups[cfgName]]),
)
pass
del dups
log.warning("Fix your cmt/requirements file !!")
pass
else:
log.debug("No duplicates have been found: that's good !")
......@@ -46,9 +71,6 @@ def _fillConfDict():
# fill the configurable dictionary at module load
_fillConfDict()
import os
import sys
def importConfiguration(conf, local=locals()):
local[conf] = confDbGetConfigurable(conf)
......@@ -80,10 +102,11 @@ def configurationDict(all=False):
conf_dict[n][p] = v
# purge empty configurables
keys = conf_dict.keys()
ret_dict = {}
for n in keys:
if not conf_dict[n]:
del conf_dict[n]
return conf_dict
if conf_dict[n]:
ret_dict[n] = conf_dict[n]
return ret_dict
def getConfigurable(name, defaultType=None):
......@@ -98,7 +121,7 @@ def getConfigurable(name, defaultType=None):
if defaultType is None:
# try to use the name of the configurable as default type
defaultType = name
if type(defaultType) is str:
if isinstance(defaultType, str):
# we need to convert from string to actual class
if defaultType in globals():
# We the type is defined in the global namespace
......@@ -106,48 +129,6 @@ def getConfigurable(name, defaultType=None):
else:
# otherwise we try to get it from the Configurables database
import Configurables
defaultType = getattr(Configurables, defaultType)
return defaultType(name)
def setCustomMainLoop(runner):
'''
Replace the default main execution loop with the specified callable object.
@param runner: a callable that accepts an initialized instance of GaudiPython.AppMgr
and the number of events to process and returns a StatusCode or a boolean
(True means success)
'''
# change the mainLoop function
from Gaudi.Main import gaudimain
gaudimain.mainLoop = lambda _self, app, nevt: runner(app, nevt)
class GaudiPersistency(ConfigurableUser):
"""Configurable to enable ROOT-based persistency.
Note: it requires Gaudi::RootCnvSvc (package RootCnv).
"""
__slots__ = {}
def __apply_configuration__(self):
"""Apply low-level configuration"""
from Configurables import (
ApplicationMgr,
PersistencySvc,
FileRecordDataSvc,
EventPersistencySvc,
)
# aliased names
from Configurables import (
RootCnvSvc,
RootEvtSelector,
IODataManager,
FileCatalog,
)
cnvSvcs = [RootCnvSvc()]
EventPersistencySvc().CnvServices += cnvSvcs
PersistencySvc("FileRecordPersistencySvc").CnvServices += cnvSvcs
app = ApplicationMgr()
app.SvcOptMapping += [FileCatalog(), IODataManager(), RootCnvSvc()]
app.ExtSvc += [FileRecordDataSvc()]
import sys
#####################################################################################
# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations #
# #
# This software is distributed under the terms of the Apache version 2 licence, #
# copied verbatim in the file "LICENSE". #
# #
# In applying this licence, CERN does not waive the privileges and immunities #
# granted to it by virtue of its status as an Intergovernmental Organization #
# or submit itself to any jurisdiction. #
#####################################################################################
import logging
import os
import sys
from time import time
from Gaudi import Configuration
import logging
log = logging.getLogger(__name__)
......@@ -31,7 +42,8 @@ class BootstrapHelper(object):
self.value = value
def __str__(self):
return str(self.value)
# TODO why bytes
return bytes(self.value).decode("utf-8")
toString = __str__
......@@ -43,87 +55,102 @@ class BootstrapHelper(object):
def configure(self):
return BootstrapHelper.StatusCode(
self.lib.py_bootstrap_fsm_configure(self.ptr))
self.lib.py_bootstrap_fsm_configure(self.ptr)
)
def initialize(self):
return BootstrapHelper.StatusCode(
self.lib.py_bootstrap_fsm_initialize(self.ptr))
self.lib.py_bootstrap_fsm_initialize(self.ptr)
)
def start(self):
return BootstrapHelper.StatusCode(
self.lib.py_bootstrap_fsm_start(self.ptr))
return BootstrapHelper.StatusCode(self.lib.py_bootstrap_fsm_start(self.ptr))
def run(self, nevt):
return BootstrapHelper.StatusCode(
self.lib.py_bootstrap_app_run(self.ptr, nevt))
self.lib.py_bootstrap_app_run(self.ptr, nevt)
)
def stop(self):
return BootstrapHelper.StatusCode(
self.lib.py_bootstrap_fsm_stop(self.ptr))
return BootstrapHelper.StatusCode(self.lib.py_bootstrap_fsm_stop(self.ptr))
def finalize(self):
return BootstrapHelper.StatusCode(
self.lib.py_bootstrap_fsm_finalize(self.ptr))
self.lib.py_bootstrap_fsm_finalize(self.ptr)
)
def terminate(self):
return BootstrapHelper.StatusCode(
self.lib.py_bootstrap_fsm_terminate(self.ptr))
self.lib.py_bootstrap_fsm_terminate(self.ptr)
)
def getService(self, name):
return self.lib.py_bootstrap_getService(self.ptr, name)
return self.lib.py_bootstrap_getService(self.ptr, name.encode("ascii"))
def setProperty(self, name, value):
return BootstrapHelper.StatusCode(
self.lib.py_bootstrap_setProperty(self.ptr, name, value))
self.lib.py_bootstrap_setProperty(
self.ptr, name.encode("ascii"), value.encode("ascii")
)
)
def getProperty(self, name):
return BootstrapHelper.Property(
self.lib.py_bootstrap_getProperty(self.ptr, name))
self.lib.py_bootstrap_getProperty(self.ptr, name.encode("ascii"))
)
def printAlgsSequences(self):
return self.lib.py_helper_printAlgsSequences(self.ptr)
def setOption(self, key, value):
self.lib.py_bootstrap_setOption(
self.ptr, key.encode("ascii"), value.encode("ascii")
)
def __init__(self):
from ctypes import (PyDLL, util, c_void_p, c_bool, c_char_p, c_int,
RTLD_GLOBAL)
from ctypes import RTLD_GLOBAL, PyDLL, c_bool, c_char_p, c_int, c_void_p, util
# Helper class to avoid void* to int conversion
# (see http://stackoverflow.com/questions/17840144)
class IInterface_p(c_void_p):
def __repr__(self):
return "IInterface_p(0x%x)" % (0 if self.value is None else
self.value)
return "IInterface_p(0x%x)" % (0 if self.value is None else self.value)
self.log = logging.getLogger('BootstrapHelper')
libname = util.find_library('GaudiKernel') or 'libGaudiKernel.so'
self.log.debug('loading GaudiKernel (%s)', libname)
self.log = logging.getLogger("BootstrapHelper")
libname = util.find_library("GaudiKernel") or "libGaudiKernel.so"
self.log.debug("loading GaudiKernel (%s)", libname)
# FIXME: note that we need PyDLL instead of CDLL if the calls to
# Python functions are not protected with the GIL.
self.lib = gkl = PyDLL(libname, mode=RTLD_GLOBAL)
functions = [
('createApplicationMgr', IInterface_p, []),
('getService', IInterface_p, [IInterface_p, c_char_p]),
('setProperty', c_bool, [IInterface_p, c_char_p, c_char_p]),
('getProperty', c_char_p, [IInterface_p, c_char_p]),
('addPropertyToCatalogue', c_bool,
[IInterface_p, c_char_p, c_char_p, c_char_p]),
('ROOT_VERSION_CODE', c_int, []),
("createApplicationMgr", IInterface_p, []),
("getService", IInterface_p, [IInterface_p, c_char_p]),
("setProperty", c_bool, [IInterface_p, c_char_p, c_char_p]),
("getProperty", c_char_p, [IInterface_p, c_char_p]),
("setOption", None, [IInterface_p, c_char_p, c_char_p]),
("ROOT_VERSION_CODE", c_int, []),
]
for name, restype, argtypes in functions:
f = getattr(gkl, 'py_bootstrap_%s' % name)
f = getattr(gkl, "py_bootstrap_%s" % name)
f.restype, f.argtypes = restype, argtypes
# create a delegate method if not already present
# (we do not want to use hasattr because it calls "properties")
if name not in self.__class__.__dict__:
setattr(self, name, f)
for name in ('configure', 'initialize', 'start', 'stop', 'finalize',
'terminate'):
f = getattr(gkl, 'py_bootstrap_fsm_%s' % name)
for name in (
"configure",
"initialize",
"start",
"stop",
"finalize",
"terminate",
):
f = getattr(gkl, "py_bootstrap_fsm_%s" % name)
f.restype, f.argtypes = c_bool, [IInterface_p]
gkl.py_bootstrap_app_run.restype = c_bool
gkl.py_bootstrap_app_run.argtypes = [IInterface_p, c_int]
......@@ -142,52 +169,169 @@ class BootstrapHelper(object):
@property
def ROOT_VERSION(self):
root_version_code = self.ROOT_VERSION_CODE
a = root_version_code >> 16 & 0xff
b = root_version_code >> 8 & 0xff
c = root_version_code & 0xff
a = root_version_code >> 16 & 0xFF
b = root_version_code >> 8 & 0xFF
c = root_version_code & 0xFF
return (a, b, c)
_bootstrap = None
def _getAllOpts_old(explicit_defaults=False):
"""
Return all options from the old configuration system as a dictionary.
If explicit_defaults is true, include default values of unset properties in the dictionary.
"""
from itertools import chain
from GaudiKernel.Proxy.Configurable import Configurable, getNeededConfigurables
old_opts = {}
# some algorithms may be generater when we call "getValuedProperties"
# so we need a few iterations before we get the full list
# (see GaudiConfig.ControlFlow)
needed_conf = []
count = 0
new_count = -1
while count != new_count:
count = new_count
needed_conf = getNeededConfigurables()
new_count = len(needed_conf)
for n in needed_conf:
c = Configurable.allConfigurables[n]
if hasattr(c, "getValuedProperties"):
c.getValuedProperties()
for n in needed_conf:
c = Configurable.allConfigurables[n]
items = (
chain(c.getDefaultProperties().items(), c.getValuedProperties().items())
if explicit_defaults
else c.getValuedProperties().items()
)
for p, v in items:
# Note: AthenaCommon.Configurable does not have Configurable.PropertyReference
if hasattr(Configurable, "PropertyReference") and isinstance(
v, Configurable.PropertyReference
):
# this is done in "getFullName", but the exception is ignored,
# so we do it again to get it
v = v.__resolve__()
if isinstance(v, str):
# properly escape quotes in the string (see gaudi/Gaudi#78)
v = '"%s"' % v.replace('"', '\\"')
elif hasattr(v, "__opt_value__"):
v = v.__opt_value__()
old_opts[".".join((n, p))] = str(v)
return old_opts
def getAllOpts(explicit_defaults=False):
"""
Return all options from the old and new configuration system as a dictionary.
If explicit_defaults is true, include default values of unset properties in the dictionary.
"""
import GaudiConfig2
# We need to run normal (without defaults) collection first (regardless of explicit_defaults)
# as the conflicts detection makes sense only for explicitly set options
old_opts = _getAllOpts_old(False)
opts = GaudiConfig2.all_options(False)
conflicts = [n for n in set(opts).intersection(old_opts) if opts[n] != old_opts[n]]
if conflicts:
conflicts.sort()
log.error("Some properties are set in old and new style configuration")
log.warning("name: old -> new")
for n in conflicts:
log.warning("%s: %s -> %s", n, old_opts[n], opts[n])
sys.exit(10)
opts.update(old_opts)
if explicit_defaults:
# If we are asked to print also the defaults, we collect everything
# and blindly merge to make sure we have the full set of configurables
all_opts = _getAllOpts_old(True)
all_opts.update(GaudiConfig2.all_options(True))
# the we override the dictionary with the explicitly set options
# (that leaves the defaults untouched and the set options with the
# correct value)
all_opts.update(opts)
opts = all_opts
return opts
def toOpt(value):
'''
"""
Helper to convert values to old .opts format.
>>> print toOpt('some "text"')
>>> print(toOpt('some "text"'))
"some \\"text\\""
>>> print toOpt('first\\nsecond')
>>> print(toOpt('first\\nsecond'))
"first
second"
>>> print toOpt({'a': [1, 2, '3']})
>>> print(toOpt({'a': [1, 2, '3']}))
{"a": [1, 2, "3"]}
'''
if isinstance(value, basestring):
"""
if isinstance(value, str):
return '"{0}"'.format(value.replace('"', '\\"'))
elif isinstance(value, dict):
return '{{{0}}}'.format(', '.join(
'{0}: {1}'.format(toOpt(k), toOpt(v))
for k, v in value.iteritems()))
elif hasattr(value, '__iter__'):
return '[{0}]'.format(', '.join(map(toOpt, value)))
return "{{{0}}}".format(
", ".join("{0}: {1}".format(toOpt(k), toOpt(v)) for k, v in value.items())
)
elif hasattr(value, "__iter__"):
return "[{0}]".format(", ".join(map(toOpt, value)))
else:
return repr(value)
class gaudimain(object):
# main loop implementation, None stands for the default
mainLoop = None
def parseOpt(s):
"""
Helper to parse option strings to Python values.
Ideally it should just be "eval", but the string parser of Gaudi
is different from the Python one, so we get string options that
cannot be just evaluated.
>>> print(parseOpt('123'))
123
>>> print(parseOpt('"some\\n\\\\"text\\\\""'))
some
"text"
>>> print(parseOpt(''))
<BLANKLINE>
(see gaudi/Gaudi#78)
"""
import re
quoted_string = re.compile(r'^"(.*)"$', re.DOTALL)
# FIXME: this is needed because we cannot use repr for strings
# (see gaudi/Gaudi#78)
if not s: # pass through empty strings
return s
m = quoted_string.match(s)
if m:
return m.group(1).replace('\\"', '"')
return eval(s)
class gaudimain(object):
def __init__(self):
from Configurables import ApplicationMgr
appMgr = ApplicationMgr()
if "GAUDIAPPNAME" in os.environ:
if os.environ.get("GAUDIAPPNAME"):
appMgr.AppName = str(os.environ["GAUDIAPPNAME"])
if "GAUDIAPPVERSION" in os.environ:
if os.environ.get("GAUDIAPPVERSION"):
appMgr.AppVersion = str(os.environ["GAUDIAPPVERSION"])
self.log = logging.getLogger(__name__)
self.printsequence = False
self.application = "Gaudi::Application"
def setupParallelLogging(self):
# ---------------------------------------------------
......@@ -195,17 +339,20 @@ class gaudimain(object):
# ----------------
# from multiprocessing import enableLogging, getLogger
import multiprocessing
# preliminaries for handlers/output files, etc.
from time import ctime
datetime = ctime()
datetime = datetime.replace(' ', '_')
outfile = open('gaudirun-%s.log' % (datetime), 'w')
datetime = datetime.replace(" ", "_")
outfile = open("gaudirun-%s.log" % (datetime), "w")
# two handlers, one for a log file, one for terminal
streamhandler = logging.StreamHandler(stream=outfile)
console = logging.StreamHandler()
# create formatter : the params in parentheses are variable names available via logging
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s")
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
# add formatter to Handler
streamhandler.setFormatter(formatter)
console.setFormatter(formatter)
......@@ -214,7 +361,7 @@ class gaudimain(object):
# self.log = getLogger()
self.log = multiprocessing.log_to_stderr()
self.log.setLevel(logging.INFO)
self.log.name = 'Gaudi/Main.py Logger'
self.log.name = "Gaudi/Main.py Logger"
self.log.handlers = []
# add handlers to logger : one for output to a file, one for console output
self.log.addHandler(streamhandler)
......@@ -225,29 +372,35 @@ class gaudimain(object):
# ---------------------------------------------------
def generatePyOutput(self, all=False):
import re
from collections import defaultdict
from pprint import pformat
conf_dict = Configuration.configurationDict(all)
return pformat(conf_dict)
optDict = defaultdict(dict)
allOpts = getAllOpts(all)
for key in allOpts:
c, p = key.rsplit(".", 1)
optDict[c][p] = parseOpt(allOpts[key])
formatted = pformat(dict(optDict))
# undo splitting of strings on multiple lines
return re.sub(r'"\n +"', "", formatted, flags=re.MULTILINE)
def generateOptsOutput(self, all=False):
from pprint import pformat
conf_dict = Configuration.configurationDict(all)
out = []
names = conf_dict.keys()
names.sort()
for n in names:
props = conf_dict[n].keys()
props.sort()
for p in props:
out.append('%s.%s = %s;' % (n, p, toOpt(conf_dict[n][p])))
return "\n".join(out)
opts = getAllOpts(all)
keys = sorted(opts)
return "\n".join(
"{} = {};".format(key, toOpt(parseOpt(opts[key]))) for key in keys
)
def _writepickle(self, filename):
# --- Lets take the first file input file as the name of the pickle file
import pickle
output = open(filename, 'wb')
output = open(filename, "wb")
# Dump only the the configurables that make sense to dump (not User ones)
from GaudiKernel.Proxy.Configurable import getNeededConfigurables
to_dump = {}
for n in getNeededConfigurables():
to_dump[n] = Configuration.allConfigurables[n]
......@@ -255,28 +408,50 @@ class gaudimain(object):
output.close()
def printconfig(self, old_format=False, all=False):
msg = 'Dumping all configurables and properties'
msg = "Dumping all configurables and properties"
if not all:
msg += ' (different from default)'
msg += " (different from default)"
log.info(msg)
conf_dict = Configuration.configurationDict(all)
if old_format:
print self.generateOptsOutput(all)
print(self.generateOptsOutput(all))
else:
print self.generatePyOutput(all)
print(self.generatePyOutput(all))
sys.stdout.flush()
def writeconfig(self, filename, all=False):
write = {".pkl": lambda filename, all: self._writepickle(filename),
".py": lambda filename, all: open(filename, "w").write(self.generatePyOutput(all) + "\n"),
".opts": lambda filename, all: open(filename, "w").write(self.generateOptsOutput(all) + "\n"),
}
import json
write = {
".pkl": lambda filename, all: self._writepickle(filename),
".py": lambda filename, all: open(filename, "w").write(
self.generatePyOutput(all) + "\n"
),
".opts": lambda filename, all: open(filename, "w").write(
self.generateOptsOutput(all) + "\n"
),
".json": lambda filename, all: json.dump(
getAllOpts(all), open(filename, "w"), indent=2, sort_keys=True
),
}
try:
import yaml
write[".yaml"] = lambda filename, all: yaml.safe_dump(
getAllOpts(all), open(filename, "w")
)
write[".yml"] = write[".yaml"]
except ImportError:
pass # yaml support is optional
from os.path import splitext
ext = splitext(filename)[1]
if ext in write:
write[ext](filename, all)
else:
log.error("Unknown file type '%s'. Must be any of %r.", ext,
write.keys())
log.error(
"Unknown file type '%s'. Must be any of %r.", ext, sorted(write.keys())
)
sys.exit(1)
# Instantiate and run the application.
......@@ -290,15 +465,17 @@ class gaudimain(object):
result = self.runParallel(ncpus)
return result
def hookDebugger(self, debugger='gdb'):
def hookDebugger(self, debugger="gdb"):
import os
self.log.info('attaching debugger to PID ' + str(os.getpid()))
pid = os.spawnvp(os.P_NOWAIT, debugger,
[debugger, '-q', 'python',
str(os.getpid())])
self.log.info("attaching debugger to PID " + str(os.getpid()))
pid = os.spawnvp(
os.P_NOWAIT, debugger, [debugger, "-q", "python", str(os.getpid())]
)
# give debugger some time to attach to the python process
import time
time.sleep(5)
# verify the process' existence (will raise OSError if failed)
......@@ -306,10 +483,7 @@ class gaudimain(object):
os.kill(pid, 0)
return
def basicInit(self):
'''
Bootstrap the application with minimal use of Python bindings.
'''
def runSerial(self, attach_debugger):
try:
from GaudiKernel.Proxy.Configurable import expandvars
except ImportError:
......@@ -317,194 +491,73 @@ class gaudimain(object):
def expandvars(data):
return data
from GaudiKernel.Proxy.Configurable import Configurable, getNeededConfigurables
global _bootstrap
if _bootstrap is None:
_bootstrap = BootstrapHelper()
self.log.debug('basicInit: instantiate ApplicationMgr')
self.ip = self.g = _bootstrap.createApplicationMgr()
self.log.debug('basicInit: apply options')
# set ApplicationMgr properties
comp = 'ApplicationMgr'
props = Configurable.allConfigurables.get(comp, {})
if props:
props = expandvars(props.getValuedProperties())
for p, v in props.items() + [('JobOptionsType', 'NONE')]:
if not self.g.setProperty(p, str(v)):
self.log.error('Cannot set property %s.%s to %s', comp, p, v)
sys.exit(10)
# issue with missing dictionary with ROOT < 6.2.7
if _bootstrap.ROOT_VERSION < (6, 2, 7):
# we need to load GaudiPython
import GaudiPython
self.g.configure()
# set MessageSvc properties
comp = 'MessageSvc'
msp = self.g.getService(comp)
if not msp:
self.log.error('Cannot get service %s', comp)
sys.exit(10)
props = Configurable.allConfigurables.get(comp, {})
if props:
props = expandvars(props.getValuedProperties())
for p, v in props.items():
if not _bootstrap.setProperty(msp, p, str(v)):
self.log.error('Cannot set property %s.%s to %s', comp, p, v)
sys.exit(10)
# feed JobOptionsSvc
comp = 'JobOptionsSvc'
jos = self.g.getService(comp)
if not jos:
self.log.error('Cannot get service %s', comp)
sys.exit(10)
for n in getNeededConfigurables():
c = Configurable.allConfigurables[n]
if n in ['ApplicationMgr', 'MessageSvc']:
continue # These are already done
for p, v in c.getValuedProperties().items():
v = expandvars(v)
# Note: AthenaCommon.Configurable does not have Configurable.PropertyReference
if hasattr(Configurable, "PropertyReference") and type(
v) == Configurable.PropertyReference:
# this is done in "getFullName", but the exception is ignored,
# so we do it again to get it
v = v.__resolve__()
if type(v) == str:
v = '"%s"' % v # need double quotes
elif type(v) == long:
v = '%d' % v # prevent pending 'L'
_bootstrap.addPropertyToCatalogue(jos, n, p, str(v))
from GaudiKernel.Proxy.Configurable import Configurable
self.log.debug("runSerial: apply options")
conf_dict = expandvars(getAllOpts())
conf_dict["ApplicationMgr.JobOptionsType"] = '"NONE"'
if self.printsequence:
conf_dict["ApplicationMgr.PrintAlgsSequence"] = "true"
if hasattr(Configurable, "_configurationLocked"):
Configurable._configurationLocked = True
self.log.debug('basicInit: done')
def gaudiPythonInit(self):
'''
Initialize the application with full Python bindings.
'''
self.log.debug('gaudiPythonInit: import GaudiPython')
import GaudiPython
self.log.debug('gaudiPythonInit: instantiate ApplicationMgr')
self.g = GaudiPython.AppMgr()
self.ip = self.g._ip
self.log.debug('gaudiPythonInit: done')
def runSerial(self, attach_debugger):
# --- Instantiate the ApplicationMgr------------------------------
if (self.mainLoop or os.environ.get('GAUDIRUN_USE_GAUDIPYTHON')):
self.gaudiPythonInit()
else:
self.basicInit()
if attach_debugger:
self.hookDebugger()
self.log.debug('-' * 80)
self.log.debug('%s: running in serial mode', __name__)
self.log.debug('-' * 80)
self.log.debug("-" * 80)
self.log.debug("%s: running in serial mode", __name__)
self.log.debug("-" * 80)
sysStart = time()
if self.mainLoop:
runner = self.mainLoop
else:
import Gaudi
def runner(app, nevt):
self.log.debug('initialize')
sc = app.initialize()
if sc.isSuccess():
if self.printsequence:
app.printAlgsSequences()
self.log.debug('start')
sc = app.start()
if sc.isSuccess():
self.log.debug('run(%d)', nevt)
sc = app.run(nevt)
self.log.debug('stop')
app.stop().ignore()
self.log.debug('finalize')
app.finalize().ignore()
self.log.debug('terminate')
sc1 = app.terminate()
if sc.isSuccess():
sc = sc1
else:
sc1.ignore()
self.log.debug('status code: %s',
'SUCCESS' if sc.isSuccess() else 'FAILURE')
return sc
if (attach_debugger == True):
self.hookDebugger()
app = Gaudi.Application.create(self.application, conf_dict)
retcode = app.run()
try:
statuscode = runner(self.g,
int(self.ip.getProperty('EvtMax').toString()))
except SystemError:
# It may not be 100% correct, but usually it means a segfault in C++
self.ip.setProperty('ReturnCode', str(128 + 11))
statuscode = False
except Exception, x:
print 'Exception:', x
# for other exceptions, just set a generic error code
self.ip.setProperty('ReturnCode', '1')
statuscode = False
if hasattr(statuscode, "isSuccess"):
success = statuscode.isSuccess()
else:
success = statuscode
#success = self.g.exit().isSuccess() and success
if not success and self.ip.getProperty('ReturnCode').toString() == '0':
# ensure that the return code is correctly set
self.ip.setProperty('ReturnCode', '1')
sysTime = time() - sysStart
self.log.debug('-' * 80)
self.log.debug('%s: serial system finished, time taken: %5.4fs',
__name__, sysTime)
self.log.debug('-' * 80)
return int(self.ip.getProperty('ReturnCode').toString())
self.log.debug("-" * 80)
self.log.debug(
"%s: serial system finished, time taken: %5.4fs", __name__, sysTime
)
self.log.debug("-" * 80)
return retcode
def runParallel(self, ncpus):
if self.mainLoop:
self.log.fatal(
"Cannot use custom main loop in multi-process mode, check your options"
)
return 1
self.setupParallelLogging()
from Gaudi.Configuration import Configurable
import GaudiMP.GMPBase as gpp
from Gaudi.Configuration import Configurable
c = Configurable.allConfigurables
self.log.info('-' * 80)
self.log.info('%s: Parallel Mode : %i ', __name__, ncpus)
self.log.info("-" * 80)
self.log.info("%s: Parallel Mode : %i ", __name__, ncpus)
for name, value in [
('platrofm', ' '.join(os.uname())),
('config', os.environ.get('BINARY_TAG')
or os.environ.get('CMTCONFIG')),
('app. name', os.environ.get('GAUDIAPPNAME')),
('app. version', os.environ.get('GAUDIAPPVERSION')),
("platform", " ".join(os.uname())),
("config", os.environ.get("BINARY_TAG") or os.environ.get("CMTCONFIG")),
("app. name", os.environ.get("GAUDIAPPNAME")),
("app. version", os.environ.get("GAUDIAPPVERSION")),
]:
self.log.info('%s: %30s : %s ', __name__, name, value
or 'Undefined')
self.log.info("%s: %30s : %s ", __name__, name, value or "Undefined")
try:
events = str(c['ApplicationMgr'].EvtMax)
except:
events = str(c["ApplicationMgr"].EvtMax)
except Exception:
events = "Undetermined"
self.log.info('%s: Events Specified : %s ', __name__, events)
self.log.info('-' * 80)
self.log.info("%s: Events Specified : %s ", __name__, events)
self.log.info("-" * 80)
# Parall = gpp.Coordinator(ncpus, shared, c, self.log)
Parall = gpp.Coord(ncpus, c, self.log)
sysStart = time()
sc = Parall.Go()
self.log.info('MAIN.PY : received %s from Coordinator' % (sc))
self.log.info("MAIN.PY : received %s from Coordinator" % (sc))
if sc.isFailure():
return 1
sysTime = time() - sysStart
self.log.name = 'Gaudi/Main.py Logger'
self.log.info('-' * 80)
self.log.info('%s: parallel system finished, time taken: %5.4fs',
__name__, sysTime)
self.log.info('-' * 80)
self.log.name = "Gaudi/Main.py Logger"
self.log.info("-" * 80)
self.log.info(
"%s: parallel system finished, time taken: %5.4fs", __name__, sysTime
)
self.log.info("-" * 80)
return 0
#####################################################################################
# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations #
# #
# This software is distributed under the terms of the Apache version 2 licence, #
# copied verbatim in the file "LICENSE". #
# #
# In applying this licence, CERN does not waive the privileges and immunities #
# granted to it by virtue of its status as an Intergovernmental Organization #
# or submit itself to any jurisdiction. #
#####################################################################################
import ctypes
import os
import sys
__configurables_module_fullname__ = __name__ + '.Configurables'
__configurables_module_fullname__ = __name__ + ".Configurables"
__ignore_missing_configurables__ = False
# Small class that allows to access all the configurables as attributes of the
......@@ -19,16 +30,27 @@ class _ConfigurablesModule(object):
# If set to true, does not raise an AttributeError if the configurable is not found.
self.ignoreMissingConfigurables = False
self.__name__ = __configurables_module_fullname__
self.__loader__ = None
def __getattr__(self, name):
# trigger the load of the configurables database
from Gaudi.Configuration import confDbGetConfigurable, cfgDb
from Gaudi.CommonGaudiConfigurables import aliases
from Gaudi.Configuration import cfgDb, confDbGetConfigurable
# return value
retval = None
# handle the special cases (needed for modules): __all__, __path__
if name == "__all__":
retval = cfgDb.keys()
elif name == "__spec__":
import importlib
retval = importlib.machinery.ModuleSpec(
name=__configurables_module_fullname__,
loader=self.__loader__,
)
elif name == "__package__":
retval = self.__name__
elif name == "__path__":
raise AttributeError("'module' object has no attribute '__path__'")
elif name in cfgDb.keys(): # ignore private names
......@@ -37,16 +59,76 @@ class _ConfigurablesModule(object):
retval = aliases[name]
elif self.ignoreMissingConfigurables:
import logging
logging.getLogger(__configurables_module_fullname__).warning(
'Configurable class %s not in database', name)
"Configurable class %s not in database", name
)
else:
# We raise an AttributeError exception if the configurable could not be found
# to respect the Python semantic.
raise AttributeError("module '%s' does not have attribute '%s'" %
(__configurables_module_fullname__, name))
raise AttributeError(
"module '%s' does not have attribute '%s'"
% (__configurables_module_fullname__, name)
)
return retval
# install the facade module instance as a module
Configurables = _ConfigurablesModule()
sys.modules[__configurables_module_fullname__] = Configurables
_GaudiKernelLib = None
class c_opt_t(ctypes.Structure):
_fields_ = [("key", ctypes.c_char_p), ("value", ctypes.c_char_p)]
class Application(object):
def __init__(self, opts, appType="Gaudi::Application"):
global _GaudiKernelLib
if _GaudiKernelLib is None:
# Note: using CDLL instead of PyDLL means that every call to the Python C
# API must be protected acquiring the GIL
#
if sys.platform == "darwin":
# LD_LIBRARY_PATH cannot be used for dlopen on macos;
# use custom variable GAUDI_PLUGIN_PATH instead
_libpaths = os.environ.get("GAUDI_PLUGIN_PATH")
if not _libpaths:
print("WARNING: GAUDI_PLUGIN_PATH is empty!")
for _path in _libpaths.split(":"):
_lib = os.path.join(_path, "libGaudiKernel.dylib")
if os.path.isfile(_lib):
gkl = _GaudiKernelLib = ctypes.CDLL(
_lib,
mode=ctypes.RTLD_GLOBAL,
)
else:
gkl = _GaudiKernelLib = ctypes.CDLL(
"libGaudiKernel.so",
mode=ctypes.RTLD_GLOBAL,
)
gkl._py_Gaudi__Application__create.restype = ctypes.c_void_p
gkl._py_Gaudi__Application__run.argtypes = [ctypes.c_void_p]
gkl._py_Gaudi__Application__run.restype = ctypes.c_int
gkl._py_Gaudi__Application__delete.argtypes = [ctypes.c_void_p]
c_opts = (c_opt_t * len(opts))()
for idx, item in enumerate(opts.items()):
c_opts[idx].key = item[0].encode("ascii")
c_opts[idx].value = item[1].encode("ascii")
self._impl = _GaudiKernelLib._py_Gaudi__Application__create(
appType.encode("ascii"), c_opts, ctypes.c_ulong(len(c_opts))
)
@classmethod
def create(cls, appType, opts):
return cls(opts, appType=appType)
def run(self):
return _GaudiKernelLib._py_Gaudi__Application__run(self._impl)
def __del__(self):
_GaudiKernelLib._py_Gaudi__Application__delete(self._impl)