Commit c2b478d4 authored by Marco Clemencic's avatar Marco Clemencic
Browse files

Merge branch 'dev/cmake' into GAUDI_cmake

* dev/cmake: (345 commits)
  fixed some "pedantic" warnings
  made CMake compile flags closer to the CMT ones
  fixed 'configure' to take into account that distcc and ccache do not work together
  fixed a problem in EnvConfig prepend
  fixed problem with the changed C++ flags
  modified build flags to be closer to the CMT ones
  avoid that Boost libraries are picked up from the system
  added a simple (preliminary) configure script
  fixed an issue in setting the test-specific runtime environment
  fixed a bug in 'gaudi_resolve_link_libraries'
  fixed a configuration problem when tests are disabled
  print only the name to the env XML file (instead of full path)
  modified the subdirectory dependency declaration to work across projects
  export also module targets to ensure that we do not have conflicts
  added consistency check on the toolchain version of used projects
  commented out debug output
  implemented dependencies on other projects (with recursion)
  propagate custom (external) and project env to user projects
  modified env.py to use cmd line settings to override XML
  prototype infrastructure to chain projects with subdir override
  ...

From: Marco Clemencic <marco.clemencic@cern.ch>


git-svn-id: svn+ssh://svn.cern.ch/reps/gaudi/Gaudi/branches/GAUDI/GAUDI_cmake@6880 53ecefc3-a64d-0410-9bdf-b8581fa3287e
parents db7ee51d 749e8e4e
*~
*.pyc
build.*.log
Makefile
NMake
install.*.history
setup.*
cleanup.*
version.cmt
genConf/
QMTest/
InstallArea/
patches/
test_results/
*-slc5-*/
i686-winxp-vc9-dbg/
.*-slc5-*.d/
.i686-winxp-vc9-dbg.d/
DoxyWarnings.log
.gdb_history
*.new
*.launch
*.launch.py
*.launch.opts
.project
.cproject
.settings
.pydevproject
.build/
CMakeFiles/
CTestTestfile.cmake
CPackSourceConfig.cmake
CPackConfig.cmake
cmake_install.cmake
GaudiConfig.cmake
GaudiConfigVersion.cmake
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.6)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.5)
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
#---------------------------------------------------------------
# Load macros and functions for Gaudi-based projects
......@@ -6,11 +8,4 @@ find_package(GaudiProject)
#---------------------------------------------------------------
# Declare project name and version
GAUDI_PROJECT(Gaudi v22r1)
#---Tests environment-------------------------------------------
if( BUILD_TESTS )
GAUDI_USE_PACKAGE(QMtest)
GAUDI_USE_PACKAGE(pytools)
GAUDI_USE_PACKAGE(RELAX)
endif()
gaudi_project(Gaudi v23r1)
......@@ -2,35 +2,20 @@
# CMakeLists.txt file for building Gaudi
# @author Pere Mato, CERN (semi-automaticaly generated)
############################################################################
GAUDI_USE_PACKAGE(GaudiKernel)
depends_on_subdirs(GaudiKernel)
#---Executables-------------------------------------------------------------
GAUDI_EXECUTABLE(Gaudi main.cpp LIBRARIES GaudiKernel)
gaudi_add_executable(Gaudi main.cpp LINK_LIBRARIES GaudiKernel)
#---Installation------------------------------------------------------------
GAUDI_INSTALL_PYTHON_MODULES()
GAUDI_INSTALL_SCRIPTS()
gaudi_install_python_modules()
gaudi_install_scripts()
INSTALL(CODE "EXECUTE_PROCESS(COMMAND ${python_cmd} -m compileall ${CMAKE_INSTALL_PREFIX}/python)")
INSTALL(CODE "EXECUTE_PROCESS(COMMAND ${python_cmd} -m compileall ${CMAKE_INSTALL_PREFIX}/scripts)")
#---Tests-------------------------------------------------------------------
set( QMtests
bug_34769 bug_37479 bug_39846 cmdline_conf import_opts
bug_35201 bug_37488 bug_42428 conf_to_str import_py_err
bug_35347 bug_38194 bug_45517 conf_user_autoapply import_py propagate_properties
bug_38206 bug_61144 conf_user_passive_dep override1 purge
bug_39809 case_sensitivity export_oldopts override2 reference)
foreach( test ${QMtests})
GAUDI_QMTEST_TEST(gaudi.${test} ENVIRONMENT
JOBOPTSEARCHPATH=${CMAKE_CURRENT_SOURCE_DIR}/tests/pyjobopts
PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/tests/python )
endforeach()
#---Combined Tests-----------------------------------------------------------
GAUDI_QMTEST_TEST( gaudi.pickle TESTS gaudi.pickle_write gaudi.pickle_read ENVIRONMENT
JOBOPTSEARCHPATH=${CMAKE_CURRENT_SOURCE_DIR}/tests/pyjobopts
PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/tests/python )
GAUDI_QMTEST_TEST( gaudi.bug_36742 TESTS gaudi.bug_36742 gaudi.bug_36742b ENVIRONMENT
JOBOPTSEARCHPATH=${CMAKE_CURRENT_SOURCE_DIR}/tests/pyjobopts
PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/tests/python )
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)
package Gaudi
version v22r2
version v23r2
branches doc cmt
use GaudiSys *
......
Package : Gaudi
Package manager : Marco Clemencic
================================ Gaudi v23r2 =================================
! 2012-03-15 - Marco Clemencic
- Fixed bug #92122: option '--printsequence' of gaudirun.py no longer works
Moved the call to the printsequence function from gaudirun.py to
gaudimain.run(), thus also fixing the possible configuration corruption due
to the use of the option.
================================ Gaudi v23r1 =================================
! 2012-02-22 - Marco Clemencic
- Modified gaudirun.py to be able to preload arbitrary libraries (option
--preload) and not just tcmalloc.
================================ Gaudi v23r0 =================================
! 2012-01-20 - Marco Clemencic
- Minor change to the test custom_main_loop_parallel to work on single core
machines, like CERNVM.
! 2011-12-09 - Marco Clemencic
- Added RootCnvSvc and RootEvtSelector to the list of aliased services
(enforcing the default name to preserve compatibility with LHCb).
! 2011-12-08 - Marco Clemencic
- Added support for class aliases in the meta-module "Configurables".
- Added a ConfigurableUser to setup the persistency via RootCnv:
from Configurables import GaudiPersistency
GaudiPersistency()
! 2011-11-01 - Marco Clemencic
- Moved core services out of GaudiSvc and into the new packages GaudiCoreSvc
and GaudiCommonSvc. (patch #1816)
Added GaudiCoreSvc and GaudiCommonSvc to the list of known modules in
Gaudi.Configuration.
- Added minimalistic tests to verify that all the required services are
available.
- Minor fix to the test gaudi.bug_39809: it was implicitly requiring the build
of GaudiAlg to work.
================================ Gaudi v22r5 =================================
! 2011-10-27 - Marco Clemencic
- Fixed bug #86980: gaudirun.py should prevent the import of GaudiPython
Install a fake GaudiPython module that prevents the use of any attribute, and
uninstall it just before calling the run function.
! 2011-10-26 - Marco Clemencic
- Introduced a hook to override the default gaudirun main loop:
Gaudi.Configuration.setCustomMainLoop
- Added tests for the custom main loop
================================ Gaudi v22r4 =================================
================================ Gaudi v22r3 =================================
================================ Gaudi v22r2 =================================
================================ Gaudi v22r1 =================================
================================ Gaudi v22r0 =================================
......
# File: Gaudi/CommonGaudiConfigurables.py
# Author: Pere Mato (per.mato@cern.ch)
# Author: Pere Mato (pere.mato@cern.ch)
"""
This module would scan all known Gaudi configurable modules for
......@@ -11,8 +11,9 @@ from GaudiKernel.Configurable import Configurable
from GaudiKernel.ConfigurableMeta import ConfigurableMeta
__all__ = []
packages = ['GaudiSvc', 'GaudiAlg', 'GaudiAud', 'GaudiPoolDb', 'RootHistCnv',
'GaudiUtils' ]
packages = ['GaudiCoreSvc', 'GaudiCommonSvc', 'GaudiSvc', 'GaudiAlg',
'GaudiAud', 'GaudiPoolDb', 'RootHistCnv', 'GaudiUtils',
'RootCnv']
#--Loop open all listed packages and populate __all__ with the names and
# the local scope with the Configurable classes
......@@ -29,21 +30,35 @@ for package in packages :
pass
#--Fix some of the name idiosyncrasies in Gaudi
def addConfigurableAs(ori, new) :
gbl = globals()
if ori in gbl: # do the aliasing only if the original is available
gbl[new] = gbl[ori]
__all__.append(new)
gbl[new].DefaultedName = new
addConfigurableAs('EvtDataSvc','EventDataSvc')
addConfigurableAs('DetDataSvc','DetectorDataSvc')
addConfigurableAs('HistogramSvc','HistogramDataSvc')
addConfigurableAs('HbookCnv__PersSvc','HbookHistSvc')
addConfigurableAs('RootHistCnv__PersSvc','RootHistSvc')
addConfigurableAs('EvtPersistencySvc','EventPersistencySvc')
addConfigurableAs('DetPersistencySvc','DetectorPersistencySvc')
addConfigurableAs('HistogramPersistencySvc','HistogramPersistencySvc')
addConfigurableAs('Gaudi__MultiFileCatalog','FileCatalog')
addConfigurableAs('Gaudi__IODataManager','IODataManager')
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',
}
_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
# change the default name
for new in aliases:
aliases[new].DefaultedName = new
# update globals and __all__
_gbl.update(aliases)
__all__.extend(aliases)
# remove temporaries
del _gbl, new
# File: Gaudi/python/Gaudi/Configuration.py
# Author: Pere Mato (per.mato@cern.ch)
# Author: Pere Mato (pere.mato@cern.ch)
from GaudiKernel.Constants import *
from GaudiKernel.Configurable import *
......@@ -55,7 +55,7 @@ def configurationDict(all=False):
"""Return a dictionary representing the configuration.
The dictionary contains one entry per configurable which is a dictionary
with one entry per property.
The optional argument "all" is used to decide if to inluce only values
The optional argument "all" is used to decide if to include only values
different from the default or all of them.
"""
from GaudiKernel.Proxy.Configurable import getNeededConfigurables
......@@ -104,3 +104,43 @@ def getConfigurable(name, defaultType = None):
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() ]
......@@ -6,6 +6,9 @@ import logging
log = logging.getLogger(__name__)
class gaudimain(object) :
# main loop implementation, None stands for the default
mainLoop = None
def __init__(self) :
from Configurables import ApplicationMgr
appMgr = ApplicationMgr()
......@@ -14,6 +17,7 @@ class gaudimain(object) :
if "GAUDIAPPVERSION" in os.environ:
appMgr.AppVersion = str(os.environ["GAUDIAPPVERSION"])
self.log = logging.getLogger(__name__)
self.printsequence = False
def setupParallelLogging( self ) :
# ---------------------------------------------------
......@@ -103,7 +107,11 @@ class gaudimain(object) :
log.error("Unknown file type '%s'. Must be any of %r.", ext, write.keys())
sys.exit(1)
def printsequence(self):
def _printsequence(self):
if not self.printsequence:
# No printing requested
return
def printAlgo( algName, appMgr, prefix = ' ') :
print prefix + algName
alg = appMgr.algorithm( algName.split( "/" )[ -1 ] )
......@@ -114,8 +122,7 @@ class gaudimain(object) :
elif prop.has_key( "DetectorList" ) :
subs = prop[ "DetectorList" ].value()
for i in subs : printAlgo( algName.split( "/" )[ -1 ] + i.strip( '"' ) + "Seq", appMgr, prefix + " ")
import GaudiPython
self.g = GaudiPython.AppMgr()
mp = self.g.properties()
print "\n ****************************** Algorithm Sequence **************************** \n"
for i in mp["TopAlg"].value(): printAlgo( i, self.g )
......@@ -141,7 +148,13 @@ class gaudimain(object) :
self.log.debug('-'*80)
sysStart = time()
self.g = GaudiPython.AppMgr()
success = self.g.run(self.g.EvtMax).isSuccess()
self._printsequence()
runner = self.mainLoop or (lambda app, nevt: app.run(nevt))
statuscode = runner(self.g, self.g.EvtMax)
if hasattr(statuscode, "isSuccess"):
success = statuscode.isSuccess()
else:
success = statuscode
success = self.g.exit().isSuccess() and success
if not success and self.g.ReturnCode == 0:
# ensure that the return code is correctly set
......@@ -153,6 +166,9 @@ class gaudimain(object) :
return self.g.ReturnCode
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
......
......@@ -19,6 +19,7 @@ class _ConfigurablesModule(object):
def __getattr__(self, name):
# trigger the load of the configurables database
from Gaudi.Configuration import confDbGetConfigurable, cfgDb
from Gaudi.CommonGaudiConfigurables import aliases
# return value
retval = None
# handle the special cases (needed for modules): __all__, __path__
......@@ -28,6 +29,8 @@ class _ConfigurablesModule(object):
retval == None
elif name in cfgDb.keys(): # ignore private names
retval = confDbGetConfigurable(name)
elif name in aliases: # special case of aliases
retval = aliases[name]
elif self.ignoreMissingConfigurables:
import logging
logging.getLogger(__configurables_module_fullname__).warning('Configurable class %s not in database', name)
......
......@@ -58,13 +58,17 @@ if __name__ == "__main__":
parser.add_option("--printsequence", action="store_true",
help="print the sequence")
if not sys.platform.startswith("win"):
# This option can be used only on unix platforms
# These options can be used only on unix platforms
parser.add_option("-T", "--tcmalloc", action="store_true",
help="Use the Google malloc replacement. The environment "
"variable TCMALLOCLIB can be used to specify a different "
"name for the library (the default is libtcmalloc.so)")
parser.add_option("--preload", action="append",
help="Allow pre-loading of special libraries (e.g. Google "
"profiling libraries).")
parser.set_defaults(options = [],
tcmalloc = False,
preload = [],
ncpus = None)
opts, args = parser.parse_args()
......@@ -105,20 +109,29 @@ if __name__ == "__main__":
# tcmalloc support
if opts.tcmalloc:
libname = os.environ.get("TCMALLOCLIB", "libtcmalloc.so")
opts.preload.insert(0, os.environ.get("TCMALLOCLIB", "libtcmalloc.so"))
# allow preloading of libraries
if opts.preload:
preload = os.environ.get("LD_PRELOAD", "")
if libname not in preload:
if preload:
preload += " "
preload += libname
if preload:
preload = preload.replace(" ", ":").split(":")
else:
preload = []
for libname in set(preload).intersection(opts.preload):
logging.warning("Ignoring preload of library %s because it is "
"already in LD_PRELOAD.", libname)
to_load = [libname
for libname in opts.preload
if libname not in set(preload)]
if to_load:
preload += to_load
preload = ":".join(preload)
os.environ["LD_PRELOAD"] = preload
logging.info("Restarting with LD_PRELOAD='%s'", preload)
# remove the --tcmalloc option from the arguments
# FIXME: the --preload arguments will issue a warning but it's tricky to remove them
args = [ a for a in sys.argv if a != '-T' and not '--tcmalloc'.startswith(a) ]
os.execv(sys.executable, [sys.executable] + args)
else:
logging.warning("Option --tcmalloc ignored because the library %s is "
" already in LD_PRELOAD.", libname)
if opts.pickle_output:
if opts.output:
......@@ -142,6 +155,14 @@ if __name__ == "__main__":
for pos, l in optlines:
options.insert(pos,l)
# prevent the usage of GaudiPython
class FakeModule(object):
def __init__(self, exception):
self.exception = exception
def __getattr__(self, *args, **kwargs):
raise self.exception
sys.modules["GaudiPython"] = FakeModule(RuntimeError("GaudiPython cannot be used in option files"))
# "execute" the configuration script generated (if any)
if options:
g = {}
......@@ -174,8 +195,16 @@ if __name__ == "__main__":
c.printconfig(opts.old_opts, opts.all_opts)
if opts.output:
c.writeconfig(opts.output, opts.all_opts)
c.printsequence = opts.printsequence
if opts.printsequence:
c.printsequence()
if opts.ncpus:
logging.warning("--printsequence not supported with --ncpus: ignored")
elif opts.dry_run:
logging.warning("--printsequence not supported with --dry-run: ignored")
# re-enable the GaudiPython module
del sys.modules["GaudiPython"]
if not opts.dry_run:
# Do the real processing
......
......@@ -5,7 +5,7 @@
<argument name="args"><set><text>-v</text><text>-n</text></set></argument>
<argument name="options"><text>
from Gaudi.Configuration import *
from Configurables import MyTool
from Configurables import DataStreamTool as MyTool
pub = MyTool("Public")
pub.addTool(MyTool,"Private")
......
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE extension PUBLIC '-//QM/2.3/Extension//EN' 'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'>
<extension class="GaudiTest.GaudiExeTest" kind="test">
<argument name="program"><text>gaudirun.py</text></argument>
<argument name="args"><set>
<text>-v</text>
</set></argument>
<argument name="options"><text>
# Options of the test job
from Gaudi.Configuration import *
def myMainLoop(app, nevt):
print "=== Custom Main Loop ==="
from GaudiPython import gbl
return gbl.StatusCode(gbl.StatusCode.SUCCESS)
setCustomMainLoop(myMainLoop)
</text></argument>
<argument name="validator"><text>
findReferenceBlock("=== Custom Main Loop ===")
</text></argument>
<argument name="use_temp_dir"><enumeral>true</enumeral></argument>
</extension>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE extension PUBLIC '-//QM/2.3/Extension//EN' 'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'>
<extension class="GaudiTest.GaudiExeTest" kind="test">
<argument name="program"><text>gaudirun.py</text></argument>
<argument name="args"><set>
<text>-v</text>
<text>--ncpus</text>
<text>1</text>
</set></argument>
<argument name="options"><text>
# Options of the test job
from Gaudi.Configuration import *
def myMainLoop(app, nevt):
print "=== Custom Main Loop ==="
from GaudiPython import gbl
return True
setCustomMainLoop(myMainLoop)
</text></argument>
<argument name="exit_code"><integer>1</integer></argument>
<argument name="use_temp_dir"><enumeral>true</enumeral></argument>
</extension>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE extension PUBLIC '-//QM/2.3/Extension//EN' 'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'>
<extension class="GaudiTest.GaudiExeTest" kind="test">
<argument name="program"><text>Gaudi.exe</text></argument>
<argument name="args"><set><text>../options/empty.opts</text></set></argument>
<argument name="validator"><text>
countErrorLines()
</text></argument>
<argument name="use_temp_dir"><enumeral>true</enumeral></argument>
</extension>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE extension PUBLIC '-//QM/2.3/Extension//EN' 'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'>
<extension class="GaudiTest.GaudiExeTest" kind="test">
<argument name="program"><text>gaudirun.py</text></argument>
<argument name="validator"><text>
countErrorLines()
</text></argument>
<argument name="use_temp_dir"><enumeral>true</enumeral></argument>
</extension>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE extension PUBLIC '-//QM/2.3/Extension//EN' 'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'>
<extension class="GaudiTest.GaudiExeTest" kind="test">
<argument name="program"><text>gaudirun.py</text></argument>
<argument name="args"><set>
<text>-v</text>
</set></argument>
<argument name="options"><text>
# Options of the test job
from Gaudi.Configuration import *
from GaudiPython import AppMgr
AppMgr().run()
</text></argument>
<argument name="validator"><text>
expected = "GaudiPython cannot be used in option files"
if not expected in stderr:
causes.append("stderr")
result["GaudiTest.stderr.expected"] = result.Quote(expected)
</text></argument>
<argument name="exit_code"><integer>1</integer></argument>
<argument name="use_temp_dir"><enumeral>true</enumeral></argument>
</extension>
......@@ -2,15 +2,17 @@
# CMakeLists.txt file for building GaudiAlg
# @author Pere Mato, CERN (semi-automaticaly generated)
############################################################################
GAUDI_USE_PACKAGE(GaudiKernel)
GAUDI_USE_PACKAGE(GaudiUtils)
GAUDI_USE_PACKAGE(ROOT)
GAUDI_USE_PACKAGE(AIDA)
GAUDI_USE_PACKAGE(Boost)
depends_on_subdirs(GaudiUtils GaudiKernel)
#---Libraries---------------------------------------------------------------
GAUDI_LINKER_LIBRARY(GaudiAlgLib lib/*.cpp LIBRARIES GaudiUtilsLib)
GAUDI_COMPONENT_LIBRARY(GaudiAlg components/*.cpp LIBRARIES GaudiAlgLib GaudiKernel ${ROOT_LIBRARIES} ${ROOT_RIO_LIBRARY})
find_package(AIDA)
find_package(Boost COMPONENTS regex)
find_package(ROOT COMPONENTS RIO)
#---Installation------------------------------------------------------------
GAUDI_INSTALL_HEADERS(GaudiAlg)
#---Libraries---------------------------------------------------------------
gaudi_add_library(GaudiAlgLib lib/*.cpp
LINK_LIBRARIES GaudiUtilsLib Boost
INCLUDE_DIRS Boost AIDA
PUBLIC_HEADERS GaudiAlg)
gaudi_add_module(GaudiAlg components/*.cpp
LINK_LIBRARIES GaudiAlgLib GaudiKernel ROOT
INCLUDE_DIRS Boost AIDA)