diff --git a/CMakeLists.txt b/CMakeLists.txt index b298d9702f..7f5b6ce314 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -447,6 +447,8 @@ if(UNIX) set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} dl m log) elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD|NetBSD|DragonFly") set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} m pthread) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "QNX") + set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} m) else() set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} dl m pthread rt) endif() diff --git a/apps/traincascade/imagestorage.h b/apps/traincascade/imagestorage.h index fb68e25cb2..432e1036ae 100644 --- a/apps/traincascade/imagestorage.h +++ b/apps/traincascade/imagestorage.h @@ -1,10 +1,11 @@ #ifndef _OPENCV_IMAGESTORAGE_H_ #define _OPENCV_IMAGESTORAGE_H_ +#include +#include +#include #include "highgui.h" - - class CvCascadeImageReader { public: diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index 9aade70b7c..b76908203d 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -254,7 +254,7 @@ if(MSVC) endif() # Extra link libs if the user selects building static libs: -if(NOT BUILD_SHARED_LIBS AND CMAKE_COMPILER_IS_GNUCXX AND NOT ANDROID) +if(NOT BUILD_SHARED_LIBS AND ((CMAKE_COMPILER_IS_GNUCXX AND NOT ANDROID) OR QNX)) # Android does not need these settings because they are already set by toolchain file set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} stdc++) set(OPENCV_EXTRA_FLAGS "-fPIC ${OPENCV_EXTRA_FLAGS}") diff --git a/modules/contrib/src/inputoutput.cpp b/modules/contrib/src/inputoutput.cpp index 37510c666e..3dc445b0e4 100644 --- a/modules/contrib/src/inputoutput.cpp +++ b/modules/contrib/src/inputoutput.cpp @@ -77,15 +77,34 @@ namespace cv return list; } + #ifdef __QNX__ + // you have to ask QNX to please include more file information + // and not to report duplicate names as a result of file system unions + if ( -1 == dircntl(dp, D_SETFLAG, D_FLAG_STAT|D_FLAG_FILTER) ) + return list; + #endif + while ((dirp = readdir(dp)) != NULL) { + #ifdef __QNX__ + // QNX looks at the world a little differently + dirent_extra *extra; + dirent_extra_stat *extra_stat; + for (extra = _DEXTRA_FIRST(dirp), + extra_stat = reinterpret_cast(extra); + _DEXTRA_VALID(extra, dirp); + extra = _DEXTRA_NEXT(extra), + extra_stat = reinterpret_cast(extra)) + if ((extra->d_type != _DTYPE_NONE) && S_ISREG(extra_stat->d_stat.st_mode)) + #else if (dirp->d_type == DT_REG) + #endif { - if (exten.compare("*") == 0) - list.push_back(static_cast(dirp->d_name)); - else - if (std::string(dirp->d_name).find(exten) != std::string::npos) - list.push_back(static_cast(dirp->d_name)); + if (exten.compare("*") == 0) + list.push_back(static_cast(dirp->d_name)); + else + if (std::string(dirp->d_name).find(exten) != std::string::npos) + list.push_back(static_cast(dirp->d_name)); } } closedir(dp); @@ -124,15 +143,15 @@ namespace cv { do { -#ifdef HAVE_WINRT + #ifdef HAVE_WINRT if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && wcscmp(FindFileData.cFileName, L".") != 0 && wcscmp(FindFileData.cFileName, L"..") != 0) -#else + #else if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && strcmp(FindFileData.cFileName, ".") != 0 && strcmp(FindFileData.cFileName, "..") != 0) -#endif + #endif { char* fname; #ifdef HAVE_WINRT @@ -167,9 +186,29 @@ namespace cv return list; } + #ifdef __QNX__ + // you have to ask QNX to please include more file information + // and not to report duplicate names as a result of file system unions + if ( -1 == dircntl(dp, D_SETFLAG, D_FLAG_STAT|D_FLAG_FILTER) ) + return list; + #endif + while ((dirp = readdir(dp)) != NULL) { + #ifdef __QNX__ + // QNX looks at the world a little differently + dirent_extra *extra; + dirent_extra_stat *extra_stat; + for (extra = _DEXTRA_FIRST(dirp), + extra_stat = reinterpret_cast(extra); + _DEXTRA_VALID(extra, dirp); + extra = _DEXTRA_NEXT(extra), + extra_stat = reinterpret_cast(extra)) + if ((extra->d_type != _DTYPE_NONE) && + S_ISDIR(extra_stat->d_stat.st_mode) && + #else if (dirp->d_type == DT_DIR && + #endif strcmp(dirp->d_name, ".") != 0 && strcmp(dirp->d_name, "..") != 0 ) { diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp index 325b7ea003..7c80b5f452 100644 --- a/modules/core/include/opencv2/core/operations.hpp +++ b/modules/core/include/opencv2/core/operations.hpp @@ -3750,8 +3750,15 @@ template inline ptrdiff_t operator - (const SeqIterator<_Tp>& a, const SeqIterator<_Tp>& b) { ptrdiff_t delta = a.index - b.index, n = a.seq->total; +#if defined(__QNX__) + // No long std::abs(long) in QNX + long absdelta = (delta < 0) ? -delta : delta; + if( absdelta > n ) +#else if( std::abs(static_cast(delta)) > n ) +#endif delta += delta < 0 ? n : -n; + return delta; } diff --git a/modules/core/src/system.cpp b/modules/core/src/system.cpp index e9ffdc71ab..53ebd00eff 100644 --- a/modules/core/src/system.cpp +++ b/modules/core/src/system.cpp @@ -157,7 +157,7 @@ std::wstring GetTempFileNameWinRT(std::wstring prefix) #include -#if defined __linux__ || defined __APPLE__ || defined __EMSCRIPTEN__ +#if defined __linux__ || defined __APPLE__ || defined __EMSCRIPTEN__ || defined __QNX__ #include #include #include diff --git a/modules/highgui/src/grfmt_tiff.cpp b/modules/highgui/src/grfmt_tiff.cpp index 4d04b13658..a8ad2602c9 100644 --- a/modules/highgui/src/grfmt_tiff.cpp +++ b/modules/highgui/src/grfmt_tiff.cpp @@ -45,9 +45,16 @@ (see otherlibs/_graphics/readme.txt for copyright notice) \****************************************************************************************/ +#include + #include "precomp.hpp" #include "grfmt_tiff.hpp" +#ifdef HAVE_TIFF +# include "tiff.h" +# include "tiffio.h" +#endif + namespace cv { static const char fmtSignTiffII[] = "II\x2a\x00"; @@ -55,9 +62,6 @@ static const char fmtSignTiffMM[] = "MM\x00\x2a"; #ifdef HAVE_TIFF -#include "tiff.h" -#include "tiffio.h" - static int grfmt_tiff_err_handler_init = 0; static void GrFmtSilentTIFFErrorHandler( const char*, const char*, va_list ) {} diff --git a/modules/objdetect/src/linemod.cpp b/modules/objdetect/src/linemod.cpp index d6d0227d97..23980c1c13 100644 --- a/modules/objdetect/src/linemod.cpp +++ b/modules/objdetect/src/linemod.cpp @@ -604,7 +604,12 @@ void ColorGradient::write(FileStorage& fs) const static void accumBilateral(long delta, long i, long j, long * A, long * b, int threshold) { - long f = std::abs(delta) < threshold ? 1 : 0; +#ifdef __QNX__ + long absdelta = (delta > 0) ? delta : -delta; + long f = absdelta < threshold ? 1 : 0; +#else + long f = std::abs(delta) < threshold ? 1 : 0; +#endif const long fi = f * i; const long fj = f * j; diff --git a/modules/ts/src/ts.cpp b/modules/ts/src/ts.cpp index 7ce37752db..ee8f01171f 100644 --- a/modules/ts/src/ts.cpp +++ b/modules/ts/src/ts.cpp @@ -60,6 +60,8 @@ #else #include +#include +#include #endif namespace cvtest @@ -110,9 +112,6 @@ static void SEHTranslator( unsigned int /*u*/, EXCEPTION_POINTERS* pExp ) #else -#include -#include - static const int tsSigId[] = { SIGSEGV, SIGBUS, SIGFPE, SIGILL, SIGABRT, -1 }; static jmp_buf tsJmpMark; diff --git a/platforms/qnx/arm-unknown-nto-qnx6.6.0eabi.toolchain.cmake b/platforms/qnx/arm-unknown-nto-qnx6.6.0eabi.toolchain.cmake new file mode 100644 index 0000000000..82b0b9ce12 --- /dev/null +++ b/platforms/qnx/arm-unknown-nto-qnx6.6.0eabi.toolchain.cmake @@ -0,0 +1,114 @@ +set(TOOLCHAIN QNX) +set(CMAKE_SYSTEM_NAME QNX) +set(CMAKE_SYSTEM_VERSION 6.6.0) +set(CMAKE_SYSTEM_PROCESSOR armv7) +set(TARGET_OS QNX) +set(TARGET_ARCH ARMV7L) +set(TARGET_COMPILER GCC) + +set(CMAKE_DL_LIBS "") +set(CMAKE_SHARED_LIBRARY_PREFIX "lib") +set(CMAKE_SHARED_LIBRARY_SUFFIX ".so") +set(CMAKE_STATIC_LIBRARY_PREFIX "lib") +set(CMAKE_STATIC_LIBRARY_SUFFIX ".a") + +if("$ENV{QNX_HOST}" STREQUAL "") + message(FATAL_ERROR "QNX_HOST environment variable not found. Please set the variable to your host's build tools") +endif() +if("$ENV{QNX_TARGET}" STREQUAL "") + message(FATAL_ERROR "QNX_TARGET environment variable not found. Please set the variable to the qnx target location") +endif() + +if(CMAKE_HOST_WIN32) + set(HOST_EXECUTABLE_SUFFIX ".exe") + #convert windows paths to cmake paths + file(TO_CMAKE_PATH "$ENV{QNX_HOST}" QNX_HOST) + file(TO_CMAKE_PATH "$ENV{QNX_TARGET}" QNX_TARGET) +else() + set(QNX_HOST "$ENV{QNX_HOST}") + set(QNX_TARGET "$ENV{QNX_TARGET}") +endif() + +message(STATUS "using QNX_HOST ${QNX_HOST}") +message(STATUS "using QNX_TARGET ${QNX_TARGET}") + +set(CMAKE_C_COMPILER "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-gcc${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX C compiler") +set(CMAKE_CXX_COMPILER "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-g++${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX CXX compiler") +set(CMAKE_ASM_COMPILER "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-as${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX CXX compiler assembler") +set(CMAKE_LINKER "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ld${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX Linker Program") +set(CMAKE_MAKE_PROGRAM "${QNX_HOST}/usr/bin/make${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX Make Program") +set(CMAKE_AR "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ar${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX ar Program") +set(CMAKE_NM "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-nm${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX nm Program") +set(CMAKE_OBJCOPY "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-objcopy${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX objcopy Program") +set(CMAKE_OBJDUMP "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-objdump${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX objdump Program") +set(CMAKE_RANLIB "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ranlib${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX ranlib Program") +set(CMAKE_SH "${QNX_HOST}/usr/bin/sh${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX shell Program") +set(CMAKE_STRIP "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-strip${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX Strip Program") + +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -D_DEBUG") +set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3 -DNDEBUG") + +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -g -D_DEBUG -ftree-vectorize") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O3 -DNDEBUG -ftree-vectorize") + +#set successful exit value on target system +set(THREADS_PTHREAD_ARG 0) + +add_definitions("-DTARGET_OS=QNX") +add_definitions("-DTARGET_ARCH=ARM") +add_definitions("-DOS_QNX") +add_definitions("-DARCH_ARM") + +# necessary for gmock +add_definitions("-DGTEST_HAS_PTHREAD=1") + +add_definitions(-D __GLIBCXX__="1") + +set(CMAKE_FIND_ROOT_PATH ${QNX_TARGET}) + +set(CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries.") +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) + +# macro to find programs on the host OS +macro( find_host_program ) + set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) + set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) + set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) + if( CMAKE_HOST_WIN32 ) + set( WIN32 1 ) + set( UNIX ) + elseif( CMAKE_HOST_APPLE ) + set( APPLE 1 ) + set( UNIX ) + endif() + find_program( ${ARGN} ) + set( WIN32 ) + set( APPLE ) + set( UNIX 1 ) + set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) + set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) + set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) +endmacro() + +# macro to find packages on the host OS +macro( find_host_package ) + set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) + set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) + set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) + if( CMAKE_HOST_WIN32 ) + set( WIN32 1 ) + set( UNIX ) + elseif( CMAKE_HOST_APPLE ) + set( APPLE 1 ) + set( UNIX ) + endif() + find_package( ${ARGN} ) + set( WIN32 ) + set( APPLE ) + set( UNIX 1 ) + set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) + set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) + set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) +endmacro()