From 15b2a9847de0719bb0b9ffc45dcb233bd723e4f4 Mon Sep 17 00:00:00 2001 From: Dmitry Kazakov Date: Tue, 27 Oct 2026 18:16:17 +0100 Subject: [PATCH] [win] Don't build a custom nanosleep() when not needed Instead of relying of the includes order we should properly check if the function is actually provided by our version of pthread library. --- CMakeLists.txt | 3 --- src/framework/CMakeLists.txt | 10 +++++++++- src/framework/mlt_config.h.in | 4 ++++ src/framework/mlt_types.h | 3 ++- src/melt/CMakeLists.txt | 6 +++--- src/modules/avformat/CMakeLists.txt | 3 --- src/modules/sdl2/CMakeLists.txt | 4 ---- src/win32/win32.c | 3 ++- 8 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 src/framework/mlt_config.h.in diff --git a/CMakeLists.txt b/CMakeLists.txt index c48843705..a366f2283 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -220,9 +220,6 @@ if(WIN32) find_package(dlfcn-win32 REQUIRED) set(CMAKE_DL_LIBS dlfcn-win32::dl) endif() - if(MINGW) - string(REPLACE "iconv" "pthread" MLT_PTHREAD_LIBS "${Iconv_LIBRARY}") - endif() endif() find_package(SDL2) diff --git a/src/framework/CMakeLists.txt b/src/framework/CMakeLists.txt index a4b4d060d..4a9cb3cc0 100644 --- a/src/framework/CMakeLists.txt +++ b/src/framework/CMakeLists.txt @@ -133,8 +133,13 @@ set_target_properties(mlt PROPERTIES ) if(WIN32) + include(CheckSymbolExists) + set(CMAKE_REQUIRED_LIBRARIES Threads::Threads) + check_symbol_exists(nanosleep "pthread.h;pthread_time.h" HAVE_PTHREAD_NANOSLEEP_WIN32) + unset(CMAKE_REQUIRED_LIBRARIES) + if(MINGW) - target_link_libraries(mlt PRIVATE ${MLT_PTHREAD_LIBS}) + target_link_libraries(mlt PRIVATE Threads::Threads) target_link_options(mlt PRIVATE -Wl,--output-def,${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/libmlt-${MLT_VERSION_MAJOR}.def) install(FILES "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/libmlt-${MLT_VERSION_MAJOR}.def" DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() @@ -145,6 +150,8 @@ if(WIN32) endif() endif() +configure_file(mlt_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/mlt_config.h) + if(NOT (WIN32 OR RELOCATABLE)) if(APPLE) target_compile_definitions(mlt PRIVATE PREFIX_DATA="${CMAKE_INSTALL_FULL_DATADIR}/mlt" PREFIX_LIB="${CMAKE_INSTALL_FULL_LIBDIR}/mlt") @@ -167,6 +174,7 @@ install(TARGETS mlt # Install the generated export header install(FILES ${CMAKE_CURRENT_BINARY_DIR}/mlt_export.h + ${CMAKE_CURRENT_BINARY_DIR}/mlt_config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mlt-${MLT_VERSION_MAJOR}/framework ) diff --git a/src/framework/mlt_config.h.in b/src/framework/mlt_config.h.in new file mode 100644 index 000000000..71ffd905b --- /dev/null +++ b/src/framework/mlt_config.h.in @@ -0,0 +1,4 @@ +/* mlt_config.h. Generated by cmake from mlt_config.h.in */ + +/* Defined when a pthread library has an implementation for nanosleep() (win32-only) */ +#cmakedefine HAVE_PTHREAD_NANOSLEEP_WIN32 \ No newline at end of file diff --git a/src/framework/mlt_types.h b/src/framework/mlt_types.h index 2854183d1..846066c00 100644 --- a/src/framework/mlt_types.h +++ b/src/framework/mlt_types.h @@ -332,12 +332,13 @@ typedef void *(*mlt_thread_function_t)(void *); /**< generic thread functio #endif #ifdef _WIN32 +#include "mlt_config.h" #include /* Win32 compatibility function declarations */ #if !defined(__MINGW32__) MLT_EXPORT int usleep(unsigned int useconds); #endif -#ifndef WIN_PTHREADS_TIME_H +#ifndef HAVE_PTHREAD_NANOSLEEP_WIN32 MLT_EXPORT int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); #endif MLT_EXPORT int setenv(const char *name, const char *value, int overwrite); diff --git a/src/melt/CMakeLists.txt b/src/melt/CMakeLists.txt index 557bac728..68f00266b 100644 --- a/src/melt/CMakeLists.txt +++ b/src/melt/CMakeLists.txt @@ -7,12 +7,12 @@ target_link_libraries(melt PRIVATE mlt Threads::Threads) target_compile_definitions(melt PRIVATE VERSION="${MLT_VERSION}") if(SDL2_FOUND AND NOT ANDROID) - target_link_libraries(melt PRIVATE SDL2::SDL2) target_compile_definitions(melt PRIVATE HAVE_SDL2) if(MINGW) - target_link_libraries(melt PRIVATE ${MLT_PTHREAD_LIBS}) target_compile_definitions(melt PRIVATE main=SDL_main) - target_link_libraries(melt PRIVATE mingw32 SDL2main SDL2) + target_link_libraries(melt PRIVATE mingw32 SDL2::SDL2main SDL2::SDL2) + else() + target_link_libraries(melt PRIVATE SDL2::SDL2) endif() endif() diff --git a/src/modules/avformat/CMakeLists.txt b/src/modules/avformat/CMakeLists.txt index 3b197daa2..97d3420d4 100644 --- a/src/modules/avformat/CMakeLists.txt +++ b/src/modules/avformat/CMakeLists.txt @@ -46,9 +46,6 @@ endif() if(WIN32) target_compile_definitions(mltavformat PRIVATE AVDATADIR="share/ffmpeg/") - if(MINGW) - target_link_libraries(mltavformat PRIVATE ${MLT_PTHREAD_LIBS}) - endif() endif() if(USE_AVDEVICE AND AVDEVICE_FOUND) diff --git a/src/modules/sdl2/CMakeLists.txt b/src/modules/sdl2/CMakeLists.txt index e46abb04f..844686d2f 100644 --- a/src/modules/sdl2/CMakeLists.txt +++ b/src/modules/sdl2/CMakeLists.txt @@ -20,10 +20,6 @@ else() target_link_libraries(mltsdl2 PRIVATE m) endif() -if(MINGW) - target_link_libraries(mltsdl2 PRIVATE ${MLT_PTHREAD_LIBS}) -endif() - set_target_properties(mltsdl2 PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${MLT_MODULE_OUTPUT_DIRECTORY}") install(TARGETS mltsdl2 LIBRARY DESTINATION ${MLT_INSTALL_MODULE_DIR}) diff --git a/src/win32/win32.c b/src/win32/win32.c index 29e443647..7e8f4ba27 100644 --- a/src/win32/win32.c +++ b/src/win32/win32.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "../framework/mlt_properties.h" #include "../framework/mlt_log.h" @@ -46,7 +47,7 @@ int usleep(unsigned int useconds) return 0; } -#ifndef WIN_PTHREADS_TIME_H +#ifndef HAVE_PTHREAD_NANOSLEEP_WIN32 int nanosleep(const struct timespec * rqtp, struct timespec * rmtp) { if (rqtp->tv_nsec > 999999999) {