From e5c555fa7d2eead153d43845cf4d9a4d2e3fa692 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Dec 2018 17:50:20 -0500 Subject: [PATCH] consolidate shared code from various Install.py files into install_helpers.py --- lib/Install.py | 45 ++----- lib/colvars/Install.py | 34 +++-- lib/colvars/Makefile.deps | 234 ----------------------------------- lib/gpu/Install.py | 37 +++--- lib/gpu/Makefile.linux | 2 +- lib/gpu/Makefile.linux_multi | 9 +- lib/install_helpers.py | 99 +++++++++++++++ lib/latte/Install.py | 86 +++---------- lib/message/Install.py | 44 ++----- lib/mscg/Install.py | 72 ++--------- lib/smd/Install.py | 62 +--------- lib/voronoi/Install.py | 70 ++--------- 12 files changed, 204 insertions(+), 590 deletions(-) create mode 100644 lib/install_helpers.py diff --git a/lib/Install.py b/lib/Install.py index d30cbffcf1..e1e6fc9a0a 100644 --- a/lib/Install.py +++ b/lib/Install.py @@ -6,34 +6,8 @@ from __future__ import print_function import sys,os,subprocess - -# help message - -help = """ -Syntax from src dir: make lib-libname args="-m machine -e suffix" -Syntax from lib dir: python Install.py -m machine -e suffix - -libname = name of lib dir (e.g. atc, h5md, meam, poems, etc) -specify -m and optionally -e, order does not matter - - -m = peform a clean followed by "make -f Makefile.machine" - machine = suffix of a lib/Makefile.* file - -e = set EXTRAMAKE variable in Makefile.machine to Makefile.lammps.suffix - does not alter existing Makefile.machine - -Examples: - -make lib-poems args="-m serial" # build POEMS lib with same settings as in the serial Makefile in src -make lib-colvars args="-m mpi" # build USER-COLVARS lib with same settings as in the mpi Makefile in src -make lib-meam args="-m ifort" # build MEAM lib with custom Makefile.ifort (using Intel Fortran) -""" - -# print error message or help - -def error(str=None): - if not str: print(help) - else: print("ERROR",str) - sys.exit() +sys.path.append('..') +from install_helpers import error,get_cpus # parse args @@ -83,17 +57,16 @@ for line in lines: fp.close() # make the library via Makefile.auto optionally with parallel make - -try: - import multiprocessing - n_cpus = multiprocessing.cpu_count() -except: - n_cpus = 1 +n_cpus = get_cpus() print("Building lib%s.a ..." % lib) cmd = "make -f Makefile.auto clean; make -f Makefile.auto -j%d" % n_cpus -txt = subprocess.check_output(cmd,shell=True,stderr=subprocess.STDOUT) -print(txt.decode('UTF-8')) +try: + txt = subprocess.check_output(cmd,shell=True,stderr=subprocess.STDOUT) + print(txt.decode('UTF-8')) +except subprocess.CalledProcessError as e: + print("Make failed with:\n %s" % e.output.decode('UTF-8')) + sys.exit(1) if os.path.exists("lib%s.a" % lib): print("Build was successful") else: error("Build of lib/%s/lib%s.a was NOT successful" % (lib,lib)) diff --git a/lib/colvars/Install.py b/lib/colvars/Install.py index 030644ceb5..a17c5bab5e 100644 --- a/lib/colvars/Install.py +++ b/lib/colvars/Install.py @@ -4,6 +4,8 @@ from __future__ import print_function import sys,os,subprocess +sys.path.append('..') +from install_helpers import error,get_cpus # help message @@ -24,18 +26,11 @@ Examples: make lib-colvars args="-m mpi" # build COLVARS lib with default mpi compiler wrapper """ -# print error message or help - -def error(str=None): - if not str: print(help) - else: print("ERROR",str) - sys.exit() - # parse args args = sys.argv[1:] nargs = len(args) -if nargs == 0: error() +if nargs == 0: error(help=help) machine = None extraflag = False @@ -43,15 +38,15 @@ extraflag = False iarg = 0 while iarg < nargs: if args[iarg] == "-m": - if iarg+2 > len(args): error() + if iarg+2 > len(args): error(help=help) machine = args[iarg+1] iarg += 2 elif args[iarg] == "-e": - if iarg+2 > len(args): error() + if iarg+2 > len(args): error(help=help) extraflag = True suffix = args[iarg+1] iarg += 2 - else: error() + else: error(help=help) # set lib from working dir @@ -124,17 +119,16 @@ fp.close() # make the library via Makefile.auto optionally with parallel make -try: - import multiprocessing - n_cpus = multiprocessing.cpu_count() -except: - n_cpus = 1 +n_cpus = get_cpus() print("Building lib%s.a ..." % lib) -cmd = ["make -f Makefile.auto clean"] -print(subprocess.check_output(cmd, shell=True).decode('UTF-8')) -cmd = ["make -f Makefile.auto -j%d" % n_cpus] -print(subprocess.check_output(cmd, shell=True).decode('UTF-8')) +cmd = ["make -f Makefile.auto clearn; make -f Makefile.auto -j%d" % n_cpus] +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) if os.path.exists("lib%s.a" % lib): print("Build was successful") else: error("Build of lib/%s/lib%s.a was NOT successful" % (lib,lib)) diff --git a/lib/colvars/Makefile.deps b/lib/colvars/Makefile.deps index a0d8515bc1..8b13789179 100644 --- a/lib/colvars/Makefile.deps +++ b/lib/colvars/Makefile.deps @@ -1,235 +1 @@ -$(COLVARS_OBJ_DIR)colvaratoms.o: colvaratoms.cpp colvarmodule.h \ - colvars_version.h colvarproxy.h colvartypes.h colvarvalue.h \ - colvarparse.h colvaratoms.h colvardeps.h -$(COLVARS_OBJ_DIR)colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h \ - colvars_version.h colvarproxy.h colvartypes.h colvarvalue.h colvar.h \ - colvarparse.h colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarbias_abf.h colvarbias.h colvargrid.h colvar_UIestimator.h -$(COLVARS_OBJ_DIR)colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h \ - colvars_version.h colvarbias.h colvar.h colvarvalue.h colvartypes.h \ - colvarparse.h colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarbias_alb.h -$(COLVARS_OBJ_DIR)colvarbias.o: colvarbias.cpp colvarmodule.h \ - colvars_version.h colvarproxy.h colvartypes.h colvarvalue.h colvarbias.h \ - colvar.h colvarparse.h colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvargrid.h -$(COLVARS_OBJ_DIR)colvarbias_histogram.o: colvarbias_histogram.cpp \ - colvarmodule.h colvars_version.h colvarproxy.h colvartypes.h \ - colvarvalue.h colvar.h colvarparse.h colvardeps.h \ - lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarbias_histogram.h colvarbias.h colvargrid.h -$(COLVARS_OBJ_DIR)colvarbias_meta.o: colvarbias_meta.cpp colvarmodule.h \ - colvars_version.h colvarproxy.h colvartypes.h colvarvalue.h colvar.h \ - colvarparse.h colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarbias_meta.h colvarbias.h colvargrid.h -$(COLVARS_OBJ_DIR)colvarbias_restraint.o: colvarbias_restraint.cpp \ - colvarmodule.h colvars_version.h colvarproxy.h colvartypes.h \ - colvarvalue.h colvarbias_restraint.h colvarbias.h colvar.h colvarparse.h \ - colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h -$(COLVARS_OBJ_DIR)colvarcomp_angles.o: colvarcomp_angles.cpp \ - colvarmodule.h colvars_version.h colvar.h colvarvalue.h colvartypes.h \ - colvarparse.h colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h colvarproxy.h -$(COLVARS_OBJ_DIR)colvarcomp_coordnums.o: colvarcomp_coordnums.cpp \ - colvarmodule.h colvars_version.h colvarparse.h colvarvalue.h \ - colvartypes.h colvaratoms.h colvarproxy.h colvardeps.h colvar.h \ - lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h -$(COLVARS_OBJ_DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h \ - colvars_version.h colvarvalue.h colvartypes.h colvar.h colvarparse.h \ - colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h colvarproxy.h -$(COLVARS_OBJ_DIR)colvarcomp_distances.o: colvarcomp_distances.cpp \ - colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ - colvarparse.h colvar.h colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h colvarproxy.h -$(COLVARS_OBJ_DIR)colvarcomp_protein.o: colvarcomp_protein.cpp \ - colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ - colvarparse.h colvar.h colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h colvarproxy.h -$(COLVARS_OBJ_DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp \ - colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ - colvarparse.h colvar.h colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h colvarproxy.h -$(COLVARS_OBJ_DIR)colvar.o: colvar.cpp colvarmodule.h colvars_version.h \ - colvarvalue.h colvartypes.h colvarparse.h colvar.h colvardeps.h \ - lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h colvarproxy.h colvarscript.h colvarbias.h -$(COLVARS_OBJ_DIR)colvardeps.o: colvardeps.cpp colvarmodule.h \ - colvars_version.h colvarproxy.h colvartypes.h colvarvalue.h colvardeps.h \ - colvarparse.h -$(COLVARS_OBJ_DIR)colvargrid.o: colvargrid.cpp colvarmodule.h \ - colvars_version.h colvarvalue.h colvartypes.h colvarparse.h colvar.h \ - colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarcomp.h colvaratoms.h colvarproxy.h colvargrid.h -$(COLVARS_OBJ_DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h \ - colvars_version.h colvarparse.h colvarvalue.h colvartypes.h \ - colvarproxy.h colvar.h colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarbias.h colvarbias_abf.h colvargrid.h colvar_UIestimator.h \ - colvarbias_alb.h colvarbias_histogram.h colvarbias_meta.h \ - colvarbias_restraint.h colvarscript.h colvaratoms.h colvarcomp.h -$(COLVARS_OBJ_DIR)colvarparse.o: colvarparse.cpp colvarmodule.h \ - colvars_version.h colvarvalue.h colvartypes.h colvarparse.h -$(COLVARS_OBJ_DIR)colvarproxy.o: colvarproxy.cpp colvarmodule.h \ - colvars_version.h colvarproxy.h colvartypes.h colvarvalue.h \ - colvarscript.h colvarbias.h colvar.h colvarparse.h colvardeps.h \ - lepton/include/Lepton.h lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvaratoms.h -$(COLVARS_OBJ_DIR)colvarscript.o: colvarscript.cpp colvarscript.h \ - colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ - colvarbias.h colvar.h colvarparse.h colvardeps.h lepton/include/Lepton.h \ - lepton/include/lepton/CompiledExpression.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/windowsIncludes.h \ - lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/ExpressionProgram.h \ - lepton/include/lepton/ExpressionTreeNode.h \ - lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ - lepton/include/lepton/Exception.h \ - lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ - colvarproxy.h -$(COLVARS_OBJ_DIR)colvartypes.o: colvartypes.cpp colvarmodule.h \ - colvars_version.h colvartypes.h colvarparse.h colvarvalue.h -$(COLVARS_OBJ_DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h \ - colvars_version.h colvarvalue.h colvartypes.h diff --git a/lib/gpu/Install.py b/lib/gpu/Install.py index 14549f53b8..612990c9c5 100644 --- a/lib/gpu/Install.py +++ b/lib/gpu/Install.py @@ -5,6 +5,8 @@ from __future__ import print_function import sys,os,subprocess +sys.path.append('..') +from install_helpers import error,get_cpus # help message @@ -51,18 +53,11 @@ make lib-gpu args="-m xk7 -p single -o xk7.single" # create new Makefile.xk make lib-gpu args="-m mpi -a sm_35 -p single -o mpi.mixed -b" # create new Makefile.mpi.mixed, also build GPU lib with these settings """ -# print error message or help - -def error(str=None): - if not str: print(help) - else: print("ERROR",str) - sys.exit() - # parse args args = sys.argv[1:] nargs = len(args) -if nargs == 0: error() +if nargs == 0: error(help=help) isuffix = "linux" hflag = aflag = pflag = eflag = 0 @@ -72,26 +67,26 @@ outflag = 0 iarg = 0 while iarg < nargs: if args[iarg] == "-m": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) isuffix = args[iarg+1] iarg += 2 elif args[iarg] == "-h": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) hflag = 1 hdir = args[iarg+1] iarg += 2 elif args[iarg] == "-a": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) aflag = 1 arch = args[iarg+1] iarg += 2 elif args[iarg] == "-p": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) pflag = 1 precision = args[iarg+1] iarg += 2 elif args[iarg] == "-e": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) eflag = 1 lmpsuffix = args[iarg+1] iarg += 2 @@ -99,11 +94,11 @@ while iarg < nargs: makeflag = 1 iarg += 1 elif args[iarg] == "-o": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) outflag = 1 osuffix = args[iarg+1] iarg += 2 - else: error() + else: error(help=help) if pflag: if precision == "double": precstr = "-D_DOUBLE_DOUBLE" @@ -145,9 +140,15 @@ if makeflag: print("Building libgpu.a ...") if os.path.exists("libgpu.a"): os.remove("libgpu.a") - cmd = "make -f Makefile.auto clean; make -f Makefile.auto" - txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - print(txt.decode('UTF-8')) + n_cpus = get_cpus() + cmd = "make -f Makefile.auto clean; make -f Makefile.auto -j%d" % n_cpus + 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) + if not os.path.exists("libgpu.a"): error("Build of lib/gpu/libgpu.a was NOT successful") if not os.path.exists("Makefile.lammps"): diff --git a/lib/gpu/Makefile.linux b/lib/gpu/Makefile.linux index 6b63b26398..7001c6d8b9 100644 --- a/lib/gpu/Makefile.linux +++ b/lib/gpu/Makefile.linux @@ -55,7 +55,7 @@ CUDA_PRECISION = -D_SINGLE_DOUBLE CUDA_INCLUDE = -I$(CUDA_HOME)/include CUDA_LIB = -L$(CUDA_HOME)/lib64 -CUDA_OPTS = -DUNIX -O3 -Xptxas -v --use_fast_math $(LMP_INC) -Xcompiler -fPIC +CUDA_OPTS = -DUNIX -O3 --use_fast_math $(LMP_INC) -Xcompiler -fPIC CUDR_CPP = mpicxx -DMPI_GERYON -DUCL_NO_EXIT -DMPICH_IGNORE_CXX_SEEK -DOMPI_SKIP_MPICXX=1 -fPIC CUDR_OPTS = -O2 $(LMP_INC) # -xHost -no-prec-div -ansi-alias diff --git a/lib/gpu/Makefile.linux_multi b/lib/gpu/Makefile.linux_multi index 02b405ac35..2f75ca0e2b 100644 --- a/lib/gpu/Makefile.linux_multi +++ b/lib/gpu/Makefile.linux_multi @@ -19,8 +19,13 @@ NVCC = nvcc #CUDA_ARCH = -arch=sm_13 # older CUDA #CUDA_ARCH = -arch=sm_10 -DCUDA_PRE_THREE +CUDA_ARCH = -arch=sm_30 -CUDA_ARCH = -gencode arch=compute_60,code=sm_60 -gencode arch=compute_61,code=sm_61 +CUDA_CODE = -gencode arch=compute_60,code=[sm_60,compute_60] -gencode arch=compute_61,code=[sm_61,compute_61] \ + -gencode arch=compute_30,code=[sm_30,compute_30] -gencode arch=compute_35,code=[sm_35,compute_35] \ + -gencode arch=compute_50,code=[sm_50,compute_50] -gencode arch=compute_52,code=[sm_52,compute_52] + +CUDA_ARCH += $(CUDA_CODE) # this setting should match LAMMPS Makefile # one of LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG and LAMMPS_SMALLSMALL @@ -36,7 +41,7 @@ CUDA_PRECISION = -D_SINGLE_DOUBLE CUDA_INCLUDE = -I$(CUDA_HOME)/include CUDA_LIB = -L$(CUDA_HOME)/lib64 -CUDA_OPTS = -DUNIX -O3 -Xptxas -v --use_fast_math $(LMP_INC) -Xcompiler "-fPIC -std=c++98" +CUDA_OPTS = -DUNIX -O3 --use_fast_math $(LMP_INC) -Xcompiler "-fPIC -std=c++98" CUDR_CPP = mpicxx -DMPI_GERYON -DUCL_NO_EXIT -DMPICH_IGNORE_CXX_SEEK -DOMPI_SKIP_MPICXX=1 -fPIC CUDR_OPTS = -O2 $(LMP_INC) # -xHost -no-prec-div -ansi-alias diff --git a/lib/install_helpers.py b/lib/install_helpers.py new file mode 100644 index 0000000000..428b801502 --- /dev/null +++ b/lib/install_helpers.py @@ -0,0 +1,99 @@ +import hashlib,os,subprocess,sys + +# default help message + +defhelp = """ +Syntax from src dir: make lib-libname args="-m machine -e suffix" +Syntax from lib dir: python Install.py -m machine -e suffix + +libname = name of lib dir (e.g. atc, h5md, meam, poems, etc) +specify -m and optionally -e, order does not matter + + -m = peform a clean followed by "make -f Makefile.machine" + machine = suffix of a lib/Makefile.* file + -e = set EXTRAMAKE variable in Makefile.machine to Makefile.lammps.suffix + does not alter existing Makefile.machine + +Examples: + +make lib-poems args="-m serial" # build POEMS lib with same settings as in the serial Makefile in src +make lib-colvars args="-m mpi" # build USER-COLVARS lib with same settings as in the mpi Makefile in src +make lib-meam args="-m ifort" # build MEAM lib with custom Makefile.ifort (using Intel Fortran) +""" + +# print error message or help +def error(str=None,help=None): + if not str: + if not help: + print(defhelp) + else: + print(help) + else: print("ERROR",str) + sys.exit() + +# try to auto-detect the maximum number of available CPUs +def get_cpus(): + try: + import multiprocessing + n_cpus = multiprocessing.cpu_count() + except: + n_cpus = 1 + return n_cpus + +# expand to full path name +# process leading '~' or relative path + +def fullpath(path): + return os.path.abspath(os.path.expanduser(path)) + +def which(program): + def is_exe(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + + fpath, fname = os.path.split(program) + if fpath: + if is_exe(program): + return program + else: + for path in os.environ["PATH"].split(os.pathsep): + path = path.strip('"') + exe_file = os.path.join(path, program) + if is_exe(exe_file): + return exe_file + + return None + +def geturl(url,fname): + success = False + + if which('curl') != None: + cmd = 'curl -L -o "%s" %s' % (fname,url) + try: + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + success = True + except subprocess.CalledProcessError as e: + print("Calling curl failed with: %s" % e.output.decode('UTF-8')) + + if not success and which('wget') != None: + cmd = 'wget -O "%s" %s' % (fname,url) + try: + subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + success = True + except subprocess.CalledProcessError as e: + print("Calling wget failed with: %s" % e.output.decode('UTF-8')) + + if not success: + error("Failed to download source code with 'curl' or 'wget'") + return + +def checkmd5sum(md5sum,fname): + with open(fname,'rb') as fh: + m = hashlib.md5() + while True: + data = fh.read(81920) + if not data: + break + m.update(data) + fh.close() + return m.hexdigest() == md5sum + diff --git a/lib/latte/Install.py b/lib/latte/Install.py index 07f89e9150..d9cc2a851a 100644 --- a/lib/latte/Install.py +++ b/lib/latte/Install.py @@ -4,7 +4,9 @@ # used to automate the steps described in the README file in this dir from __future__ import print_function -import sys,os,re,subprocess,hashlib,shutil +import sys,os,re,subprocess,shutil +sys.path.append('..') +from install_helpers import error,get_cpus,fullpath,which,geturl,checkmd5sum # help message @@ -43,75 +45,11 @@ checksums = { \ '1.2.1' : '85ac414fdada2d04619c8f936344df14', \ } -# print error message or help - -def error(str=None): - if not str: print(help) - else: print("ERROR",str) - sys.exit() - -# expand to full path name -# process leading '~' or relative path - -def fullpath(path): - return os.path.abspath(os.path.expanduser(path)) - -def which(program): - def is_exe(fpath): - return os.path.isfile(fpath) and os.access(fpath, os.X_OK) - - fpath, fname = os.path.split(program) - if fpath: - if is_exe(program): - return program - else: - for path in os.environ["PATH"].split(os.pathsep): - path = path.strip('"') - exe_file = os.path.join(path, program) - if is_exe(exe_file): - return exe_file - - return None - -def geturl(url,fname): - success = False - - if which('curl') != None: - cmd = 'curl -L -o "%s" %s' % (fname,url) - try: - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - success = True - except subprocess.CalledProcessError as e: - print("Calling curl failed with: %s" % e.output.decode('UTF-8')) - - if not success and which('wget') != None: - cmd = 'wget -O "%s" %s' % (fname,url) - try: - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - success = True - except subprocess.CalledProcessError as e: - print("Calling wget failed with: %s" % e.output.decode('UTF-8')) - - if not success: - error("Failed to download source code with 'curl' or 'wget'") - return - -def checkmd5sum(md5sum,fname): - with open(fname,'rb') as fh: - m = hashlib.md5() - while True: - data = fh.read(81920) - if not data: - break - m.update(data) - fh.close() - return m.hexdigest() == md5sum - # parse args args = sys.argv[1:] nargs = len(args) -if nargs == 0: error() +if nargs == 0: error(help=help) homepath = "." @@ -123,7 +61,7 @@ linkflag = True iarg = 0 while iarg < nargs: if args[iarg] == "-p": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) lattedir = fullpath(args[iarg+1]) pathflag = True iarg += 2 @@ -131,15 +69,15 @@ while iarg < nargs: buildflag = True iarg += 1 elif args[iarg] == "-m": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) suffix = args[iarg+1] suffixflag = True iarg += 2 elif args[iarg] == "-v": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) version = args[iarg+1] iarg += 2 - else: error() + else: error(help=help) homedir = "LATTE-%s" % version @@ -177,8 +115,12 @@ if buildflag: if buildflag: print("Building LATTE ...") cmd = 'cd "%s"; make' % lattedir - txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - print(txt.decode('UTF-8')) + 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) # create 3 links in lib/latte to LATTE dirs # do this -b or -p is set diff --git a/lib/message/Install.py b/lib/message/Install.py index d3f31c986f..293ff74d68 100644 --- a/lib/message/Install.py +++ b/lib/message/Install.py @@ -5,6 +5,8 @@ from __future__ import print_function import sys,os,re,subprocess +sys.path.append('..') +from install_helpers import error,get_cpus,fullpath,which # help message @@ -26,41 +28,11 @@ make lib-message args="-m -z" # build parallel CSlib with ZMQ support make lib-message args="-s" # build serial CSlib with no ZMQ support """ -# print error message or help - -def error(str=None): - if not str: print(help) - else: print("ERROR",str) - sys.exit() - -# expand to full path name -# process leading '~' or relative path - -def fullpath(path): - return os.path.abspath(os.path.expanduser(path)) - -def which(program): - def is_exe(fpath): - return os.path.isfile(fpath) and os.access(fpath, os.X_OK) - - fpath, fname = os.path.split(program) - if fpath: - if is_exe(program): - return program - else: - for path in os.environ["PATH"].split(os.pathsep): - path = path.strip('"') - exe_file = os.path.join(path, program) - if is_exe(exe_file): - return exe_file - - return None - # parse args args = sys.argv[1:] nargs = len(args) -if nargs == 0: error() +if nargs == 0: error(help=help) mpiflag = False serialflag = False @@ -77,7 +49,7 @@ while iarg < nargs: elif args[iarg] == "-z": zmqflag = True iarg += 1 - else: error() + else: error(help=help) if (not mpiflag and not serialflag): error("Must use either -m or -s flag") @@ -102,8 +74,12 @@ elif not mpiflag and not zmqflag: cmd = "cd %s; make lib_serial zmq=no" % srcdir print(cmd) -txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) -print(txt.decode('UTF-8')) +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) if mpiflag: cmd = "cd %s; cp libcsmpi.a libmessage.a" % srcdir else: cmd = "cd %s; cp libcsnompi.a libmessage.a" % srcdir diff --git a/lib/mscg/Install.py b/lib/mscg/Install.py index d613532d39..5c0164f4a5 100644 --- a/lib/mscg/Install.py +++ b/lib/mscg/Install.py @@ -5,6 +5,8 @@ from __future__ import print_function import sys,os,re,subprocess,shutil +sys.path.append('..') +from install_helpers import error,get_cpus,fullpath,which,get_cpus,geturl # help message @@ -35,64 +37,11 @@ url = "https://github.com/uchicago-voth/MSCG-release/archive/%s.tar.gz" % mscgve tarfile = "MS-CG-%s.tar.gz" % mscgver tardir = "MSCG-release-%s" % mscgver -# print error message or help - -def error(str=None): - if not str: print(help) - else: print("ERROR",str) - sys.exit() - -# expand to full path name -# process leading '~' or relative path - -def fullpath(path): - return os.path.abspath(os.path.expanduser(path)) - -def which(program): - def is_exe(fpath): - return os.path.isfile(fpath) and os.access(fpath, os.X_OK) - - fpath, fname = os.path.split(program) - if fpath: - if is_exe(program): - return program - else: - for path in os.environ["PATH"].split(os.pathsep): - path = path.strip('"') - exe_file = os.path.join(path, program) - if is_exe(exe_file): - return exe_file - - return None - -def geturl(url,fname): - success = False - - if which('curl') != None: - cmd = 'curl -L -o "%s" %s' % (fname,url) - try: - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - success = True - except subprocess.CalledProcessError as e: - print("Calling curl failed with: %s" % e.output.decode('UTF-8')) - - if not success and which('wget') != None: - cmd = 'wget -O "%s" %s' % (fname,url) - try: - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - success = True - except subprocess.CalledProcessError as e: - print("Calling wget failed with: %s" % e.output.decode('UTF-8')) - - if not success: - error("Failed to download source code with 'curl' or 'wget'") - return - # parse args args = sys.argv[1:] nargs = len(args) -if nargs == 0: error() +if nargs == 0: error(help=help) homepath = "." homedir = tardir @@ -105,18 +54,18 @@ msuffix = "g++_simple" iarg = 0 while iarg < nargs: if args[iarg] == "-p": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) mscgpath = fullpath(args[iarg+1]) pathflag = True iarg += 2 elif args[iarg] == "-m": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) msuffix = args[iarg+1] iarg += 2 elif args[iarg] == "-b": buildflag = True iarg += 1 - else: error() + else: error(help=help) homepath = fullpath(homepath) homedir = "%s/%s" % (homepath,homedir) @@ -160,8 +109,13 @@ if buildflag: (homedir,msuffix,msuffix) else: error("Cannot find Makefile.%s" % msuffix) - txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - print(txt.decode('UTF-8')) + 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) + if not os.path.exists("Makefile.lammps"): print("Creating Makefile.lammps") if os.path.exists("Makefile.lammps.%s" % msuffix): diff --git a/lib/smd/Install.py b/lib/smd/Install.py index 8d83b0f78a..e7038611ea 100644 --- a/lib/smd/Install.py +++ b/lib/smd/Install.py @@ -5,6 +5,8 @@ from __future__ import print_function import sys,os,re,glob,subprocess,shutil +sys.path.append('..') +from install_helpers import error,get_cpus,fullpath,which,geturl # help message @@ -34,64 +36,12 @@ make lib-smd args="-p /usr/include/eigen3" # use existing Eigen installation in version = '3.3.4' tarball = "eigen.tar.gz" -# print error message or help - -def error(str=None): - if not str: print(help) - else: print("ERROR",str) - sys.exit() - -# expand to full path name -# process leading '~' or relative path - -def fullpath(path): - return os.path.abspath(os.path.expanduser(path)) - -def which(program): - def is_exe(fpath): - return os.path.isfile(fpath) and os.access(fpath, os.X_OK) - - fpath, fname = os.path.split(program) - if fpath: - if is_exe(program): - return program - else: - for path in os.environ["PATH"].split(os.pathsep): - path = path.strip('"') - exe_file = os.path.join(path, program) - if is_exe(exe_file): - return exe_file - - return None - -def geturl(url,fname): - success = False - - if which('curl') != None: - cmd = 'curl -L -o "%s" %s' % (fname,url) - try: - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - success = True - except subprocess.CalledProcessError as e: - print("Calling curl failed with: %s" % e.output.decode('UTF-8')) - - if not success and which('wget') != None: - cmd = 'wget -O "%s" %s' % (fname,url) - try: - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - success = True - except subprocess.CalledProcessError as e: - print("Calling wget failed with: %s" % e.output.decode('UTF-8')) - - if not success: - error("Failed to download source code with 'curl' or 'wget'") - return # parse args args = sys.argv[1:] nargs = len(args) -if nargs == 0: error() +if nargs == 0: error(help=help) homepath = "." homedir = "eigen3" @@ -103,18 +53,18 @@ linkflag = True iarg = 0 while iarg < nargs: if args[iarg] == "-v": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) version = args[iarg+1] iarg += 2 elif args[iarg] == "-p": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) eigenpath = fullpath(args[iarg+1]) pathflag = True iarg += 2 elif args[iarg] == "-b": buildflag = True iarg += 1 - else: error() + else: error(help=help) homepath = fullpath(homepath) diff --git a/lib/voronoi/Install.py b/lib/voronoi/Install.py index 4e8b457905..6df3d89679 100644 --- a/lib/voronoi/Install.py +++ b/lib/voronoi/Install.py @@ -5,6 +5,8 @@ from __future__ import print_function import sys,os,re,subprocess,shutil +sys.path.append('..') +from install_helpers import error,get_cpus,fullpath,which,geturl # help message @@ -33,64 +35,12 @@ make lib-voronoi args="-p $HOME/voro++-0.4.6" # use existing Voro++ installation version = "voro++-0.4.6" url = "http://math.lbl.gov/voro++/download/dir/%s.tar.gz" % version -# print error message or help - -def error(str=None): - if not str: print(help) - else: print("ERROR",str) - sys.exit() - -# expand to full path name -# process leading '~' or relative path - -def fullpath(path): - return os.path.abspath(os.path.expanduser(path)) - -def which(program): - def is_exe(fpath): - return os.path.isfile(fpath) and os.access(fpath, os.X_OK) - - fpath, fname = os.path.split(program) - if fpath: - if is_exe(program): - return program - else: - for path in os.environ["PATH"].split(os.pathsep): - path = path.strip('"') - exe_file = os.path.join(path, program) - if is_exe(exe_file): - return exe_file - - return None - -def geturl(url,fname): - success = False - - if which('curl') != None: - cmd = 'curl -L -o "%s" %s' % (fname,url) - try: - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - success = True - except subprocess.CalledProcessError as e: - print("Calling curl failed with: %s" % e.output.decode('UTF-8')) - - if not success and which('wget') != None: - cmd = 'wget -O "%s" %s' % (fname,url) - try: - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - success = True - except subprocess.CalledProcessError as e: - print("Calling wget failed with: %s" % e.output.decode('UTF-8')) - - if not success: - error("Failed to download source code with 'curl' or 'wget'") - return # parse args args = sys.argv[1:] nargs = len(args) -if nargs == 0: error() +if nargs == 0: error(help=help) homepath = "." homedir = version @@ -102,18 +52,18 @@ linkflag = True iarg = 0 while iarg < nargs: if args[iarg] == "-v": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) version = args[iarg+1] iarg += 2 elif args[iarg] == "-p": - if iarg+2 > nargs: error() + if iarg+2 > nargs: error(help=help) voropath = fullpath(args[iarg+1]) pathflag = True iarg += 2 elif args[iarg] == "-b": buildflag = True iarg += 1 - else: error() + else: error(help=help) homepath = fullpath(homepath) homedir = "%s/%s" % (homepath,version) @@ -150,8 +100,12 @@ if buildflag: if buildflag: print("Building Voro++ ...") cmd = 'cd "%s"; make CXX=g++ CFLAGS="-fPIC -O3"' % homedir - txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - print(txt.decode('UTF-8')) + 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) # create 2 links in lib/voronoi to Voro++ src dir