From 2ee00e7f7defcf119be9742e2d83fd7c4a7cd95a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Lindstr=C3=B6m?= Date: Wed, 24 Jul 2019 22:12:09 +0200 Subject: [PATCH] Merge pull request #15059 from hugolm84:improved-support-for-wince * Improve support for Windows Embedded Compact * Remove redundant set(WINCE true) and format CMake --- 3rdparty/zlib/zutil.c | 2 +- 3rdparty/zlib/zutil.h | 12 ++-- CMakeLists.txt | 62 ++++++++++--------- .../opencv2/core/utils/filesystem.private.hpp | 2 +- modules/core/src/glob.cpp | 6 +- modules/core/src/ocl.cpp | 2 +- modules/core/src/system.cpp | 24 +++++-- .../wince/arm-wince-headless-overrides.cmake | 12 ++++ platforms/wince/arm-wince.toolchain.cmake | 35 +++++++++++ platforms/wince/readme.md | 62 +++++++++++++++++++ 10 files changed, 174 insertions(+), 45 deletions(-) create mode 100644 platforms/wince/arm-wince-headless-overrides.cmake create mode 100644 platforms/wince/arm-wince.toolchain.cmake create mode 100644 platforms/wince/readme.md diff --git a/3rdparty/zlib/zutil.c b/3rdparty/zlib/zutil.c index a76c6b0c7e..7271667fd7 100644 --- a/3rdparty/zlib/zutil.c +++ b/3rdparty/zlib/zutil.c @@ -136,7 +136,7 @@ const char * ZEXPORT zError(err) return ERR_MSG(err); } -#if defined(_WIN32_WCE) +#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800 /* The Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. diff --git a/3rdparty/zlib/zutil.h b/3rdparty/zlib/zutil.h index b079ea6a80..4774fc3235 100644 --- a/3rdparty/zlib/zutil.h +++ b/3rdparty/zlib/zutil.h @@ -169,11 +169,13 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX # if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif +# if _WIN32_WCE < 0x800 +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# endif # else # define fdopen(fd,type) _fdopen(fd,type) # endif diff --git a/CMakeLists.txt b/CMakeLists.txt index c9a5c42965..6ce583bc69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,35 +53,6 @@ if(NOT DEFINED CMAKE_INSTALL_PREFIX) endif() endif() -if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore) - set(WINRT TRUE) -endif() - -if(WINRT) - add_definitions(-DWINRT -DNO_GETENV) - - # Making definitions available to other configurations and - # to filter dependency restrictions at compile time. - if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone) - set(WINRT_PHONE TRUE) - add_definitions(-DWINRT_PHONE) - elseif(CMAKE_SYSTEM_NAME MATCHES WindowsStore) - set(WINRT_STORE TRUE) - add_definitions(-DWINRT_STORE) - endif() - - if(CMAKE_SYSTEM_VERSION MATCHES 10) - set(WINRT_10 TRUE) - add_definitions(-DWINRT_10) - elseif(CMAKE_SYSTEM_VERSION MATCHES 8.1) - set(WINRT_8_1 TRUE) - add_definitions(-DWINRT_8_1) - elseif(CMAKE_SYSTEM_VERSION MATCHES 8.0) - set(WINRT_8_0 TRUE) - add_definitions(-DWINRT_8_0) - endif() -endif() - if(POLICY CMP0026) cmake_policy(SET CMP0026 NEW) endif() @@ -136,6 +107,39 @@ enable_testing() project(OpenCV CXX C) +if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore) + set(WINRT TRUE) +endif() + +if(WINRT OR WINCE) + add_definitions(-DNO_GETENV) +endif() + +if(WINRT) + add_definitions(-DWINRT) + + # Making definitions available to other configurations and + # to filter dependency restrictions at compile time. + if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone) + set(WINRT_PHONE TRUE) + add_definitions(-DWINRT_PHONE) + elseif(CMAKE_SYSTEM_NAME MATCHES WindowsStore) + set(WINRT_STORE TRUE) + add_definitions(-DWINRT_STORE) + endif() + + if(CMAKE_SYSTEM_VERSION MATCHES 10) + set(WINRT_10 TRUE) + add_definitions(-DWINRT_10) + elseif(CMAKE_SYSTEM_VERSION MATCHES 8.1) + set(WINRT_8_1 TRUE) + add_definitions(-DWINRT_8_1) + elseif(CMAKE_SYSTEM_VERSION MATCHES 8.0) + set(WINRT_8_0 TRUE) + add_definitions(-DWINRT_8_0) + endif() +endif() + if(MSVC) set(CMAKE_USE_RELATIVE_PATHS ON CACHE INTERNAL "" FORCE) endif() diff --git a/modules/core/include/opencv2/core/utils/filesystem.private.hpp b/modules/core/include/opencv2/core/utils/filesystem.private.hpp index deca4a4f95..b477cafc8e 100644 --- a/modules/core/include/opencv2/core/utils/filesystem.private.hpp +++ b/modules/core/include/opencv2/core/utils/filesystem.private.hpp @@ -9,7 +9,7 @@ #ifndef OPENCV_HAVE_FILESYSTEM_SUPPORT # if defined(__EMSCRIPTEN__) || defined(__native_client__) /* no support */ -# elif defined WINRT +# elif defined WINRT || defined _WIN32_WCE /* not supported */ # elif defined __ANDROID__ || defined __linux__ || defined _WIN32 || \ defined __FreeBSD__ || defined __bsdi__ || defined __HAIKU__ diff --git a/modules/core/src/glob.cpp b/modules/core/src/glob.cpp index 5aad2756f6..db054daa52 100644 --- a/modules/core/src/glob.cpp +++ b/modules/core/src/glob.cpp @@ -57,7 +57,7 @@ namespace struct DIR { -#ifdef WINRT +#if defined(WINRT) || defined(_WIN32_WCE) WIN32_FIND_DATAW data; #else WIN32_FIND_DATAA data; @@ -78,7 +78,7 @@ namespace { DIR* dir = new DIR; dir->ent.d_name = 0; -#ifdef WINRT +#if defined(WINRT) || defined(_WIN32_WCE) cv::String full_path = cv::String(path) + "\\*"; wchar_t wfull_path[MAX_PATH]; size_t copied = mbstowcs(wfull_path, full_path.c_str(), MAX_PATH); @@ -100,7 +100,7 @@ namespace dirent* readdir(DIR* dir) { -#ifdef WINRT +#if defined(WINRT) || defined(_WIN32_WCE) if (dir->ent.d_name != 0) { if (::FindNextFileW(dir->handle, &dir->data) != TRUE) diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index bef36f31b0..79797bc801 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -1722,7 +1722,7 @@ static bool parseOpenCLDeviceConfiguration(const std::string& configurationStr, return true; } -#ifdef WINRT +#if defined WINRT || defined _WIN32_WCE static cl_device_id selectOpenCLDevice() { return NULL; diff --git a/modules/core/src/system.cpp b/modules/core/src/system.cpp index 2c0038b80e..eec0082486 100644 --- a/modules/core/src/system.cpp +++ b/modules/core/src/system.cpp @@ -378,7 +378,7 @@ struct HWFeatures void initialize(void) { -#ifndef WINRT +#ifndef NO_GETENV if (getenv("OPENCV_DUMP_CONFIG")) { fprintf(stderr, "\nOpenCV build configuration is:\n%s\n", @@ -614,10 +614,10 @@ struct HWFeatures { bool dump = true; const char* disabled_features = -#ifndef WINRT - getenv("OPENCV_CPU_DISABLE"); -#else +#ifdef NO_GETENV NULL; +#else + getenv("OPENCV_CPU_DISABLE"); #endif if (disabled_features && disabled_features[0] != 0) { @@ -892,7 +892,7 @@ String format( const char* fmt, ... ) String tempfile( const char* suffix ) { String fname; -#ifndef WINRT +#ifndef NO_GETENV const char *temp_dir = getenv("OPENCV_TEMP_PATH"); #endif @@ -913,6 +913,20 @@ String tempfile( const char* suffix ) CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1)); fname = String(aname); RoUninitialize(); +#elif defined(_WIN32_WCE) + const auto kMaxPathSize = MAX_PATH+1; + wchar_t temp_dir[kMaxPathSize] = {0}; + wchar_t temp_file[kMaxPathSize] = {0}; + + ::GetTempPathW(kMaxPathSize, temp_dir); + + if(0 != ::GetTempFileNameW(temp_dir, L"ocv", 0, temp_file)) { + DeleteFileW(temp_file); + char aname[MAX_PATH]; + size_t copied = wcstombs(aname, temp_file, MAX_PATH); + CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1)); + fname = String(aname); + } #else char temp_dir2[MAX_PATH] = { 0 }; char temp_file[MAX_PATH] = { 0 }; diff --git a/platforms/wince/arm-wince-headless-overrides.cmake b/platforms/wince/arm-wince-headless-overrides.cmake new file mode 100644 index 0000000000..e658f8812e --- /dev/null +++ b/platforms/wince/arm-wince-headless-overrides.cmake @@ -0,0 +1,12 @@ +if(WINCE) + # CommCtrl.lib does not exist in headless WINCE Adding this will make CMake + # Try_Compile succeed and therefore also C/C++ ABI Detetection work + # https://gitlab.kitware.com/cmake/cmake/blob/master/Modules/Platform/Windows- + # MSVC.cmake + set(CMAKE_C_STANDARD_LIBRARIES_INIT "coredll.lib") + set(CMAKE_CXX_STANDARD_LIBRARIES_INIT ${CMAKE_C_STANDARD_LIBRARIES_INIT}) + foreach(ID EXE SHARED MODULE) + string(APPEND CMAKE_${ID}_LINKER_FLAGS_INIT + " /NODEFAULTLIB:libc.lib /NODEFAULTLIB:oldnames.lib") + endforeach() +endif() diff --git a/platforms/wince/arm-wince.toolchain.cmake b/platforms/wince/arm-wince.toolchain.cmake new file mode 100644 index 0000000000..fc96d12eb9 --- /dev/null +++ b/platforms/wince/arm-wince.toolchain.cmake @@ -0,0 +1,35 @@ +set(CMAKE_SYSTEM_NAME WindowsCE) + +if(NOT CMAKE_SYSTEM_VERSION) + set(CMAKE_SYSTEM_VERSION 8.0) +endif() + +if(NOT CMAKE_SYSTEM_PROCESSOR) + set(CMAKE_SYSTEM_PROCESSOR armv7-a) +endif() + +if(NOT CMAKE_GENERATOR_TOOLSET) + set(CMAKE_GENERATOR_TOOLSET CE800) +endif() + +# Needed to make try_compile to succeed +if(BUILD_HEADLESS) + set(CMAKE_USER_MAKE_RULES_OVERRIDE + ${CMAKE_CURRENT_LIST_DIR}/arm-wince-headless-overrides.cmake) +endif() + +if(NOT CMAKE_FIND_ROOT_PATH_MODE_PROGRAM) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +endif() + +if(NOT CMAKE_FIND_ROOT_PATH_MODE_LIBRARY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +endif() + +if(NOT CMAKE_FIND_ROOT_PATH_MODE_INCLUDE) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +if(NOT CMAKE_FIND_ROOT_PATH_MODE_PACKAGE) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) +endif() diff --git a/platforms/wince/readme.md b/platforms/wince/readme.md new file mode 100644 index 0000000000..3b7ca2c764 --- /dev/null +++ b/platforms/wince/readme.md @@ -0,0 +1,62 @@ +# Building OpenCV from Source for Windows Embedded Compact (WINCE/WEC) + +## Requirements +CMake 3.1.0 or higher +Windows Embedded Compact SDK + +## Configuring +To configure CMake for Windows Embedded, specify Visual Studio 2013 as generator and the name of your installed SDK: + +`cmake -G "Visual Studio 12 2013" -A "MySDK WEC2013" -DCMAKE_TOOLCHAIN_FILE:FILEPATH=../platforms/wince/arm-wince.toolchain.cmake` + +If you are building for a headless WINCE, specify `-DBUILD_HEADLESS=ON` when configuring. This will remove the `commctrl.lib` dependency. + +If you are building for anything else than WINCE800, you need to specify that in the configuration step. Example: + +``` +-DCMAKE_SYSTEM_VERSION=7.0 -DCMAKE_GENERATOR_TOOLSET=CE700 -DCMAKE_SYSTEM_PROCESSOR=arm-v4 +``` + +For headless WEC2013, this configuration may not be limited to but is known to work: + +``` +-DBUILD_EXAMPLES=OFF ` +-DBUILD_opencv_apps=OFF ` +-DBUILD_opencv_calib3d=OFF ` +-DBUILD_opencv_highgui=OFF ` +-DBUILD_opencv_features2d=OFF ` +-DBUILD_opencv_flann=OFF ` +-DBUILD_opencv_ml=OFF ` +-DBUILD_opencv_objdetect=OFF ` +-DBUILD_opencv_photo=OFF ` +-DBUILD_opencv_shape=OFF ` +-DBUILD_opencv_stitching=OFF ` +-DBUILD_opencv_superres=OFF ` +-DBUILD_opencv_ts=OFF ` +-DBUILD_opencv_video=OFF ` +-DBUILD_opencv_videoio=OFF ` +-DBUILD_opencv_videostab=OFF ` +-DBUILD_opencv_dnn=OFF ` +-DBUILD_opencv_java=OFF ` +-DBUILD_opencv_python2=OFF ` +-DBUILD_opencv_python3=OFF ` +-DBUILD_opencv_java_bindings_generator=OFF ` +-DBUILD_opencv_python_bindings_generator=OFF ` +-DBUILD_TIFF=OFF ` +-DCV_TRACE=OFF ` +-DWITH_OPENCL=OFF ` +-DHAVE_OPENCL=OFF ` +-DWITH_QT=OFF ` +-DWITH_GTK=OFF ` +-DWITH_QUIRC=OFF ` +-DWITH_JASPER=OFF ` +-DWITH_WEBP=OFF ` +-DWITH_PROTOBUF=OFF ` +-DBUILD_SHARED_LIBS=OFF ` +-DWITH_OPENEXR=OFF ` +-DWITH_TIFF=OFF ` +``` + +## Building +You are required to build using Unicode: +`cmake --build . -- /p:CharacterSet=Unicode`