Remove custom phases in packages (1/n) (#29968)

* abi-dumper: remove custom phases

* apktool: remove custom phases, add v2.6.1

* aragorn: remove custom phases

* ascent: remove custom phases

* astral: remove custom phases, add v5.7.1

* bigdft: remove redundant phase definitions

* bazel: remove custom phases phase definitions

* blasr: remove custom phases phase definitions

* bmake: remove custom phases phase definitions, add v20220330

* botan: remove custom phases phase definitions

* breakdancer: remove custom phases phase definitions

* dnstracer: remove custom phases phase definitions

* conduit: remove custom phases phase definitions

* eclipse-gcj-parser: remove custom phases phase definitions

* eem: remove custom phases phase definitions

* fasttree: remove custom phases phase definitions

* fleur: remove custom phases phase definitions

* fpm: remove custom phases phase definitions

* genie: remove custom phases phase definitions

* gluegen: remove custom phases phase definitions

* gnat: remove custom phases phase definitions

* hpgmg: remove custom phases phase definitions

* karma: remove custom phases phase definitions

* libc: remove custom phases phase definitions
This commit is contained in:
Massimiliano Culpo 2022-04-11 11:39:50 +02:00 committed by GitHub
parent c2f470f4a6
commit d0ad644ea6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
31 changed files with 61 additions and 157 deletions

View file

@ -6,7 +6,7 @@
from spack import *
class AbiDumper(MakefilePackage):
class AbiDumper(Package):
"""ABI Dumper is a tool to dump ABI of an ELF object containing
DWARF debug info."""
@ -24,7 +24,5 @@ class AbiDumper(MakefilePackage):
depends_on('universal-ctags')
depends_on('vtable-dumper@1.1:')
phases = ['install']
def install(self, spec, prefix):
make('prefix={0}'.format(prefix), 'install')

View file

@ -13,20 +13,17 @@ class Apktool(Package):
homepage = "https://ibotpeaches.github.io/Apktool/"
url = "https://github.com/iBotPeaches/Apktool/archive/refs/tags/v2.6.0.tar.gz"
version('2.6.1', sha256='8932e77d963b9e0e07227422d82ed4a355e8aa268bad1361e5cfaffa8e4d52ee')
version('2.6.0', sha256='74739cdb1434ca35ec34e51ca7272ad3f378ae3ed0a2d5805d9a2fab5016037f')
depends_on('java@8:', type=('build', 'run'))
phases = ['build', 'install']
def setup_build_environment(self, env):
env.set('LC_ALL', 'en_US.UTF-8')
def build(self, spec, prefix):
def install(self, spec, prefix):
gradlew = Executable('./gradlew')
gradlew('--info', '--debug', 'build', 'shadowJar')
def install(self, spec, prefix):
ln = which('ln')
mkdir(join_path(prefix, 'bin'))
install(

View file

@ -16,13 +16,9 @@ class Aragorn(Package):
version('1.2.38', sha256='4b84e3397755fb22cc931c0e7b9d50eaba2a680df854d7a35db46a13cecb2126')
version('1.2.36', sha256='ab06032589e45aa002f8616333568e9ab11034b3a675f922421e5f1c3e95e7b5')
phases = ['build', 'install']
def build(self, spec, prefix):
def install(self, spec, prefix):
cc = Executable(spack_cc)
cc('-O3', '-ffast-math', '-finline-functions',
'-oaragorn', 'aragorn' + format(spec.version.dotted) + '.c')
def install(self, spec, prefix):
mkdirp(prefix.bin)
install('aragorn', prefix.bin)

View file

@ -187,11 +187,6 @@ class Ascent(CMakePackage, CudaPackage):
conflicts("+shared", when="+cuda",
msg="Ascent needs to be built with ~shared for CUDA builds.")
###################################
# build phases used by this package
###################################
phases = ['hostconfig', 'cmake', 'build', 'install']
def setup_build_environment(self, env):
env.set('CTEST_OUTPUT_ON_FAILURE', '1')
@ -260,7 +255,8 @@ def _get_host_config_path(self, spec):
host_config_path))
return host_config_path
def hostconfig(self, spec, prefix):
@run_before('cmake')
def hostconfig(self):
"""
This method creates a 'host-config' file that specifies
all of the options used to configure and build ascent.
@ -269,6 +265,7 @@ def hostconfig(self, spec, prefix):
https://ascent.readthedocs.io/en/latest/BuildingAscent.html
"""
spec = self.spec
if not os.path.isdir(spec.prefix):
os.mkdir(spec.prefix)

