Skip to content
Snippets Groups Projects
Verified Commit 726b8b79 authored by Simon Schwitanski's avatar Simon Schwitanski :slight_smile:
Browse files

Add error class mapping for MUST

parent 283dc071
No related branches found
No related tags found
1 merge request!20Parsing and tools updates
...@@ -5,6 +5,7 @@ import shutil ...@@ -5,6 +5,7 @@ import shutil
import json import json
from MBIutils import * from MBIutils import *
def must_filter(line, process): def must_filter(line, process):
if re.search("ERROR: MUST detected a deadlock", line): if re.search("ERROR: MUST detected a deadlock", line):
pid = process.pid pid = process.pid
...@@ -16,6 +17,7 @@ def must_filter(line, process): ...@@ -16,6 +17,7 @@ def must_filter(line, process):
except ProcessLookupError: except ProcessLookupError:
pass # Ok, it's gone now pass # Ok, it's gone now
class V18(AbstractTool): class V18(AbstractTool):
def identify(self): def identify(self):
return "MUST v1.9.2 wrapper" return "MUST v1.9.2 wrapper"
...@@ -25,25 +27,32 @@ class V18(AbstractTool): ...@@ -25,25 +27,32 @@ class V18(AbstractTool):
def build(self, rootdir, cached=True): def build(self, rootdir, cached=True):
if cached and os.path.exists("/MBI-builds/MUST192/bin/mustrun"): if cached and os.path.exists("/MBI-builds/MUST192/bin/mustrun"):
os.environ['PATH'] = os.environ['PATH'] + ":/MBI-builds/MUST192/bin/" os.environ['PATH'] = os.environ['PATH'] + \
":/MBI-builds/MUST192/bin/"
os.environ['OMPI_CC'] = "clang-14" os.environ['OMPI_CC'] = "clang-14"
return return
subprocess.run(f"rm -rf /MBI-builds/MUST192", shell=True, check=True) # MUST sometimes fails when reinstalling over the same dir # MUST sometimes fails when reinstalling over the same dir
subprocess.run(f"rm -rf /MBI-builds/MUST192", shell=True, check=True)
# Build it # Build it
here = os.getcwd() # Save where we were here = os.getcwd() # Save where we were
subprocess.run(f"rm -rf /tmp/build-must ; mkdir /tmp/build-must", shell=True, check=True) subprocess.run(
f"rm -rf /tmp/build-must ; mkdir /tmp/build-must", shell=True, check=True)
os.chdir("/tmp/build-must") os.chdir("/tmp/build-must")
subprocess.run(f"wget https://hpc.rwth-aachen.de/must/files/MUST-v1.9.2.tar.gz", shell=True, check=True) subprocess.run(
f"wget https://hpc.rwth-aachen.de/must/files/MUST-v1.9.2.tar.gz", shell=True, check=True)
subprocess.run(f"tar xfz MUST-*.tar.gz", shell=True, check=True) subprocess.run(f"tar xfz MUST-*.tar.gz", shell=True, check=True)
subprocess.run(f"mkdir -p /tmp/build-must/build", shell=True, check=True) subprocess.run(f"mkdir -p /tmp/build-must/build",
shell=True, check=True)
os.chdir("/tmp/build-must/build") os.chdir("/tmp/build-must/build")
subprocess.run(f"CC=$(which gcc) CXX=$(which gcc++) cmake ../MUST-v1.9.2 -DCMAKE_INSTALL_PREFIX=/MBI-builds/MUST192 -DCMAKE_BUILD_TYPE=Release -DENABLE_FORTRAN=OFF -DENABLE_TYPEART=On", shell=True, check=True) subprocess.run(f"CC=$(which gcc) CXX=$(which gcc++) cmake ../MUST-v1.9.2 -DCMAKE_INSTALL_PREFIX=/MBI-builds/MUST192 -DCMAKE_BUILD_TYPE=Release -DENABLE_FORTRAN=OFF -DENABLE_TYPEART=On", shell=True, check=True)
# subprocess.run(f"CC=$(which clang) CXX=$(which clang++) cmake ../MUST-v1.9.2 -DCMAKE_INSTALL_PREFIX=/MBI-builds/MUST192 -DCMAKE_BUILD_TYPE=Release -DENABLE_FORTRAN=OFF -DENABLE_TYPEART=On", shell=True, check=True) # subprocess.run(f"CC=$(which clang) CXX=$(which clang++) cmake ../MUST-v1.9.2 -DCMAKE_INSTALL_PREFIX=/MBI-builds/MUST192 -DCMAKE_BUILD_TYPE=Release -DENABLE_FORTRAN=OFF -DENABLE_TYPEART=On", shell=True, check=True)
subprocess.run(f"make -j$(nproc) install VERBOSE=1", shell=True, check=True) subprocess.run(f"make -j$(nproc) install VERBOSE=1",
subprocess.run(f"make -j$(nproc) install-prebuilds VERBOSE=1", shell=True, check=True) shell=True, check=True)
subprocess.run(
f"make -j$(nproc) install-prebuilds VERBOSE=1", shell=True, check=True)
subprocess.run(f"rm -rf /tmp/build-must", shell=True, check=True) subprocess.run(f"rm -rf /tmp/build-must", shell=True, check=True)
# Back to our previous directory # Back to our previous directory
...@@ -57,7 +66,8 @@ class V18(AbstractTool): ...@@ -57,7 +66,8 @@ class V18(AbstractTool):
def run(self, execcmd, filename, binary, id, number, timeout, batchinfo, loglevel=logging.INFO): def run(self, execcmd, filename, binary, id, number, timeout, batchinfo, loglevel=logging.INFO):
cachefile = f'{binary}_{id}' cachefile = f'{binary}_{id}'
execcmd = re.sub("mpirun", "mustrun --must:distributed --must:typeart --must:output json", execcmd) execcmd = re.sub(
"mpirun", "mustrun --must:distributed --must:typeart --must:output json", execcmd)
execcmd = re.sub('\${EXE}', f'./{binary}', execcmd) execcmd = re.sub('\${EXE}', f'./{binary}', execcmd)
execcmd = re.sub('\$zero_buffer', "", execcmd) execcmd = re.sub('\$zero_buffer', "", execcmd)
execcmd = re.sub('\$infty_buffer', "", execcmd) execcmd = re.sub('\$infty_buffer', "", execcmd)
...@@ -77,7 +87,8 @@ class V18(AbstractTool): ...@@ -77,7 +87,8 @@ class V18(AbstractTool):
read_line_lambda=must_filter) read_line_lambda=must_filter)
if os.path.isfile(f"{tmpdirname}/MUST_Output.html"): if os.path.isfile(f"{tmpdirname}/MUST_Output.html"):
shutil.copyfile(f"{tmpdirname}/MUST_Output.html", f"{cachefile}.html") shutil.copyfile(
f"{tmpdirname}/MUST_Output.html", f"{cachefile}.html")
if os.path.isfile(f"{tmpdirname}/MUST_Output.json"): if os.path.isfile(f"{tmpdirname}/MUST_Output.json"):
# pretty print JSON output # pretty print JSON output
...@@ -96,11 +107,128 @@ class V18(AbstractTool): ...@@ -96,11 +107,128 @@ class V18(AbstractTool):
print(open(f"{tmpdirname}/MUST_Output.json").read()) print(open(f"{tmpdirname}/MUST_Output.json").read())
def teardown(self): def teardown(self):
subprocess.run("find -type f -a -executable | xargs rm -f", shell=True, check=True) # Remove generated (binary files) subprocess.run("find -type f -a -executable | xargs rm -f",
# Remove generated (binary files)
shell=True, check=True)
subprocess.run("rm -rf must_temp core", shell=True, check=True) subprocess.run("rm -rf must_temp core", shell=True, check=True)
def get_mbb_error_label(self): def get_mbb_error_label(self):
mbb_error_dict = { # TODO return {
"MUST_ERROR_INTEGER_NEGATIVE": ["InvalidParam"],
"MUST_ERROR_INTEGER_ZERO": ["InvalidParam"],
"MUST_ERROR_INTEGER_NEGATIVE_ARRAY": ["InvalidParam"],
"MUST_ERROR_INTEGER_ENTRY_GREATER_OR_EQUAL": ["InvalidParam"],
"MUST_ERROR_INTEGER_NEGATIVE_NOT_PROC_NULL_ANY_SOURCE": ["InvalidParam"],
"MUST_ERROR_INTEGER_NEGATIVE_NOT_PROC_NULL": ["InvalidParam"],
"MUST_ERROR_INTEGER_NEGATIVE_NOT_PROC_NULL_ARRAY": ["InvalidParam"],
"MUST_ERROR_INTEGER_NEGATIVE_PROC_NULL_ANY_SOURCE": ["InvalidParam"],
"MUST_ERROR_INTEGER_NEGATIVE_UNDEFINED": ["InvalidParam"],
"MUST_ERROR_INTEGER_NOT_WITHIN_ZERO_TAG_UB": ["InvalidParam"],
"MUST_ERROR_INTEGER_NOT_WITHIN_ZERO_TAG_UB_ANY_TAG": ["InvalidParam"],
"MUST_ERROR_INTEGER_GREATER_COMM_SIZE": ["InvalidParam"],
"MUST_ERROR_INTEGER_GREATER_EQUAL_COMM_SIZE": ["InvalidParam"],
"MUST_ERROR_INTEGER_PRODUCT_GREATER_COMM_SIZE": ["InvalidParam"],
"MUST_ERROR_GROUP_RANGE_RANK": ["InvalidParam"],
"MUST_ERROR_GROUP_RANGE_STRIDE": ["InvalidParam"],
"MUST_ERROR_REQUEST_ACTIVE": ["DEADLOCK", "RequestLifeCycle"],
"MUST_ERROR_REQUEST_ACTIVE_ARRAY": ["DEADLOCK", "RequestLifeCycle"],
"MUST_ERROR_REQUEST_PARTITION_ACTIVE": ["DEADLOCK", "RequestLifeCycle"],
"MUST_ERROR_REQUEST_NOT_PARTITIONED_SEND": ["DEADLOCK", "RequestLifeCycle"],
"MUST_ERROR_REQUEST_NOT_PARTITIONED_RECV": ["DEADLOCK", "RequestLifeCycle"],
"MUST_ERROR_REQUEST_NOT_KNOWN": ["DEADLOCK", "RequestLifeCycle"],
"MUST_ERROR_REQUEST_NOT_KNOWN_ARRAY": ["DEADLOCK", "RequestLifeCycle"],
"MUST_ERROR_REQUEST_NULL": ["DEADLOCK", "RequestLifeCycle"],
"MUST_ERROR_REQUEST_NULL_ARRAY": ["DEADLOCK", "RequestLifeCycle"],
"MUST_ERROR_REQUEST_PERSISTENT_BUT_INACTIVE": ["DEADLOCK", "RequestLifeCycle"],
"MUST_ERROR_COMM_UNKNWOWN": ["InvalidParam"],
"MUST_ERROR_COMM_NULL": ["InvalidParam"],
"MUST_ERROR_NOT_CART_COMM": ["InvalidParam"],
"MUST_ERROR_NOT_GRAPH_COMM": ["InvalidParam"],
"MUST_ERROR_INTER_COMM": ["InvalidParam"],
"MUST_ERROR_INTER_COMM_MPI1": ["InvalidParam"],
"MUST_ERROR_ROOT_NOT_IN_COMM": ["InvalidParam"],
"MUST_ERROR_PREDEFINED_COMM": ["InvalidParam"],
"MUST_ERROR_NOT_INTER_COMM": ["InvalidParam"],
"MUST_ERROR_POINTER_NULL": ["InvalidParam"],
"MUST_ERROR_LEAK_COMM": ["CallOrdering"],
"MUST_ERROR_LEAK_DATATYPE": ["CallOrdering"],
"MUST_ERROR_LEAK_REQUEST": ["RequestLifeCycle"],
"MUST_ERROR_LEAK_GROUP": ["CallOrdering"],
"MUST_ERROR_LEAK_ERR": ["InvalidParam"],
"MUST_ERROR_LEAK_KEYVAL": ["InvalidParam"],
"MUST_ERROR_LEAK_OP": ["InvalidParam"],
"MUST_ERROR_DIRECTION_GREATER_NDIMS": ["TODO"],
"MUST_ERROR_DATATYPE_NULL": ["InvalidParam"],
"MUST_ERROR_DATATYPE_UNKNOWN": ["InvalidParam"],
"MUST_ERROR_DATATYPE_NOT_COMMITED": ["InvalidParam"],
"MUST_ERROR_GROUP_NULL": ["InvalidParam"],
"MUST_ERROR_GROUP_UNKNOWN": ["InvalidParam"],
"MUST_ERROR_INTEGER_GREATER_GROUP_SIZE": ["InvalidParam"],
"MUST_ERROR_INTEGER_DUPLICATION_ARRAY": ["InvalidParam"],
"MUST_ERROR_INTEGER_GREATER_GROUP_SIZE_ARRAY": ["InvalidParam"],
"MUST_ERROR_INTEGER_DUPLICATION_ARRAY_TRIPLET": ["InvalidParam"],
"MUST_ERROR_RANK_FROM_RANGES_NOT_IN_GROUP": ["InvalidParam"],
"MUST_ERROR_OPERATION_PREDEFINED": ["InvalidParam"],
"MUST_ERROR_OPERATION_UNKNOWN": ["InvalidParam"],
"MUST_ERROR_OPERATION_NULL": ["InvalidParam"],
"MUST_ERROR_POINTER_NULL_NOT_BOTTOM": ["InvalidParam"],
"MUST_ERROR_POINTER_NULL_COMM_SIZE": ["InvalidParam"],
"MUST_ERROR_POINTER_NULL_COMM_SIZE_ARRAY": ["InvalidParam"],
"MUST_ERROR_POINTER_NULL_COMM_SIZE_ARRAY_AT_INDEX": ["InvalidParam"],
"MUST_ERROR_MPI_IN_PLACE_USED": ["InvalidParam"],
"MUST_ERROR_SELFOVERLAPPED": ["LocalParameterMissmatch"],
"MUST_ERROR_OVERLAPPED_SEND": ["LocalParameterMissmatch"],
"MUST_ERROR_OVERLAPPED_RECV": ["LocalParameterMissmatch"],
"MUST_ERROR_POINTER_NULL_STATUS_IGNORE": ["InvalidParam"],
"MUST_ERROR_TYPEMATCH_INTERNAL_NOTYPE": ["InvalidParam", "LocalParameterMissmatch"],
"MUST_ERROR_TYPEMATCH_INTERNAL_TYPESIG": ["InvalidParam", "LocalParameterMissmatch"],
"MUST_ERROR_TYPEMATCH_MISMATCH": ["GlobalParameterMissmatch"],
"MUST_ERROR_TYPEMATCH_MISMATCH_BYTE": ["GlobalParameterMissmatch"],
"MUST_ERROR_TYPEMATCH_LENGTH": ["InvalidParam", "LocalParameterMissmatch"],
"MUST_ERROR_TYPEMATCH_ALIGNMENT": ["InvalidParam", "LocalParameterMissmatch"],
"MUST_ERROR_MESSAGE_LOST": ["DEADLOCK", "CallOrdering"],
"MUST_ERROR_COLLECTIVE_CALL_MISMATCH": ["DEADLOCK", "CallOrdering"],
"MUST_ERROR_COLLECTIVE_OP_MISMATCH": ["GlobalParameterMissmatch"],
"MUST_ERROR_COLLECTIVE_ROOT_MISMATCH": ["GlobalParameterMissmatch"],
"MUST_ERROR_COLLECTIVE_BLOCKING_NONBLOCKING_MISMATCH": ["GlobalParameterMissmatch"],
"MUST_ERROR_DEADLOCK": ["DEADLOCK"],
"MUST_ERROR_BUFFER_REATTACH": ["TODO"],
"MUST_ERROR_BUFFER_NOATTACHED": ["TODO"],
"MUST_ERROR_COUNTS_ARRAYS_DIFFER": ["TODO"],
"MUST_ERROR_MPI_MULTIPLE_THREADS": ["TODO"],
"MUST_ERROR_UNSUPPORTED": ["TODO"],
"MUST_ERROR_OPENMP": ["TODO"],
"MUST_INFO_UNIMPLEMENTED_FEATURE": [],
# Ignore warnings so far
"MUST_WARNING_INTEGER_ZERO": [],
"MUST_WARNING_INTEGER_ZERO_ARRAY": [],
"MUST_WARNING_INTEGER_NOT_ONE_OR_ZERO": [],
"MUST_WARNING_INTEGER_NOT_ONE_OR_ZERO_ARRAY": [],
"MUST_WARNING_INTEGER_HIGH_BUT_LESS_TAG_UB": [],
"MUST_WARNING_INTEGER_PRODUCT_LESS_COMM_SIZE": [],
"MUST_WARNING_INTER_COMM": [],
"MUST_WARNING_REQUEST_ACTIVE_RECV": [],
"MUST_WARNING_REQUEST_CANCELED": [],
"MUST_WARNING_REQUEST_NULL": [],
"MUST_WARNING_REQUEST_NULL_OR_INACTIVE_ARRAY": [],
"MUST_WARNING_REQUEST_INACTIVE": [],
"MUST_WARNING_NOT_CART_COMM": [],
"MUST_WARNING_INTER_COMM_MPI2": [],
"MUST_WARNING_COMM_NULL": [],
"MUST_WARNING_MAXDIMS_GREATER_NDIMS": [],
"MUST_WARNING_MAXNEIGHBORS_TO_SMALL": [],
"MUST_WARNING_MAXINDICES_TO_SMALL": [],
"MUST_WARNING_MAXEDGES_TO_SMALL": [],
"MUST_WARNING_DATATYPE_PREDEFINED": [],
"MUST_WARNING_DATATYPE_COMMITED": [],
"MUST_WARNING_DATATYPE_BAD_ALIGNMENT": [],
"MUST_WARNING_IF_EMPTY": [],
"MUST_WARNING_GROUP_NULL": [],
"MUST_WARNING_POINTER_NULL": [],
"MUST_WARNING_SELFOVERLAPPED": [],
"MUST_WARNING_BUFFER_OUTSIZED": [],
"MUST_WARNING_THREADLEVEL": [],
"MUST_WARNING_DATARACE": []
} }
def parse(self, cachefile, logs_dir): def parse(self, cachefile, logs_dir):
...@@ -124,7 +252,11 @@ class V18(AbstractTool): ...@@ -124,7 +252,11 @@ class V18(AbstractTool):
return {"status": "failure"} return {"status": "failure"}
output_string = ''.join(output_strings) output_string = ''.join(output_strings)
# TODO: catch segfaults
if re.search('Compilation of .*? raised an error \(retcode: ', output_string):
output = {}
output["status"] = "UNIMPLEMENTED"
return output_string
# No interesting output found, so return the timeout as is if it exists # No interesting output found, so return the timeout as is if it exists
if os.path.exists(f'{cachefile}.timeout') or os.path.exists(f'{logs_dir}/must/{cachefile}.timeout'): if os.path.exists(f'{cachefile}.timeout') or os.path.exists(f'{logs_dir}/must/{cachefile}.timeout'):
...@@ -140,7 +272,8 @@ class V18(AbstractTool): ...@@ -140,7 +272,8 @@ class V18(AbstractTool):
# parse JSON output and convert to MBB format # parse JSON output and convert to MBB format
for message in json_output["messages"]: for message in json_output["messages"]:
parsed_report = {} parsed_report = {}
parsed_report["error_class"] = "TODO" parsed_report["error_class"] = self.get_mbb_error_label()[
message["error_id"]]
parsed_report["calls"] = [] parsed_report["calls"] = []
parsed_report["lines"] = [] parsed_report["lines"] = []
parsed_report["ranks"] = [] parsed_report["ranks"] = []
...@@ -172,63 +305,7 @@ class V18(AbstractTool): ...@@ -172,63 +305,7 @@ class V18(AbstractTool):
return output return output
# if re.search('MUST_ERROR_DEADLOCK', output): # TODO: Catch segfaults?
# return 'deadlock'
# if re.search('not freed', output):
# return 'resleak'
# if re.search('conflicting roots', output):
# return 'various'
# if re.search('unknown datatype', output) or re.search('has to be a non-negative integer', output) or re.search('must use equal type signatures', output):
# return 'conflicting roots'
# if re.search('MUST_ERROR_COMM', output):
# return 'error communicator'
# if re.search('MUST_ERROR_COLLECTIVE_(.*)_MISMATCH', output):
# # ignore collective mismatch for RMA test cases
# print(os.getcwd())
# source = open(f'{logs_dir}/must/{cachefile[:-2]}.c').read()
# if 'Category: RMA' in source:
# pass
# else:
# return 'call mismatch'
# if re.search('MUST_ERROR_(.*)_NULL', output):
# return 'null parameter'
# if re.search('MUST_ERROR_BUFFER_(.*)', output):
# return 'buffer error'
# if re.search('MUST_ERROR_INTEGER_(.*)', output):
# return 'integer error'
# if re.search('MUST_ERROR_TYPEMATCH_MISMATCH', output):
# return 'type mismatch'
# if re.search('MUST_ERROR_TYPEMATCH_LENGTH', output):
# return 'type length'
# # catch any remaining error
# if re.search('MUST_ERROR_(.*)', output):
# # ignore collective mismatch for RMA test cases
# source = open(f'{logs_dir}/must/{cachefile[:-2]}.c').read()
# if 'Category: RMA' in source and 'MUST_ERROR_COLLECTIVE_CALL_MISMATCH' in output:
# pass
# else:
# return 'error'
# if re.search('MBI_MSG_RACE', output):
# return 'MBI_MSG_RACE'
# if re.search('MUST detected no MPI usage errors nor any suspicious behavior during this application run', output):
# return 'OK'
# if re.search('Compilation of .*? raised an error \(retcode: ', output):
# return 'UNIMPLEMENTED'
# if re.search('YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault', output): # if re.search('YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault', output):
# return 'segfault' # return 'segfault'
# if re.search('caught signal nr 11', output) or re.search('caught signal nr 6', output): # if re.search('caught signal nr 11', output) or re.search('caught signal nr 6', output):
...@@ -237,11 +314,6 @@ class V18(AbstractTool): ...@@ -237,11 +314,6 @@ class V18(AbstractTool):
# if re.search('internal ABORT - process ', output): # if re.search('internal ABORT - process ', output):
# return 'failure' # return 'failure'
# # special handling for RMA test cases
# source = open(f'{logs_dir}/must/{cachefile[:-2]}.c').read()
# if 'Category: RMA' in source and 'MUST_ERROR_COLLECTIVE_CALL_MISMATCH' in output:
# return 'OK'
# if re.search('caught MPI error', output): # if re.search('caught MPI error', output):
# # if we arrive here we, then MUST just found an MPI error, but did not detect anything, so we return 'OK' # # if we arrive here we, then MUST just found an MPI error, but did not detect anything, so we return 'OK'
# return 'OK' # return 'OK'
...@@ -249,42 +321,3 @@ class V18(AbstractTool): ...@@ -249,42 +321,3 @@ class V18(AbstractTool):
# if re.search('Fatal error in internal_Comm_size', output): # if re.search('Fatal error in internal_Comm_size', output):
# # if we arrive here, nothing relevant has been detected, MPI just crashed internally # # if we arrive here, nothing relevant has been detected, MPI just crashed internally
# return 'OK' # return 'OK'
\ No newline at end of file
# print (f">>>>[ INCONCLUSIVE ]>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ({self.identify()}/{cachefile})")
# print(output)
# print ("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
# return 'other'
# No beta release of MUST for now
#
#class V19(V18):
# def identify(self):
# return "MUST v1.8.0 wrapper"
#
# def ensure_image(self):
# AbstractTool.ensure_image(self, "-x must18")
#
# def build(self, rootdir, cached=True):
# if cached and os.path.exists("/MBI-builds/MUST18/bin/mustrun"):
# return
#
# subprocess.run(f"rm -rf /MBI-builds/MUST18", shell=True, check=True) # MUST sometimes fails when reinstalling over the same dir
#
# # Build it
# here = os.getcwd() # Save where we were
# if not os.path.exists((f"{rootdir}/tools/MUST-v1.8.0.tar.gz")):
# subprocess.run(f"cd {rootdir}/tools; wget https://hpc.rwth-aachen.de/must/files/MUST-v1.8.0.tar.gz", shell=True, check=True)
# subprocess.run(f"rm -rf /tmp/build-must ; mkdir /tmp/build-must", shell=True, check=True)
# os.chdir("/tmp/build-must")
# subprocess.run(f"tar xfz {rootdir}/tools/MUST-v1.8.0.tar.gz", shell=True, check=True)
#
# subprocess.run(f"CC=$(which clang) CXX=$(which clang++) OMPI_CC=$(which clang) OMPI_CXX=$(which clang++) FC=$(which gfortran) cmake MUST-v1.8.0 -DCMAKE_INSTALL_PREFIX=/MBI-builds/MUST18 -DCMAKE_BUILD_TYPE=Release", shell=True, check=True)
# subprocess.run(f"make -j$(nproc) install VERBOSE=1", shell=True, check=True)
# subprocess.run(f"make -j$(nproc) install-prebuilds VERBOSE=1", shell=True, check=True)
#
# # Back to our previous directory
# os.chdir(here)
#
# def setup(self):
# os.environ['PATH'] = os.environ['PATH'] + ":/MBI-builds/MUST18/bin/"
#
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment