Skip to content

Commit f1327c6

Browse files
committed
feat: support to build on windows
1 parent ddebad3 commit f1327c6

26 files changed

+1005
-116
lines changed

sdk/runanywhere-commons/CMakeLists.txt

Lines changed: 101 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
4545
set(CMAKE_CXX_EXTENSIONS OFF)
4646
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
4747

48+
# Set default build type for single-config generators (Unix Makefiles, Ninja)
49+
# Note: Multi-config generators (Visual Studio, Xcode) ignore this
50+
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
51+
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
52+
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
53+
endif()
54+
4855
# Export compile commands for clang-tidy
4956
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
5057

@@ -73,6 +80,9 @@ elseif(ANDROID)
7380
elseif(APPLE)
7481
set(RAC_PLATFORM_MACOS TRUE)
7582
set(RAC_PLATFORM_NAME "macOS")
83+
elseif(WIN32)
84+
set(RAC_PLATFORM_WINDOWS TRUE)
85+
set(RAC_PLATFORM_NAME "Windows")
7686
elseif(UNIX)
7787
set(RAC_PLATFORM_LINUX TRUE)
7888
set(RAC_PLATFORM_NAME "Linux")
@@ -134,6 +144,34 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
134144
add_compile_options(-fvisibility=hidden)
135145
add_compile_options(-ffunction-sections -fdata-sections)
136146
endif()
147+
elseif(MSVC)
148+
# MSVC compiler flags (shared across configs)
149+
add_compile_options(/W4 /WX- /wd4996 /wd4576 /FS) # W4 = level 4 warnings, WX- = warnings as errors off, 4996 = deprecated function warnings, 4576 = non-standard cast syntax, FS = force synchronous PDB writes
150+
# Per-config flags: use generator expressions so multi-config generators (e.g. Visual Studio) get correct flags per config. /O2 and /RTC1 are incompatible.
151+
add_compile_options("$<$<CONFIG:Release>:/O2 /DNDEBUG /GL /MP>") # O2 = optimize for speed, GL = whole program optimization, MP = multi-processor
152+
add_compile_options("$<$<CONFIG:RelWithDebInfo>:/O2 /DNDEBUG /GL /MP>")
153+
add_compile_options("$<$<CONFIG:MinSizeRel>:/O1 /DNDEBUG /GL /MP>")
154+
add_compile_options("$<$<CONFIG:Debug>:/Od /Zi>") # Od = disable optimizations, Zi = debug information (no /RTC1 here; let CMake default or use /RTC1 only if desired)
155+
# Disable MSVC-specific warnings that are common in cross-platform code
156+
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
157+
add_compile_definitions(NOMINMAX) # Prevent Windows.h from defining min/max macros
158+
# Use Unicode character set: Windows API and CRT use wide-char (UTF-16) variants
159+
add_compile_definitions(UNICODE _UNICODE)
160+
# https://learn.microsoft.com/en-us/cpp/build/reference/debug-generate-debug-info?view=msvc-170
161+
# The /DEBUG option puts the debugging information from linked object and library files
162+
# into a program database (PDB) file. It updates the PDB during subsequent builds of the program.
163+
#
164+
# An executable (an EXE or DLL file) created for debugging contains the name and path of the corresponding PDB.
165+
# The debugger reads the embedded name and uses the PDB when you debug the program.
166+
# The linker uses the base name of the program and the extension .pdb to name the program database,
167+
# and embeds the path where it was created. To override this default, set the /PDB option and specify a different file name.
168+
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG")
169+
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG")
170+
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
171+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
172+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
173+
/Zi \
174+
/arch:SSE2")
137175
endif()
138176

