Skip to content

Commit 82af4a1

Browse files
authored
cmake NCNN_WINXP option, do not define _WIN32_WINNT macro (Tencent#6430)
1 parent 44b88e4 commit 82af4a1

File tree

6 files changed

+46
-50
lines changed

6 files changed

+46
-50
lines changed

.github/workflows/windows-xp-clang.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ jobs:
5656
- name: build
5757
run: |
5858
mkdir build; cd build
59-
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"
59+
cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DCMAKE_TOOLCHAIN_FILE="../toolchains/windows-xp-clang.toolchain.cmake" -DNCNN_WINXP=ON -DNCNN_SIMPLEOCV=ON -DNCNN_SIMPLEOMP=ON -DNCNN_AVX2=OFF -DNCNN_AVX=OFF .. -G "MinGW Makefiles"
6060
cmake --build . --config Release -j 4
6161
- name: test
62-
run: cd build; ctest -C Release --output-on-failure -j 4
62+
run: cd build; ctest -C Release --output-on-failure -j 4

.github/workflows/windows-xp-mingw.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ jobs:
5151
- name: build
5252
run: |
5353
mkdir build; cd build
54-
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"
54+
cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DCMAKE_TOOLCHAIN_FILE="../toolchains/windows-xp-mingw.toolchain.cmake" -DNCNN_WINXP=ON -DNCNN_SIMPLEOCV=ON -DNCNN_AVX2=OFF -DNCNN_AVX=OFF -DNCNN_VULKAN=OFF .. -G "MinGW Makefiles"
5555
cmake --build . --config Release -j 4
5656
- name: test
57-
run: cd build; ctest -C Release --output-on-failure -j 4
57+
run: cd build; ctest -C Release --output-on-failure -j 4

.github/workflows/windows-xp-msvc.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ jobs:
5050
- name: build
5151
run: |
5252
mkdir build; cd build
53-
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" ..
53+
cmake ${{ env.NCNN_CMAKE_OPTIONS }} -A WIN32 -G "Visual Studio 17 2022" -T v141_xp -DNCNN_WINXP=ON -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" ..
5454
cmake --build . --config Release -j 4
5555
- name: test
56-
run: cd build; ctest -C Release --output-on-failure -j 4
56+
run: cd build; ctest -C Release --output-on-failure -j 4

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ option(NCNN_THREADS "build with threads" ON)
7171
option(NCNN_BENCHMARK "print benchmark information for every layer" OFF)
7272
option(NCNN_C_API "build with C api" ON)
7373
option(NCNN_PLATFORM_API "build with platform api candy" ON)
74+
option(NCNN_WINXP "build with windows xp compatibility" OFF)
7475
option(NCNN_PIXEL "convert and resize from/to image pixel" ON)
7576
option(NCNN_PIXEL_ROTATE "rotate image pixel orientation" ON)
7677
option(NCNN_PIXEL_AFFINE "warp affine image pixel" ON)

docs/how-to-build/how-to-build.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ Download mingw toolchain targeting 32 bit from [sourceforge](https://jaist.dl.so
278278
```shell
279279
mkdir build
280280
cd build
281-
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"
281+
cmake -DCMAKE_TOOLCHAIN_FILE="../toolchains/windows-xp-mingw.toolchain.cmake" -DNCNN_WINXP=ON -DNCNN_SIMPLEOCV=ON -DNCNN_AVX2=OFF -DNCNN_AVX=OFF -DNCNN_VULKAN=OFF .. -G "MinGW Makefiles"
282282
cmake --build . --config Release -j 4
283283
cmake --build . --config Release --target install
284284
```
@@ -292,7 +292,7 @@ Install Clang 6.0 or later.
292292
```shell
293293
mkdir build
294294
cd build
295-
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"
295+
cmake -DCMAKE_TOOLCHAIN_FILE="../toolchains/windows-xp-clang.toolchain.cmake" -DNCNN_WINXP=ON -DNCNN_SIMPLEOCV=ON -DNCNN_SIMPLEOMP=ON -DNCNN_AVX2=OFF -DNCNN_AVX=OFF .. -G "MinGW Makefiles"
296296
cmake --build . --config Release -j 4
297297
cmake --build . --config Release --target install
298298
```
@@ -309,7 +309,7 @@ Install v141_xp toolset for Windows XP:
309309
```shell
310310
mkdir build
311311
cd build
312-
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" ..
312+
cmake -A WIN32 -G "Visual Studio 17 2022" -T v141_xp -DNCNN_WINXP=ON -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" ..
313313
cmake --build . --config Release -j 2
314314
cmake --build . --config Release --target install
315315
```

src/platform.h.in

Lines changed: 36 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#cmakedefine01 NCNN_BENCHMARK
1515
#cmakedefine01 NCNN_C_API
1616
#cmakedefine01 NCNN_PLATFORM_API
17+
#cmakedefine01 NCNN_WINXP
1718
#cmakedefine01 NCNN_PIXEL
1819
#cmakedefine01 NCNN_PIXEL_ROTATE
1920
#cmakedefine01 NCNN_PIXEL_AFFINE
@@ -67,9 +68,6 @@
6768
#if NCNN_THREADS
6869
#if defined _WIN32
6970
#define WIN32_LEAN_AND_MEAN
70-
#ifndef _WIN32_WINNT
71-
#define _WIN32_WINNT 0x0501
72-
#endif
7371
#include <windows.h>
7472
#include <process.h>
7573
#else
@@ -87,33 +85,7 @@ namespace ncnn {
8785

8886
#if NCNN_THREADS
8987
#if defined _WIN32
90-
#if _WIN32_WINNT > _WIN32_WINNT_WINXP // Windows Vista and later
91-
class NCNN_EXPORT Mutex
92-
{
93-
public:
94-
Mutex() { InitializeSRWLock(&srwlock); }
95-
~Mutex() {}
96-
void lock() { AcquireSRWLockExclusive(&srwlock); }
97-
void unlock() { ReleaseSRWLockExclusive(&srwlock); }
98-
private:
99-
friend class ConditionVariable;
100-
SRWLOCK srwlock;
101-
};
102-
103-
class NCNN_EXPORT ConditionVariable
104-
{
105-
public:
106-
ConditionVariable() { InitializeConditionVariable(&condvar); }
107-
~ConditionVariable() {}
108-
void wait(Mutex& mutex) { SleepConditionVariableSRW(&condvar, &mutex.srwlock, INFINITE, 0); }
109-
void broadcast() { WakeAllConditionVariable(&condvar); }
110-
void signal() { WakeConditionVariable(&condvar); }
111-
private:
112-
CONDITION_VARIABLE condvar;
113-
};
114-
115-
#else // Windows XP compatibility
116-
88+
#if NCNN_WINXP
11789
class NCNN_EXPORT Mutex
11890
{
11991
public:
@@ -129,15 +101,15 @@ private:
129101
class NCNN_EXPORT ConditionVariable
130102
{
131103
public:
132-
ConditionVariable()
133-
{
104+
ConditionVariable()
105+
{
134106
signal_event = CreateEvent(0, FALSE, FALSE, 0); // Auto-reset event for signal()
135107
broadcast_event = CreateEvent(0, TRUE, FALSE, 0); // Manual-reset event for broadcast()
136108
}
137-
~ConditionVariable()
138-
{
139-
CloseHandle(signal_event);
140-
CloseHandle(broadcast_event);
109+
~ConditionVariable()
110+
{
111+
CloseHandle(signal_event);
112+
CloseHandle(broadcast_event);
141113
}
142114
void wait(Mutex& mutex)
143115
{
@@ -146,21 +118,44 @@ public:
146118
WaitForMultipleObjects(2, events, FALSE, INFINITE); // Wait for either signal or broadcast
147119
mutex.lock();
148120
}
149-
void broadcast()
150-
{
121+
void broadcast()
122+
{
151123
SetEvent(broadcast_event); // Wake all threads
152124
ResetEvent(broadcast_event); // Reset after waking all threads
153125
}
154-
void signal()
155-
{
126+
void signal()
127+
{
156128
SetEvent(signal_event); // Wake one thread
157129
}
158130
private:
159131
HANDLE signal_event;
160132
HANDLE broadcast_event;
161133
};
134+
#else // NCNN_WINXP
135+
class NCNN_EXPORT Mutex
136+
{
137+
public:
138+
Mutex() { InitializeSRWLock(&srwlock); }
139+
~Mutex() {}
140+
void lock() { AcquireSRWLockExclusive(&srwlock); }
141+
void unlock() { ReleaseSRWLockExclusive(&srwlock); }
142+
private:
143+
friend class ConditionVariable;
144+
SRWLOCK srwlock;
145+
};
162146

163-
#endif // _WIN32_WINNT > _WIN32_WINNT_WINXP
147+
class NCNN_EXPORT ConditionVariable
148+
{
149+
public:
150+
ConditionVariable() { InitializeConditionVariable(&condvar); }
151+
~ConditionVariable() {}
152+
void wait(Mutex& mutex) { SleepConditionVariableSRW(&condvar, &mutex.srwlock, INFINITE, 0); }
153+
void broadcast() { WakeAllConditionVariable(&condvar); }
154+
void signal() { WakeConditionVariable(&condvar); }
155+
private:
156+
CONDITION_VARIABLE condvar;
157+
};
158+
#endif // NCNN_WINXP
164159

165160
static unsigned __stdcall start_wrapper(void* args);
166161
class NCNN_EXPORT Thread

0 commit comments

Comments
 (0)