From adda5bbef9bb5f1b70f2d0534162c72376c1537f Mon Sep 17 00:00:00 2001 From: Tim Stahlhut Date: Mon, 4 May 2026 23:08:32 -0400 Subject: [PATCH 1/6] Add Cygwin guards to SDL3/SDL_stdinc.h Co-authored-by: TrueCat17 --- include/SDL3/SDL_stdinc.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/SDL3/SDL_stdinc.h b/include/SDL3/SDL_stdinc.h index 3e2266dc8f65a..8d291adcc8747 100644 --- a/include/SDL3/SDL_stdinc.h +++ b/include/SDL3/SDL_stdinc.h @@ -739,7 +739,7 @@ typedef Sint64 SDL_Time; * should define these but this is not true all platforms. * (for example win32) */ #ifndef SDL_PRIs64 -#if defined(SDL_PLATFORM_WINDOWS) +#if defined(SDL_PLATFORM_WINDOWS) && !defined(__CYGWIN__) #define SDL_PRIs64 "I64d" #elif defined(PRId64) #define SDL_PRIs64 PRId64 @@ -750,7 +750,7 @@ typedef Sint64 SDL_Time; #endif #endif #ifndef SDL_PRIu64 -#if defined(SDL_PLATFORM_WINDOWS) +#if defined(SDL_PLATFORM_WINDOWS) && !defined(__CYGWIN__) #define SDL_PRIu64 "I64u" #elif defined(PRIu64) #define SDL_PRIu64 PRIu64 @@ -761,7 +761,7 @@ typedef Sint64 SDL_Time; #endif #endif #ifndef SDL_PRIx64 -#if defined(SDL_PLATFORM_WINDOWS) +#if defined(SDL_PLATFORM_WINDOWS) && !defined(__CYGWIN__) #define SDL_PRIx64 "I64x" #elif defined(PRIx64) #define SDL_PRIx64 PRIx64 @@ -772,7 +772,7 @@ typedef Sint64 SDL_Time; #endif #endif #ifndef SDL_PRIX64 -#if defined(SDL_PLATFORM_WINDOWS) +#if defined(SDL_PLATFORM_WINDOWS) && !defined(__CYGWIN__) #define SDL_PRIX64 "I64X" #elif defined(PRIX64) #define SDL_PRIX64 PRIX64 @@ -811,7 +811,7 @@ typedef Sint64 SDL_Time; #endif #endif /* Specifically for the `long long` -- SDL-specific. */ -#ifdef SDL_PLATFORM_WINDOWS +#if defined(SDL_PLATFORM_WINDOWS) && !defined(__CYGWIN__) #ifndef SDL_NOLONGLONG SDL_COMPILE_TIME_ASSERT(longlong_size64, sizeof(long long) == 8); /* using I64 for windows - make sure `long long` is 64 bits. */ #endif From 84c552fa4732d71c0b8220e4f3a55ea887994c58 Mon Sep 17 00:00:00 2001 From: Tim Stahlhut Date: Mon, 4 May 2026 15:35:00 -0400 Subject: [PATCH 2/6] Add or edit macros to reduce warnings under Cygwin or MSYS build enviroments --- include/SDL3/SDL_stdinc.h | 13 ++++++++++ src/audio/wasapi/SDL_wasapi.c | 2 +- src/dialog/windows/SDL_windowsdialog.c | 2 +- src/gpu/d3d12/SDL_gpu_d3d12.c | 4 +-- src/joystick/windows/SDL_rawinputjoystick.c | 6 ++--- src/time/windows/SDL_systime.c | 2 +- src/video/windows/SDL_windowsrawinput.c | 2 +- src/video/windows/SDL_windowswindow.c | 28 ++++++++++----------- test/testautomation_stdlib.c | 4 ++- 9 files changed, 39 insertions(+), 24 deletions(-) diff --git a/include/SDL3/SDL_stdinc.h b/include/SDL3/SDL_stdinc.h index 8d291adcc8747..c23c340f71b1d 100644 --- a/include/SDL3/SDL_stdinc.h +++ b/include/SDL3/SDL_stdinc.h @@ -810,6 +810,19 @@ typedef Sint64 SDL_Time; #define SDL_PRIX32 "X" #endif #endif +#if defined(__CYGWIN__) +#define SDL_PRIlDWORD "d" +#define SDL_PRIuDWORD "u" +#define SDL_PRIdHRESULT "d" +#define SDL_PRIxHRESULT "x" +#define SDL_PRIdLONG "d" +#else +#define SDL_PRIlDWORD "ld" +#define SDL_PRIuDWORD "lu" +#define SDL_PRIdHRESULT "ld" +#define SDL_PRIxHRESULT "lx" +#define SDL_PRIdLONG "ld" +#endif /* Specifically for the `long long` -- SDL-specific. */ #if defined(SDL_PLATFORM_WINDOWS) && !defined(__CYGWIN__) #ifndef SDL_NOLONGLONG diff --git a/src/audio/wasapi/SDL_wasapi.c b/src/audio/wasapi/SDL_wasapi.c index c01f007ff1550..0b3ebe50f26bd 100644 --- a/src/audio/wasapi/SDL_wasapi.c +++ b/src/audio/wasapi/SDL_wasapi.c @@ -773,7 +773,7 @@ static bool mgmtthrtask_PrepDevice(void *userdata) ret = IAudioClient2_SetClientProperties(client2, &audioProps); if (FAILED(ret)) { // This isn't fatal, let's log it instead of failing - SDL_LogWarn(SDL_LOG_CATEGORY_AUDIO, "IAudioClient2_SetClientProperties failed: 0x%lx", ret); + SDL_LogWarn(SDL_LOG_CATEGORY_AUDIO, "IAudioClient2_SetClientProperties failed: 0x%" SDL_PRIxHRESULT, ret); } IAudioClient2_Release(client2); } diff --git a/src/dialog/windows/SDL_windowsdialog.c b/src/dialog/windows/SDL_windowsdialog.c index 99a49384d6e8a..da12d18226522 100644 --- a/src/dialog/windows/SDL_windowsdialog.c +++ b/src/dialog/windows/SDL_windowsdialog.c @@ -1035,7 +1035,7 @@ void windows_ShowFileDialog(void *ptr) const char *opts[1] = { NULL }; callback(userdata, opts, getFilterIndex(dialog.nFilterIndex)); } else { - SDL_SetError("Windows error, CommDlgExtendedError: %ld", pCommDlgExtendedError()); + SDL_SetError("Windows error, CommDlgExtendedError: %" SDL_PRIlDWORD, pCommDlgExtendedError()); callback(userdata, NULL, -1); } } diff --git a/src/gpu/d3d12/SDL_gpu_d3d12.c b/src/gpu/d3d12/SDL_gpu_d3d12.c index 3a1d651fddf64..29e8874908619 100644 --- a/src/gpu/d3d12/SDL_gpu_d3d12.c +++ b/src/gpu/d3d12/SDL_gpu_d3d12.c @@ -9036,7 +9036,7 @@ static bool D3D12_INTERNAL_GetAdapterByLuid(LUID luid, IDXGIFactory1 *factory, I IDXGIAdapter1 *adapter; res = IDXGIFactory1_EnumAdapters1(factory, adapterIndex, &adapter); if (FAILED(res)) { - SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to get an adapter when iterating, i: %d, res: %ld", adapterIndex, res); + SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to get an adapter when iterating, i: %d, res: %" SDL_PRIdHRESULT, adapterIndex, res); return false; } @@ -9044,7 +9044,7 @@ static bool D3D12_INTERNAL_GetAdapterByLuid(LUID luid, IDXGIFactory1 *factory, I res = IDXGIAdapter1_GetDesc1(adapter, &adapterDesc); if (FAILED(res)) { IDXGIAdapter1_Release(adapter); - SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to get description of adapter, i: %d, res %ld", adapterIndex, res); + SDL_LogError(SDL_LOG_CATEGORY_GPU, "Failed to get description of adapter, i: %d, res %" SDL_PRIdHRESULT, adapterIndex, res); return false; } if (SDL_memcmp(&adapterDesc.AdapterLuid, &luid, sizeof(luid)) == 0) { diff --git a/src/joystick/windows/SDL_rawinputjoystick.c b/src/joystick/windows/SDL_rawinputjoystick.c index 7a69775e2627f..1f1fec3572607 100644 --- a/src/joystick/windows/SDL_rawinputjoystick.c +++ b/src/joystick/windows/SDL_rawinputjoystick.c @@ -705,12 +705,12 @@ static void RAWINPUT_InitWindowsGamingInput(RAWINPUT_DeviceContext *ctx) hr = __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_add_GamepadAdded(wgi_state.gamepad_statics, &gamepad_added.iface, &wgi_state.gamepad_added_token); if (!SUCCEEDED(hr)) { - SDL_SetError("add_GamepadAdded() failed: 0x%lx", hr); + SDL_SetError("add_GamepadAdded() failed: 0x%" SDL_PRIxHRESULT, hr); } hr = __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_add_GamepadRemoved(wgi_state.gamepad_statics, &gamepad_removed.iface, &wgi_state.gamepad_removed_token); if (!SUCCEEDED(hr)) { - SDL_SetError("add_GamepadRemoved() failed: 0x%lx", hr); + SDL_SetError("add_GamepadRemoved() failed: 0x%" SDL_PRIxHRESULT, hr); } } } @@ -1506,7 +1506,7 @@ static bool RAWINPUT_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_ WindowsGamingInputGamepadState *gamepad_state = ctx->wgi_slot; HRESULT hr = __x_ABI_CWindows_CGaming_CInput_CIGamepad_put_Vibration(gamepad_state->gamepad, ctx->vibration); if (!SUCCEEDED(hr)) { - return SDL_SetError("Setting vibration failed: 0x%lx", hr); + return SDL_SetError("Setting vibration failed: 0x%" SDL_PRIxHRESULT, hr); } ctx->triggers_rumbling = (left_rumble > 0 || right_rumble > 0); return true; diff --git a/src/time/windows/SDL_systime.c b/src/time/windows/SDL_systime.c index a35ae7286a9f4..11112dc02011d 100644 --- a/src/time/windows/SDL_systime.c +++ b/src/time/windows/SDL_systime.c @@ -151,7 +151,7 @@ bool SDL_TimeToDateTime(SDL_Time ticks, SDL_DateTime *dt, bool localTime) } } - return SDL_SetError("SDL_DateTime conversion failed (%lu)", GetLastError()); + return SDL_SetError("SDL_DateTime conversion failed (%" SDL_PRIuDWORD ")", GetLastError()); } #endif // SDL_TIME_WINDOWS diff --git a/src/video/windows/SDL_windowsrawinput.c b/src/video/windows/SDL_windowsrawinput.c index e9b4aad3d95c8..52facac79f877 100644 --- a/src/video/windows/SDL_windowsrawinput.c +++ b/src/video/windows/SDL_windowsrawinput.c @@ -78,7 +78,7 @@ static RawInputIterateResult IterateRawInputThread(void) } else if (wait_status == WAIT_INPUT) { return RINP_CONTINUE; } else { - SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Raw input thread exiting, unexpected wait result: %lu", wait_status); + SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Raw input thread exiting, unexpected wait result: %" SDL_PRIuDWORD, wait_status); return RINP_QUIT; } } diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c index 506fdc1ae5119..83b4fea257f65 100644 --- a/src/video/windows/SDL_windowswindow.c +++ b/src/video/windows/SDL_windowswindow.c @@ -1771,16 +1771,16 @@ static STDMETHODIMP SDLDropTarget_DragEnter(SDLDropTarget *target, POINTL pt, DWORD *pdwEffect) { SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In DragEnter at %ld, %ld", pt.x, pt.y); + ". In DragEnter at %" SDL_PRIdLONG ", %" SDL_PRIdLONG, pt.x, pt.y); *pdwEffect = DROPEFFECT_COPY; POINT pnt = { pt.x, pt.y }; if (ScreenToClient(target->hwnd, &pnt)) { SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In DragEnter at %ld, %ld => window %u at %ld, %ld", pt.x, pt.y, target->window->id, pnt.x, pnt.y); + ". In DragEnter at %" SDL_PRIdLONG ", %" SDL_PRIdLONG " => window %u at %" SDL_PRIdLONG ", %" SDL_PRIdLONG, pt.x, pt.y, target->window->id, pnt.x, pnt.y); SDL_SendDropPosition(target->window, pnt.x, pnt.y); } else { SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In DragEnter at %ld, %ld => nil, nil", pt.x, pt.y); + ". In DragEnter at %" SDL_PRIdLONG ", %" SDL_PRIdLONG " => nil, nil", pt.x, pt.y); } return S_OK; } @@ -1790,16 +1790,16 @@ static STDMETHODIMP SDLDropTarget_DragOver(SDLDropTarget *target, POINTL pt, DWORD *pdwEffect) { SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In DragOver at %ld, %ld", pt.x, pt.y); + ". In DragOver at %" SDL_PRIdLONG ", %" SDL_PRIdLONG, pt.x, pt.y); *pdwEffect = DROPEFFECT_COPY; POINT pnt = { pt.x, pt.y }; if (ScreenToClient(target->hwnd, &pnt)) { SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In DragOver at %ld, %ld => window %u at %ld, %ld", pt.x, pt.y, target->window->id, pnt.x, pnt.y); + ". In DragOver at %" SDL_PRIdLONG ", %" SDL_PRIdLONG " => window %u at %" SDL_PRIdLONG ", %" SDL_PRIdLONG, pt.x, pt.y, target->window->id, pnt.x, pnt.y); SDL_SendDropPosition(target->window, pnt.x, pnt.y); } else { SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In DragOver at %ld, %ld => nil, nil", pt.x, pt.y); + ". In DragOver at %" SDL_PRIdLONG ", %" SDL_PRIdLONG " => nil, nil", pt.x, pt.y); } return S_OK; } @@ -1820,11 +1820,11 @@ static STDMETHODIMP SDLDropTarget_Drop(SDLDropTarget *target, POINT pnt = { pt.x, pt.y }; if (ScreenToClient(target->hwnd, &pnt)) { SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In Drop at %ld, %ld => window %u at %ld, %ld", pt.x, pt.y, target->window->id, pnt.x, pnt.y); + ". In Drop at %" SDL_PRIdLONG ", %" SDL_PRIdLONG " => window %u at %" SDL_PRIdLONG ", %" SDL_PRIdLONG, pt.x, pt.y, target->window->id, pnt.x, pnt.y); SDL_SendDropPosition(target->window, pnt.x, pnt.y); } else { SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In Drop at %ld, %ld => nil, nil", pt.x, pt.y); + ". In Drop at %" SDL_PRIdLONG ", %" SDL_PRIdLONG " => nil, nil", pt.x, pt.y); } { @@ -1832,7 +1832,7 @@ static STDMETHODIMP SDLDropTarget_Drop(SDLDropTarget *target, HRESULT hres; hres = pDataObject->lpVtbl->EnumFormatEtc(pDataObject, DATADIR_GET, &pEnumFormatEtc); SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In Drop for EnumFormatEtc, HRESULT is %08lx", hres); + ". In Drop for EnumFormatEtc, HRESULT is %08" SDL_PRIxHRESULT, hres); if (hres == S_OK) { FORMATETC fetc; while (pEnumFormatEtc->lpVtbl->Next(pEnumFormatEtc, 1, &fetc, NULL) == S_OK) { @@ -1864,7 +1864,7 @@ static STDMETHODIMP SDLDropTarget_Drop(SDLDropTarget *target, STGMEDIUM med; HRESULT hres = pDataObject->lpVtbl->GetData(pDataObject, &fetc, &med); SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In Drop File for GetData, format %08x '%s', HRESULT is %08lx", + ". In Drop File for GetData, format %08x '%s', HRESULT is %08" SDL_PRIxHRESULT, fetc.cfFormat, format_mime, hres); if (SUCCEEDED(hres)) { const size_t bsize = GlobalSize(med.hGlobal); @@ -1912,7 +1912,7 @@ static STDMETHODIMP SDLDropTarget_Drop(SDLDropTarget *target, STGMEDIUM med; HRESULT hres = pDataObject->lpVtbl->GetData(pDataObject, &fetc, &med); SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In Drop Text for GetData, format %08x '%s', HRESULT is %08lx", + ". In Drop Text for GetData, format %08x '%s', HRESULT is %08" SDL_PRIxHRESULT, fetc.cfFormat, format_mime, hres); if (SUCCEEDED(hres)) { const size_t bsize = GlobalSize(med.hGlobal); @@ -1958,7 +1958,7 @@ static STDMETHODIMP SDLDropTarget_Drop(SDLDropTarget *target, STGMEDIUM med; HRESULT hres = pDataObject->lpVtbl->GetData(pDataObject, &fetc, &med); SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In Drop Text for GetData, format %08x '%s', HRESULT is %08lx", + ". In Drop Text for GetData, format %08x '%s', HRESULT is %08" SDL_PRIxHRESULT, fetc.cfFormat, format_mime, hres); if (SUCCEEDED(hres)) { const size_t bsize = GlobalSize(med.hGlobal); @@ -2012,7 +2012,7 @@ static STDMETHODIMP SDLDropTarget_Drop(SDLDropTarget *target, STGMEDIUM med; HRESULT hres = pDataObject->lpVtbl->GetData(pDataObject, &fetc, &med); SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In Drop Text for GetData, format %08x '%s', HRESULT is %08lx", + ". In Drop Text for GetData, format %08x '%s', HRESULT is %08" SDL_PRIxHRESULT, fetc.cfFormat, format_mime, hres); if (SUCCEEDED(hres)) { const size_t bsize = GlobalSize(med.hGlobal); @@ -2058,7 +2058,7 @@ static STDMETHODIMP SDLDropTarget_Drop(SDLDropTarget *target, STGMEDIUM med; HRESULT hres = pDataObject->lpVtbl->GetData(pDataObject, &fetc, &med); SDL_LogTrace(SDL_LOG_CATEGORY_INPUT, - ". In Drop File for GetData, format %08x '%s', HRESULT is %08lx", + ". In Drop File for GetData, format %08x '%s', HRESULT is %08" SDL_PRIxHRESULT, fetc.cfFormat, format_mime, hres); if (SUCCEEDED(hres)) { const size_t bsize = GlobalSize(med.hGlobal); diff --git a/test/testautomation_stdlib.c b/test/testautomation_stdlib.c index 4d1c6ea5db774..7ffd8585b8aeb 100644 --- a/test/testautomation_stdlib.c +++ b/test/testautomation_stdlib.c @@ -934,7 +934,9 @@ static int SDLCALL stdlib_sscanf(void *arg) #pragma GCC diagnostic pop #endif -#ifdef _WIN64 +#if defined(__CYGWIN__) +#define SIZE_FORMAT "zu" +#elif defined(_WIN64) #define SIZE_FORMAT "I64u" #elif defined(SDL_PLATFORM_WIN32) #define SIZE_FORMAT "I32u" From b68ef4bba2abe1ae3178db367bb6ef67e3885842 Mon Sep 17 00:00:00 2001 From: Tim Stahlhut Date: Sat, 2 May 2026 15:21:46 -0400 Subject: [PATCH 3/6] Edit SDL_d3d12.h to enable Cygwin and MSYS features --- src/video/directx/SDL_d3d12.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/video/directx/SDL_d3d12.h b/src/video/directx/SDL_d3d12.h index 2dfe672209d57..8587d1c3c8c91 100644 --- a/src/video/directx/SDL_d3d12.h +++ b/src/video/directx/SDL_d3d12.h @@ -37,8 +37,14 @@ #define WINAPI_PARTITION_GAMES 0 #endif // WINAPI_PARTITION_GAMES +#if defined(SDL_PLATFORM_WIN32) && defined(__CYGWIN__) + #define _WIN32 1 +#endif #define COBJMACROS #include "d3d12.h" +#if defined(SDL_PLATFORM_WIN32) && defined(__CYGWIN__) + #undef _WIN32 +#endif #include #include From 55b47cc34ca6351c1d1183cc137e8d38b39740eb Mon Sep 17 00:00:00 2001 From: Tim Stahlhut Date: Thu, 7 May 2026 16:36:26 -0400 Subject: [PATCH 4/6] Fix selected CYGWIN build issues. Many ideas are likely from PR 15457 Co-authored-by: TrueCat17 Co-authored-by: Anonymous Maarten Co-authored-by: Ozkan Sezer --- CMakeLists.txt | 33 +++++++++-------------------- cmake/macros.cmake | 2 +- include/SDL3/SDL_platform_defines.h | 4 ++-- include/SDL3/SDL_thread.h | 4 ++-- src/dynapi/SDL_dynapi.c | 6 +++--- src/hidapi/SDL_hidapi.c | 22 +++++++++---------- src/hidapi/windows/hid.c | 2 +- src/io/SDL_iostream.c | 18 +++++++--------- src/io/SDL_iostream_c.h | 2 +- test/CMakeLists.txt | 2 +- test/childprocess.c | 4 ++-- 11 files changed, 42 insertions(+), 57 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e591a011c1a72..ba9f2dd942991 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -367,16 +367,16 @@ dep_option(SDL_WAYLAND_LIBDECOR_SHARED "Dynamically load libdecor support" O dep_option(SDL_RPI "Use Raspberry Pi video driver" ON "SDL_VIDEO;UNIX_SYS;SDL_CPU_ARM32 OR SDL_CPU_ARM64" OFF) dep_option(SDL_ROCKCHIP "Use ROCKCHIP Hardware Acceleration video driver" ON "SDL_VIDEO;UNIX_SYS;SDL_CPU_ARM32 OR SDL_CPU_ARM64" OFF) dep_option(SDL_COCOA "Use Cocoa video driver" ON "APPLE" OFF) -dep_option(SDL_DIRECTX "Use DirectX for Windows audio/video" ON "SDL_AUDIO OR SDL_VIDEO;WINDOWS" OFF) -dep_option(SDL_XINPUT "Use Xinput for Windows" ON "WINDOWS" OFF) -dep_option(SDL_WASAPI "Use the Windows WASAPI audio driver" ON "WINDOWS;SDL_AUDIO" OFF) +dep_option(SDL_DIRECTX "Use DirectX for Windows audio/video" ON "SDL_AUDIO OR SDL_VIDEO;WINDOWS OR CYGWIN" OFF) +dep_option(SDL_XINPUT "Use Xinput for Windows" ON "WINDOWS OR CYGWIN" OFF) +dep_option(SDL_WASAPI "Use the Windows WASAPI audio driver" ON "WINDOWS OR CYGWIN;SDL_AUDIO" OFF) dep_option(SDL_RENDER_D3D "Enable the Direct3D 9 render driver" ON "SDL_RENDER;SDL_DIRECTX" OFF) dep_option(SDL_RENDER_D3D11 "Enable the Direct3D 11 render driver" ON "SDL_RENDER;SDL_DIRECTX" OFF) dep_option(SDL_RENDER_D3D12 "Enable the Direct3D 12 render driver" ON "SDL_RENDER;SDL_DIRECTX" OFF) dep_option(SDL_RENDER_METAL "Enable the Metal render driver" ON "SDL_RENDER;APPLE" OFF) dep_option(SDL_RENDER_GPU "Enable the SDL_GPU render driver" ON "SDL_RENDER;SDL_GPU" OFF) dep_option(SDL_VIVANTE "Use Vivante EGL video driver" ON "${UNIX_SYS};SDL_CPU_ARM32" OFF) -dep_option(SDL_VULKAN "Enable Vulkan support" "${SDL_VULKAN_DEFAULT}" "SDL_VIDEO;ANDROID OR APPLE OR LINUX OR FREEBSD OR OPENBSD OR WINDOWS" OFF) +dep_option(SDL_VULKAN "Enable Vulkan support" "${SDL_VULKAN_DEFAULT}" "SDL_VIDEO;ANDROID OR APPLE OR LINUX OR FREEBSD OR OPENBSD OR WINDOWS OR CYGWIN" OFF) dep_option(SDL_RENDER_VULKAN "Enable the Vulkan render driver" ON "SDL_RENDER;SDL_VULKAN" OFF) dep_option(SDL_METAL "Enable Metal support" ON "APPLE" OFF) set_option(SDL_OPENVR "Use OpenVR video driver" OFF) @@ -563,19 +563,6 @@ else() endif() endif() -if(CYGWIN) - # We build SDL on cygwin without the UNIX emulation layer - sdl_include_directories(PUBLIC SYSTEM "/usr/include/mingw") - cmake_push_check_state() - string(APPEND CMAKE_REQUIRED_FLAGS " -mno-cygwin") - check_c_source_compiles("int main(int argc, char **argv) { return 0; }" - HAVE_GCC_NO_CYGWIN) - cmake_pop_check_state() - if(HAVE_GCC_NO_CYGWIN) - sdl_shared_link_options("-mno-cygwin") - endif() -endif() - # General includes sdl_compile_definitions(PRIVATE "USING_GENERATED_CONFIG_H") sdl_include_directories( @@ -1128,7 +1115,7 @@ if(SDL_LIBC) vsnprintf vsscanf wcsnlen wcscmp wcsdup wcslcat wcslcpy wcslen wcsncmp wcsstr wcstol ) - if(WINDOWS) + if(WINDOWS OR CYGWIN) list(APPEND symbols_to_check _copysign _fseeki64 _strrev _ui64toa _uitoa _ultoa _wcsdup ) @@ -1407,7 +1394,7 @@ if(SDL_CAMERA) #endif() endif() -if(UNIX OR APPLE) +if((UNIX OR APPLE) AND (NOT CYGWIN)) # Relevant for Unix/Darwin only set(DYNAPI_NEEDS_DLOPEN 1) CheckDLOPEN() @@ -1806,7 +1793,7 @@ elseif(EMSCRIPTEN) CheckPTHREAD() CheckLibUnwind() -elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU) +elseif(UNIX AND NOT (APPLE OR RISCOS OR HAIKU OR CYGWIN)) set(SDL_DISABLE_DLOPEN_NOTES TRUE) if(SDL_DLOPEN_NOTES) @@ -2197,7 +2184,7 @@ elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU) set (HAVE_VSNPRINTF 0) set (USE_POSIX_SPAWN 1) endif() -elseif(WINDOWS) +elseif(WINDOWS OR CYGWIN) enable_language(CXX) check_c_source_compiles(" #include @@ -2231,7 +2218,7 @@ elseif(WINDOWS) if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700) set(USE_WINSDK_DIRECTX TRUE) endif() - if(NOT MINGW AND NOT USE_WINSDK_DIRECTX) + if(NOT (MINGW OR CYGWIN) AND NOT USE_WINSDK_DIRECTX) if("$ENV{DXSDK_DIR}" STREQUAL "") message(FATAL_ERROR "DIRECTX requires the \$DXSDK_DIR environment variable to be set") endif() @@ -2250,7 +2237,7 @@ elseif(WINDOWS) cmake_pop_check_state() if(HAVE_D3D9_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H) set(HAVE_DIRECTX TRUE) - if(NOT MINGW AND NOT USE_WINSDK_DIRECTX) + if(NOT (MINGW OR CYGWIN) AND NOT USE_WINSDK_DIRECTX) if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(PROCESSOR_ARCH "x64") else() diff --git a/cmake/macros.cmake b/cmake/macros.cmake index eb445b233d360..afa0a3b597561 100644 --- a/cmake/macros.cmake +++ b/cmake/macros.cmake @@ -425,7 +425,7 @@ function(SDL_PrintSummary) message(STATUS "") endif() - if(UNIX AND NOT (ANDROID OR APPLE OR EMSCRIPTEN OR HAIKU OR RISCOS OR DJGPP)) + if(UNIX AND NOT (ANDROID OR APPLE OR EMSCRIPTEN OR HAIKU OR RISCOS OR DJGPP OR CYGWIN)) if(NOT (HAVE_X11 OR HAVE_WAYLAND)) if(NOT SDL_UNIX_CONSOLE_BUILD) message(FATAL_ERROR diff --git a/include/SDL3/SDL_platform_defines.h b/include/SDL3/SDL_platform_defines.h index 23ff34ce10d7b..71dbd53feccdb 100644 --- a/include/SDL3/SDL_platform_defines.h +++ b/include/SDL3/SDL_platform_defines.h @@ -317,7 +317,7 @@ #define SDL_PLATFORM_CYGWIN 1 #endif -#if (defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN)) && !defined(__NGAGE__) +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(__NGAGE__) /** * A preprocessor macro that is only defined if compiling for Windows. @@ -417,7 +417,7 @@ #define SDL_PLATFORM_WIN32 1 #endif -#endif /* defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN) */ +#endif /* (defined(_WIN32) || defined(__CYGWIN__)) && !defined(__NGAGE__) */ /* This is to support generic "any GDK" separate from a platform-specific GDK */ diff --git a/include/SDL3/SDL_thread.h b/include/SDL3/SDL_thread.h index 1842c035f71f9..9f6f8feae1076 100644 --- a/include/SDL3/SDL_thread.h +++ b/include/SDL3/SDL_thread.h @@ -48,7 +48,7 @@ /* Thread synchronization primitives */ #include -#if defined(SDL_PLATFORM_WINDOWS) +#if defined(SDL_PLATFORM_WINDOWS) && !defined(__CYGWIN__) #include /* _beginthreadex() and _endthreadex() */ #endif @@ -296,7 +296,7 @@ extern SDL_DECLSPEC SDL_Thread * SDLCALL SDL_CreateThreadWithProperties(SDL_Prop /* The real implementation, hidden from the wiki, so it can show this as real functions that don't have macro magic. */ #ifndef SDL_WIKI_DOCUMENTATION_SECTION -# if defined(SDL_PLATFORM_WINDOWS) +# if defined(SDL_PLATFORM_WINDOWS) && !defined(__CYGWIN__) # ifndef SDL_BeginThreadFunction # define SDL_BeginThreadFunction _beginthreadex # endif diff --git a/src/dynapi/SDL_dynapi.c b/src/dynapi/SDL_dynapi.c index a0135dca42387..fcbbbd6d612d0 100644 --- a/src/dynapi/SDL_dynapi.c +++ b/src/dynapi/SDL_dynapi.c @@ -48,7 +48,7 @@ // These headers have system specific definitions, so aren't included above #include -#if defined(WIN32) || defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN) +#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 #endif @@ -451,7 +451,7 @@ Sint32 SDL_DYNAPI_entry(Uint32 apiver, void *table, Uint32 tablesize) // Obviously we can't use SDL_LoadObject() to load SDL. :) // Also obviously, we never close the loaded library, once we accept it. -#if defined(WIN32) || defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN) +#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) static HMODULE sdlapi_lib = NULL; // The handle to the other SDL library, loaded with SDL_DYNAMIC_API_ENVVAR static SDL_INLINE void unload_sdlapi_library(void) @@ -509,7 +509,7 @@ static void dynapi_warn(const char *msg) const char *caption = "SDL Dynamic API Failure!"; (void)caption; // SDL_ShowSimpleMessageBox() is a too heavy for here. -#if (defined(WIN32) || defined(_WIN32) || defined(SDL_PLATFORM_CYGWIN)) && !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) +#if (defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__)) && !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES) MessageBoxA(NULL, msg, caption, MB_OK | MB_ICONERROR); #elif defined(HAVE_STDIO_H) fprintf(stderr, "\n\n%s\n%s\n\n", caption, msg); diff --git a/src/hidapi/SDL_hidapi.c b/src/hidapi/SDL_hidapi.c index 0dda4d4ba18a7..12eefe22c7653 100644 --- a/src/hidapi/SDL_hidapi.c +++ b/src/hidapi/SDL_hidapi.c @@ -50,7 +50,7 @@ SDL_ELF_NOTE_DLOPEN( ) #endif -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) +#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_CYGWIN) #include "../core/windows/SDL_windows.h" #endif @@ -110,7 +110,7 @@ static struct bool m_bCanGetNotifications; Uint64 m_unLastDetect; -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) +#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_CYGWIN) SDL_ThreadID m_nThreadID; WNDCLASSEXA m_wndClass; HWND m_hwndMsg; @@ -130,7 +130,7 @@ static struct #endif } SDL_HIDAPI_discovery; -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) +#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_CYGWIN) struct _DEV_BROADCAST_HDR { DWORD dbch_size; @@ -176,7 +176,7 @@ static LRESULT CALLBACK ControllerWndProc(HWND hwnd, UINT message, WPARAM wParam return DefWindowProc(hwnd, message, wParam, lParam); } -#endif // defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) +#endif // defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_CYGWIN) #ifdef SDL_PLATFORM_MACOS static void CallbackIOServiceFunc(void *context, io_iterator_t portIterator) @@ -239,7 +239,7 @@ static void HIDAPI_InitializeDiscovery(void) SDL_HIDAPI_discovery.m_bCanGetNotifications = false; SDL_HIDAPI_discovery.m_unLastDetect = 0; -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) +#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_CYGWIN) SDL_HIDAPI_discovery.m_nThreadID = SDL_GetCurrentThreadID(); SDL_zero(SDL_HIDAPI_discovery.m_wndClass); @@ -266,7 +266,7 @@ static void HIDAPI_InitializeDiscovery(void) SDL_HIDAPI_discovery.m_hNotify = RegisterDeviceNotification(SDL_HIDAPI_discovery.m_hwndMsg, &devBroadcast, DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); SDL_HIDAPI_discovery.m_bCanGetNotifications = (SDL_HIDAPI_discovery.m_hNotify != 0); } -#endif // defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) +#endif // defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_CYGWIN) #ifdef SDL_PLATFORM_MACOS SDL_HIDAPI_discovery.m_notificationPort = IONotificationPortCreate(kIOMainPortDefault); @@ -387,7 +387,7 @@ static void HIDAPI_UpdateDiscovery(void) return; } -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) +#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_CYGWIN) if (SDL_IsVideoThread()) { // just let the usual SDL_PumpEvents loop dispatch these, fixing bug 2998. --ryan. } else { @@ -402,7 +402,7 @@ static void HIDAPI_UpdateDiscovery(void) } } } -#endif // defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) +#endif // defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_CYGWIN) #ifdef SDL_PLATFORM_MACOS if (SDL_HIDAPI_discovery.m_notificationPort) { @@ -496,7 +496,7 @@ static void HIDAPI_ShutdownDiscovery(void) return; } -#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) +#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_CYGWIN) if (SDL_HIDAPI_discovery.m_hNotify) { UnregisterDeviceNotification(SDL_HIDAPI_discovery.m_hNotify); } @@ -589,7 +589,7 @@ typedef struct PLATFORM_hid_device_ PLATFORM_hid_device; #include "SDL_hidapi_netbsd.h" #elif defined(SDL_PLATFORM_MACOS) #include "SDL_hidapi_mac.h" -#elif defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) +#elif defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) || defined(SDL_PLATFORM_CYGWIN) #include "SDL_hidapi_windows.h" #elif defined(SDL_PLATFORM_ANDROID) #include "SDL_hidapi_android.h" @@ -1075,7 +1075,7 @@ bool SDL_HIDAPI_ShouldIgnoreDevice(int bus, Uint16 vendor_id, Uint16 product_id, if (vendor_id == USB_VENDOR_VALVE) { // Ignore the mouse/keyboard interface on Steam Controllers if ( -#ifdef SDL_PLATFORM_WIN32 +#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_CYGWIN) // Check the usage page and usage on both USB and Bluetooth #else // Only check the usage page and usage on USB diff --git a/src/hidapi/windows/hid.c b/src/hidapi/windows/hid.c index 49a53f9bb3c83..3d0b4d41d775e 100644 --- a/src/hidapi/windows/hid.c +++ b/src/hidapi/windows/hid.c @@ -45,7 +45,7 @@ typedef LONG NTSTATUS; #define _WIN32_WINNT_WIN8 0x0602 #endif -#ifdef __CYGWIN__ +#if defined(__CYGWIN__) && !defined(HIDAPI_USING_SDL_RUNTIME) #include #include #define _wcsdup wcsdup diff --git a/src/io/SDL_iostream.c b/src/io/SDL_iostream.c index 4f3b0606add5a..8db2a537d5314 100644 --- a/src/io/SDL_iostream.c +++ b/src/io/SDL_iostream.c @@ -20,7 +20,7 @@ */ #include "SDL_internal.h" -#if defined(SDL_PLATFORM_WINDOWS) +#if defined(SDL_PLATFORM_WINDOWS) && !defined(SDL_PLATFORM_CYGWIN) #include "../core/windows/SDL_windows.h" #else #include @@ -62,7 +62,7 @@ struct SDL_IOStream #include "../core/android/SDL_android.h" #endif -#if defined(SDL_PLATFORM_WINDOWS) +#if defined(SDL_PLATFORM_WINDOWS) && !defined(SDL_PLATFORM_CYGWIN) typedef struct IOStreamWindowsData { @@ -478,9 +478,7 @@ SDL_IOStream *SDL_IOFromHandle(HANDLE handle, const char *mode, bool autoclose) return iostr; } -#endif // defined(SDL_PLATFORM_WINDOWS) - -#if !defined(SDL_PLATFORM_WINDOWS) +#else // Functions to read/write file descriptors. Not used for windows. @@ -672,9 +670,9 @@ SDL_IOStream *SDL_IOFromFD(int fd, bool autoclose) return iostr; } -#endif // !defined(SDL_PLATFORM_WINDOWS) +#endif // defined(SDL_PLATFORM_WINDOWS) && !defined(SDL_PLATFORM_CYGWIN) -#if defined(HAVE_STDIO_H) && !defined(SDL_PLATFORM_WINDOWS) +#if defined(HAVE_STDIO_H) && !(defined(SDL_PLATFORM_WINDOWS) && !defined(SDL_PLATFORM_CYGWIN)) // Functions to read/write stdio file pointers. Not used for windows. @@ -871,7 +869,7 @@ SDL_IOStream *SDL_IOFromFP(FILE *fp, bool autoclose) return iostr; } -#endif // !HAVE_STDIO_H && !defined(SDL_PLATFORM_WINDOWS) +#endif // defined(HAVE_STDIO_H) && !(defined(SDL_PLATFORM_WINDOWS) && !defined(SDL_PLATFORM_CYGWIN)) // Functions to read/write memory pointers @@ -965,7 +963,7 @@ static bool SDLCALL mem_close(void *userdata) // Functions to create SDL_IOStream structures from various data sources // private platforms might define SKIP_STDIO_DIR_TEST in their build configs, too. -#if defined(SDL_PLATFORM_WINDOWS) || defined(SDL_PLATFORM_EMSCRIPTEN) +#if (defined(SDL_PLATFORM_WINDOWS) && !defined(SDL_PLATFORM_CYGWIN)) || defined(SDL_PLATFORM_EMSCRIPTEN) #define SKIP_STDIO_DIR_TEST 1 #endif @@ -1102,7 +1100,7 @@ SDL_IOStream *SDL_IOFromFile(const char *file, const char *mode) iostr = SDL_IOFromFP(fp, true); } -#elif defined(SDL_PLATFORM_WINDOWS) +#elif defined(SDL_PLATFORM_WINDOWS) && !defined(SDL_PLATFORM_CYGWIN) HANDLE handle = windows_file_open(file, mode); if (handle != INVALID_HANDLE_VALUE) { iostr = SDL_IOFromHandle(handle, mode, true); diff --git a/src/io/SDL_iostream_c.h b/src/io/SDL_iostream_c.h index fadb98bcb6d4c..be955e89ad1ec 100644 --- a/src/io/SDL_iostream_c.h +++ b/src/io/SDL_iostream_c.h @@ -23,7 +23,7 @@ #ifndef SDL_iostream_c_h_ #define SDL_iostream_c_h_ -#if defined(SDL_PLATFORM_WINDOWS) +#if defined(SDL_PLATFORM_WINDOWS) && !defined(SDL_PLATFORM_CYGWIN) SDL_IOStream *SDL_IOFromHandle(HANDLE handle, const char *mode, bool autoclose); #else #if defined(HAVE_STDIO_H) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b6e7b724bf228..a374ae576691a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -670,7 +670,7 @@ function(add_sdl_test TEST TARGET) COMMAND ${command} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) - if(WIN32 AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.27") + if((WIN32 OR CYGWIN) AND CMAKE_VERSION VERSION_GREATER_EQUAL "3.27") set_property(TEST ${TEST} APPEND PROPERTY ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$") endif() if(NOT notrackmem) diff --git a/test/childprocess.c b/test/childprocess.c index 69a7cea2da3d9..785356d0c8821 100644 --- a/test/childprocess.c +++ b/test/childprocess.c @@ -107,7 +107,7 @@ int main(int argc, char *argv[]) { if (print_arguments) { int print_i; -#ifdef SDL_PLATFORM_WINDOWS +#if defined(SDL_PLATFORM_WINDOWS) && !defined(__CYGWIN__) /* reopen stdout as binary to prevent newline conversion */ _setmode(_fileno(stdout), _O_BINARY); #endif @@ -145,7 +145,7 @@ int main(int argc, char *argv[]) { continue; } -#ifdef SDL_PLATFORM_WINDOWS +#if defined(SDL_PLATFORM_WINDOWS) && !defined(__CYGWIN__) if (strerror_s(error, sizeof(error), errno) != 0) { SDL_strlcpy(error, "Unknown error", sizeof(error)); } From 64db957080b0e27fcb1cfdb4b56d606806c35507 Mon Sep 17 00:00:00 2001 From: Tim Stahlhut Date: Thu, 7 May 2026 16:36:26 -0400 Subject: [PATCH 5/6] Add support for MSYS --- CMakeLists.txt | 12 ++++++------ include/SDL3/SDL_egl.h | 2 +- include/SDL3/SDL_opengl.h | 6 +++--- include/SDL3/SDL_opengl_glext.h | 2 +- include/SDL3/SDL_platform_defines.h | 2 +- src/hidapi/windows/hid.c | 2 +- src/video/khronos/EGL/eglplatform.h | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ba9f2dd942991..fc0af9a3abd8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,7 +130,7 @@ list(APPEND CMAKE_REQUIRED_LINK_OPTIONS ${SDL_CHECK_REQUIRED_LINK_OPTIONS}) SDL_DetectCMakePlatform() # Don't mistake macOS for unix -if(UNIX AND NOT ANDROID AND NOT APPLE AND NOT RISCOS) +if(UNIX AND NOT ANDROID AND NOT APPLE AND NOT RISCOS AND NOT MSYS) set(UNIX_SYS ON) else() set(UNIX_SYS OFF) @@ -272,7 +272,7 @@ if(SDL_FRAMEWORK) set(SDL_STATIC_AVAILABLE FALSE) endif() -if(UNIX AND NOT ANDROID AND NOT RISCOS AND NOT SDL_FRAMEWORK) +if(UNIX AND NOT ANDROID AND NOT RISCOS AND NOT SDL_FRAMEWORK AND NOT MSYS) set(SDL_RPATH_DEFAULT ON) else() set(SDL_RPATH_DEFAULT OFF) @@ -3484,7 +3484,7 @@ if (SDL_DIALOG) if(ANDROID) sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/android/SDL_androiddialog.c) set(HAVE_SDL_DIALOG TRUE) - elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU) + elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU AND NOT MSYS) sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_unixdialog.c) sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_portaldialog.c) sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_portaldialog.h) @@ -3494,7 +3494,7 @@ if (SDL_DIALOG) elseif(HAIKU) sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/haiku/SDL_haikudialog.cc) set(HAVE_SDL_DIALOG TRUE) - elseif(WINDOWS) + elseif(WINDOWS OR MSYS) sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/windows/SDL_windowsdialog.c) set(HAVE_SDL_DIALOG TRUE) elseif(MACOS) @@ -3502,13 +3502,13 @@ if (SDL_DIALOG) set(HAVE_SDL_DIALOG TRUE) endif() endif() -if(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU) +if(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU AND NOT MSYS) sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_zenitymessagebox.h) sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_zenitymessagebox.c) endif() sdl_sources("${SDL3_SOURCE_DIR}/src/process/SDL_process.c") -if(WINDOWS) +if(WINDOWS OR MSYS) sdl_glob_sources( "${SDL3_SOURCE_DIR}/src/process/windows/*.c" "${SDL3_SOURCE_DIR}/src/process/windows/*.h" diff --git a/include/SDL3/SDL_egl.h b/include/SDL3/SDL_egl.h index 1371c4d0120e5..f4d955d52c555 100644 --- a/include/SDL3/SDL_egl.h +++ b/include/SDL3/SDL_egl.h @@ -409,7 +409,7 @@ typedef void *EGLNativeDisplayType; typedef void *EGLNativePixmapType; typedef void *EGLNativeWindowType; -#elif defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ +#elif defined(_WIN32) || defined(__MSYS__) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 #endif diff --git a/include/SDL3/SDL_opengl.h b/include/SDL3/SDL_opengl.h index 733f2b51a0174..c7fdf48b0024b 100644 --- a/include/SDL3/SDL_opengl.h +++ b/include/SDL3/SDL_opengl.h @@ -71,7 +71,7 @@ * Begin system-specific stuff. */ -#if defined(_WIN32) && !defined(__CYGWIN__) +#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MSYS__) # if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */ # define GLAPI __declspec(dllexport) # elif (defined(_MSC_VER) || defined(__MINGW32__)) && defined(_DLL) /* tag specifying we're building for DLL runtime support */ @@ -84,7 +84,7 @@ # else # define GLAPIENTRY __stdcall # endif -#elif defined(__CYGWIN__) && defined(USE_OPENGL32) /* use native windows opengl32 */ +#elif defined(__CYGWIN__) && defined(USE_OPENGL32) && !defined(__MSYS__) /* use native windows opengl32 */ # define GLAPI extern # define GLAPIENTRY __stdcall #elif (defined(__GNUC__) && __GNUC__ >= 4) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) @@ -100,7 +100,7 @@ * than "WIN32_LEAN_AND_MEAN" may include windows.h before * glut.h or gl.h. */ -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) +#if (defined(_WIN32) || defined(__MSYS__)) && !defined(APIENTRY) && !defined(__CYGWIN__) #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 #endif diff --git a/include/SDL3/SDL_opengl_glext.h b/include/SDL3/SDL_opengl_glext.h index fa0f6c2a5bffd..a59957185e7e3 100644 --- a/include/SDL3/SDL_opengl_glext.h +++ b/include/SDL3/SDL_opengl_glext.h @@ -19,7 +19,7 @@ extern "C" { ** https://github.com/KhronosGroup/OpenGL-Registry */ -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#if (defined(_WIN32) || defined(__MSYS__)) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 #endif diff --git a/include/SDL3/SDL_platform_defines.h b/include/SDL3/SDL_platform_defines.h index 71dbd53feccdb..fc5922d1477a1 100644 --- a/include/SDL3/SDL_platform_defines.h +++ b/include/SDL3/SDL_platform_defines.h @@ -307,7 +307,7 @@ #define SDL_PLATFORM_SOLARIS 1 #endif -#if defined(__CYGWIN__) +#if defined(__CYGWIN__) && !defined(__MSYS__) /** * A preprocessor macro that is only defined if compiling for Cygwin. diff --git a/src/hidapi/windows/hid.c b/src/hidapi/windows/hid.c index 3d0b4d41d775e..7f3ab363383bc 100644 --- a/src/hidapi/windows/hid.c +++ b/src/hidapi/windows/hid.c @@ -45,7 +45,7 @@ typedef LONG NTSTATUS; #define _WIN32_WINNT_WIN8 0x0602 #endif -#if defined(__CYGWIN__) && !defined(HIDAPI_USING_SDL_RUNTIME) +#if defined(__CYGWIN__) && !defined(HIDAPI_USING_SDL_RUNTIME) && !defined(__MSYS__) #include #include #define _wcsdup wcsdup diff --git a/src/video/khronos/EGL/eglplatform.h b/src/video/khronos/EGL/eglplatform.h index 6786afd90b685..3dcf2061185d0 100644 --- a/src/video/khronos/EGL/eglplatform.h +++ b/src/video/khronos/EGL/eglplatform.h @@ -54,7 +54,7 @@ typedef void *EGLNativeDisplayType; typedef void *EGLNativePixmapType; typedef void *EGLNativeWindowType; -#elif defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ +#elif (defined(_WIN32) || defined(__MSYS__)) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 #endif From 614f586fcf5836056f9802d3a4f6a45364b3f5aa Mon Sep 17 00:00:00 2001 From: Tim Stahlhut Date: Mon, 4 May 2026 12:11:11 -0400 Subject: [PATCH 6/6] ci: Add "msys2-msys" Co-authored-by: Anonymous Maarten [sdl-ci-filter msys2-msys] --- .github/workflows/create-test-plan.py | 40 ++++++++++++++++++--------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/.github/workflows/create-test-plan.py b/.github/workflows/create-test-plan.py index c0e847c05f10f..4bc63f4bbde4e 100755 --- a/.github/workflows/create-test-plan.py +++ b/.github/workflows/create-test-plan.py @@ -66,6 +66,7 @@ class Msys2Platform(Enum): Mingw64 = "mingw64" Clang64 = "clang64" Ucrt64 = "ucrt64" + Msys = "msys" class IntelCompiler(Enum): @@ -110,6 +111,7 @@ class JobSpec: "msys2-mingw64": JobSpec(name="Windows (msys2, mingw64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-mingw64", msys2_platform=Msys2Platform.Mingw64, ), "msys2-clang64": JobSpec(name="Windows (msys2, clang64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-mingw64-clang", msys2_platform=Msys2Platform.Clang64, ), "msys2-ucrt64": JobSpec(name="Windows (msys2, ucrt64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-mingw64-ucrt", msys2_platform=Msys2Platform.Ucrt64, ), + "msys2-msys": JobSpec(name="Windows (msys2, msys)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-msys", msys2_platform=Msys2Platform.Msys, ), "msvc-x64": JobSpec(name="Windows (MSVC, x64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-VC-x64", msvc_arch=MsvcArch.X64, msvc_project="VisualC/SDL.sln", ), "msvc-x86": JobSpec(name="Windows (MSVC, x86)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-VC-x86", msvc_arch=MsvcArch.X86, msvc_project="VisualC/SDL.sln", ), "msvc-clang-x64": JobSpec(name="Windows (MSVC, clang-cl x64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-clang-cl-x64", msvc_arch=MsvcArch.X64, clang_cl=True, ), @@ -161,6 +163,7 @@ class StaticLibType(Enum): class SharedLibType(Enum): WIN32 = "SDL3.dll" + MSYS = "msys-SDL3-0.dll" SO_0 = "libSDL3.so.0" SO = "libSDL3.so" DYLIB = "libSDL3.0.dylib" @@ -744,26 +747,37 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool, ctest_args job.shell = "msys2 {0}" assert spec.msys2_platform job.msys2_msystem = spec.msys2_platform.value - job.shared_lib = SharedLibType.WIN32 + if spec.msys2_platform == Msys2Platform.Msys: + job.shared_lib = SharedLibType.MSYS + job.cmake_arguments.append("-DSDLTEST_GDB=ON") + else: + job.shared_lib = SharedLibType.WIN32 job.static_lib = StaticLibType.A msys2_env = { - "mingw32": "mingw-w64-i686", - "mingw64": "mingw-w64-x86_64", - "clang64": "mingw-w64-clang-x86_64", - "ucrt64": "mingw-w64-ucrt-x86_64", + "mingw32": "mingw-w64-i686-", + "mingw64": "mingw-w64-x86_64-", + "clang64": "mingw-w64-clang-x86_64-", + "ucrt64": "mingw-w64-ucrt-x86_64-", + "msys": "", }[spec.msys2_platform.value] job.msys2_packages.extend([ - f"{msys2_env}-cc", - f"{msys2_env}-cmake", - f"{msys2_env}-ffmpeg", - f"{msys2_env}-ninja", - f"{msys2_env}-pkg-config", + f"{msys2_env}cmake", + f"{msys2_env}ninja", + f"{msys2_env}pkg-config", ]) + if spec.msys2_platform in (Msys2Platform.Msys, ): + job.msys2_packages.append(f"{msys2_env}gcc") + job.msys2_packages.append(f"{msys2_env}gdb") + job.msys2_packages.append(f"{msys2_env}git") # might not be needed + if spec.msys2_platform not in (Msys2Platform.Msys, ): + job.msys2_packages.append(f"{msys2_env}cc") + job.msys2_packages.append(f"{msys2_env}ffmpeg") if spec.msys2_platform not in (Msys2Platform.Mingw32, ): - job.msys2_packages.append(f"{msys2_env}-perl") - job.msys2_packages.append(f"{msys2_env}-clang-tools-extra") + job.msys2_packages.append(f"{msys2_env}perl") + if spec.msys2_platform not in (Msys2Platform.Mingw32, Msys2Platform.Msys, ): + job.msys2_packages.append(f"{msys2_env}clang-tools-extra") if job.ccache: - job.msys2_packages.append(f"{msys2_env}-ccache") + job.msys2_packages.append(f"{msys2_env}ccache") case SdlPlatform.Riscos: job.ccache = False # FIXME: enable when container gets upgrade # FIXME: Enable SDL_WERROR