contrib/intel/jenkins/build.py (195 lines of code) (raw):
import os
import sys
# add jenkins config location to PATH
sys.path.append(os.environ['CI_SITE_CONFIG'])
import ci_site_config
import argparse
import subprocess
import shlex
import common
import re
import shutil
def build_libfabric(libfab_install_path, mode):
if (os.path.exists(libfab_install_path) != True):
os.makedirs(libfab_install_path)
config_cmd = ['./configure', '--prefix={}'.format(libfab_install_path)]
enable_prov_val = 'yes'
if (mode == 'dbg'):
config_cmd.append('--enable-debug')
elif (mode == 'dl'):
enable_prov_val='dl'
for prov in common.enabled_prov_list:
config_cmd.append('--enable-{}={}'.format(prov, enable_prov_val))
for prov in common.disabled_prov_list:
config_cmd.append('--enable-{}=no'.format(prov))
config_cmd.append('--with-psm2-src={}/opa-psm2-lib'.format(workspace))
common.run_command(['./autogen.sh'])
common.run_command(shlex.split(" ".join(config_cmd)))
common.run_command(['make','clean'])
common.run_command(['make'])
common.run_command(['make','install'])
def build_fabtests(libfab_install_path, mode):
os.chdir('{}/fabtests'.format(workspace))
if (mode == 'dbg'):
config_cmd = ['./configure', '--enable-debug', '--prefix={}' \
.format(libfab_install_path),'--with-libfabric={}' \
.format(libfab_install_path)]
else:
config_cmd = ['./configure', '--prefix={}'.format(libfab_install_path),
'--with-libfabric={}'.format(libfab_install_path)]
common.run_command(['./autogen.sh'])
common.run_command(config_cmd)
common.run_command(['make','clean'])
common.run_command(['make'])
common.run_command(['make', 'install'])
def build_shmem(shmem_dir, libfab_install_path):
shmem_tar = ci_site_config.shmem_tar
if(os.path.exists(shmem_dir)):
os.rmdir(shmem_dir)
os.makedirs(shmem_dir)
os.chdir(shmem_dir)
os.makedirs('SOS')
common.run_command(['tar', '-xf', shmem_tar, '-C', 'SOS', '--strip-components=1'])
os.chdir('SOS')
common.run_command(['./autogen.sh'])
config_cmd = ['./configure', '--prefix={}'.format(shmem_dir), '--disable-fortran', \
'--enable-remote-virtual-addressing', '--disable-aslr-check', \
'--enable-pmi-simple', '--with-ofi={}'.format(libfab_install_path), \
'LDFLAGS=-fno-pie']
common.run_command(config_cmd)
common.run_command(['make','-j4'])
common.run_command(['make', 'check', 'TESTS='])
common.run_command(['make', 'install'])
def build_ISx(shmem_dir):
oshcc = '{}/bin/oshcc'.format(shmem_dir)
os.chdir(shmem_dir)
git_cmd = ['git', 'clone', '--depth', '1', 'https://github.com/ParRes/ISx.git', 'ISx']
common.run_command(git_cmd)
os.chdir('ISx/SHMEM')
common.run_command(['make', 'CC={}'.format(oshcc), 'LDLIBS=-lm'])
def build_PRK(shmem_dir):
oshcc = '{}/bin/oshcc'.format(shmem_dir)
shmem_src = '{}/SOS'.format(shmem_dir)
os.chdir(shmem_dir)
git_cmd = ['git', 'clone', '--depth', ' 1', 'https://github.com/ParRes/Kernels.git', 'PRK']
common.run_command(git_cmd)
os.chdir('PRK')
with open('common/make.defs','w') as f:
f.write('SHMEMCC={} -std=c99\nSHMEMTOP={}\n'.format(oshcc,shmem_src))
common.run_command(['make', 'allshmem'])
def build_uh(shmem_dir):
oshcc_bin = "{}/bin".format(shmem_dir)
os.environ["PATH"] += os.pathsep + oshcc_bin
os.chdir(shmem_dir)
git_cmd = ['git', 'clone', '--depth', '1', 'https://github.com/openshmem-org/tests-uh.git', 'tests-uh']
common.run_command(git_cmd)
os.chdir('tests-uh')
common.run_command(['make', '-j4', 'C_feature_tests'])
def build_mpi(mpi, mpisrc, mpi_install_path, libfab_install_path, ofi_build_mode):
build_mpi_path ="/mpibuilddir/{}-build-dir/{}/{}/{}".format(mpi, jobname, buildno, ofi_build_mode)
if (os.path.exists(build_mpi_path) == False):
os.makedirs(build_mpi_path)
os.chdir(build_mpi_path)
cmd = ["{}/configure".format(mpisrc),
"--disable-oshmem", "--prefix={}".format(mpi_install_path),
"--with-libfabric={}".format(libfab_install_path)]
if (mpi == 'ompi'):
cmd.append("--enable-mpi-fortran=no")
elif (mpi == 'mpich'):
cmd.append("--enable-fortran=no")
cmd.append("--with-device=ch4:ofi")
cmd.append("--enable-ch4-direct=netmod")
configure_cmd = shlex.split(" ".join(cmd))
common.run_command(configure_cmd)
common.run_command(["make", "clean"])
common.run_command(["make", "install", "-j32"])
def build_mpich_suite(mpi, mpi_install_path, libfab_install_path):
mpich_suite_path = '{}/test/'.format(ci_site_config.mpich_src)
mpichsuite_installpath= "{}/mpichsuite/test".format(mpi_install_path)
pwd = os.getcwd()
if (mpi == 'impi'):
os.chdir("{}/mpi".format(mpich_suite_path))
cmd = ["./configure", "--with-mpi={}/intel64" \
.format(ci_site_config.impi_root)]
configure_cmd = shlex.split(" ".join(cmd))
common.run_command(configure_cmd)
common.run_command(["make", "all","-j32"])
shutil.copytree(mpich_suite_path, mpichsuite_installpath)
common.run_command(["make", "distclean"])
os.chdir(pwd)
def build_stress_bm(mpi, mpi_install_path, libfab_install_path):
stress_install_path = "{}/stress".format(mpi_install_path)
if (os.path.exists(stress_install_path) == False):
os.makedirs(stress_install_path)
if (mpi == 'impi'):
os.environ['LD_LIBRARY_PATH'] = "{}/lib".format(libfab_install_path)
mpicc_path = "{}/intel64/bin/mpicc".format(ci_site_config.impi_root)
else:
os.environ['LD_LIBRARY_PATH'] = ""
mpicc_path = "{}/bin/mpicc".format(mpi_install_path)
cmd=" ".join([mpicc_path, '-lz', "{}/mpi_stress/mpi_stress.c" \
.format(ci_site_config.benchmarks['wfr-mpi-tests']),\
'-o', "{}/mpi_stress".format(stress_install_path)])
runcmd = shlex.split(cmd)
common.run_command(runcmd)
def build_osu_bm(mpi, mpi_install_path, libfab_install_path):
osu_install_path = "{}/osu".format(mpi_install_path)
if (os.path.exists(osu_install_path) == False):
os.makedirs(osu_install_path)
os.chdir(osu_install_path)
if (mpi == 'impi'):
os.environ['CC']="{}/intel64/bin/mpicc".format(ci_site_config.impi_root)
os.environ['CXX']="{}/intel64/bin/mpicxx".format(ci_site_config.impi_root)
os.environ['LD_LIBRARY_PATH'] = "{}/lib".format(libfab_install_path)
else:
os.environ['CC']="{}/bin/mpicc".format(mpi_install_path)
os.environ['CXX']="{}/bin/mpicxx".format(mpi_install_path)
os.environ['LD_LIBRARY_PATH']=""
os.environ['CFLAGS']="-I{}/util/".format(ci_site_config.benchmarks['osu'])
cmd = " ".join(["{}/configure".format(ci_site_config.benchmarks['osu']),
"--prefix={}".format(osu_install_path)])
configure_cmd = shlex.split(cmd)
common.run_command(configure_cmd)
common.run_command(["make", "-j4"])
common.run_command(["make", "install"])
if __name__ == "__main__":
#read Jenkins environment variables
# In Jenkins, JOB_NAME = 'ofi_libfabric/master' vs BRANCH_NAME = 'master'
# job name is better to use to distinguish between builds of different
# jobs but with same branch name.
jobname = os.environ['JOB_NAME']
buildno = os.environ['BUILD_NUMBER']
workspace = os.environ['WORKSPACE']
parser = argparse.ArgumentParser()
parser.add_argument("build_item", help="build libfabric or fabtests",
choices=['libfabric','fabtests', 'impi_benchmarks', \
'ompi_benchmarks', 'mpich_benchmarks', 'shmem'])
parser.add_argument("--ofi_build_mode", help="select buildmode debug or dl", \
choices=['dbg','dl'])
args = parser.parse_args()
build_item = args.build_item
if (args.ofi_build_mode):
ofi_build_mode = args.ofi_build_mode
else:
ofi_build_mode = 'reg'
install_path = "{installdir}/{jbname}/{bno}/{bmode}" \
.format(installdir=ci_site_config.install_dir,
jbname=jobname, bno=buildno,bmode=ofi_build_mode)
p = re.compile('mpi*')
if (build_item == 'libfabric'):
build_libfabric(install_path, ofi_build_mode)
elif (build_item == 'fabtests'):
build_fabtests(install_path, ofi_build_mode)
#if the build_item contains the string 'mpi'
elif (p.search(build_item)):
mpi = build_item[:-11] #extract the mpitype from '*mpi*_benchmarks' build_item
mpi_install_path = "{}/{}".format(install_path, mpi)
if (os.path.exists(mpi_install_path) == False):
os.makedirs(mpi_install_path)
if (mpi != 'impi'):
mpisrc = ci_site_config.mpich_src if mpi == 'mpich' \
else ci_site_config.ompi_src
# only need to build ompi or mpich, impi is available as binary
build_mpi(mpi, mpisrc, mpi_install_path, install_path, ofi_build_mode)
# build mpich_test_suite
build_mpich_suite(mpi, mpi_install_path, install_path)
# run stress and osu benchmarks for all mpitypes
build_stress_bm(mpi, mpi_install_path, install_path)
build_osu_bm(mpi, mpi_install_path, install_path)
elif (build_item == 'shmem'):
# build shmem
shmem_dir = "{}/shmem".format(install_path)
build_shmem(shmem_dir, install_path)
build_ISx(shmem_dir)
build_PRK(shmem_dir)
build_uh(shmem_dir)