View file

@ -15,6 +15,7 @@ class Astral(Package):
homepage = "https://github.com/smirarab/ASTRAL"
url = "https://github.com/smirarab/ASTRAL/archive/v4.10.7.tar.gz"
version('5.7.1', sha256='8aa6fd4324efca325d3dde432517090fac314bea95f407b1dd59977181fec77e')
version('5.6.1', sha256='b49a67c9fe19c0c92a89dc2f1a3928840e698a53054a595c61546ca98448a076',
url='https://github.com/smirarab/ASTRAL/archive/untagged-697f19dbce69929ece09.tar.gz')
version('4.10.7', sha256='314b49e0129ec06a7c78a1b60d590259ede6a5e75253407031e108d8048fcc79')
@ -22,13 +23,9 @@ class Astral(Package):
depends_on('java', type=('build', 'run'))
depends_on('zip', type='build')
phases = ['build', 'install']
def build(self, spec, prefix):
def install(self, spec, prefix):
make = Executable('./make.sh')
make()
def install(self, spec, prefix):
mkdirp(prefix.bin)
install_tree('lib', prefix.tools.lib)
jar_file = 'astral.{v}.jar'.format(v=self.version)

View file

@ -157,8 +157,6 @@ class Bazel(Package):
patch('disabledepcheck.patch', when='@0.3.2:+nodepfail')
patch('disabledepcheck_old.patch', when='@0.3.0:0.3.1+nodepfail')
phases = ['bootstrap', 'install']
executables = ['^bazel$']
@classmethod
@ -195,7 +193,8 @@ def setup_build_environment(self, env):
' --subcommands=pretty_print'
' --jobs={0}'.format(make_jobs))
def bootstrap(self, spec, prefix):
@run_before('install')
def bootstrap(self):
bash = which('bash')
bash('./compile.sh')

View file

@ -29,8 +29,6 @@ class BigdftAtlab(AutotoolsPackage):
for vers in ['1.8.1', '1.8.2', '1.8.3', '1.9.0', '1.9.1', '1.9.2', 'develop']:
depends_on('bigdft-futile@{0}'.format(vers), when='@{0}'.format(vers))
phases = ['autoreconf', 'configure', 'build', 'install']
build_directory = "atlab"
def autoreconf(self, spec, prefix):

View file

@ -45,8 +45,6 @@ class BigdftChess(AutotoolsPackage, CudaPackage):
for vers in ['1.8.3', '1.9.0', '1.9.1', '1.9.2', 'develop']:
depends_on('bigdft-atlab@{0}'.format(vers), when='@{0}'.format(vers))
phases = ['autoreconf', 'configure', 'build', 'install']
build_directory = "chess"
def autoreconf(self, spec, prefix):

View file

@ -48,8 +48,6 @@ class BigdftCore(AutotoolsPackage, CudaPackage):
depends_on('bigdft-psolver@{0}'.format(vers), when='@{0}'.format(vers))
depends_on('bigdft-libabinit@{0}'.format(vers), when='@{0}'.format(vers))
phases = ['autoreconf', 'configure', 'build', 'install']
build_directory = "bigdft"
def autoreconf(self, spec, prefix):

View file

@ -38,8 +38,6 @@ class BigdftFutile(AutotoolsPackage, CudaPackage):
depends_on('py-pyyaml')
depends_on('mpi', when='+mpi')
phases = ['autoreconf', 'configure', 'build', 'install']
build_directory = "futile"
def autoreconf(self, spec, prefix):

View file

@ -40,8 +40,6 @@ class BigdftLibabinit(AutotoolsPackage):
patch('m_libpaw_mpi.F90.patch', when='@:1.8.2')
phases = ['autoreconf', 'configure', 'build', 'install']
build_directory = "libABINIT"
def autoreconf(self, spec, prefix):

View file

@ -42,8 +42,6 @@ class BigdftPsolver(AutotoolsPackage, CudaPackage):
for vers in ['1.8.3', '1.9.0', '1.9.1', '1.9.2', 'develop']:
depends_on('bigdft-atlab@{0}'.format(vers), when='@{0}'.format(vers))
phases = ['autoreconf', 'configure', 'build', 'install']
build_directory = "psolver"
def autoreconf(self, spec, prefix):

View file

@ -41,8 +41,6 @@ class BigdftSpred(AutotoolsPackage):
depends_on('bigdft-psolver@{0}'.format(vers), when='@{0}'.format(vers))
depends_on('bigdft-core@{0}'.format(vers), when='@{0}'.format(vers))
phases = ['autoreconf', 'configure', 'build', 'install']
build_directory = "spred"
def autoreconf(self, spec, prefix):

View file

@ -28,8 +28,7 @@ class BlasrLibcpp(Package):
depends_on('python@2.7:2.8', type='build')
phases = ['configure', 'build', 'install']
@run_before('install')
def configure(self, spec, prefix):
configure_args = [
'PBBAM_INC={0}'.format(self.spec['pbbam'].prefix.include),
@ -39,6 +38,7 @@ def configure(self, spec, prefix):
]
python('configure.py', *configure_args)
@run_before('install')
def build(self, spec, prefix):
os.environ['CPLUS_INCLUDE_PATH'] = self.stage.source_path
make()

View file

@ -30,8 +30,6 @@ class Blasr(Package):
depends_on('blasr-libcpp')
depends_on('python', type='build')
phases = ['configure', 'build', 'install']
def setup_build_environment(self, env):
env.prepend_path('CPATH', self.spec['blasr-libcpp'].prefix)
env.prepend_path('CPATH', self.spec['blasr-libcpp'].prefix.pbdata)
@ -46,6 +44,7 @@ def setup_build_environment(self, env):
def setup_run_environment(self, env):
env.prepend_path('PATH', self.spec.prefix.utils)
@run_before('install')
def configure(self, spec, prefix):
configure_args = [
'LIBPBDATA_INC={0}'.format(
@ -64,6 +63,7 @@ def configure(self, spec, prefix):
]
python('configure.py', *configure_args)
@run_before('install')
def build(self, spec, prefix):
os.environ['CPLUS_INCLUDE_PATH'] = join_path(
self.stage.source_path, 'include')

View file

@ -12,12 +12,11 @@ class Bmake(Package):
homepage = "https://www.crufty.net/help/sjg/bmake.htm"
url = "https://www.crufty.net/ftp/pub/sjg/bmake-20180512.tar.gz"
version('20220330', sha256='4b46d95b6ae4b3311ba805ff7d5a19b9e37ac0e86880e296e2111f565b545092')
version('20200710', sha256='6538fc4319ef79d178dca76d3b869f7aa93a9bb7b510df08a7d872c01a56b76c')
version('20180512', sha256='ac3cd262065fcc20c1dec7c95f06306c8138b3e17025b949343a06a8980a5508')
version('20171207', sha256='1703667e53a0498c0903b20612ebcbb41b886a94b238624cfeadd91a4111d39a')
phases = ['configure', 'build', 'install']
def patch(self):
# Do not pre-roff cat pages
filter_file('MANTARGET?', 'MANTARGET', 'mk/man.mk', string=True)
@ -25,14 +24,8 @@ def patch(self):
filter_file('GetDir /bmake', 'GetDir ' + self.stage.source_path,
'boot-strap', string=True)
def configure(self, spec, prefix):
sh = which('sh')
sh('boot-strap', 'op=configure')
def build(self, spec, prefix):
sh = which('sh')
sh('boot-strap', 'op=build')
def install(self, spec, prefix):
sh = which('sh')
sh('boot-strap', 'op=configure')
sh('boot-strap', 'op=build')
sh('boot-strap', '--prefix={0}'.format(prefix), 'op=install')

View file

@ -6,7 +6,7 @@
from spack import *
class Botan(Package):
class Botan(MakefilePackage):
"""Crypto and TLS for Modern C++"""
homepage = "https://botan.randombit.net/"
@ -36,24 +36,15 @@ class Botan(Package):
depends_on('python', type='build')
depends_on('py-sphinx@1.2:', type='build', when='+doc')
phases = ['configure', 'build', 'install']
def configure(self, spec, prefix):
def edit(self, spec, prefix):
configure = Executable('./configure.py')
configure(*self.configure_args())
def configure_args(self):
spec = self.spec
args = []
args.append('--prefix=' + prefix)
args = ['--prefix={0}'.format(self.prefix)]
if '+doc' in spec:
args.append('--with-documentation')
else:
args.append('--without-documentation')
return args
def build(self, spec, prefix):
make()
def install(self, spec, prefix):
make('install')

View file

@ -24,8 +24,6 @@ class Breakdancer(CMakePackage):
version('master', submodules='true',
git='https://github.com/genome/breakdancer.git', preferred=True)
phases = ['edit', 'cmake', 'build', 'install']
depends_on('zlib')
depends_on('ncurses', type='link')
@ -45,7 +43,8 @@ def setup_run_environment(self, env):
# get the perl tools in the path
env.prepend_path('PATH', self.prefix.lib)
def edit(self, spec, prefix):
@run_before('cmake')
def edit(self):
# perl tools end up in a silly lib subdirectory, fixing that
filter_file(r'set\(SUPPORT_LIBDIR lib\/breakdancer-max\$ \
\{EXE_VERSION_SUFFIX\}\)',

View file

@ -176,11 +176,6 @@ class Conduit(CMakePackage):
patch('https://github.com/LLNL/conduit/pull/773.patch?full_index=1', when='@:0.7.2',
sha256='784d74942a63acf698c31b39848b46b4b755bf06faa6aa6fb81be61783ec0c30')
###################################
# build phases used by this package
###################################
phases = ['hostconfig', 'cmake', 'build', 'install']
def setup_build_environment(self, env):
env.set('CTEST_OUTPUT_ON_FAILURE', '1')
# conduit uses a <=1.10 api version before 0.8
@ -274,7 +269,8 @@ def _get_host_config_path(self, spec):
host_config_path))
return host_config_path
def hostconfig(self, spec, prefix):
@run_before('cmake')
def hostconfig(self):
"""
This method creates a 'host-config' file that specifies
all of the options used to configure and build conduit.
@ -282,6 +278,7 @@ def hostconfig(self, spec, prefix):
For more details about 'host-config' files see:
http://software.llnl.gov/conduit/building.html
"""
spec = self.spec
if not os.path.isdir(spec.prefix):
os.mkdir(spec.prefix)

