Co-authored-by: Sugar-Baby <87747602+Sugar-Baby@users.noreply.github.com> Co-authored-by: AtomAlpaca <66774326+AtomAlpaca@users.noreply.github.com> Co-authored-by: nihui <171016+nihui@users.noreply.github.com>pull/6204/head
| @@ -0,0 +1,62 @@ | |||
| name: windows-xp-clang | |||
| on: | |||
| push: | |||
| branches: [master] | |||
| paths: | |||
| - '.github/workflows/windows-xp-clang.yml' | |||
| - 'toolchains/windows-xp-clang.toolchain.cmake' | |||
| - 'CMakeLists.txt' | |||
| - 'cmake/**' | |||
| - 'src/*' | |||
| - 'src/layer/*' | |||
| - 'src/layer/x86/**' | |||
| - 'tests/**' | |||
| pull_request: | |||
| branches: [master] | |||
| paths: | |||
| - '.github/workflows/windows-xp-clang.yml' | |||
| - 'toolchains/windows-xp-clang.toolchain.cmake' | |||
| - 'CMakeLists.txt' | |||
| - 'cmake/**' | |||
| - 'src/*' | |||
| - 'src/layer/*' | |||
| - 'src/layer/x86/**' | |||
| - 'tests/**' | |||
| concurrency: | |||
| group: windows-xp-clang-${{ github.ref }} | |||
| cancel-in-progress: true | |||
| permissions: | |||
| contents: read | |||
| jobs: | |||
| windows: | |||
| name: Clang | |||
| runs-on: windows-2022 | |||
| env: | |||
| UseMultiToolTask: true | |||
| NCNN_CMAKE_OPTIONS: -DNCNN_BUILD_TOOLS=OFF -DNCNN_BUILD_EXAMPLES=OFF -DNCNN_BUILD_TESTS=ON | |||
| steps: | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| submodules: true | |||
| - name: Set up Clang | |||
| run: choco install llvm --version=6.0.0 --allow-downgrade | |||
| - name: Verify Clang | |||
| run: | | |||
| clang --version | |||
| clang++ --version | |||
| - name: config | |||
| run: | | |||
| Invoke-WebRequest -Uri https://jaist.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/8.1.0/threads-posix/dwarf/i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z -OutFile i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z | |||
| 7z x ./i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z | |||
| Add-Content -Path $env:GITHUB_ENV -Value "MINGW32_ROOT_PATH=${{ github.workspace }}\mingw32" | |||
| echo "${{ github.workspace }}\mingw32\bin;$env:PATH" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 | |||
| - name: build | |||
| run: | | |||
| mkdir build; cd build | |||
| cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DCMAKE_TOOLCHAIN_FILE="../toolchains/windows-xp-clang.toolchain.cmake" -DNCNN_SIMPLEOCV=ON -DNCNN_SIMPLEOMP=ON -DNCNN_AVX2=OFF -DNCNN_AVX=OFF .. -G "MinGW Makefiles" | |||
| cmake --build . --config Release -j 4 | |||
| - name: test | |||
| run: cd build; ctest -C Release --output-on-failure -j 4 | |||
| @@ -0,0 +1,57 @@ | |||
| name: windows-xp-mingw | |||
| on: | |||
| push: | |||
| branches: [master] | |||
| paths: | |||
| - '.github/workflows/windows-xp-mingw.yml' | |||
| - 'toolchains/windows-xp-mingw.toolchain.cmake' | |||
| - 'CMakeLists.txt' | |||
| - 'cmake/**' | |||
| - 'src/*' | |||
| - 'src/layer/*' | |||
| - 'src/layer/x86/**' | |||
| - 'tests/**' | |||
| pull_request: | |||
| branches: [master] | |||
| paths: | |||
| - '.github/workflows/windows-xp-mingw.yml' | |||
| - 'toolchains/windows-xp-mingw.toolchain.cmake' | |||
| - 'CMakeLists.txt' | |||
| - 'cmake/**' | |||
| - 'src/*' | |||
| - 'src/layer/*' | |||
| - 'src/layer/x86/**' | |||
| - 'tests/**' | |||
| concurrency: | |||
| group: windows-xp-mingw-${{ github.ref }} | |||
| cancel-in-progress: true | |||
| permissions: | |||
| contents: read | |||
| jobs: | |||
| windows: | |||
| name: MinGW-w32 | |||
| runs-on: windows-2022 | |||
| env: | |||
| UseMultiToolTask: true | |||
| NCNN_CMAKE_OPTIONS: -DNCNN_BUILD_TOOLS=OFF -DNCNN_BUILD_EXAMPLES=OFF -DNCNN_BUILD_TESTS=ON | |||
| steps: | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| submodules: true | |||
| - name: config | |||
| run: | | |||
| Invoke-WebRequest -Uri https://jaist.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/8.1.0/threads-posix/dwarf/i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z -OutFile i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z | |||
| 7z x ./i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z | |||
| Add-Content -Path $env:GITHUB_ENV -Value "MINGW32_ROOT_PATH=${{ github.workspace }}\mingw32" | |||
| Add-Content -Path $env:GITHUB_PATH -Value "${{ github.workspace }}\mingw32\bin" | |||
| - name: build | |||
| run: | | |||
| mkdir build; cd build | |||
| cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DCMAKE_TOOLCHAIN_FILE="../toolchains/windows-xp-mingw.toolchain.cmake" -DNCNN_SIMPLEOCV=ON -DNCNN_AVX2=OFF -DNCNN_AVX=OFF -DNCNN_VULKAN=OFF .. -G "MinGW Makefiles" | |||
| cmake --build . --config Release -j 4 | |||
| - name: test | |||
| run: cd build; ctest -C Release --output-on-failure -j 4 | |||
| @@ -0,0 +1,56 @@ | |||
| name: windows-xp-msvc | |||
| on: | |||
| push: | |||
| branches: [master] | |||
| paths: | |||
| - '.github/workflows/windows-xp-msvc.yml' | |||
| - 'toolchains/windows-xp-msvc.toolchain.cmake' | |||
| - 'CMakeLists.txt' | |||
| - 'cmake/**' | |||
| - 'src/*' | |||
| - 'src/layer/*' | |||
| - 'src/layer/x86/**' | |||
| - 'tests/**' | |||
| pull_request: | |||
| branches: [master] | |||
| paths: | |||
| - '.github/workflows/windows-xp-msvc.yml' | |||
| - 'toolchains/windows-xp-msvc.toolchain.cmake' | |||
| - 'CMakeLists.txt' | |||
| - 'cmake/**' | |||
| - 'src/*' | |||
| - 'src/layer/*' | |||
| - 'src/layer/x86/**' | |||
| - 'tests/**' | |||
| concurrency: | |||
| group: windows-xp-msvc-${{ github.ref }} | |||
| cancel-in-progress: true | |||
| permissions: | |||
| contents: read | |||
| jobs: | |||
| windows: | |||
| name: MSVC | |||
| runs-on: windows-2022 | |||
| env: | |||
| VS_INSTALL_DIR: C:\Program Files\Microsoft Visual Studio\2022\Enterprise | |||
| UseMultiToolTask: true | |||
| NCNN_CMAKE_OPTIONS: -DNCNN_BUILD_TOOLS=OFF -DNCNN_BUILD_EXAMPLES=OFF -DNCNN_BUILD_TESTS=ON | |||
| steps: | |||
| - uses: actions/checkout@v4 | |||
| with: | |||
| submodules: true | |||
| - name: config | |||
| shell: cmd | |||
| run: | | |||
| "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify --installPath "${{ env.VS_INSTALL_DIR }}" --channelId VisualStudio.17.Release --add Microsoft.VisualStudio.Component.WinXP --add Microsoft.VisualStudio.Component.VC.Tools.X86.X64.Spectre --add Microsoft.VisualStudio.Component.VC.Tools.X86.X64 --add Microsoft.VisualStudio.Component.VC.Tools.X86.X64 --add Microsoft.VisualStudio.Component.VC.v141.xp --nocache --quiet | |||
| call "${{ env.VS_INSTALL_DIR }}\VC\Auxiliary\Build\vcvarsall.bat" x86 | |||
| - name: build | |||
| run: | | |||
| mkdir build; cd build | |||
| cmake ${{ env.NCNN_CMAKE_OPTIONS }} -A WIN32 -G "Visual Studio 17 2022" -T v141_xp -DNCNN_SIMPLEOCV=ON -DNCNN_OPENMP=OFF -DNCNN_BUILD_WITH_STATIC_CRT=ON -DNCNN_AVX2=OFF -DNCNN_AVX=OFF -DCMAKE_TOOLCHAIN_FILE="../toolchains/windows-xp-msvc.toolchain.cmake" .. | |||
| cmake --build . --config Release -j 4 | |||
| - name: test | |||
| run: cd build; ctest -C Release --output-on-failure -j 4 | |||
| @@ -0,0 +1,137 @@ | |||
| # Build ncnn on Windows XP | |||
| > **Contributors:** [@Sugar-Baby](https://github.com/Sugar-Baby) and [@AtomAlpaca](https://github.com/AtomAlpaca) | |||
| ## 0. 环境准备 | |||
| #### 0.1 虚拟机设置 | |||
| 我使用的是[我的MSDN](https://www.imsdn.cn/)提供的[Windows XP SP3 x64版本](https://www.imsdn.cn/operating-systems/windows-xp/)。虚拟机使用Oracle VM VirtualBox,内存4GB,存储空间64GB(C盘16GB,D盘48GB)。 | |||
| **在虚拟机关机的情况下**,点击虚拟机管理器界面的"设置"-"网络"-"高级",将控制芯片改为PCnet-FAST III,混杂模式设置为拒绝,勾选接入网线,点击"OK"保存。重启虚拟机就可以连接上网络了。 | |||
| 点击虚拟机界面的"设备"-"安装增强功能...",在虚拟机中进入"我的电脑",刷新后出现"VirtualBox Guest Additions (D: )",右键选择"自动播放",完成安装后重启。 | |||
| 点击虚拟机界面的"设备"-"共享粘贴板",设置为"双向"。点击"设备"-"共享文件夹"-"共享文件夹..",点击右侧加号,在"共享文件夹路径"中选择"其他...",然后选择需要共享的主机文件夹。勾选"自动挂载"和"固定分配",点击"OK"保存。在虚拟机中进入"我的电脑",刷新后出现'VBoxSvr' 上的 <主机文件夹名称>,双击进入就可以双向传输文件了。 | |||
| #### 0.2 开发环境配置 | |||
| 浏览器推荐[Mypal 68](https://www.mypal-browser.org/download.html),注意要选择32位版本。Windows XP自带ZIP文件解压。安装后就可以访问互联网了。 | |||
| 从Github下载[w64devkit](https://github.com/skeeto/w64devkit),选择x86版本。这里下载的是一个自解压的7z文件,在虚拟机中解压即可。 | |||
| 在"开始"-"控制面板"-"切换到经典视图"-"系统"-"高级"-"环境变量"-"系统变量"中,选择Path,点击"编辑",在字符串末尾加入一个分号(;),然后粘贴w64devkit下bin文件夹的目录。点击"确定"保存之后可以打开命令提示符输入例如c++的命令验证是否成功加入环境变量。 | |||
| 由于年代过于久远,Git的官方release已经没有兼容Windows XP的版本了。最后一个兼容的版本(1.9.5)可以在[这里](https://www.xiazaiba.com/html/29352.html)下载。 | |||
| 为了使用Git,需要安装[Win32 OpenSSL](https://slproweb.com/products/Win32OpenSSL.html)。选择Win32 OpenSSL Light版本。这个过程中会附带安装VC++ 2022运行时库。 | |||
| 如果因为协议、代理等问题不能在虚拟机中使用Git,也可以下载ZIP版本后在虚拟机中解压。 | |||
| 需要手动下载[CMake最后支持Windows XP的版本](https://github.com/Kitware/CMake/releases/download/v3.10.3/cmake-3.10.3-win32-x86.zip)。建议解压在C:\Program Files下,并且需要设置系统变量,到CMake目录下的bin文件夹。具体可以参考上面w64devkit的方法。 | |||
| ## 1. 编译 | |||
| ### 1.1 使用 MinGW-w64 | |||
| 运行 | |||
| ```bash | |||
| cd <ncnn-root-dir> | |||
| mkdir build | |||
| cd build | |||
| cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/windows-xp-mingw.toolchain.cmake -DNCNN_VULKAN=OFF -DNCNN_SIMPLEOCV=ON -DNCNN_AVX=OFF -DCMAKE_BUILD_TYPE=Release -G "MinGW Makefiles" .. | |||
| make -j2 | |||
| make install | |||
| ``` | |||
| 由于平台性能的限制,Vulkan SDK 最低要求 Windows 7 SP1,XP 无法安装官方驱动和工具链,因此需要关闭Vulkan选项。同时需要使用简化版 OpenCV 替代库NCNN_SIMPLEOCV。 | |||
| ### 1.2 使用 Clang | |||
| 需要先配置 MinGW-w64 环境,然后安装 Clang 6.0 或更高版本。 | |||
| ```bash | |||
| cd <ncnn-root-dir> | |||
| mkdir build | |||
| cd build | |||
| cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/windows-xp-clang.toolchain.cmake -DNCNN_SIMPLEOCV=ON -DNCNN_SIMPLEOMP=ON -DNCNN_AVX=OFF -DCMAKE_BUILD_TYPE=Release -G "MinGW Makefiles" .. | |||
| make -j2 | |||
| make install | |||
| ``` | |||
| ### 1.3 使用 Visual Studio (MSVC) | |||
| 需要安装支持 Windows XP 的 v141_xp 工具集: | |||
| 1. 打开 Visual Studio 安装程序(工具 → 获取工具和功能) | |||
| 2. 选择"使用 C++ 的桌面开发" | |||
| 3. 在摘要部分选择"对 C++ 的 Windows XP 支持" | |||
| 4. 点击修改 | |||
| ```bash | |||
| cd <ncnn-root-dir> | |||
| mkdir build | |||
| cd build | |||
| cmake -A WIN32 -G "Visual Studio 17 2022" -T v141_xp -DNCNN_SIMPLEOCV=ON -DNCNN_OPENMP=OFF -DNCNN_AVX=OFF -DNCNN_BUILD_WITH_STATIC_CRT=ON -DCMAKE_TOOLCHAIN_FILE=../toolchains/windows-xp-msvc.toolchain.cmake .. | |||
| cmake --build . --config Release -j 2 | |||
| cmake --build . --config Release --target install | |||
| ``` | |||
| ## 2. 测试 | |||
| ### 2.1 benchncnn | |||
| 将benchmark目录下的所有文件复制到build/benchmark目录下。在命令提示符中cd到build/benchmark, 然后运行 | |||
| ```bash | |||
| benchncnn [测试的循环次数] [线程数] [节能模式] | |||
| ``` | |||
| 其中,节能模式取值为0时关闭,为1时打开。 | |||
| ### 2.2 examples | |||
| 从[这里](https://github.com/nihui/ncnn-assets/tree/master/models)可以下载到所有需要的param和bin文件。需要注意的是,ZF_faster_rcnn_final.bin开头的三个文件(.zip,.z01,.z02)最好先放在主机上解压出bin文件再传进虚拟机。 | |||
| 把这些文件放在build/examples目录下。 | |||
| 我写了一个bat脚本来批量测试这些模型: | |||
| ```batch | |||
| @echo off | |||
| setlocal enabledelayedexpansion | |||
| set EXAMPLES_DIR=<ncnn-root-dir>\BUILD\EXAMPLES | |||
| set IMAGE_PATH=<ncnn-root-dir>\IMAGES\256-ncnn.png | |||
| set LOG_FILE=test_results.log | |||
| echo NCNN Examples Test Results > %LOG_FILE% | |||
| echo ========================= >> %LOG_FILE% | |||
| echo Test started: %date% %time% >> %LOG_FILE% | |||
| echo. >> %LOG_FILE% | |||
| for %%f in ("%EXAMPLES_DIR%\*.exe") do ( | |||
| set EXE_NAME=%%~nf | |||
| set EXE_PATH=%%f | |||
| echo Testing: !EXE_NAME! >> %LOG_FILE% | |||
| echo -------------------------------- >> %LOG_FILE% | |||
| !EXE_PATH! "%IMAGE_PATH%" >> %LOG_FILE% 2>&1 | |||
| if errorlevel 1 ( | |||
| echo [ERROR] !EXE_NAME! failed to run. >> %LOG_FILE% | |||
| ) else ( | |||
| echo [SUCCESS] !EXE_NAME! completed. >> %LOG_FILE% | |||
| ) | |||
| echo. >> %LOG_FILE% | |||
| ) | |||
| echo Test finished: %date% %time% >> %LOG_FILE% | |||
| echo Results saved to %LOG_FILE% | |||
| endlocal | |||
| ``` | |||
| 把这个bat脚本放在build/examples目录下,替换掉所有的`<ncnn-root-dir>`,双击运行。通过生成的test_results.log即可查看所有模型的结果。 | |||
| 通过修改`set IMAGE_PATH=<ncnn-root-dir>\IMAGES\256-ncnn.png`中的路径来更换需要测试的文件。 | |||
| @@ -16,6 +16,10 @@ git submodule update --init | |||
| - [Verification](#verification) | |||
| - [Build for Windows x64 using Visual Studio Community 2017](#build-for-windows-x64-using-visual-studio-community-2017) | |||
| - [Build for Windows x64 using MinGW-w64](#build-for-windows-x64-using-mingw-w64) | |||
| - [Build for Windows XP (x86)](#build-for-windows-xp-x86) | |||
| - [Using MinGW-w64](#using-mingw-w64) | |||
| - [Using Clang](#using-clang) | |||
| - [Using Visual Studio (MSVC)](#using-visual-studio-msvc) | |||
| - [Build for macOS](#build-for-macos) | |||
| - [Build for ARM Cortex-A family with cross-compiling](#build-for-arm-cortex-a-family-with-cross-compiling) | |||
| - [Build for Hisilicon platform with cross-compiling](#build-for-hisilicon-platform-with-cross-compiling) | |||
| @@ -263,6 +267,57 @@ cmake --build . --config Release --target install | |||
| *** | |||
| ### Build for Windows XP (x86) | |||
| > **Note:** Windows XP support is provided through collaborative contributions from [@Sugar-Baby](https://github.com/Sugar-Baby) and [@AtomAlpaca](https://github.com/AtomAlpaca). | |||
| #### Using MinGW-w64 | |||
| Download mingw toolchain targeting 32 bit from [sourceforge](https://jaist.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/8.1.0/threads-posix/dwarf/i686-8.1.0-release-posix-dwarf-rt_v6-rev0.7z), extract and add environment variable named `MINGW32_ROOT_PATH` valued by `<your-path-to-mingw-root-path>`, and add `<your-path-to-mingw-root-path>/bin` to `PATH`. | |||
| ```shell | |||
| mkdir build | |||
| cd build | |||
| cmake -DCMAKE_TOOLCHAIN_FILE="../toolchains/windows-xp-mingw.toolchain.cmake" -DNCNN_SIMPLEOCV=ON -DNCNN_AVX2=OFF -DNCNN_AVX=OFF -DNCNN_VULKAN=OFF .. -G "MinGW Makefiles" | |||
| cmake --build . --config Release -j 4 | |||
| cmake --build . --config Release --target install | |||
| ``` | |||
| #### Using Clang | |||
| Clang requires libraries from mingw. Configure mingw toolchain targeting 32-bit as described in the [MinGW-w64 section](#using-mingw-w64). | |||
| Install Clang 6.0 or later. | |||
| ```shell | |||
| mkdir build | |||
| cd build | |||
| cmake -DCMAKE_TOOLCHAIN_FILE="../toolchains/windows-xp-clang.toolchain.cmake" -DNCNN_SIMPLEOCV=ON -DNCNN_SIMPLEOMP=ON -DNCNN_AVX2=OFF -DNCNN_AVX=OFF .. -G "MinGW Makefiles" | |||
| cmake --build . --config Release -j 4 | |||
| cmake --build . --config Release --target install | |||
| ``` | |||
| #### Using Visual Studio (MSVC) | |||
| Install v141_xp toolset for Windows XP: | |||
| 1. Bring up the Visual Studio installer (Tools → Get Tools and Features) | |||
| 2. Select Desktop development with C++ | |||
| 3. Select Windows XP support for C++ from the Summary section | |||
| 4. Click Modify | |||
| ```shell | |||
| mkdir build | |||
| cd build | |||
| cmake -A WIN32 -G "Visual Studio 17 2022" -T v141_xp -DNCNN_SIMPLEOCV=ON -DNCNN_OPENMP=OFF -DNCNN_AVX2=OFF -DNCNN_AVX=OFF -DNCNN_BUILD_WITH_STATIC_CRT=ON -DCMAKE_TOOLCHAIN_FILE="../toolchains/windows-xp-msvc.toolchain.cmake" .. | |||
| cmake --build . --config Release -j 2 | |||
| cmake --build . --config Release --target install | |||
| ``` | |||
| **Note:** The MSVC toolchain uses the `v141_xp` platform toolset for Windows XP compatibility. Vulkan is disabled for XP compatibility, and advanced CPU features (AVX, AVX2, AVX512) are disabled to ensure compatibility with older processors. | |||
| *** | |||
| ### Build for macOS | |||
| We've published ncnn to [brew](https://formulae.brew.sh/formula/ncnn#default) now, you can just use following method to install ncnn if you have the Xcode Command Line Tools installed. | |||
| @@ -153,7 +153,11 @@ __attribute__((constructor)) void ncnn_kmp_env_initializer() | |||
| // and cpu core goes offline in powersave mode on android, which triggers abort | |||
| // disable affinity capability, we handle thread affinity for openmp threads | |||
| #if defined _WIN32 | |||
| #if _WIN32_WINNT >= 0x0600 | |||
| _putenv_s("KMP_AFFINITY", "disabled"); | |||
| #else | |||
| _putenv("KMP_AFFINITY=disabled"); | |||
| #endif | |||
| #else | |||
| setenv("KMP_AFFINITY", "disabled", 1); | |||
| #endif | |||
| @@ -163,7 +167,11 @@ __attribute__((constructor)) void ncnn_kmp_env_initializer() | |||
| // this happens when loading multiple libraries that are static linked openmp | |||
| // just let it continue to work, it works well in most cases, at least it won't crash unexpectedly | |||
| #if defined _WIN32 | |||
| #if _WIN32_WINNT >= 0x0600 | |||
| _putenv_s("KMP_DUPLICATE_LIB_OK", "1"); | |||
| #else | |||
| _putenv("KMP_DUPLICATE_LIB_OK=1"); | |||
| #endif | |||
| #else | |||
| setenv("KMP_DUPLICATE_LIB_OK", "1", 1); | |||
| #endif | |||
| @@ -67,6 +67,9 @@ | |||
| #if NCNN_THREADS | |||
| #if defined _WIN32 | |||
| #define WIN32_LEAN_AND_MEAN | |||
| #ifndef _WIN32_WINNT | |||
| #define _WIN32_WINNT 0x0501 | |||
| #endif | |||
| #include <windows.h> | |||
| #include <process.h> | |||
| #else | |||
| @@ -84,6 +87,7 @@ namespace ncnn { | |||
| #if NCNN_THREADS | |||
| #if defined _WIN32 | |||
| #if _WIN32_WINNT > _WIN32_WINNT_WINXP // Windows Vista and later | |||
| class NCNN_EXPORT Mutex | |||
| { | |||
| public: | |||
| @@ -93,7 +97,6 @@ public: | |||
| void unlock() { ReleaseSRWLockExclusive(&srwlock); } | |||
| private: | |||
| friend class ConditionVariable; | |||
| // NOTE SRWLock is available from windows vista | |||
| SRWLOCK srwlock; | |||
| }; | |||
| @@ -109,6 +112,56 @@ private: | |||
| CONDITION_VARIABLE condvar; | |||
| }; | |||
| #else // Windows XP compatibility | |||
| class NCNN_EXPORT Mutex | |||
| { | |||
| public: | |||
| Mutex() { InitializeCriticalSection(&cs); } | |||
| ~Mutex() { DeleteCriticalSection(&cs); } | |||
| void lock() { EnterCriticalSection(&cs); } | |||
| void unlock() { LeaveCriticalSection(&cs); } | |||
| private: | |||
| friend class ConditionVariable; | |||
| CRITICAL_SECTION cs; | |||
| }; | |||
| class NCNN_EXPORT ConditionVariable | |||
| { | |||
| public: | |||
| ConditionVariable() | |||
| { | |||
| signal_event = CreateEvent(0, FALSE, FALSE, 0); // Auto-reset event for signal() | |||
| broadcast_event = CreateEvent(0, TRUE, FALSE, 0); // Manual-reset event for broadcast() | |||
| } | |||
| ~ConditionVariable() | |||
| { | |||
| CloseHandle(signal_event); | |||
| CloseHandle(broadcast_event); | |||
| } | |||
| void wait(Mutex& mutex) | |||
| { | |||
| mutex.unlock(); | |||
| HANDLE events[2] = { signal_event, broadcast_event }; | |||
| WaitForMultipleObjects(2, events, FALSE, INFINITE); // Wait for either signal or broadcast | |||
| mutex.lock(); | |||
| } | |||
| void broadcast() | |||
| { | |||
| SetEvent(broadcast_event); // Wake all threads | |||
| ResetEvent(broadcast_event); // Reset after waking all threads | |||
| } | |||
| void signal() | |||
| { | |||
| SetEvent(signal_event); // Wake one thread | |||
| } | |||
| private: | |||
| HANDLE signal_event; | |||
| HANDLE broadcast_event; | |||
| }; | |||
| #endif // _WIN32_WINNT > _WIN32_WINNT_WINXP | |||
| static unsigned __stdcall start_wrapper(void* args); | |||
| class NCNN_EXPORT Thread | |||
| { | |||
| @@ -107,8 +107,8 @@ static int test_cpu_powersave() | |||
| #else | |||
| #if defined _WIN32 | |||
| // Check SDK >= Win7 | |||
| #if _WIN32_WINNT >= _WIN32_WINNT_WIN7 // win7 | |||
| // Check SDK >= WinXP | |||
| #if _WIN32_WINNT >= _WIN32_WINNT_WINXP // winxp | |||
| static int test_cpu_info() | |||
| { | |||
| @@ -0,0 +1,33 @@ | |||
| # Windows XP Clang Toolchain | |||
| # Supports building ncnn for Windows XP using Clang with MinGW libraries | |||
| # Contributors: @Sugar-Baby and @AtomAlpaca | |||
| set(CMAKE_SYSTEM_NAME Windows) | |||
| if(DEFINED ENV{MINGW32_ROOT_PATH}) | |||
| file(TO_CMAKE_PATH $ENV{MINGW32_ROOT_PATH} MINGW32_ROOT_PATH) | |||
| else() | |||
| message(FATAL_ERROR "MINGW32_ROOT_PATH env must be defined") | |||
| endif() | |||
| set(CMAKE_C_COMPILER "clang.exe") | |||
| set(CMAKE_CXX_COMPILER "clang++.exe") | |||
| set(CMAKE_AR "$ENV{MINGW32_ROOT_PATH}/bin/ar.exe" CACHE FILEPATH "Archiver") | |||
| set(CMAKE_RANLIB "$ENV{MINGW32_ROOT_PATH}/bin/ranlib.exe" CACHE FILEPATH "Ranlib") | |||
| set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) | |||
| set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) | |||
| set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) | |||
| set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) | |||
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --target=i686-pc-windows-gnu -D_WIN32_WINNT=0x0501 -static --sysroot=${MINGW32_ROOT_PATH} -D__STRICT_ANSI__") | |||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --target=i686-pc-windows-gnu -D_WIN32_WINNT=0x0501 -static --sysroot=${MINGW32_ROOT_PATH} -D__STRICT_ANSI__") | |||
| # cache flags | |||
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags") | |||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags") | |||
| set(STATIC_LINK_FLAGS "-static") | |||
| set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${STATIC_LINK_FLAGS}") | |||
| set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${STATIC_LINK_FLAGS}") | |||
| @@ -0,0 +1,43 @@ | |||
| # Windows XP MinGW Toolchain | |||
| # Supports building ncnn for Windows XP using MinGW-w64 32-bit toolchain | |||
| # Contributors: @Sugar-Baby and @AtomAlpaca | |||
| set(CMAKE_SYSTEM_NAME Windows) | |||
| if(DEFINED ENV{MINGW32_ROOT_PATH}) | |||
| file(TO_CMAKE_PATH $ENV{MINGW32_ROOT_PATH} MINGW32_ROOT_PATH) | |||
| else() | |||
| message(FATAL_ERROR "MINGW32_ROOT_PATH env must be defined") | |||
| endif() | |||
| set(MINGW32_ROOT_PATH ${MINGW32_ROOT_PATH} CACHE STRING "root path to mingw toolchain") | |||
| set(CMAKE_C_COMPILER "${MINGW32_ROOT_PATH}/bin/i686-w64-mingw32-gcc.exe") | |||
| set(CMAKE_CXX_COMPILER "${MINGW32_ROOT_PATH}/bin/i686-w64-mingw32-g++.exe") | |||
| set(CMAKE_FIND_ROOT_PATH "${MINGW32_ROOT_PATH}/i686-w64-mingw32") | |||
| 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() | |||
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_WIN32_WINNT=0x0501 -march=i686 -static -UMINGW_HAS_SECURE_API") | |||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0501 -march=i686 -static -UMINGW_HAS_SECURE_API") | |||
| # cache flags | |||
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags") | |||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags") | |||
| set(STATIC_LINK_FLAGS "-static -fopenmp") | |||
| set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${STATIC_LINK_FLAGS}") | |||
| set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${STATIC_LINK_FLAGS}") | |||
| @@ -0,0 +1,31 @@ | |||
| # Windows XP MSVC Toolchain | |||
| # Supports Visual Studio 2017 (v141) and later with XP compatibility | |||
| # Contributors: @Sugar-Baby and @AtomAlpaca | |||
| set(CMAKE_SYSTEM_NAME Windows) | |||
| set(CMAKE_SYSTEM_VERSION 5.1) | |||
| set(CMAKE_C_COMPILER cl) | |||
| set(CMAKE_CXX_COMPILER cl) | |||
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D_WIN32_WINNT=0x0501 /DWINVER=0x0501 /EHsc") | |||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_WIN32_WINNT=0x0501 /DWINVER=0x0501 /EHsc") | |||
| set(CMAKE_GENERATOR_TOOLSET "v141_xp" CACHE STRING "Platform Toolset" FORCE) | |||
| # Disabling AVX will automatically disable newer instruction sets (AVX2, AVX512, etc.) | |||
| set(NCNN_VULKAN OFF CACHE BOOL "Disable Vulkan for Windows XP" FORCE) | |||
| set(CMAKE_GENERATOR_PLATFORM "Win32" CACHE STRING "Platform" FORCE) | |||
| set(NCNN_SIMPLEOCV ON CACHE BOOL "Use simple OpenCV implementation" FORCE) | |||
| # cache flags | |||
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags") | |||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags") | |||
| set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) | |||
| set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) | |||
| set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) | |||
| message(STATUS "Windows XP MSVC Toolchain configured") | |||
| message(STATUS " Platform Toolset: ${CMAKE_GENERATOR_TOOLSET}") | |||
| message(STATUS " Platform: ${CMAKE_GENERATOR_PLATFORM}") | |||
| message(STATUS " Runtime Library: ${CMAKE_MSVC_RUNTIME_LIBRARY}") | |||
| message(STATUS " Vulkan: ${NCNN_VULKAN}") | |||
| message(STATUS " Build Type: ${CMAKE_BUILD_TYPE}") | |||