mirror of
https://github.com/macports/macports-ports.git
synced 2026-07-12 18:20:25 -07:00
442 lines
16 KiB
Tcl
442 lines
16 KiB
Tcl
# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
|
|
|
|
PortSystem 1.0
|
|
PortGroup compilers 1.0
|
|
PortGroup mpiutil 1.0
|
|
|
|
#===============================================================================
|
|
#
|
|
# *** IMPORTANT NOTE ***
|
|
#
|
|
# When making logic changes to this port, PLEASE review port 'openmpi' to see
|
|
# if the same changes should be applied. While the subports and variants aren't
|
|
# exactly the same between the two - and things like configure arguments
|
|
# certainly differ, as they're different code bases - much of the core logic
|
|
# is very similar. (And often identical.)
|
|
#
|
|
# Please help us avoid divergent MPI ports, which cause serious migraines.
|
|
#
|
|
#===============================================================================
|
|
|
|
# make sure to keep in sync with mpi-doc
|
|
name mpich
|
|
version 4.3.2
|
|
revision 1
|
|
|
|
license BSD
|
|
categories science parallel net
|
|
maintainers {eborisch @eborisch} \
|
|
{mascguy @mascguy}
|
|
|
|
description Message Passing Interface (MPI) Library
|
|
|
|
long_description MPICH is a high-performance and widely portable\
|
|
implementation of the Message Passing Interface (MPI) \
|
|
standard (MPI-1, MPI-2 and MPI-3). The goals of MPICH are:\
|
|
(1) to provide an MPI implementation that efficiently\
|
|
supports different computation and communication platforms\
|
|
including commodity clusters (desktop systems,\
|
|
shared-memory systems, multicore architectures), high-speed\
|
|
networks (10 Gigabit Ethernet, InfiniBand, Myrinet,\
|
|
Quadrics) and proprietary high-end computing systems (Blue\
|
|
Gene, Cray) and (2) to enable cutting-edge research in MPI\
|
|
through an easy-to-extend modular framework for other\
|
|
derived implementations.
|
|
|
|
homepage https://www.mpich.org/
|
|
master_sites ${homepage}static/downloads/${version}
|
|
|
|
checksums rmd160 b7e1a2b1e3914bad58bfb238339a64a5c42494c6 \
|
|
sha256 47d774587a7156a53752218c811c852e70ac44db9c502dc3f399b4cb817e3818 \
|
|
size 37697007
|
|
|
|
# Disable livecheck for all subports; only enabled for main port, at end of portfile
|
|
livecheck.type none
|
|
|
|
#-------------------------------------------------------------------------------
|
|
# Target Compiler Logic
|
|
#-------------------------------------------------------------------------------
|
|
|
|
# As MPICH creates compiler wrappers, there are lots of
|
|
# variants for what compiler the user would like to wrap.
|
|
|
|
# Please update the mpi portgroup whenever clist is changed.
|
|
|
|
# Subport names and corresponding configure.compiler value
|
|
set clist [dict create]
|
|
set clist_unsupported [list]
|
|
set clist_obsolete [list]
|
|
|
|
# Compilers supported across-the-board
|
|
dict set clist gcc7 {macports-gcc-7}
|
|
dict set clist gcc10 {macports-gcc-10}
|
|
dict set clist gcc11 {macports-gcc-11}
|
|
dict set clist gcc12 {macports-gcc-12}
|
|
dict set clist gcc13 {macports-gcc-13}
|
|
dict set clist gcc14 {macports-gcc-14}
|
|
dict set clist gcc15 {macports-gcc-15}
|
|
dict set clist clang11 {macports-clang-11}
|
|
dict set clist clang12 {macports-clang-12}
|
|
dict set clist clang13 {macports-clang-13}
|
|
dict set clist clang14 {macports-clang-14}
|
|
dict set clist clang15 {macports-clang-15}
|
|
dict set clist clang16 {macports-clang-16}
|
|
dict set clist clang17 {macports-clang-17}
|
|
dict set clist clang18 {macports-clang-18}
|
|
dict set clist clang19 {macports-clang-19}
|
|
dict set clist clang20 {macports-clang-20}
|
|
|
|
# Only enable default (gcc), and Xcode clang, for MacOS 10.7 and later
|
|
if { ${os.major} >= 11 } {
|
|
dict set clist default {}
|
|
dict set clist clang {clang}
|
|
} else {
|
|
lappend clist_unsupported \
|
|
default clang
|
|
}
|
|
|
|
# Clang 9 and 10 not supported on ARM
|
|
if { ${os.arch} eq "arm" } {
|
|
lappend clist_unsupported \
|
|
clang90 clang10
|
|
} else {
|
|
dict set clist clang90 {macports-clang-9.0}
|
|
dict set clist clang10 {macports-clang-10}
|
|
}
|
|
|
|
# GCC 9 only supported for macOS 10.6 through 10.10
|
|
if { ${os.major} >= 10 && ${os.major} <= 14 } {
|
|
dict set clist gcc9 {macports-gcc-9}
|
|
} else {
|
|
lappend clist_unsupported \
|
|
gcc9
|
|
}
|
|
|
|
#-------------------------------------------------------------------------------
|
|
# Subport Creation/Validation
|
|
#-------------------------------------------------------------------------------
|
|
|
|
set cname \
|
|
[lindex [split ${subport} -] end]
|
|
|
|
mpiutil_add_subports \
|
|
${name} ${subport} \
|
|
${clist} ${clist_unsupported} ${clist_obsolete}
|
|
|
|
set subport_enabled \
|
|
[mpiutil_validate_subport \
|
|
${name} ${subport} ${cname} \
|
|
${clist} ${clist_unsupported} ${clist_obsolete} \
|
|
]
|
|
|
|
#-------------------------------------------------------------------------------
|
|
# General Subport Logic
|
|
#-------------------------------------------------------------------------------
|
|
|
|
# TODO: simplify via regex capture group, for clang version
|
|
if {[string match {*-clang1[3-9]} ${subport}]
|
|
|| [string match {*-clang2[0-9]} ${subport}]} {
|
|
platforms {darwin >= 11}
|
|
}
|
|
|
|
if {${subport_enabled}} {
|
|
PortGroup select 1.0
|
|
PortGroup muniversal 1.0
|
|
PortGroup legacysupport 1.1
|
|
|
|
if {${cname} eq "default"} {
|
|
set cname "mp"
|
|
}
|
|
|
|
# Add various dependencies: build, lib, and run
|
|
mpiutil_add_depends \
|
|
${subport} ${cname}
|
|
|
|
# Determine whether buildbot binaries should be used, and disable if necessary
|
|
mpiutil_set_binary_eligibility \
|
|
${subport} ${cname}
|
|
|
|
depends_build-append port:pkgconfig
|
|
depends_lib-append port:libxml2
|
|
|
|
if {${cname} eq "mp"} {
|
|
if {${os.major} == 10} {
|
|
# Make every attempt to avoid MacPorts compilers on 10.6
|
|
configure.cxx_stdlib libstdc++
|
|
}
|
|
}
|
|
|
|
# ch4 is hanging in finalize https://github.com/pmodels/mpich/issues/6584
|
|
# always use ch3 for now.
|
|
|
|
configure.args --disable-dependency-tracking \
|
|
--disable-fortran \
|
|
--disable-silent-rules \
|
|
--enable-base-cache \
|
|
--enable-cache \
|
|
--enable-cxx \
|
|
--enable-fast=O2 \
|
|
--enable-shared \
|
|
--enable-versioning \
|
|
--enable-timer-type=mach_absolute_time \
|
|
--with-pm=hydra \
|
|
--with-thread-package=posix \
|
|
--with-hwloc=embedded \
|
|
--disable-collalgo-tests \
|
|
--with-device=ch4:ofi:tcp
|
|
|
|
# Hopefully avoid double-rpath issues.
|
|
compilers.add_gcc_rpath_support no
|
|
|
|
if {${os.major} < 12} {
|
|
# MPICH requires OpenCL version 1.2, which was not introduced until OS X Mountain Lion
|
|
configure.args-append \
|
|
--enable-opencl=no
|
|
# https://trac.macports.org/ticket/70418 (change in scandir prototype)
|
|
patchfiles-append patch-scandir-lion.diff
|
|
}
|
|
|
|
patchfiles-append \
|
|
patch-no_qmkshrobj.diff \
|
|
patch-mpich-darwin-powerpc.diff
|
|
|
|
post-patch {
|
|
reinplace \
|
|
"s/commons_use_dylibs_works=yes/commons_use_dylibs_works=no/" \
|
|
configure
|
|
}
|
|
|
|
platform darwin powerpc {
|
|
# libfabric calls for atomicops, on PPC at least
|
|
configure.ldflags-append \
|
|
-latomic
|
|
}
|
|
|
|
# We're making compiler wrappers here... don't default to -O2 for wrappers.
|
|
# Actual library code is compiled with -O2 via --enable-fast=O2 configure arg
|
|
configure.optflags-delete -O2 -Os
|
|
configure.cppflags-delete -I${prefix}/include
|
|
configure.ldflags-delete -L${prefix}/lib
|
|
|
|
select.group mpi
|
|
select.file ${filespath}/portselect/${name}-${cname}
|
|
|
|
# Prevent "ccache" and "distcc" from being baked into the wrapper scripts.
|
|
configure.ccache no
|
|
configure.distcc no
|
|
|
|
if {${cname} ne "mp"} {
|
|
set compiler [dict get ${clist} ${cname}]
|
|
configure.compiler [lindex ${compiler} 0]
|
|
unset compiler
|
|
|
|
long_description-append \
|
|
"\n\nTHIS SUBPORT WRAPS ${cname}'s C/C++"
|
|
} else {
|
|
long_description-append \
|
|
"\n\nTHIS SUBPORT WRAPS MACPORTS' DEFAULT COMPILER FOR C/C++"
|
|
}
|
|
|
|
configure.args-append \
|
|
--libdir=${prefix}/lib/${name}-${cname} \
|
|
--sysconfdir=${prefix}/etc/${name}-${cname} \
|
|
--program-suffix=-${name}-${cname} \
|
|
--includedir=${prefix}/include/${name}-${cname}
|
|
|
|
# avoid dependency on port:bash
|
|
configure.env-append \
|
|
BASH_SHELL=/bin/bash
|
|
|
|
# setting xFLAGS resulting in mpicc, etc. always using these flags
|
|
# setting MPICHLIB_xFLAGS only uses them for building the library
|
|
foreach env_var {CFLAGS CPPFLAGS CXXFLAGS FFLAGS FCFLAGS} {
|
|
configure.args-append \
|
|
MPICHLIB_${env_var}=\"\$${env_var}\" \
|
|
${env_var}=""
|
|
}
|
|
|
|
# remove LDFLAGS mpicc, etc. and pkgconfig files
|
|
post-build {
|
|
foreach arch [get_canonical_archs] {
|
|
if {[variant_exists universal] && [variant_isset universal]} {
|
|
set dir ${worksrcpath}-${arch}
|
|
} else {
|
|
set dir ${worksrcpath}
|
|
}
|
|
foreach f [glob \
|
|
${dir}/src/env/*.bash \
|
|
${dir}/src/env/*.sh \
|
|
${dir}/src/packaging/pkgconfig/*.pc] {
|
|
reinplace \
|
|
"s| ${configure.ldflags}||g" \
|
|
${f}
|
|
reinplace \
|
|
"s| -arch ${arch}||g" \
|
|
${f}
|
|
}
|
|
}
|
|
}
|
|
|
|
post-destroot {
|
|
# This version doesn't supply doc/manpages
|
|
if {[file isdirectory ${destroot}${prefix}/share/man]} {
|
|
delete ${destroot}${prefix}/share/man
|
|
}
|
|
if {[file isdirectory ${destroot}${prefix}/share/doc]} {
|
|
delete ${destroot}${prefix}/share/doc
|
|
}
|
|
}
|
|
|
|
#---------------------------------------------------------------------------
|
|
# Fortran Support
|
|
#---------------------------------------------------------------------------
|
|
|
|
set fortran_enabled no
|
|
|
|
if { [string first gcc $cname] == 0 } {
|
|
set fortran_enabled yes
|
|
|
|
long_description-append "AND FORTRAN COMPILERS"
|
|
|
|
variant fortran description {Stub : fortran always enabled for gcc-based version} {}
|
|
default_variants-append +fortran
|
|
|
|
if {${cname} eq "gcc10" ||
|
|
${cname} eq "gcc11" ||
|
|
${cname} eq "gcc12" ||
|
|
${cname} eq "gcc13"} {
|
|
# see https://lists.mpich.org/pipermail/discuss/2020-January/005862.html
|
|
# see https://github.com/pmodels/mpich/issues/4300
|
|
# see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91556
|
|
configure.fflags-append -fallow-argument-mismatch
|
|
configure.fcflags-append -fallow-argument-mismatch
|
|
}
|
|
|
|
# GCC C++ always uses libstdc++
|
|
# see https://trac.macports.org/ticket/59185
|
|
configure.cxx_stdlib libstdc++
|
|
} else {
|
|
long_description-append "(AND THE FORTRAN COMPILER SELECTED BY THE VARIANT, IF ANY)"
|
|
|
|
compilers.allow_arguments_mismatch yes
|
|
compilers.choose fc f77 f90
|
|
compilers.setup default_fortran
|
|
|
|
if {[fortran_variant_isset]} {
|
|
set fortran_enabled yes
|
|
|
|
# Ask the portgroup for the correct dependency - the Fortran
|
|
# variants gccX and g95 match the name of the ports but
|
|
# gccdevel does not.
|
|
depends_lib-append [fortran_variant_depends]
|
|
|
|
if {[variant_isset g95]} {
|
|
configure.args-append lt_cv_ld_force_load=no
|
|
}
|
|
}
|
|
}
|
|
|
|
if {${fortran_enabled}} {
|
|
configure.args-replace --disable-fortran \
|
|
--enable-fortran
|
|
|
|
# avoid
|
|
# Python 3 is required to generate F90 bindings but not found!
|
|
set python_branch 3.13
|
|
set python_version [string map {. {}} ${python_branch}]
|
|
depends_build-append port:python${python_version}
|
|
depends_skip_archcheck-append port:python${python_version}
|
|
configure.python ${prefix}/bin/python${python_branch}
|
|
|
|
select.file ${filespath}/portselect/${name}-${cname}-fortran
|
|
}
|
|
|
|
unset fortran_enabled
|
|
|
|
#---------------------------------------------------------------------------
|
|
# Universal Build Support
|
|
#---------------------------------------------------------------------------
|
|
|
|
if {![info exists universal_possible]} {
|
|
set universal_possible [expr {${os.universal_supported} && [llength ${configure.universal_archs}] >= 2}]
|
|
}
|
|
# Fortran headers do not understand preprocessors commands like __LP64__
|
|
# Fortran mod files can not be merged for different architectures
|
|
# create a architecture specific folder for the non-build_arch architecture
|
|
if {${universal_possible} && [variant_isset universal]} {
|
|
patchfiles-append patch-universal_fortran.diff
|
|
post-patch {
|
|
if {${build_arch} eq "ppc" || ${build_arch} eq "ppc64"} {
|
|
set arch32 "ppc"
|
|
set arch64 "ppc64"
|
|
} else {
|
|
set arch32 "i386"
|
|
set arch64 "x86_64"
|
|
}
|
|
reinplace \
|
|
"s|__MACPORTS_32_BIT_ARCH__|${arch32}|g" \
|
|
${worksrcpath}/src/env/mpifort.bash.in
|
|
reinplace \
|
|
"s|__MACPORTS_64_BIT_ARCH__|${arch64}|g" \
|
|
${worksrcpath}/src/env/mpifort.bash.in
|
|
reinplace \
|
|
"s|__MACPORTS_BUILD_ARCH__|${build_arch}|g" \
|
|
${worksrcpath}/src/env/mpifort.bash.in
|
|
}
|
|
merger-post-destroot {
|
|
foreach arch ${configure.universal_archs} {
|
|
set incdir ${destroot}-${arch}${prefix}/include/${name}-${cname}
|
|
if {${arch} ne ${build_arch}} {
|
|
set archinc ${incdir}/${arch}
|
|
xinstall -d -m 0755 ${archinc}
|
|
foreach f [glob -nocomplain -directory ${incdir} *.mod mpif.h] {
|
|
move ${f} ${archinc}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#---------------------------------------------------------------------------
|
|
# Variants
|
|
#---------------------------------------------------------------------------
|
|
|
|
variant threads description {Build with full thread support} {
|
|
configure.args-append --enable-threads=multiple
|
|
}
|
|
|
|
variant gforker description {Use gforker process manager instead of the default hydra} {
|
|
configure.args-replace --with-pm=hydra \
|
|
--with-pm=gforker
|
|
}
|
|
|
|
variant native description {Build for local machine} {
|
|
configure.args-replace --enable-fast=O2 \
|
|
--enable-fast=all
|
|
# Note these need to be above the following foreach
|
|
if {${build_arch} in [list ppc ppc64]} {
|
|
configure.cflags-append -mtune=native
|
|
configure.cxxflags-append -mtune=native
|
|
} else {
|
|
configure.cflags-append -march=native
|
|
configure.cxxflags-append -march=native
|
|
}
|
|
}
|
|
|
|
#---------------------------------------------------------------------------
|
|
# Notes
|
|
#---------------------------------------------------------------------------
|
|
|
|
mpiutil_add_notes \
|
|
${name} ${subport} ${cname} ${select.file}
|
|
|
|
} elseif {${subport} eq ${name}} {
|
|
PortGroup stub 1.0
|
|
|
|
depends_lib-append port:${name}-default
|
|
|
|
livecheck.type regex
|
|
livecheck.regex {href=.([0-9.p]+)/}
|
|
livecheck.url ${homepage}/static/downloads/
|
|
}
|