ROOT: use native CMakePackage functions in packages.py (#19642)

* root: update to built-in CMakePackage functions

* root: Disable options from missing variants

* Remove modification of CMAKE_PROGRAM_PATH
This commit is contained in:
Seth R. Johnson 2020-11-02 11:21:44 -05:00 committed by GitHub
parent f621e97f47
commit 62eab8923e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -275,179 +275,173 @@ class Root(CMakePackage):
conflicts('cxxstd=11', when='+root7', msg='root7 requires at least C++14') conflicts('cxxstd=11', when='+root7', msg='root7 requires at least C++14')
# Feature removed in 6.18: # Feature removed in 6.18:
[(conflicts('+{0}'.format(pkg), when='@6.18.00:', for pkg in ('memstat', 'qt4', 'table'):
msg='Obsolete option +{0} selected.'.format(pkg))) for pkg in conflicts('+' + pkg, when='@6.18.00:',
('memstat', 'qt4', 'table')] msg='Obsolete option +{0} selected.'.format(pkg))
def cmake_args(self): def cmake_args(self):
spec = self.spec spec = self.spec
define = self.define
define_from_variant = self.define_from_variant
options = []
# ###################### Boolean Options ###################### # ###################### Boolean Options ######################
# For option list format see _process_opts(), below. # For option list format see _process_opts(), below.
# Options controlling gross build / config behavior. # Options controlling gross build / config behavior.
control_opts\ options += [
= [ define('cxxmodules', False),
['cxxmodules', False], define('exceptions', True),
['exceptions', True], define('explicitlink', True),
['explicitlink', True], define('fail-on-missing', True),
['fail-on-missing', True], define_from_variant('fortran'),
['fortran'], define_from_variant('gminimal'),
['gminimal'], define('gnuinstall', False),
['gnuinstall', False], define('libcxx', False),
['libcxx', False], define('pch', True),
['pch', True], define('roottest', False),
['roottest', False], define_from_variant('rpath'),
['rpath'], define('runtime_cxxmodules', False),
['runtime_cxxmodules', False], define('shared', True),
['shared', True], define('soversion', True),
['soversion', True], define('testing', self.run_tests),
['testing', self.run_tests], define_from_variant('thread', 'threads')
['thread', 'threads'] ]
]
# Options related to ROOT's ability to download and build its own # Options related to ROOT's ability to download and build its own
# dependencies. Per Spack convention, this should generally be avoided. # dependencies. Per Spack convention, this should generally be avoided.
builtin_opts\ options += [
= [ define('builtin_afterimage', True),
['builtin_afterimage', True], define('builtin_cfitsio', False),
['builtin_cfitsio', False], define('builtin_davix', False),
['builtin_davix', False], define('builtin_fftw3', False),
['builtin_fftw3', False], define('builtin_freetype', False),
['builtin_freetype', False], define('builtin_ftgl', False),
['builtin_ftgl', False], define('builtin_gl2ps', False),
['builtin_gl2ps', False], define('builtin_glew', False),
['builtin_glew', False], define('builtin_gsl', False),
['builtin_gsl', False], define('builtin_llvm', True),
['builtin_llvm', True], define('builtin_lz4', self.spec.satisfies('@6.12.02:6.12.99')),
['builtin_lz4', self.spec.satisfies('@6.12.02:6.12.99')], define('builtin_lzma', False),
['builtin_lzma', False], define('builtin_openssl', False),
['builtin_openssl', False], define('builtin_pcre', False),
['builtin_pcre', False], define('builtin_tbb', False),
['builtin_tbb', False], define('builtin_unuran', False),
['builtin_unuran', False], define('builtin_vc', False),
['builtin_vc', False], define('builtin_vdt', False),
['builtin_vdt', False], define('builtin_veccore', False),
['builtin_veccore', False], define('builtin_xrootd', False),
['builtin_xrootd', False], define('builtin_xxhash', self.spec.satisfies('@6.12.02:6.12.99')),
['builtin_xxhash', self.spec.satisfies('@6.12.02:6.12.99')], define('builtin_zlib', False)
['builtin_zlib', False] ]
]
# Features # Features
feature_opts\ options += [
= [ define('afdsmrgd', False),
['afdsmrgd', False], define('afs', False),
['afs', False], define('alien', False),
['alien', False], define('arrow', False),
['arrow', False], define('asimage', True),
['asimage', True], define('astiff', True),
['astiff', True], define('bonjour', False),
['bonjour', False], define('castor', False),
['castor', False], define('ccache', False),
['ccache', False], define('chirp', False),
['chirp', False], define('cling', True),
['cling', True], define_from_variant('cocoa', 'aqua'),
['cocoa', 'aqua'], define('dataframe', True),
['dataframe', True], define_from_variant('davix'),
['davix'], define('dcache', False),
['dcache', False], define_from_variant('fftw3', 'fftw'),
['fftw3', 'fftw'], define_from_variant('fitsio', 'fits'),
['fitsio', 'fits'], define_from_variant('ftgl', 'opengl'),
['ftgl', 'opengl'], define_from_variant('gdml'),
['gdml'], define_from_variant('genvector', 'math'),
['genvector', 'math'], define('geocad', False),
['geocad', False], define('gfal', False),
['gfal', False], define_from_variant('gl2ps', 'opengl'),
['gl2ps', 'opengl'], define('glite', False),
['glite', False], define('globus', False),
['globus', False], define_from_variant('gsl_shared', 'gsl'),
['gsl_shared', 'gsl'], define_from_variant('gviz', 'graphviz'),
['gviz', 'graphviz'], define('hdfs', False),
['hdfs', False], define_from_variant('http'), # See conflicts
['http'], # See conflicts define_from_variant('imt', 'tbb'),
['imt', 'tbb'], define_from_variant('jemalloc'),
['jemalloc'], define('krb5', False),
['krb5', False], define('ldap', False),
['ldap', False], define_from_variant('mathmore', 'math'),
['mathmore', 'math'], define_from_variant('memstat'), # See conflicts
['memstat'], # See conflicts define('minimal', False),
['minimal'], define_from_variant('minuit'),
['minuit'], define_from_variant('minuit2', 'minuit'),
['minuit2', 'minuit'], define_from_variant('mlp'),
['mlp'], define('monalisa', False),
['monalisa', False], define_from_variant('mysql'),
['mysql'], define('odbc', False),
['odbc'], define_from_variant('opengl'),
['opengl'], define('oracle', False),
['oracle', False], define_from_variant('pgsql', 'postgres'),
['pgsql', 'postgres'], define_from_variant('pythia6'),
['pythia6'], define_from_variant('pythia8'),
['pythia8'], define_from_variant('qt', 'qt4'), # See conflicts
['qt', 'qt4'], # See conflicts define_from_variant('qtgsi', 'qt4'), # See conflicts
['qtgsi', 'qt4'], # See conflicts define_from_variant('r'),
['r', 'r'], define('rfio', False),
['rfio', False], define('roofit', False),
['roofit'], define_from_variant('root7'), # See conflicts
['root7'], # See conflicts define('ruby', False),
['ruby', False], define('sapdb', False),
['sapdb', False], define_from_variant('shadowpw', 'shadow'),
['shadowpw', 'shadow'], define_from_variant('sqlite'),
['sqlite'], define('srp', False),
['srp', False], define_from_variant('ssl'),
['ssl'], define_from_variant('table'),
['table'], define_from_variant('tbb'),
['tbb'], define('tcmalloc', False),
['tcmalloc', False], define_from_variant('tmva'),
['tmva'], define_from_variant('unuran'),
['unuran'], define_from_variant('vc'),
['vc'], define_from_variant('vdt'),
['vdt'], define('veccore', False),
['veccore'], define_from_variant('vmc'),
['vmc'], define_from_variant('webui', 'root7'), # requires root7
['webui', 'root7'], # requires root7 define_from_variant('x11', 'x'),
['x11', 'x'], define_from_variant('xft', 'x'),
['xft', 'x'], define_from_variant('xml'),
['xml'], define_from_variant('xrootd')
['xrootd'] ]
]
options = self._process_opts(control_opts, builtin_opts, feature_opts)
# Some special features # Some special features
if self.spec.satisfies('@6.20:'): if self.spec.satisfies('@6.20:'):
options.append(self.define_from_variant('pyroot', 'python')) options.append(define_from_variant('pyroot', 'python'))
else: else:
options.append(self.define_from_variant('python')) options.append(define_from_variant('python'))
# #################### Compiler options #################### # #################### Compiler options ####################
if sys.platform == 'darwin': if sys.platform == 'darwin' and self.compiler.cc == 'gcc':
if self.compiler.cc == 'gcc': cflags = '-D__builtin_unreachable=__builtin_trap'
options.extend([ options.extend([
'-DCMAKE_C_FLAGS=-D__builtin_unreachable=__builtin_trap', define('CMAKE_C_FLAGS', cflags),
'-DCMAKE_CXX_FLAGS=-D__builtin_unreachable=__builtin_trap', define('CMAKE_CXX_FLAGS', cflags),
]) ])
# Method for selecting C++ standard depends on ROOT version # Method for selecting C++ standard depends on ROOT version
options.append(('-DCMAKE_CXX_STANDARD={0}' if if self.spec.satisfies('@6.18.00:'):
self.spec.satisfies('@6.18.00:') else options.append(define_from_variant('CMAKE_CXX_STANDARD', 'cxxstd'))
'-Dcxx{0}:BOOL=ON').format else:
(self.spec.variants['cxxstd'].value)) options.append(define('cxx' + self.spec.variants['cxxstd'].value,
True))
if 'mysql-client' in self.spec:
options.append('-DCMAKE_PROGRAM_PATH={0}'.format(
self.spec['mysql-client'].prefix.bin))
if '+x+opengl' in self.spec: if '+x+opengl' in self.spec:
options.append('-DFTGL_ROOT_DIR={0}'.format( ftgl_prefix = self.spec('ftgl').prefix
self.spec['ftgl'].prefix)) options.append(define('FTGL_ROOT_DIR', ftgl_prefix))
options.append('-DFTGL_INCLUDE_DIR={0}'.format( options.append(define('FTGL_INCLUDE_DIR', ftgl_prefix.include))
self.spec['ftgl'].prefix.include))
# see https://github.com/spack/spack/pull/11579
if '+python' in self.spec: if '+python' in self.spec:
options.append('-DPYTHON_EXECUTABLE=%s' % # See https://github.com/spack/spack/pull/11579
spec['python'].command.path) options.append(define('PYTHON_EXECUTABLE',
spec['python'].command.path))
return options return options
@ -496,8 +490,7 @@ def setup_dependent_build_environment(self, env, dependent_spec):
env.set('ROOT_VERSION', 'v{0}'.format(self.version.up_to(1))) env.set('ROOT_VERSION', 'v{0}'.format(self.version.up_to(1)))
env.prepend_path('PYTHONPATH', self.prefix.lib) env.prepend_path('PYTHONPATH', self.prefix.lib)
env.prepend_path('PATH', self.prefix.bin) env.prepend_path('PATH', self.prefix.bin)
env.append_path('CMAKE_MODULE_PATH', '{0}/cmake' env.append_path('CMAKE_MODULE_PATH', self.prefix.cmake)
.format(self.prefix))
if "+rpath" not in self.spec: if "+rpath" not in self.spec:
env.prepend_path('LD_LIBRARY_PATH', self.prefix.lib) env.prepend_path('LD_LIBRARY_PATH', self.prefix.lib)
@ -508,24 +501,3 @@ def setup_dependent_run_environment(self, env, dependent_spec):
env.prepend_path('PATH', self.prefix.bin) env.prepend_path('PATH', self.prefix.bin)
if "+rpath" not in self.spec: if "+rpath" not in self.spec:
env.prepend_path('LD_LIBRARY_PATH', self.prefix.lib) env.prepend_path('LD_LIBRARY_PATH', self.prefix.lib)
def _process_opts(self, *opt_lists):
"""Process all provided boolean option lists into CMake arguments.
Args:
opt_list (list): list of elements, each of which is a list:
<cmake-option>[, <bool-or-controlling-variant-name>]
The optional element in each sub-list defaults to
<cmake-option> if ommited.
"""
def _process_opt(opt_name, cond_or_variant=None):
val = cond_or_variant if \
isinstance(cond_or_variant, bool) else \
('+{variant}'.format(variant=cond_or_variant or opt_name)
in self.spec)
return '-D{opt}:BOOL={val}'.format(opt=opt_name, val='ON' if
val else 'OFF')
return [_process_opt(*opt_info) for opt_list in opt_lists for
opt_info in opt_list]