139177
# =============================================================================
@@ -295,11 +333,16 @@ target_include_directories(rac_commons PRIVATE
295333
# Symbol visibility for shared builds
296334
if(RAC_BUILD_SHARED)
297335
target_compile_definitions(rac_commons PRIVATE RAC_BUILDING_SHARED=1)
298-
set_target_properties(rac_commons PROPERTIES
299-
C_VISIBILITY_PRESET hidden
300-
CXX_VISIBILITY_PRESET hidden
301-
VISIBILITY_INLINES_HIDDEN ON
302-
)
336+
if(WIN32)
337+
# Windows DLL export/import is handled via __declspec in headers
338+
# No need for visibility presets on Windows
339+
else()
340+
set_target_properties(rac_commons PROPERTIES
341+
C_VISIBILITY_PRESET hidden
342+
CXX_VISIBILITY_PRESET hidden
343+
VISIBILITY_INLINES_HIDDEN ON
344+
)
345+
endif()
303346
endif()
304347

305348
# Platform-specific linking
@@ -319,7 +362,48 @@ if(RAC_PLATFORM_ANDROID)
319362
target_link_libraries(rac_commons PUBLIC log)
320363
endif()
321364

322-
target_compile_features(rac_commons PUBLIC cxx_std_17)
365+
if(WIN32)
366+
# Windows-specific libraries
367+
# ws2_32 for networking (if needed)
368+
# winmm for multimedia (if needed)
369+
# No specific libraries required by default, add as needed
370+
371+
# Set Windows-specific properties
372+
if(MSVC)
373+
# Set runtime library (use /MD for Release, /MDd for Debug)
374+
if(CMAKE_BUILD_TYPE STREQUAL "Release")
375+
set_property(TARGET rac_commons PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")
376+
# Enable link-time code generation for Release builds
377+
set_target_properties(rac_commons PROPERTIES
378+
INTERPROCEDURAL_OPTIMIZATION ON
379+
)
380+
else()
381+
set_property(TARGET rac_commons PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreadedDebugDLL")
382+
endif()
383+
384+
# Force synchronous PDB writes for parallel compilation and disable C4576 warning
385+
target_compile_options(rac_commons PRIVATE /FS /wd4576)
386+
387+
# Set output file names for Windows
388+
if(RAC_BUILD_SHARED)
389+
set_target_properties(rac_commons PROPERTIES
390+
OUTPUT_NAME "rac_commons"
391+
PREFIX ""
392+
)
393+
else()
394+
set_target_properties(rac_commons PROPERTIES
395+
OUTPUT_NAME "rac_commons"
396+
)
397+
endif()
398+
endif()
399+
endif()
400+
401+
# Set C++ standard based on platform
402+
if(WIN32)
403+
target_compile_features(rac_commons PUBLIC cxx_std_20)
404+
else()
405+
target_compile_features(rac_commons PUBLIC cxx_std_17)
406+
endif()
323407

324408
# =============================================================================
325409
# JNI BRIDGE (Android/JVM)
@@ -404,7 +488,12 @@ endif()
404488

405489
if(RAC_BUILD_TESTS)
406490
enable_testing()
407-
add_subdirectory(tests)
491+
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/tests/CMakeLists.txt")
492+
message(STATUS "Building unit tests")
493+
add_subdirectory(tests)
494+
else()
495+
message(WARNING "RAC_BUILD_TESTS is ON but tests/CMakeLists.txt not found. Skipping tests.")
496+
endif()
408497
endif()
409498

410499
# =============================================================================
@@ -414,6 +503,7 @@ endif()
414503
install(TARGETS rac_commons
415504
LIBRARY DESTINATION lib
416505
ARCHIVE DESTINATION lib
506+
RUNTIME DESTINATION bin # Windows DLLs go to bin
417507
)
418508

419509
install(DIRECTORY include/
@@ -432,7 +522,11 @@ message(STATUS "====================================")
432522
message(STATUS "Platform: ${RAC_PLATFORM_NAME}")
433523
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
434524
message(STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
525+
message(STATUS "C++ Standard: C++${CMAKE_CXX_STANDARD}")
435526
message(STATUS "Shared libs: ${RAC_BUILD_SHARED}")
527+
if(WIN32)
528+
message(STATUS "Architecture: ${CMAKE_SYSTEM_PROCESSOR}")
529+
endif()
436530
message(STATUS "")
437531
message(STATUS "Components:")
438532
message(STATUS " Core: Logging, errors, events, memory")

sdk/runanywhere-commons/VERSIONS

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ ONNX_VERSION_MACOS=1.23.2
4949
# Linux version (can use latest)
5050
ONNX_VERSION_LINUX=1.23.2
5151

52+
# Windows version (can use latest)
53+
ONNX_VERSION_WINDOWS=1.23.2
54+
5255
# =============================================================================
5356
# Sherpa-ONNX (via runanywhere-core)
5457
# =============================================================================
@@ -69,6 +72,9 @@ SHERPA_ONNX_VERSION_MACOS=1.12.18
6972
# Linux version
7073
SHERPA_ONNX_VERSION_LINUX=1.12.23
7174

75+
# Windows version
76+
SHERPA_ONNX_VERSION_WINDOWS=1.12.20
77+
7278
# =============================================================================
7379
# llama.cpp (LLM inference)
7480
# =============================================================================

sdk/runanywhere-commons/cmake/FetchONNXRuntime.cmake

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ endif()
1717
if(NOT DEFINED ONNX_VERSION_LINUX OR "${ONNX_VERSION_LINUX}" STREQUAL "")
1818
message(FATAL_ERROR "ONNX_VERSION_LINUX not defined in VERSIONS file")
1919
endif()
20+
if(NOT DEFINED ONNX_VERSION_WINDOWS OR "${ONNX_VERSION_WINDOWS}" STREQUAL "")
21+
message(FATAL_ERROR "ONNX_VERSION_WINDOWS not defined in VERSIONS file")
22+
endif()
2023

21-
message(STATUS "ONNX Runtime versions: iOS=${ONNX_VERSION_IOS}, Android=${ONNX_VERSION_ANDROID}, macOS=${ONNX_VERSION_MACOS}, Linux=${ONNX_VERSION_LINUX}")
24+
message(STATUS "ONNX Runtime versions: iOS=${ONNX_VERSION_IOS}, Android=${ONNX_VERSION_ANDROID}, macOS=${ONNX_VERSION_MACOS}, Linux=${ONNX_VERSION_LINUX}, Windows=${ONNX_VERSION_WINDOWS}")
2225

2326
if(EMSCRIPTEN)
2427
# ==========================================================================
@@ -231,7 +234,76 @@ elseif(UNIX)
231234
)
232235

233236
message(STATUS "ONNX Runtime Linux library: ${onnxruntime_SOURCE_DIR}/lib/libonnxruntime.so")
237+
elseif(WIN32)
238+
set(ONNX_TARGET_ARCH "UNKNOWN")
239+
240+
if(CMAKE_VS_PLATFORM_NAME)
241+
if(CMAKE_VS_PLATFORM_NAME STREQUAL "Win32")
242+
set(ONNX_TARGET_ARCH "x86")
243+
elseif(CMAKE_VS_PLATFORM_NAME STREQUAL "x64")
244+
set(ONNX_TARGET_ARCH "x64")
245+
elseif(CMAKE_VS_PLATFORM_NAME STREQUAL "ARM")
246+
set(ONNX_TARGET_ARCH "ARM")
247+
elseif(CMAKE_VS_PLATFORM_NAME STREQUAL "ARM64")
248+
set(ONNX_TARGET_ARCH "ARM64")
249+
endif()
250+
else()
251+
# Alternative: use system processor variable to determine architecture (cross-platform compatible)
252+
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86|i[3-6]86)$")
253+
set(ONNX_TARGET_ARCH "x86")
254+
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
255+
set(ONNX_TARGET_ARCH "x64")
256+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(ARM|arm)$")
257+
set(ONNX_TARGET_ARCH "ARM")
258+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(ARM64|arm64|aarch64)$")
259+
set(ONNX_TARGET_ARCH "ARM64")
260+
endif()
261+
endif()
262+
# Windows: Download Windows binaries
263+
if(ONNX_TARGET_ARCH MATCHES "x64")
264+
set(ONNX_URL "https://github.com/microsoft/onnxruntime/releases/download/v${ONNX_VERSION_WINDOWS}/onnxruntime-win-x64-${ONNX_VERSION_WINDOWS}.zip")
265+
elseif(ONNX_TARGET_ARCH MATCHES "ARM64")
266+
set(ONNX_URL "https://github.com/microsoft/onnxruntime/releases/download/v${ONNX_VERSION_WINDOWS}/onnxruntime-win-arm64-${ONNX_VERSION_WINDOWS}.zip")
267+
elseif(ONNX_TARGET_ARCH MATCHES "x86")
268+
# TODO: @sylar
269+
# The official ONNX Runtime does not offer x86 binaries, but we can use the binaries from sherpa-onnx which contains x86 binaries
270+
message(FATAL_ERROR "x86 architecture is not supported for ONNX Runtime")
271+
else()
272+
message(FATAL_ERROR "Unsupported architecture for ONNX Runtime: ${ONNX_TARGET_ARCH}")
273+
endif()
274+
275+
FetchContent_Declare(
276+
onnxruntime
277+
URL ${ONNX_URL}
278+
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
279+
)
280+
FetchContent_MakeAvailable(onnxruntime)
281+
282+
add_library(onnxruntime SHARED IMPORTED GLOBAL)
283+
284+
# Windows DLL: IMPORTED_LOCATION = .dll (runtime), IMPORTED_IMPLIB = .lib (link time).
285+
# Multi-config generators (VS) require per-config props; prebuilt ORT usually ships Release only.
286+
set(ONNX_WIN_DLL "${onnxruntime_SOURCE_DIR}/lib/onnxruntime.dll")
287+
set(ONNX_WIN_IMPLIB "${onnxruntime_SOURCE_DIR}/lib/onnxruntime.lib")
288+
set_target_properties(onnxruntime PROPERTIES
289+
IMPORTED_LOCATION "${ONNX_WIN_DLL}"
290+
IMPORTED_IMPLIB "${ONNX_WIN_IMPLIB}"
291+
# IMPORTED_LOCATION_DEBUG "${ONNX_WIN_DLL}"
292+
# IMPORTED_IMPLIB_DEBUG "${ONNX_WIN_IMPLIB}"
293+
# IMPORTED_LOCATION_RELEASE "${ONNX_WIN_DLL}"
294+
# IMPORTED_IMPLIB_RELEASE "${ONNX_WIN_IMPLIB}"
295+
# IMPORTED_LOCATION_MINSIZEREL "${ONNX_WIN_DLL}"
296+
# IMPORTED_IMPLIB_MINSIZEREL "${ONNX_WIN_IMPLIB}"
297+
# IMPORTED_LOCATION_RELWITHDEBINFO "${ONNX_WIN_DLL}"
298+
# IMPORTED_IMPLIB_RELWITHDEBINFO "${ONNX_WIN_IMPLIB}"
299+
)
300+
301+
target_include_directories(onnxruntime INTERFACE
302+
"${onnxruntime_SOURCE_DIR}/include"
303+
)
234304

305+
message(STATUS "ONNX Runtime Windows DLL: ${ONNX_WIN_DLL}")
306+
message(STATUS "ONNX Runtime Windows headers: ${onnxruntime_SOURCE_DIR}/include")
235307
else()
236308
message(FATAL_ERROR "Unsupported platform for ONNX Runtime")
237309
endif()

sdk/runanywhere-commons/cmake/LoadVersions.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,12 @@ message(STATUS " ONNX_VERSION_IOS: ${RAC_ONNX_VERSION_IOS}")
5656
message(STATUS " ONNX_VERSION_ANDROID: ${RAC_ONNX_VERSION_ANDROID}")
5757
message(STATUS " ONNX_VERSION_MACOS: ${RAC_ONNX_VERSION_MACOS}")
5858
message(STATUS " ONNX_VERSION_LINUX: ${RAC_ONNX_VERSION_LINUX}")
59+
message(STATUS " ONNX_VERSION_WINDOWS: ${RAC_ONNX_VERSION_WINDOWS}")
5960
message(STATUS " Sherpa-ONNX:")
6061
message(STATUS " SHERPA_ONNX_VERSION_IOS: ${RAC_SHERPA_ONNX_VERSION_IOS}")
6162
message(STATUS " SHERPA_ONNX_VERSION_ANDROID: ${RAC_SHERPA_ONNX_VERSION_ANDROID}")
6263
message(STATUS " SHERPA_ONNX_VERSION_MACOS: ${RAC_SHERPA_ONNX_VERSION_MACOS}")
64+
message(STATUS " SHERPA_ONNX_VERSION_WINDOWS: ${RAC_SHERPA_ONNX_VERSION_WINDOWS}")
6365
message(STATUS " Other:")
6466
message(STATUS " LLAMACPP_VERSION: ${RAC_LLAMACPP_VERSION}")
6567
message(STATUS " NLOHMANN_JSON_VERSION: ${RAC_NLOHMANN_JSON_VERSION}")

sdk/runanywhere-commons/include/rac/backends/rac_stt_onnx.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,10 @@ typedef struct rac_stt_onnx_config {
5858
} rac_stt_onnx_config_t;
5959

6060
static const rac_stt_onnx_config_t RAC_STT_ONNX_CONFIG_DEFAULT = {
61-
.model_type = RAC_STT_ONNX_MODEL_AUTO, .num_threads = 0, .use_coreml = RAC_TRUE};
61+
RAC_STT_ONNX_MODEL_AUTO, /* model_type */
62+
0, /* num_threads */
63+
RAC_TRUE, /* use_coreml */
64+
};
6265

6366
// =============================================================================
6467
// ONNX STT API

sdk/runanywhere-commons/include/rac/backends/rac_tts_onnx.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ typedef struct rac_tts_onnx_config {
4343
} rac_tts_onnx_config_t;
4444

4545
static const rac_tts_onnx_config_t RAC_TTS_ONNX_CONFIG_DEFAULT = {
46-
.num_threads = 0, .use_coreml = RAC_TRUE, .sample_rate = 22050};
46+
0, /* num_threads */
47+
RAC_TRUE, /* use_coreml */
48+
22050 /* sample_rate */
49+
};
4750

4851
// =============================================================================
4952
// ONNX TTS API

sdk/runanywhere-commons/include/rac/backends/rac_vad_onnx.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ typedef struct rac_vad_onnx_config {
4444
} rac_vad_onnx_config_t;
4545

4646
static const rac_vad_onnx_config_t RAC_VAD_ONNX_CONFIG_DEFAULT = {
47-
.sample_rate = 16000, .energy_threshold = 0.5f, .frame_length = 0.032f, .num_threads = 0};
47+
RAC_VAD_DEFAULT_SAMPLE_RATE, /* sample_rate */
48+
RAC_VAD_DEFAULT_ENERGY_THRESHOLD, /* energy_threshold */
49+
RAC_VAD_DEFAULT_FRAME_LENGTH, /* frame_length */
50+
0, /* num_threads */
51+
};
4852

4953
// =============================================================================
5054
// ONNX VAD API

0 commit comments

Comments
 (0)