80 lines
2.7 KiB
Python
80 lines
2.7 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)
|
|
|
|
from spack.package import *
|
|
|
|
|
|
class Migrate(AutotoolsPackage):
|
|
"""Migrate estimates effective population sizes and past migration rates
|
|
between n population assuming a migration matrix model with asymmetric
|
|
migration rates and different subpopulation sizes"""
|
|
|
|
homepage = "https://popgen.sc.fsu.edu/"
|
|
url = "https://popgen.sc.fsu.edu/currentversions/migrate-3.6.11.src.tar.gz"
|
|
|
|
license("Unlicense")
|
|
|
|
version("3.6.11", sha256="a9ba06a4e995a45b8d04037f5f2da23e1fe64a2f3565189bdd50c62c6fe01fb8")
|
|
|
|
variant("mpi", default=False, description="Build MPI binaries")
|
|
|
|
depends_on("autoconf", type="build")
|
|
depends_on("automake", type="build")
|
|
depends_on("libtool", type="build")
|
|
depends_on("m4", type="build")
|
|
depends_on("zlib-api", type="link")
|
|
|
|
depends_on("openmpi", type=("build", "link", "run"), when="+mpi")
|
|
|
|
configure_directory = "src"
|
|
|
|
def configure_args(self):
|
|
return ["--with-zlib=system"]
|
|
|
|
def build(self, spec, prefix):
|
|
with working_dir("src"):
|
|
# this software is written with parts both in C and C++.
|
|
# it tries to link using gcc which causes problems, so this package
|
|
# explicitly links with g++ (CXX) instead.
|
|
|
|
# spack's FileFilter/filter_file only work per-line (see docs),
|
|
# so the package uses a custom filter by replacing substrings
|
|
# in the Makefile.
|
|
|
|
mfc = ""
|
|
with open("Makefile") as m:
|
|
mfc = mfc_old = m.read()
|
|
|
|
# replace linking step
|
|
mfc = mfc.replace(
|
|
"$(NAME): $(PRODUCT_DEPENDS)\n\t$(CC)", "$(NAME): $(PRODUCT_DEPENDS)\n\t$(CXX)"
|
|
)
|
|
mfc = mfc.replace(
|
|
"$(MPINAME): $(PRODUCT_DEPENDS)\n\t$(CC)",
|
|
"$(MPINAME): $(PRODUCT_DEPENDS)\n\t$(CXX)",
|
|
)
|
|
|
|
# make sure the replace worked
|
|
if mfc == mfc_old:
|
|
raise InstallError("Failed to update linker command")
|
|
|
|
# don't try to install MPI binaries that aren't there
|
|
if "+mpi" not in spec:
|
|
line = "$(INSTALL) $(IFLAGS) $(MPINAME) $(INSTALLDIR)"
|
|
mfc = mfc.replace(line, "")
|
|
|
|
# write modified makefile back
|
|
with open("Makefile", "w") as m:
|
|
m.write(mfc)
|
|
|
|
make()
|
|
if "+mpi" in spec:
|
|
make("mpis")
|
|
|
|
def install(self, spec, prefix):
|
|
mkdirp(prefix.man)
|
|
with working_dir("src"):
|
|
make("install")
|