import argparse
import subprocess
import re
import logging
import os
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
parser = argparse.ArgumentParser(description='Build Casa in a container')
parser.add_argument("-c", "--container", type=str, required=True,
help='Source code location f.e. /home/<user>/source')
parser.add_argument("-u", "--user", type=str, required=True, help='user')
parser.add_argument("-d", "--uid", type=str, required=True, help='uid')
parser.add_argument("--testtools", required=False, action='store_true', help='Run casatools tests')
parser.add_argument("--testtasks", required=False, action='store_true', help='Run casatasks tests')
parser.add_argument("-b", "--buildtarget", type=str, required=False, help='Use genmake to build casatools with. Default is bdist_wheel.')
parser.add_argument("-p", "--pythonversion", type=str, required=True, help='Python version. For example 3.6')
parser.add_argument('--debug', action='store_true', help='Print debug messages')
args = parser.parse_args()
logger = logging.getLogger()
if args.debug:
logger.setLevel(logging.DEBUG)
logger.debug('Argument values:')
logger.debug(args.container)
logger.debug(args.user)
logger.debug(args.uid)
logger.debug(args.buildtarget)
logger.debug(args.pythonversion)
container = args.container
user = args.user
uid = args.uid
pythonversion = args.pythonversion
testtools = args.testtools
testtasks = args.testtasks
tools_target = " --relwithdebinfo --stripsyms bdist_wheel"
tasks_target = "bdist_wheel"
shell_target = "bdist_wheel"
if args.buildtarget =="genmake":
tools_target = "genmake"
tasks_target = "build"
shell_target = "build"
mypath = os.path.dirname(os.path.abspath(__file__))
logger.debug("Script path: " + mypath)
def exec_as_shell(cmd):
print("Executing: " + cmd)
process = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, shell=True)
while True:
output = process.stdout.readline().decode('UTF-8')
if output == '' and process.poll() is not None:
break
if output:
print (output.strip())
rc = process.poll()
return rc
cmds = []
cmds.append('docker exec ' + container +' /bin/bash -c "useradd -u ' + uid + ' ' + user + '"')
cmds.append('docker exec -u ' + user + " " + container +' /bin/bash -c "mkdir ~/.casa && mkdir -p ~/.config/pip"')
cmds.append('docker cp ' + mypath + "/config/config.py " + container +':/home/' + user +'/.casa/config.py')
cmds.append('docker cp ' + mypath + "/config/pip.conf " + container +':/home/' + user +'/.config/pip/pip.conf')
cmds.append('docker exec -u ' + user + " " + container +' /bin/bash -c "ccache -M 50G"')
cmds.append('docker exec -u ' + user + " " + container +' /bin/bash -c "python'+ pythonversion + ' -m venv ~/venv" ')
cmds.append('docker exec -u ' + user + " " + container +' /bin/bash -c "source ~/venv/bin/activate && pip install --index-url=https://pypi.org/simple --upgrade pip wheel"')
cmds.append('docker exec -u ' + user + " " + container +' /bin/bash -c "source ~/venv/bin/activate && pip install --index-url=https://pypi.org/simple --upgrade packaging certifi auditwheel numpy==1.19.5 scipy matplotlib patchelf"')
cmds.append('docker exec -u ' + user + " " + container +' /bin/bash -c "export PATH=/usr/lib64/ccache:/opt/rh/devtoolset-4/root/usr/bin:/opt/casa/03/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/casa/02/bin:/usr/local/sbin:/usr/local/bin && source ~/venv/bin/activate && cd /source/casa6/casatools/ && autoconf && ./configure && python setup.py ' + tools_target + '"')
if tools_target=="genmake":
cmds.append('docker exec -u ' + user + " " + container +' /bin/bash -c "export CCACHE_DIR=/ccache && cd /source/casa6/casatools/ && make -j4' + '"')
else:
cmds.append('docker exec -u ' + user + " " + container + " /bin/bash -c 'source ~/venv/bin/activate && cd /source/casa6/casatools/dist && auditwheel repair `ls -t *.whl | head -1`'")
cmds.append('docker exec -u ' + user + " " + container +' /bin/bash -c "source ~/venv/bin/activate && export PYTHONPATH=/source/casa6/casatools/build/lib.linux-x86_64-'+ pythonversion + '/ && cd /source/casa6/casatasks/ && python'+ pythonversion + ' setup.py ' + tasks_target + '"')
cmds.append('docker exec -u ' + user + " " + container +' /bin/bash -c "source ~/venv/bin/activate && export PYTHONPATH=/source/casa6/casatools/build/lib.linux-x86_64-'+ pythonversion + '/:/source/casa6/casatasks/build/lib.linux-x86_64-'+ pythonversion + '/ && cd /source/casashell/ && python setup.py ' + tasks_target + '"')
cmds.append('docker exec -u ' + user + " " + container +' /bin/bash -c "mkdir /source/extralibs"')
cmds.append('docker exec -u ' + user + " " + container +' /bin/bash -c "cp /usr/lib64/libgfortran.so.3 /source/extralibs"')
if testtools == True or testtasks != None:
cmds.append('docker exec -u ' + user + " " + container +' /bin/bash -c "source ~/venv/bin/activate && export PYTHONPATH=/source/casa6/casatools/build/lib.linux-x86_64-'+ pythonversion + \
':/source/casa6/casatasks/build/lib.linux-x86_64-'+ pythonversion +'/ && cd /source/casa6/casatestutils && python setup.py bdist_wheel"')
if testtools == True: