diff --git a/CMakeLists.txt b/CMakeLists.txt index 409f4bd6d..544622c34 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,14 @@ if(BUILD_OUT_OF_TREE) include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/common/bootstrap.cmake" NO_POLICY_SCOPE) include(compilerconfig) + # OPENSSL_USE_STATIC_LIBS here ensures FindOpenSSL picks up the static libs + # preventing DLL name collisions with other plugins (e.g.NVIDIA AR SDK). + if(OS_WINDOWS) + set(OPENSSL_USE_STATIC_LIBS + ON + CACHE BOOL "Use static OpenSSL" FORCE) + include(cmake/windows/wingetssl.cmake) + endif() include(defaults) include(helpers) endif() @@ -34,11 +42,6 @@ include(cmake/common/get_git_revision_description.cmake) get_git_head_revision(GIT_REFSPEC GIT_SHA1) git_describe(GIT_TAG) -# Helper for OpenSSL -if(OS_WINDOWS) - include(cmake/windows/wingetssl.cmake) -endif() - if(${GIT_TAG} STREQUAL "GIT-NOTFOUND") set(GIT_TAG ${PROJECT_VERSION}) endif() diff --git a/cmake/windows/wingetssl.cmake b/cmake/windows/wingetssl.cmake index 04966e426..f68fc7af2 100644 --- a/cmake/windows/wingetssl.cmake +++ b/cmake/windows/wingetssl.cmake @@ -40,19 +40,27 @@ if(WIN32 AND (NOT OpenSSL_FOUND)) message(STATUS "Looking for OpenSSL built with CRT variant: ${_crt_kind}") # Try to find the root and corresponding lib path + if(OPENSSL_USE_STATIC_LIBS) + set(_crypto_lib_name "libcrypto_static.lib") + set(_ssl_lib_name "libssl_static.lib") + else() + set(_crypto_lib_name "libcrypto.lib") + set(_ssl_lib_name "libssl.lib") + endif() + foreach(_root ${_openssl_roots}) if(EXISTS "${_root}/include/openssl/ssl.h") foreach(_suffix ${_openssl_lib_suffixes}) if(_suffix MATCHES "${_crt_kind}$" - AND EXISTS "${_root}/${_suffix}/libcrypto.lib") + AND EXISTS "${_root}/${_suffix}/${_crypto_lib_name}") set(OPENSSL_ROOT_DIR "${_root}" CACHE PATH "Path to OpenSSL root") set(OPENSSL_CRYPTO_LIBRARY - "${_root}/${_suffix}/libcrypto.lib" + "${_root}/${_suffix}/${_crypto_lib_name}" CACHE FILEPATH "OpenSSL crypto lib") set(OPENSSL_SSL_LIBRARY - "${_root}/${_suffix}/libssl.lib" + "${_root}/${_suffix}/${_ssl_lib_name}" CACHE FILEPATH "OpenSSL ssl lib") set(OPENSSL_INCLUDE_DIR "${_root}/include" diff --git a/plugins/http/CMakeLists.txt b/plugins/http/CMakeLists.txt index 4deb16ba1..f4af791e7 100644 --- a/plugins/http/CMakeLists.txt +++ b/plugins/http/CMakeLists.txt @@ -15,7 +15,7 @@ if(NOT TARGET httplib) EXCLUDE_FROM_ALL) endif() -if(OS_MACOS) +if(OS_MACOS OR OS_WINDOWS) set(OPENSSL_USE_STATIC_LIBS ON CACHE BOOL "Use static OpenSSL" FORCE) @@ -25,6 +25,14 @@ if(NOT OPENSSL_FOUND) message(WARNING "OpenSSL not found!\n" "HTTP support will be disabled!\n\n") return() endif() +if(OS_WINDOWS AND NOT OPENSSL_CRYPTO_LIBRARY MATCHES "_static\\.lib$") + message( + WARNING + "Static OpenSSL libraries (libcrypto_static.lib / libssl_static.lib) not found!\n" + "HTTP support will be disabled to avoid DLL name collisions with other plugins.\n\n" + ) + return() +endif() find_package(ZLIB) if(NOT ZLIB_FOUND) @@ -65,29 +73,7 @@ set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "") target_include_directories(${PROJECT_NAME} PRIVATE "${CPP_HTTPLIB_DIR}/" "${OPENSSL_INCLUDE_DIR}") target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENSSL_LIBRARIES} ZLIB::ZLIB) -install_advss_plugin(${PROJECT_NAME}) if(OS_WINDOWS) - # Couldn't really find a better way to install runtime dependencies for - # Windows TODO: Clean this up at some point - function(FIND_FILES_WITH_PATTERN result pattern dir) - execute_process( - COMMAND - powershell -Command - "Get-ChildItem -Path '${dir}' -Recurse -Include ${pattern} |" - "Select-Object -First 1 |" - "ForEach-Object { $_.FullName -replace '\\\\', '\\\\' }" - OUTPUT_VARIABLE files - OUTPUT_STRIP_TRAILING_WHITESPACE) - set(${result} - ${files} - PARENT_SCOPE) - endfunction() - - set(OPENSSL_DLL_SEARCH_DIR "${OPENSSL_INCLUDE_DIR}/..") - find_files_with_pattern(CRYPTO_DLL_FILES "libcrypto*.dll" - "${OPENSSL_DLL_SEARCH_DIR}") - find_files_with_pattern(SSL_DLL_FILES "libssl*.dll" - "${OPENSSL_DLL_SEARCH_DIR}") - install_advss_plugin_dependency(TARGET ${PROJECT_NAME} DEPENDENCIES - "${CRYPTO_DLL_FILES}" "${SSL_DLL_FILES}") + target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32 crypt32 bcrypt) endif() +install_advss_plugin(${PROJECT_NAME}) diff --git a/plugins/mqtt/CMakeLists.txt b/plugins/mqtt/CMakeLists.txt index 0397315e5..b1c4519d7 100644 --- a/plugins/mqtt/CMakeLists.txt +++ b/plugins/mqtt/CMakeLists.txt @@ -3,12 +3,21 @@ project(advanced-scene-switcher-mqtt) # --- Check paho.mqtt.cpp requirements --- -if(OS_MACOS) +if(OS_MACOS OR OS_WINDOWS) set(OPENSSL_USE_STATIC_LIBS ON CACHE BOOL "Use static OpenSSL" FORCE) endif() find_package(OpenSSL) +if(OS_WINDOWS + AND OPENSSL_FOUND + AND NOT OPENSSL_CRYPTO_LIBRARY MATCHES "_static\\.lib$") + message( + WARNING + "Static OpenSSL libraries (libcrypto_static.lib / libssl_static.lib) not found!\n" + "MQTT may fail at runtime due to OpenSSL DLL name collisions with other plugins.\n\n" + ) +endif() find_package(PahoMqttCpp) if(NOT PahoMqttCpp_FOUND) @@ -51,4 +60,7 @@ else() target_link_libraries(${PROJECT_NAME} PRIVATE PahoMqttCpp::paho-mqttpp3-static) endif() +if(OS_WINDOWS) + target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32 crypt32 bcrypt) +endif() install_advss_plugin(${PROJECT_NAME}) diff --git a/plugins/twitch/CMakeLists.txt b/plugins/twitch/CMakeLists.txt index ffa92069f..36a26c0ea 100644 --- a/plugins/twitch/CMakeLists.txt +++ b/plugins/twitch/CMakeLists.txt @@ -15,7 +15,7 @@ if(NOT TARGET httplib) EXCLUDE_FROM_ALL) endif() -if(OS_MACOS) +if(OS_MACOS OR OS_WINDOWS) set(OPENSSL_USE_STATIC_LIBS ON CACHE BOOL "Use static OpenSSL" FORCE) @@ -25,6 +25,14 @@ if(NOT OPENSSL_FOUND) message(WARNING "OpenSSL not found!\n" "Twitch support will be disabled!\n\n") return() endif() +if(OS_WINDOWS AND NOT OPENSSL_CRYPTO_LIBRARY MATCHES "_static\\.lib$") + message( + WARNING + "Static OpenSSL libraries (libcrypto_static.lib / libssl_static.lib) not found!\n" + "Twitch support will be disabled to avoid DLL name collisions with other plugins.\n\n" + ) + return() +endif() find_package(ZLIB) if(NOT ZLIB_FOUND) @@ -90,30 +98,7 @@ set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "") target_include_directories(${PROJECT_NAME} PRIVATE "${CPP_HTTPLIB_DIR}/" "${OPENSSL_INCLUDE_DIR}") target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENSSL_LIBRARIES} ZLIB::ZLIB) - -install_advss_plugin(${PROJECT_NAME}) if(OS_WINDOWS) - # Couldn't really find a better way to install runtime dependencies for - # Windows TODO: Clean this up at some point - function(FIND_FILES_WITH_PATTERN result pattern dir) - execute_process( - COMMAND - powershell -Command - "Get-ChildItem -Path '${dir}' -Recurse -Include ${pattern} |" - "Select-Object -First 1 |" - "ForEach-Object { $_.FullName -replace '\\\\', '\\\\' }" - OUTPUT_VARIABLE files - OUTPUT_STRIP_TRAILING_WHITESPACE) - set(${result} - ${files} - PARENT_SCOPE) - endfunction() - - set(OPENSSL_DLL_SEARCH_DIR "${OPENSSL_INCLUDE_DIR}/..") - find_files_with_pattern(CRYPTO_DLL_FILES "libcrypto*.dll" - "${OPENSSL_DLL_SEARCH_DIR}") - find_files_with_pattern(SSL_DLL_FILES "libssl*.dll" - "${OPENSSL_DLL_SEARCH_DIR}") - install_advss_plugin_dependency(TARGET ${PROJECT_NAME} DEPENDENCIES - "${CRYPTO_DLL_FILES}" "${SSL_DLL_FILES}") + target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32 crypt32 bcrypt) endif() +install_advss_plugin(${PROJECT_NAME})