From 71f5bda0356c6d1dffa2af2a4f3e338462e1344d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 24 Jul 2025 06:46:43 +0000 Subject: [PATCH] Add Windows XP support merging PRs #6176 and #6177 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> --- .github/workflows/windows-xp-clang.yml | 62 ++++++++ .github/workflows/windows-xp-mingw.yml | 57 ++++++++ .github/workflows/windows-xp-msvc.yml | 56 +++++++ .../build-ncnn-on-windows-xp.zh.md | 137 ++++++++++++++++++ docs/how-to-build/how-to-build.md | 55 +++++++ src/cpu.cpp | 8 + src/platform.h.in | 55 ++++++- tests/test_cpu.cpp | 4 +- toolchains/windows-xp-clang.toolchain.cmake | 33 +++++ toolchains/windows-xp-mingw.toolchain.cmake | 43 ++++++ toolchains/windows-xp-msvc.toolchain.cmake | 31 ++++ 11 files changed, 538 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/windows-xp-clang.yml create mode 100644 .github/workflows/windows-xp-mingw.yml create mode 100644 .github/workflows/windows-xp-msvc.yml create mode 100644 docs/developer-guide/build-ncnn-on-windows-xp.zh.md create mode 100644 toolchains/windows-xp-clang.toolchain.cmake create mode 100644 toolchains/windows-xp-mingw.toolchain.cmake create mode 100644 toolchains/windows-xp-msvc.toolchain.cmake diff --git a/.github/workflows/windows-xp-clang.yml b/.github/workflows/windows-xp-clang.yml new file mode 100644 index 000000000..2bb0abe71 --- /dev/null +++ b/.github/workflows/windows-xp-clang.yml @@ -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 \ No newline at end of file diff --git a/.github/workflows/windows-xp-mingw.yml b/.github/workflows/windows-xp-mingw.yml new file mode 100644 index 000000000..560320bcc --- /dev/null +++ b/.github/workflows/windows-xp-mingw.yml @@ -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 \ No newline at end of file diff --git a/.github/workflows/windows-xp-msvc.yml b/.github/workflows/windows-xp-msvc.yml new file mode 100644 index 000000000..1119f37c7 --- /dev/null +++ b/.github/workflows/windows-xp-msvc.yml @@ -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 \ No newline at end of file diff --git a/docs/developer-guide/build-ncnn-on-windows-xp.zh.md b/docs/developer-guide/build-ncnn-on-windows-xp.zh.md new file mode 100644 index 000000000..9de15b5dd --- /dev/null +++ b/docs/developer-guide/build-ncnn-on-windows-xp.zh.md @@ -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 +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 +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 +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=\BUILD\EXAMPLES +set IMAGE_PATH=\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目录下,替换掉所有的``,双击运行。通过生成的test_results.log即可查看所有模型的结果。 + +通过修改`set IMAGE_PATH=\IMAGES\256-ncnn.png`中的路径来更换需要测试的文件。 \ No newline at end of file diff --git a/docs/how-to-build/how-to-build.md b/docs/how-to-build/how-to-build.md index 5c429ad26..3d7e814d2 100644 --- a/docs/how-to-build/how-to-build.md +++ b/docs/how-to-build/how-to-build.md @@ -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 ``, and add `/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. diff --git a/src/cpu.cpp b/src/cpu.cpp index d8b240058..a095b6b6f 100644 --- a/src/cpu.cpp +++ b/src/cpu.cpp @@ -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 diff --git a/src/platform.h.in b/src/platform.h.in index 8b7357eec..7bb27c6b0 100644 --- a/src/platform.h.in +++ b/src/platform.h.in @@ -67,6 +67,9 @@ #if NCNN_THREADS #if defined _WIN32 #define WIN32_LEAN_AND_MEAN +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#endif #include #include #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 { diff --git a/tests/test_cpu.cpp b/tests/test_cpu.cpp index 013ce2175..680c91cc9 100644 --- a/tests/test_cpu.cpp +++ b/tests/test_cpu.cpp @@ -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() { diff --git a/toolchains/windows-xp-clang.toolchain.cmake b/toolchains/windows-xp-clang.toolchain.cmake new file mode 100644 index 000000000..c4d339e8e --- /dev/null +++ b/toolchains/windows-xp-clang.toolchain.cmake @@ -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}") \ No newline at end of file diff --git a/toolchains/windows-xp-mingw.toolchain.cmake b/toolchains/windows-xp-mingw.toolchain.cmake new file mode 100644 index 000000000..16aa6a845 --- /dev/null +++ b/toolchains/windows-xp-mingw.toolchain.cmake @@ -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}") \ No newline at end of file diff --git a/toolchains/windows-xp-msvc.toolchain.cmake b/toolchains/windows-xp-msvc.toolchain.cmake new file mode 100644 index 000000000..0de1cea50 --- /dev/null +++ b/toolchains/windows-xp-msvc.toolchain.cmake @@ -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}") \ No newline at end of file