From 059d63cceb171c0384e68300fb82f83418c9fa7f Mon Sep 17 00:00:00 2001 From: hbristow Date: Thu, 8 Aug 2013 02:42:17 +1000 Subject: [PATCH] Added diagnostic/build information function --- modules/matlab/CMakeLists.txt | 28 +++++++++-- modules/matlab/generator/build_info.py | 50 +++++++++++++++++++ modules/matlab/generator/filters.py | 6 +++ .../generator/templates/template_build_info.m | 39 +++++++++++++++ .../generator/templates/template_map_base.m | 20 ++++---- modules/matlab/test/help.m | 15 ++++++ 6 files changed, 145 insertions(+), 13 deletions(-) create mode 100644 modules/matlab/generator/build_info.py create mode 100644 modules/matlab/generator/templates/template_build_info.m create mode 100644 modules/matlab/test/help.m diff --git a/modules/matlab/CMakeLists.txt b/modules/matlab/CMakeLists.txt index 5a31c45a16..ce42c2fbc1 100644 --- a/modules/matlab/CMakeLists.txt +++ b/modules/matlab/CMakeLists.txt @@ -52,11 +52,12 @@ endif() # If the user built OpenCV as X-bit, but they have a Y-bit version of Matlab, # attempting to link to OpenCV during binding generation will fail, since # mixed precision pointers are not allowed. Disable the bindings. -if (${CMAKE_SIZEOF_VOID_P} EQUAL 4 AND ${MATLAB_ARCH} MATCHES "64") +math(EXPR ARCH "${CMAKE_SIZEOF_VOID_P} * 8") +if (${ARCH} EQUAL 32 AND ${MATLAB_ARCH} MATCHES "64") warn_mixed_precision("32" "64") ocv_module_disable(matlab) return() -elseif (${CMAKE_SIZEOF_VOID_P} EQUAL 8 AND NOT ${MATLAB_ARCH} MATCHES "64") +elseif (${ARCH} EQUAL 64 AND NOT ${MATLAB_ARCH} MATCHES "64") warn_mixed_precision("64" "32") ocv_module_disable(matlab) return() @@ -73,6 +74,10 @@ ocv_add_module(matlab BINDINGS opencv_nonfree ) +# get the commit information +execute_process(COMMAND git log -1 --pretty=%H OUTPUT_VARIABLE GIT_COMMIT ERROR_QUIET) +string(REGEX REPLACE "(\r?\n)+$" "" GIT_COMMIT ${GIT_COMMIT}) + # set the path to the C++ header and doc parser set(HDR_PARSER_PATH ${CMAKE_SOURCE_DIR}/modules/python/src2) set(RST_PARSER_PATH ${CMAKE_SOURCE_DIR}/modules/java/generator) @@ -80,7 +85,7 @@ set(RST_PARSER_PATH ${CMAKE_SOURCE_DIR}/modules/java/generator) # set mex compiler options prepend("-I" MEX_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include) prepend("-L" MEX_LIB_DIR ${LIBRARY_OUTPUT_PATH}/$(Configuration)) -set(MEX_OPTS -largeArrayDims) +set(MEX_OPTS "-largeArrayDims") if (BUILD_TESTS) add_subdirectory(test) @@ -108,7 +113,8 @@ list(APPEND opencv_extra_hdrs "core:${OPENCV_MODULE_opencv_core_LOCATION}/includ # pass the OPENCV_CXX_EXTRA_FLAGS through to the mex compiler # remove the visibility modifiers, so the mex gateway is visible -string(REGEX REPLACE "[^\ ]*visibility[^\ ]*" "" MEX_CXX_FLAGS "${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}") +# TODO: get mex working without warnings +#string(REGEX REPLACE "[^\ ]*visibility[^\ ]*" "" MEX_CXXFLAGS "${OPENCV_EXTRA_FLAGS} ${OPENCV_EXTRA_CXX_FLAGS}") # Configure checks # Check to see whether the generator and the mex compiler are working. @@ -189,6 +195,20 @@ add_custom_command( --modules ${opencv_modules} --extra ${opencv_extra_hdrs} --outdir ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${PYTHON_EXECUTABLE} + ${CMAKE_CURRENT_SOURCE_DIR}/generator/build_info.py + --os ${CMAKE_SYSTEM} + --arch ${ARCH} ${CMAKE_SYSTEM_PROCESSOR} + --compiler ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} + --mex_arch ${MATLAB_ARCH} + --mex_script ${MATLAB_MEX_SCRIPT} + --cxx_flags ${MEX_CXXFLAGS} + --opencv_version ${OPENCV_VERSION} + --commit ${GIT_COMMIT} + --modules ${opencv_modules} + --configuration "$(Configuration)" ${CMAKE_BUILD_TYPE} + --outdir ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/test/help.m ${CMAKE_CURRENT_BINARY_DIR}/+cv COMMAND ${CMAKE_COMMAND} -E touch ${GENERATE_PROXY} COMMENT "Generating Matlab source files" ) diff --git a/modules/matlab/generator/build_info.py b/modules/matlab/generator/build_info.py new file mode 100644 index 0000000000..e02354974e --- /dev/null +++ b/modules/matlab/generator/build_info.py @@ -0,0 +1,50 @@ +#/usr/bin/env python + +def substitute(build, output_dir): + + # setup the template engine + template_dir = os.path.join(os.path.dirname(__file__), 'templates') + jtemplate = Environment(loader=FileSystemLoader(template_dir), trim_blocks=True, lstrip_blocks=True) + + # add the filters + jtemplate.filters['csv'] = csv + jtemplate.filters['stripExtraSpaces'] = stripExtraSpaces + + # load the template + template = jtemplate.get_template('template_build_info.m') + + # create the build directory + output_dir = output_dir+'/+cv' + if not os.path.isdir(output_dir): + os.mkdir(output_dir) + + # populate templates + populated = template.render(build=build) + with open(os.path.join(output_dir, 'buildInformation.m'), 'wb') as f: + f.write(populated) + +if __name__ == "__main__": + + # parse the input options + import sys, re, os + from argparse import ArgumentParser + parser = ArgumentParser() + parser.add_argument('--os') + parser.add_argument('--arch', nargs=2) + parser.add_argument('--compiler', nargs='+') + parser.add_argument('--mex_arch') + parser.add_argument('--mex_script') + parser.add_argument('--mex_opts', default=['-largeArrayDims'], nargs='*') + parser.add_argument('--cxx_flags', default=[], nargs='*') + parser.add_argument('--opencv_version', default='', nargs='?') + parser.add_argument('--commit', default='Not in working git tree', nargs='?') + parser.add_argument('--modules', nargs='+') + parser.add_argument('--configuration') + parser.add_argument('--outdir') + build = parser.parse_args() + + from filters import * + from jinja2 import Environment, FileSystemLoader + + # populate the build info template + substitute(build, build.outdir) diff --git a/modules/matlab/generator/filters.py b/modules/matlab/generator/filters.py index d8b2d9541f..30b1cf000b 100644 --- a/modules/matlab/generator/filters.py +++ b/modules/matlab/generator/filters.py @@ -98,6 +98,12 @@ def slugify(text): def filename(fullpath): return os.path.splitext(os.path.basename(fullpath))[0] + +def csv(items, sep=', '): + return sep.join(item for item in items) + +def stripExtraSpaces(text): + return ' '.join(text.split()) def comment(text, wrap=80, escape='% ', escape_first='', escape_last=''): '''comment filter diff --git a/modules/matlab/generator/templates/template_build_info.m b/modules/matlab/generator/templates/template_build_info.m new file mode 100644 index 0000000000..486e0a03d0 --- /dev/null +++ b/modules/matlab/generator/templates/template_build_info.m @@ -0,0 +1,39 @@ +function buildInformation() +%CV.BUILDINFORMATION display OpenCV Toolbox build information +% +% Call CV.BUILDINFORMATION() to get a printout of diagonstic information +% pertaining to your particular build of the OpenCV Toolbox. If you ever +% run into issues with the Toolbox, it is useful to submit this +% information alongside a bug report to the OpenCV team. +% +info = { +' ------------------------------------------------------------------------' +' OpenCV Toolbox' +' Build and diagnostic information' +' ------------------------------------------------------------------------' +'' +' Platform' +' OS: {{ build.os }}' +' Architecture: {{ build.arch[0] }}-bit {{ build.arch[1] }}' +' Compiler: {{ build.compiler | csv(' ') }}' +'' +' Matlab' +[' Version: ' version()] +[' Mex extension: ' mexext()] +' Architecture: {{ build.mex_arch }}' +' Mex path: {{ build.mex_script }}' +' Mex flags: {{ build.mex_opts | csv(' ') }}' +' CXX flags: {{ build.cxx_flags | csv(' ') | stripExtraSpaces | wordwrap(60, True, '\'\n\' ') }}' +'' +' OpenCV' +' Version: {{ build.opencv_version }}' +' Commit: {{ build.commit }}' +' Configuration: {{ build.configuration }}' +' Modules: {{ build.modules | csv | wordwrap(60, True, '\'\n\' ') }}' +'' +}; + +info = cellfun(@(x) [x '\n'], info, 'UniformOutput', false); +info = horzcat(info{:}); +fprintf(info); +end diff --git a/modules/matlab/generator/templates/template_map_base.m b/modules/matlab/generator/templates/template_map_base.m index bc010d47e2..5bea782d17 100644 --- a/modules/matlab/generator/templates/template_map_base.m +++ b/modules/matlab/generator/templates/template_map_base.m @@ -1,12 +1,12 @@ % ------------------------------------------------------------------------ -% OpenCV Toolbox +% OpenCV Toolbox % Matlab bindings for the OpenCV library % ------------------------------------------------------------------------ % % The OpenCV Toolbox allows you to make calls to native OpenCV methods % and classes directly from within Matlab. % -% PATHS +% PATHS % To call OpenCV methods from anywhere in your workspace, add the % directory containing this file to the path: % @@ -16,7 +16,7 @@ % cv.m - This file, containing OpenCV enums % +cv/ - The directory containing the OpenCV methods and classes % -% CALLING SYNTAX +% CALLING SYNTAX % To call an OpenCV method, class or enum, it must be prefixed with the % 'cv' qualifier. For example: % @@ -27,7 +27,7 @@ % camera = cv.VideoCapture(); % camera.open('/path/to/file'); % -% HELP +% HELP % Each method has its own help file containing information about the % arguments, return values, and what operation the method performs. % You can access this help information by typing: @@ -38,17 +38,19 @@ % directory. Note that the methods available to you will depend % on which modules you configured OpenCV to build. % -% DIAGNOSTICS +% DIAGNOSTICS % If you are having problems with the OpenCV Toolbox and need to send a % bug report to the OpenCV team, you can get a printout of diagnostic % information to submit along with your report by typing: % % cv.buildInformation(); % -% OTHER RESOURCES -% OpenCV documentation online: http://docs.opencv.org -% OpenCV issue tracker: http://code.opencv.org -% OpenCV Q&A: http://answers.opencv.org +% OTHER RESOURCES +% OpenCV documentation online: http://docs.opencv.org +% OpenCV issue tracker: http://code.opencv.org +% OpenCV Q&A: http://answers.opencv.org +% +% See also: cv.help, cv.buildInformation % % Copyright {{ time.strftime("%Y", time.localtime()) }} The OpenCV Foundation % diff --git a/modules/matlab/test/help.m b/modules/matlab/test/help.m new file mode 100644 index 0000000000..cfe86767d6 --- /dev/null +++ b/modules/matlab/test/help.m @@ -0,0 +1,15 @@ +function help() +%CV.HELP display help information for the OpenCV Toolbox +% +% Calling: +% >> cv.help(); +% +% is equivalent to calling: +% >> help cv; +% +% It displays high-level usage information about the OpenCV toolbox +% along with resources to find out more information. +% +% See also: cv.buildInformation + help('cv'); +end