View file

@ -6,24 +6,17 @@
from spack import *
class Dnstracer(Package):
class Dnstracer(MakefilePackage):
"""Dnstracer determines where a given Domain Name Server gets
its information from, and follows the chain of DNS servers back to
the servers which know the data."""
the servers which know the data.
"""
homepage = "https://github.com/Orc/dnstracer"
git = "https://github.com/Orc/dnstracer.git"
version('master', branch='master')
phases = ['configure', 'build', 'install']
def configure(self, spec, prefix):
def edit(self, spec, prefix):
configure = Executable('./configure.sh')
configure('--prefix={0}'.format(prefix))
def build(self, spec, prefix):
make()
def install(self, spec, prefix):
make('install')

View file

@ -25,8 +25,6 @@ class EclipseGcjParser(Package):
version('4.8', sha256='98fd128f1d374d9e42fd9d4836bdd249c6d511ebc6c0df17fbc1b9df96c3d781', expand=False)
phases = ('build', 'install')
@property
def gcj(self):
"""Obtain Executable for the gcj included with this GCC,
@ -40,12 +38,9 @@ def gcj(self):
return Executable(join_path(dir, gcc.replace('gcc', 'gcj')))
def build(self, spec, prefix):
self.gcj(
'-o', 'ecj1',
def install(self, spec, prefix):
self.gcj('-o', 'ecj1',
'--main=org.eclipse.jdt.internal.compiler.batch.GCCMain',
'ecj-4.8.jar')
def install(self, spec, prefix):
mkdirp(spec.prefix.bin)
install('ecj1', spec.prefix.bin)

View file

@ -17,8 +17,6 @@ class Eem(MakefilePackage):
variant('K', default=False, description='Build for K computer')
phases = ['edit', 'install']
depends_on('mpi')
build_directory = 'src'

View file

@ -9,23 +9,18 @@
class Fasttree(Package):
"""FastTree infers approximately-maximum-likelihood phylogenetic
trees from alignments of nucleotide or protein sequences.
FastTree can handle alignments with up to a million of sequences
in a reasonable amount of time and memory."""
"""
homepage = "http://www.microbesonline.org/fasttree"
url = "http://www.microbesonline.org/fasttree/FastTree-2.1.10.c"
version('2.1.10', sha256='54cb89fc1728a974a59eae7a7ee6309cdd3cddda9a4c55b700a71219fc6e926d', expand=False, url='http://www.microbesonline.org/fasttree/FastTree-2.1.10.c')
phases = ['build', 'install']
def build(self, spec, prefix):
def install(self, spec, prefix):
cc = Executable(spack_cc)
cc('-O3', self.compiler.openmp_flag,
'-DOPENMP', '-finline-functions', '-funroll-loops', '-Wall',
'-oFastTreeMP', 'FastTree-' + format(spec.version.dotted) + '.c',
'-lm')
def install(self, spec, prefix):
mkdir(prefix.bin)
install('FastTreeMP', prefix.bin)

View file

@ -53,8 +53,6 @@ class Fleur(Package):
depends_on('elpa~openmp', when='+elpa~openmp')
depends_on('elpa+openmp', when='+elpa+openmp')
phases = ['configure', 'build', 'install']
conflicts('%intel@:16.0.4',
msg='ifort version <16.0 will most probably not work correctly')
conflicts('%gcc@:6.3.0',
@ -81,7 +79,8 @@ def setup_build_environment(self, env):
env.set('FC', spec['mpi'].mpifc, force=True)
env.set('CXX', spec['mpi'].mpicxx, force=True)
def configure(self, spec, prefix):
@run_before('install')
def configure(self):
spec = self.spec
sh = which('bash')
@ -162,18 +161,12 @@ def configure(self, spec, prefix):
args.append(" ".join(options["-libdir"]))
args.append("-includedir")
args.append(" ".join(options["-includedir"]))
# args.append("-flags")
# args.append(" ".join(options["-flags"]))
sh('configure.sh', *args)
def build(self, spec, prefix):
with working_dir('build'):
make()
def install(self, spec, prefix):
with working_dir('build'):
# copy bin
make()
mkdirp(prefix.bin)
if '+mpi' in spec:
install('fleur_MPI', prefix.bin)

View file

@ -19,7 +19,6 @@ class Fpm(Package):
url = "https://github.com/fortran-lang/fpm/releases/download/v0.4.0/fpm-0.4.0.zip"
maintainers = ["awvwgk"]
phases = ["install"]
version("0.5.0", "e4a06956d2300f9aa1d06bd3323670480e946549617582e32684ded6921a921e")
version("0.4.0", "cd9b80b7f40d9cf357ca8d5d4fe289fd32dfccb729bad7d2a68f245e4cdd0045")

View file

@ -12,7 +12,7 @@
from spack.version import Version
class Genie(Package): # Genie doesn"t use Autotools
class Genie(Package):
"""Genie is a neutrino Monte Carlo Generator."""
homepage = "https://www.genie-mc.org"
@ -22,7 +22,7 @@ class Genie(Package): # Genie doesn"t use Autotools
tags = ["neutrino", "hep"]
maintainers = [
# maintainer of this recipe, not affliated with the GENIE collaboration
# maintainer of this recipe, not affiliated with the GENIE collaboration
"davehadley",
]
@ -77,8 +77,6 @@ class Genie(Package): # Genie doesn"t use Autotools
variant("vleextension", default=False,
description="Enable GENIE very low energy (1 MeV - 100 MeV) extension")
phases = ["configure", "build", "install"]
def url_for_version(self, version):
url = "https://github.com/GENIE-MC/Generator/archive/R-{0}.tar.gz"
if version >= Version(3):
@ -94,16 +92,11 @@ def setup_run_environment(self, env):
env.set("GENIE", self.prefix)
return super(Genie, self).setup_run_environment(env)
def configure(self, spec, prefix):
def install(self, spec, prefix):
configure = Executable("./configure")
args = self._configure_args(spec, prefix)
configure(*args)
def build(self, spec, prefix):
# parallel build is not supported on GENIE 2
self._make(parallel=spec.satisfies("@3:"))
def install(self, spec, prefix):
# GENIE make install does not support parallel jobs
self._make("install", parallel=False)
# GENIE requires these files to be present at runtime, but doesn"t install them

View file

@ -34,11 +34,9 @@ class Gluegen(Package):
# patch for build with Fujitsu Compiler
patch('cpptasks.fj.patch', working_dir='ant-cpptasks', when='%fj')
phases = ['build', 'install']
compiler_mapping = {'gcc': 'gcc', 'clang': 'clang', 'fj': 'fcc'}
def build(self, spec, prefix):
def install(self, spec, prefix):
ant = spec['ant'].command
cname = spec.compiler.name
compiler = self.compiler_mapping.get(cname, 'gcc')
@ -53,7 +51,6 @@ def build(self, spec, prefix):
with working_dir('make'):
ant(*antarg)
def install(self, spec, prefix):
install_tree('build', prefix.build)
install(join_path('ant-optional', 'optional-1.5.4.jar'), prefix.build)
install_tree('make', prefix.make)

View file

@ -6,7 +6,7 @@
from spack import *
class Gnat(MakefilePackage):
class Gnat(Package):
"""The GNAT Ada compiler. Ada is a modern programming language designed
for large, long-lived applications - and embedded systems in particular
- where reliability and efficiency are essential."""
@ -26,7 +26,5 @@ class Gnat(MakefilePackage):
version('2016', sha256='d083c01e054d0aeda7c67967306cfa5a8df12268664f9098a2d9b331aa24dfe7', extension='tar.gz',
url="http://mirrors.cdn.adacore.com/art/5739cefdc7a447658e0b016b")
phases = ['install']
def install(self, spec, prefix):
make('ins-all', 'prefix={0}'.format(prefix))

View file

@ -6,14 +6,15 @@
from spack import *
class Hpgmg(Package):
class Hpgmg(MakefilePackage):
"""HPGMG implements full multigrid (FMG) algorithms using finite-volume and
finite-element methods. Different algorithmic variants adjust the
arithmetic intensity and architectural properties that are tested. These
FMG methods converge up to discretization error in one F-cycle, thus may
be considered direct solvers. An F-cycle visits the finest level a total
of two times, the first coarsening (8x smaller) 4 times, the second
coarsening 6 times, etc.
finite-element methods.
Different algorithmic variants adjust the arithmetic intensity and architectural
properties that are tested. These FMG methods converge up to discretization
error in one F-cycle, thus may be considered direct solvers. An F-cycle visits
the finest level a total of two times, the first coarsening (8x smaller) 4 times,
the second coarsening 6 times, etc.
"""
homepage = "https://bitbucket.org/hpgmg/hpgmg"
@ -27,10 +28,8 @@ class Hpgmg(Package):
version('a0a5510df23b', sha256='b9c50f25e541428d4735fb07344d1d0ed9fc821bdde918d8e0defa78c0d9b4f9')
version('0.3', sha256='12a65da216fec91daea78594ae4b5a069c8f1a700f1ba21eed9f45a79a68c793')
variant(
'fe', default=False, description='Build finite element solver')
variant(
'fv', default='mpi', values=('serial', 'mpi', 'none'),
variant('fe', default=False, description='Build finite element solver')
variant('fv', default='mpi', values=('serial', 'mpi', 'none'),
description='Build finite volume solver with or without MPI support')
variant('cuda', default=False, description='Build with CUDA')
variant('debug', default=False, description='Build in debug mode')
@ -41,8 +40,6 @@ class Hpgmg(Package):
depends_on('cuda', when='+cuda')
depends_on('python', type='build')
phases = ['configure', 'build', 'install']
def configure_args(self):
args = []
if '+fe' in self.spec and not ('@0.3' in self.spec):
@ -75,7 +72,7 @@ def configure_args(self):
return args
def configure(self, spec, prefix):
def edit(self, spec, prefix):
python('configure', *self.configure_args())
def build(self, spec, prefix):

View file

@ -21,8 +21,6 @@ class Karma(Package):
depends_on('libx11', type=('build', 'run'))
depends_on('libxaw', type=('build', 'run'))
phases = ['install']
resource(
name='karma-linux',
url='ftp://ftp.atnf.csiro.au/pub/software/karma/karma-1.7.25-amd64_Linux_libc6.3.tar.bz2',

View file

@ -6,12 +6,10 @@
from llnl.util.filesystem import LibraryList
class Libc(Package):
class Libc(BundlePackage):
"""Dummy package to provide interfaces available in libc."""
homepage = "https://en.wikipedia.org/wiki/C_standard_library"
has_code = False
phases = []
version('1.0') # Dummy