diff --git a/lib/scafacos/.gitignore b/lib/scafacos/.gitignore index 66523c0cb3..2752e713ed 100644 --- a/lib/scafacos/.gitignore +++ b/lib/scafacos/.gitignore @@ -1,3 +1,4 @@ /scafacos* /includelink /liblink +/build diff --git a/lib/scafacos/Install.py b/lib/scafacos/Install.py index 34247839cd..ee21f26945 100644 --- a/lib/scafacos/Install.py +++ b/lib/scafacos/Install.py @@ -1,14 +1,23 @@ #!/usr/bin/env python -# Install.py tool to download, unpack, build, and link to the Scafacos library +# Install.py tool to download, unpack, build, and link to the ScaFaCoS library # used to automate the steps described in the README file in this dir from __future__ import print_function import sys,os,re,subprocess,shutil sys.path.append('..') -from install_helpers import error,fullpath,which,geturl +from install_helpers import fullpath,geturl,get_cpus +from argparse import ArgumentParser -# help message +parser = ArgumentParser(prog='Install.py', + description="LAMMPS library build wrapper script") + +# settings + +version = "1.0.1" +url = "https://github.com/scafacos/scafacos/releases/download/v%s/scafacos-%s.tar.gz" % (version, version) + +# extra help message help = """ Syntax from src dir: make lib-scafacos args="-b" @@ -16,101 +25,84 @@ Syntax from src dir: make lib-scafacos args="-b" Syntax from lib dir: python Install.py -b or: python Install.py -p /usr/local/scafacos -specify zero or more options, order does not matter - - -b = download and build the Scafacos library - -p = specify folder of existing Scafacos installation - - always creates includelink, liblink to Scafacos dirs - Example: make lib-scafacos args="-b" # download/build in lib/scafacos/scafacos -make lib-scafacos args="-p $HOME/scafacos" # use existing Scafacos installation in $HOME +make lib-scafacos args="-p $HOME/scafacos" # use existing ScaFaCoS installation in $HOME """ -# settings +# parse and process arguments -version = "scafacos-1.0.1" -url = "https://github.com/scafacos/scafacos/releases/download/v1.0.1/scafacos-1.0.1.tar.gz" -#url = "https://gigamove.rz.rwth-aachen.de/d/id/CTzyApN76MXMJ6/dd/100" % version +pgroup = parser.add_mutually_exclusive_group() +pgroup.add_argument("-b", "--build", action="store_true", + help="download and build the ScaFaCoS library") +pgroup.add_argument("-p", "--path", + help="specify folder of existing ScaFaCoS installation") +parser.add_argument("-v", "--version", default=version, + help="set version of ScaFaCoS to download and build (default: %s)" % version) -# parse args +args = parser.parse_args() -args = sys.argv[1:] -nargs = len(args) +# print help message and exit, if neither build nor path options are given +if args.build == False and not args.path: + parser.print_help() + sys.exit(help) -homepath = "." +buildflag = args.build +pathflag = args.path != None -buildflag = True -pathflag = False -linkflag = True - -iarg = 0 -while iarg < nargs: - if args[iarg] == "-v": - if iarg+2 > nargs: error(help=help) - version = args[iarg+1] - iarg += 2 - elif args[iarg] == "-p": - if iarg+2 > nargs: error(help=help) - scafacospath = fullpath(args[iarg+1]) - pathflag = True - iarg += 2 - elif args[iarg] == "-b": - buildflag = True - iarg += 1 - else: error(help=help) - -homepath = fullpath(homepath) -homedir = "%s/%s" % (homepath,version) +homepath = fullpath(".") +scafacospath = "%s/scafacos-%s" % (homepath,version) if (pathflag): - if not os.path.isdir(scafacospath): error("Scafacos path does not exist") - homedir =scafacospath + scafacospath = args.path + if not os.path.isdir("%s/include" % scafacospath): + sys.exit("ScaFaCoS include path for %s does not exist" % scafacospath) + if (not os.path.isdir("%s/lib64" % scafacospath)) \ + and (not os.path.isdir("%s/lib" % scafacospath)): + sys.exit("ScaFaCoS lib path for %s does not exist" % scafacospath) + scafacospath = fullpath(scafacospath) -if (buildflag and pathflag): - error("Cannot use -b and -p flag at the same time") - -# download and unpack Scafacos tarball +# download and unpack ScaFaCoS tarball if buildflag: - print("Downloading Scafacos ...") - geturl(url,"%s/%s.tar.gz" % (homepath,version)) + print("Downloading ScaFaCoS ...") + geturl(url,"%s/scafacos-%s.tar.gz" % (homepath,version)) - print("Unpacking Scafacos tarball ...") - if os.path.exists("%s/%s" % (homepath,version)): - shutil.rmtree("%s/%s" % (homepath,version)) - cmd = 'cd "%s"; tar -xzvf %s.tar.gz' % (homepath,version) + print("Unpacking ScaFaCoS tarball ...") + if os.path.exists(scafacospath): + shutil.rmtree(scafacospath) + cmd = 'cd "%s"; tar -xzvf %s.tar.gz' % (homepath,scafacospath) subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - os.remove("%s/%s.tar.gz" % (homepath,version)) - if os.path.basename(homedir) != version: - if os.path.exists(homedir): - shutil.rmtree(homedir) - os.rename("%s/%s" % (homepath,version),homedir) + os.remove("%s.tar.gz" % scafacospath) -# build Scafacos - -if buildflag: - print("Building Scafacos ...") - n_cpu = get_gpus() - cmd = 'cd "%s"; ./configure --prefix="%s/build" --disable-doc --enable-fcs-solvers=fmm,p2nfft,direct,ewald,p3m --with-internal-fftw --with-internal-pfft --with-internal-pnfft CC=mpicc FC=mpif90 CXX=mpicxx F77=; make -j%d; make install' % (homedir,homedir,n_cpu) + # build ScaFaCoS + print("Building ScaFaCoS ...") + n_cpu = get_cpus() + cmd = 'cd "%s"; ./configure --prefix="%s/build" --disable-doc --enable-fcs-solvers=fmm,p2nfft,direct,ewald,p3m --with-internal-fftw --with-internal-pfft --with-internal-pnfft CC=mpicc FC=mpif90 CXX=mpicxx F77=; make -j%d; make install' % (scafacospath,homepath,n_cpu) try: txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) print(txt.decode('UTF-8')) except subprocess.CalledProcessError as e: - print("Make failed with:\n %s" % e.output.decode('UTF-8')) - sys.exit(1) + sys.exit("Make failed with:\n %s" % e.output.decode('UTF-8')) -# create 2 links in lib/scafacos to Scafacos include/lib dirs +# create 2 links in lib/scafacos to ScaFaCoS include/lib dirs -if linkflag: - print("Creating links to Scafacos include and lib files") - if os.path.isfile("includelink") or os.path.islink("includelink"): - os.remove("includelink") - if os.path.isfile("liblink") or os.path.islink("liblink"): - os.remove("liblink") - cmd = 'ln -s "%s/build/include" includelink' % homedir +print("Creating links to ScaFaCoS include and lib files") +if os.path.isfile("includelink") or os.path.islink("includelink"): + os.remove("includelink") +if os.path.isfile("liblink") or os.path.islink("liblink"): + os.remove("liblink") +if buildflag: + cmd = 'ln -s "%s/build/include" includelink' % homepath subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - cmd = 'ln -s "%s/build/lib" liblink' % homedir + cmd = 'ln -s "%s/build/lib" liblink' % homepath + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) +else: + cmd = 'ln -s "%s/include" includelink' % scafacospath + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + if os.path.isdir("%s/lib64" % scafacospath): + cmd = 'ln -s "%s/lib64" liblink' % scafacospath + else: + cmd = 'ln -s "%s/lib" liblink' % scafacospath subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True)