Browse Source

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>
pull/6204/head
copilot-swe-agent[bot] 11 months ago
parent
commit
71f5bda035
11 changed files with 538 additions and 3 deletions
  1. +62
    -0
      .github/workflows/windows-xp-clang.yml
  2. +57
    -0
      .github/workflows/windows-xp-mingw.yml
  3. +56
    -0
      .github/workflows/windows-xp-msvc.yml
  4. +137
    -0
      docs/developer-guide/build-ncnn-on-windows-xp.zh.md
  5. +55
    -0
      docs/how-to-build/how-to-build.md
  6. +8
    -0
      src/cpu.cpp
  7. +54
    -1
      src/platform.h.in
  8. +2
    -2
      tests/test_cpu.cpp
  9. +33
    -0
      toolchains/windows-xp-clang.toolchain.cmake
  10. +43
    -0
      toolchains/windows-xp-mingw.toolchain.cmake
  11. +31
    -0
      toolchains/windows-xp-msvc.toolchain.cmake

+ 62
- 0
.github/workflows/windows-xp-clang.yml View File

@@ -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

+ 57
- 0
.github/workflows/windows-xp-mingw.yml View File

@@ -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

+ 56
- 0
.github/workflows/windows-xp-msvc.yml View File

@@ -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

+ 137
- 0
docs/developer-guide/build-ncnn-on-windows-xp.zh.md View File

@@ -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`中的路径来更换需要测试的文件。

+ 55
- 0
docs/how-to-build/how-to-build.md View File

@@ -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.


+ 8
- 0
src/cpu.cpp View File

@@ -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


+ 54
- 1
src/platform.h.in View File

@@ -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
{


+ 2
- 2
tests/test_cpu.cpp View File

@@ -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()
{


+ 33
- 0
toolchains/windows-xp-clang.toolchain.cmake View File

@@ -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}")

+ 43
- 0
toolchains/windows-xp-mingw.toolchain.cmake View File

@@ -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}")

+ 31
- 0
toolchains/windows-xp-msvc.toolchain.cmake View File

@@ -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}")

Loading…
Cancel
Save