
Symlinks on Windows can use longpath prefixes (\\?\); these are fine in the context of win32 API interactions but break numerous facets of Spack behavior that rely on string parsing/matching (archiving, binary distributions, tarball extraction, view regen, etc). Spack's internal readlink method (llnl.util.symlink.readlink) gracefully handles this by removing the prefix and otherwise behaving exactly as os.readlink does, so we should prefer that in all cases.
120 lines
4.8 KiB
Python
120 lines
4.8 KiB
Python
# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
|
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
|
#
|
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
|
|
import os
|
|
from fnmatch import fnmatch
|
|
from os.path import join
|
|
|
|
from llnl.util.symlink import readlink
|
|
|
|
from spack.package import *
|
|
|
|
|
|
class Kaldi(Package): # Does not use Autotools
|
|
"""Kaldi is a toolkit for speech recognition written
|
|
in C++ and licensed under the Apache License v2.0.
|
|
Kaldi is intended for use by speech recognition researchers."""
|
|
|
|
homepage = "https://github.com/kaldi-asr/kaldi"
|
|
git = "https://github.com/kaldi-asr/kaldi.git"
|
|
|
|
license("Apache-2.0")
|
|
|
|
version("master")
|
|
version("2021-11-16", commit="6e03a3f5f99d6d8c22494d90b7e7f9ceb0117ac8")
|
|
version("2019-09-29", commit="6ffde4b41c58de778245149690927d592cd5956a")
|
|
version("2019-07-29", commit="7637de77e0a77bf280bef9bf484e4f37c4eb9475")
|
|
version("2018-07-11", commit="6f2140b032b0108bc313eefdca65151289642773")
|
|
version("2015-10-07", commit="c024e8aa0a727bf76c91a318f76a1f8b0b59249e")
|
|
|
|
variant("shared", default=True, description="build shared libraries")
|
|
variant("double", default=False, description="build with double precision floats")
|
|
variant("cuda", default=False, description="build with CUDA")
|
|
|
|
depends_on("blas")
|
|
depends_on("cuda", when="+cuda")
|
|
depends_on("sph2pipe", type="run")
|
|
depends_on("sctk", type="run")
|
|
depends_on("speex", type="run")
|
|
depends_on("openfst@1.4.1-patch", when="@2015-10-07")
|
|
depends_on("openfst@1.6.0:", when="@2018-07-11")
|
|
depends_on("openfst@1.6.0:", when="@2019-07-29")
|
|
depends_on("openfst@1.6.7:1.7.3", when="@2019-09-29:")
|
|
depends_on("cub", when="@2019-07-29:^cuda@:10")
|
|
|
|
patch("openfst-1.4.1.patch", when="@2015-10-07")
|
|
patch("0001_CMakeLists_txt.patch", when="+cuda@11:")
|
|
|
|
# Change process of version analysis when using Fujitsu compiler.
|
|
patch("fujitsu_fix_version_analysis.patch", when="@2018-07-11:%fj")
|
|
|
|
def install(self, spec, prefix):
|
|
configure_args = ["--fst-root=" + spec["openfst"].prefix]
|
|
configure_args.append("--fst-version=" + str(spec["openfst"].version))
|
|
configure_args.append("--speex-root=" + spec["speex"].prefix)
|
|
configure_args.append("--cub-root=" + spec["cuda"].prefix.include)
|
|
|
|
if "~shared" in spec:
|
|
configure_args.append("--static")
|
|
else:
|
|
configure_args.append("--shared")
|
|
|
|
if "^openblas" in spec:
|
|
configure_args.append("--mathlib=OPENBLAS")
|
|
configure_args.append("--openblas-root=" + spec["blas"].prefix)
|
|
if "+openmp" in spec["blas"].variants:
|
|
configure_args.append("--threaded-math=yes")
|
|
elif "^atlas" in spec:
|
|
configure_args.append("--mathlib=ATLAS")
|
|
configure_args.append("--atlas-root=" + spec["blas"].prefix)
|
|
if "+pthread" in spec["blas"].variants:
|
|
configure_args.append("--threaded-atlas")
|
|
elif "^intel-parallel-studio" in spec or "^intel-mkl" in spec:
|
|
configure_args.append("--mathlib=MKL")
|
|
configure_args.append("--mkl-root=" + spec["blas"].prefix.mkl)
|
|
if "+openmp" in spec["blas"].variants:
|
|
configure_args.append("--mkl-threading=iomp")
|
|
|
|
if "+cuda" in spec:
|
|
configure_args.append("--use-cuda=yes")
|
|
configure_args.append("--cudatk-dir=" + spec["cuda"].prefix)
|
|
|
|
if spec.satisfies("@2019-07-29: ^cuda@:10"):
|
|
configure_args.append("--cub-root=" + spec["cub"].prefix.include)
|
|
|
|
with working_dir("src"):
|
|
configure(*configure_args)
|
|
make()
|
|
|
|
mkdirp(prefix.bin)
|
|
for root, dirs, files in os.walk("."):
|
|
for name in files:
|
|
if (
|
|
name.endswith("." + dso_suffix)
|
|
or name.endswith(".cc")
|
|
or name.endswith(".pptx")
|
|
):
|
|
continue
|
|
if "configure" == name:
|
|
continue
|
|
if os.access(join(root, name), os.X_OK):
|
|
install(join(root, name), prefix.bin)
|
|
|
|
mkdir(prefix.lib)
|
|
for root, dirs, files in os.walk("lib"):
|
|
for name in files:
|
|
if name.endswith("." + dso_suffix):
|
|
fpath = join(root, name)
|
|
src = readlink(fpath)
|
|
install(src, prefix.lib)
|
|
|
|
for root, dirs, files in os.walk("."):
|
|
for name in files:
|
|
if fnmatch(name, "*.h"):
|
|
mkdirp(join(prefix.include, root.strip("./")))
|
|
install(join(root, name), join(prefix.include, root.strip("./")))
|
|
egs_dir = join(prefix, "egs")
|
|
install_tree("egs", egs_dir)
|