Skip to content
Snippets Groups Projects
Commit 10fdfb0d authored by Nicola Vigano's avatar Nicola Vigano
Browse files

Python/conf: improved compilation of mex functions

parent 7bee4c9a
No related branches found
No related tags found
No related merge requests found
......@@ -112,8 +112,8 @@ class DCTLauncher(object):
try:
args_compile = [""] + self.args
mex_builder = MexBuilder.getInstanceFromArgs(args_compile, dct_dir = self.dct_dir)
mex_builder.findMexs()
mex_builder.compileFuncs()
mex_builder.find_mex_files()
mex_builder.compile_mex_files()
except ValueError as ex:
if (len(ex.args) is not 0) and (ex.args[0] is not ""):
dct.dct_io_xml.DCTOutput.printError(ex.args)
......
......@@ -56,27 +56,12 @@
<mex_files>
<exclude_list>
<path>zUtil_Cxx/test/*.cpp</path>
<path>zUtil_Imaging/pmedf/pmedf_readC.cpp</path>
<path>zUtil_ForwardProjection/jacobs_ray3d_c.c</path>
<path>zUtil_ForwardProjection/jacobs_rays.c</path>
<path>zUtil_Crack/External/ITK_REGISTRATION/src/ProgOptions.cxx</path>
<path>zUtil_Crack/External/ITK_REGISTRATION/src/TestRegistrationProgOptions.cxx</path>
<path>zUtil_Crack/External/ITK_REGISTRATION/src/itkRegistrationAffineTransform.cxx</path>
<path>zUtil_Crack/External/ITK_REGISTRATION/src/itkRegistrationVersorRigid3DTransform.cxx</path>
<path>zUtil_Crack/External/ITK_SEGMENTATION/src/ProgOptions.cxx</path>
<path>zUtil_Crack/External/ITK_SEGMENTATION/src/TestProgOptions.cxx</path>
<path>zUtil_Crack/External/ITK_SEGMENTATION/src/itkCrackRemesh.cxx</path>
<path>zUtil_Crack/External/ITK_SEGMENTATION/src/itkCrackSegmentation.cxx</path>
<path>zUtil_Crack/External/ITK_SEGMENTATION/src/itkMeshTovtkPolyData.cxx</path>
<path>zUtil_Crack/External/ITK_SEGMENTATION/src/vtkShowWriteMesh.cxx</path>
<path>zUtil_Crack/External/ITK_TOOLS/src/itkMedianImageFilter.cxx</path>
<path>zUtil_Crack/External/ITK_TOOLS/src/itkNormalizeImageFilter.cxx</path>
<path>zUtil_Crack/External/ITK_TOOLS/src/itkRescaleIntensityImageFilter.cxx</path>
<path>zUtil_Crack/External/ITK_TOOLS/src/itkResizeVolume.cxx</path>
<path>zUtil_Crack/External/ITK_TOOLS/src/itkShiftScaleImageFilter.cxx</path>
<path>zUtil_Crack/External/ITK_TOOLS/src/itkTransformBinaryFromFile.cxx</path>
<path>zUtil_Crack/External/ITK_TOOLS/src/itkVersorRigid3DTransform.cxx</path>
<path>zUtil_Crack/External/ITK_TOOLS/src/itkVersorRigid3DTransform2.cxx</path>
<path>zUtil_ForwardProjection/*.c</path>
<path>zUtil_Crack/External/ITK_REGISTRATION/src/*.cxx</path>
<path>zUtil_Crack/External/ITK_SEGMENTATION/src/*.cxx</path>
<path>zUtil_Crack/External/ITK_TOOLS/src/*.cxx</path>
</exclude_list>
<file>
......
......@@ -88,6 +88,7 @@ class MexBuilder(object):
self.outdir = outdir
self.c_files = { }
self.excluded_c_files = { }
self.mfiles_to_consider = mfiles_to_consider
self.force_compile = force_compile
......@@ -123,11 +124,14 @@ class MexBuilder(object):
print(" -force-compile : to force the compilation even if not needed")
print(" -fresh-mexopts : to force the resetting of mexopts file")
def findMexs(self):
"""
def findMexs():
def is_mex_excluded(self, file_path):
if self.mex_info is not None:
return self.mex_info.isExcluded(file_path, self.dct_dir)
return False
Finds the mex files (well, the C sources) and saves the files into the object
def find_mex_files(self):
"""
Finds the mex files (well, the C and Cxx sources) and saves the files into the object
"""
self.out.printSubJob("Finding mex files, from: '%s'" % self.dct_dir)
for root, dir_name, file_names in os.walk(self.dct_dir):
......@@ -135,13 +139,45 @@ class MexBuilder(object):
for file_name in file_names:
if fnmatch.fnmatch(file_name, file_extension):
filepath = os.path.join(root, file_name)
self.c_files[file_name] = filepath
self.out.printSubJob("These files were found:")
if self.is_mex_excluded(filepath):
self.excluded_c_files[file_name] = filepath
else:
self.c_files[file_name] = filepath
self.out.printSubJob("These files were found, but excluded:")
for file_name in self.excluded_c_files:
self.out.printSubSubJob('File', file_name + ' ( ' + self.excluded_c_files[file_name] + ' )')
self.out.printSubJob("These files were found, and they can be compiled:")
for file_name in self.c_files:
self.out.printSubSubJob('File', file_name + ' ( ' + self.c_files[file_name] + ' )')
print('')
def _buildMakeCmd(self, cmd, includes, lib_paths, libs, defines, options):
def _compile_mex_file(self, file_name):
"""
Tries to compile the given file.
"""
file_path = self.c_files[file_name]
compiler_path = os.path.join(self.matlab_dir, "bin", "mex")
cmd = [ compiler_path, file_path, '-outdir', self.outdir ]
includes = [ os.path.join(self.dct_dir, 'zUtil_Cxx', 'include') ]
lib_paths = []
libs = []
defines = []
options = []
if self.mex_info is not None:
props = self.mex_info.getFileProperties(file_name)
if props is None:
props = self.mex_info.getFileProperties(file_path)
if props is not None:
# No info at all into the xml file
includes = includes + props.get("includes")
lib_paths = lib_paths + props.get("lib_paths")
libs = libs + props.get("libs")
defines = defines + props.get("defines")
options = options + props.get("options")
if self.out.verboseLevel > 1:
cmd.append('-v')
if self.debug is True:
......@@ -163,39 +199,8 @@ class MexBuilder(object):
self.out.printSubSubJob('File', cmd[1] + ' (cmd: ' + string.join(cmd, ' ') + ' )')
return subprocess.call(cmd)
def _compileFile(self, file_path):
"""
[Internal] def _compileFile(file_path):
Tries to compile the given file_path.
"""
compiler_path = os.path.join(self.matlab_dir, "bin", "mex")
cmd = [ compiler_path, file_path, '-outdir', self.outdir ]
includes = [ os.path.join(self.dct_dir, 'zUtil_Cxx', 'include') ]
lib_paths = []
libs = []
defines = []
options = []
if (self.mex_info is not None) \
and (self.mex_info.isExcluded(file_path) is False):
props = self.mex_info.getFileProperties(file_path)
if props is not None:
# No info at all into the xml file
includes = includes + props.get("includes")
lib_paths = lib_paths + props.get("lib_paths")
libs = libs + props.get("libs")
defines = defines + props.get("defines")
options = options + props.get("options")
return self._buildMakeCmd(cmd, includes, lib_paths, libs, defines, options)
def compileFuncs(self):
def compile_mex_files(self):
"""
def compileFuncs():
Compiles the mex files into the list.
"""
......@@ -223,7 +228,6 @@ class MexBuilder(object):
# Now let's compile
for file_name in files_to_compile:
# Check if it is an actual file or a regular expression
if file_name in self.c_files:
match_list = [ file_name ]
......@@ -239,13 +243,9 @@ class MexBuilder(object):
# Let's compile each match
for cfile in match_list:
file_path = self.c_files[cfile]
if (self.mex_info is None) \
or ( (self.mex_info is not None) \
and (self.mex_info.isExcluded(file_path) is False) ):
ret_val = self._compileFile(file_path)
if ret_val is not 0:
listOfErrors.append("Error compiling MEX: %s (Return Value: %d)" % (file_name, ret_val))
ret_val = self._compile_mex_file(cfile)
if ret_val is not 0:
listOfErrors.append("Error compiling MEX: %s (Return Value: %d)" % (file_name, ret_val))
print('')
if len(listOfErrors) is not 0:
print("Errors happened during compilation:")
......@@ -255,8 +255,8 @@ class MexBuilder(object):
if __name__=="__main__":
try:
mex_builder = MexBuilder.getInstanceFromArgs(sys.argv)
mex_builder.findMexs()
mex_builder.compileFuncs()
mex_builder.find_mex_files()
mex_builder.compile_mex_files()
except ValueError as ex:
if (len(ex.args) is not 0) and (ex.args[0] is not ""):
DCTOutput.printError(ex.args)
......
......@@ -161,9 +161,10 @@ class MexConf(object):
def __init__(self, tree):
self.tree = tree
def isExcluded(self, testFile):
def isExcluded(self, test_file, dct_dir):
for exclude in self.tree.findall("exclude_list/path"):
if re.search(exclude.text, testFile):
exclude_path = os.path.join(dct_dir, exclude.text)
if fnmatch.fnmatch(test_file, exclude_path):
return True
else:
return False
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment