# coding: utf-8
import os
# ... TODO: - check that cmake exists in PATH
# - create build dir for cmake
# - add method make
# - add method install
# - add logger
[docs]class CMake(object):
"""User-friendly class for cmake."""
def __init__(self, path, \
prefix=None, \
flags=None, \
flags_fortran=None, \
compiler_fortran=None):
"""
Constructor for cmake.
path: str
path to CMakeLists of the current project
prefix: str
installation directory
flags: dict
general flags from the config file
flags_fortran: dict
flags for the fortran compiler
compiler_fortran: str
a valid fortran compiler
"""
# ...
self._flags = flags
self._flags_fortran = flags_fortran
self._compiler_fortran = compiler_fortran
self._prefix = prefix
self._path = path
# ...
# ... create build dir
build_path = os.path.join(path, 'build')
if not os.path.exists(build_path):
os.makedirs(build_path)
self._build_path = build_path
# ...
# ...
args = []
# ...
# ... MPI
if compiler_fortran:
if "mpi" in compiler_fortran.lower():
args += ['-DMPI_ENABLED=ON']
# ...
# ...
if prefix:
if not os.path.exists(prefix):
mkdir_p(prefix)
prefix = os.path.abspath(prefix)
args += [' -DCMAKE_INSTALL_PREFIX={0}'.format(prefix)]
if flags_fortran:
args += [' -DCMAKE_Fortran_FLAGS="{0}"'.format(flags_fortran)]
# args += [' -DCMAKE_Fortran_FLAGS_DEBUG={0}'.format(flags_fortran)]
# args += [' -DCMAKE_Fortran_FLAGS_RELEASE={0}'.format(flags_fortran)]
# ...
# ...
if flags:
for flag, value in list(flags.items()):
args += ['-D{0}={1}'.format(flag, value)]
# ...
# ...
self._args = args
# ...
@property
def args(self):
return self._args
@property
def flags(self):
return self._flags
@property
def flags_fortran(self):
return self._flags_fortran
@property
def compiler_fortran(self):
return self._compiler_fortran
@property
def prefix(self):
return self._prefix
@property
def path(self):
return self._path
@property
def build_path(self):
return self._build_path
# ...
[docs] def make(self, verbose=False):
# ...
cmd = 'make'
if verbose:
cmd = '{0} VERBOSE=1'.format(cmd)
# ...
# ...
base_dir = os.getcwd()
os.chdir(self.build_path)
os.system(cmd)
os.chdir(base_dir)
# ...
[docs] def install(self):
# ...
cmd = 'make install'
# ...
# ...
base_dir = os.getcwd()
os.chdir(self.build_path)
os.system(cmd)
os.chdir(base_dir)
# ...
[docs] def initialize(self, src_dir, project, suffix, libname, force=True):
# ...
from pyccel import codegen
codegen_dir = os.path.dirname(os.path.realpath(str(codegen.__file__)))
templates_dir = os.path.join(codegen_dir, 'templates')
cmakemodules_src = os.path.join(templates_dir, 'cmake')
cmakelists_src = os.path.join(templates_dir, 'CMakeLists.txt')
package_src = os.path.join(templates_dir, 'package')
cmakemodules_dst = os.path.join(src_dir, 'cmake')
cmakelists_dst = os.path.join(src_dir, 'CMakeLists.txt')
package_dst = os.path.join(src_dir, 'package')
# ...
# ...
import shutil, errno
def _copydata(src, dst):
try:
# TODO improve
if os.path.exists(dst):
os.system('rm -rf {0}'.format(dst))
shutil.copytree(src, dst, ignore=shutil.ignore_patterns('*.pyc'))
except OSError as exc: # python >2.5
if exc.errno == errno.ENOTDIR:
shutil.copy(src, dst)
else: raise
if not os.path.exists(src_dir):
raise ValueError('Could not find :{0}'.format(src_dir))
# ...
# ... update CMakeLists.txt
def _print_cmakelists(src, dst):
f = open(src, 'r')
code = f.readlines()
f.close()
code = ''.join(l for l in code)
code = code.replace('__PROJECT__', project)
code = code.replace('__SRC_DIR__', src_dir)
code = code.replace('__SUFFIX__', suffix)
code = code.replace('__LIBNAME__', libname)
if force or (not os.path.isfile(dst)):
f = open(dst, 'w')
f.write(code)
f.close()
# ...
# ... update make_package.py
def _print_make_package(package_src, package_dst):
src = os.path.join(package_src, 'make_package.py')
dst = os.path.join(package_dst, 'make_package.py')
f = open(src, 'r')
code = f.readlines()
f.close()
code = ''.join(l for l in code)
code = code.replace('__PROJECT__', project)
code = code.replace('__SUFFIX__', suffix.upper())
code = code.replace('__LIBNAME__', libname)
if force or (not os.path.isfile(dst)):
f = open(dst, 'w')
f.write(code)
f.close()
# ...
# ... TODO: uncomment add_subdirectory(package) from templates/CMakeLists.txt
_print_cmakelists(cmakelists_src, cmakelists_dst)
# ...
# ...
_copydata(cmakemodules_src, cmakemodules_dst)
_copydata(package_src, package_dst)
# ...
# ...
src = os.path.join(package_src, 'CMakeLists.txt')
dst = os.path.join(package_dst, 'CMakeLists.txt')
_print_cmakelists(src, dst)
# ...
# ...
_print_make_package(package_src, package_dst)
# ...