diff --git a/cmake/modules/FindWine.cmake b/cmake/modules/FindWine.cmake index aabb5ef78..19a0cffbb 100644 --- a/cmake/modules/FindWine.cmake +++ b/cmake/modules/FindWine.cmake @@ -2,8 +2,15 @@ # Once done this will define # # WINE_FOUND - System has wine -# WINE_INCLUDE_DIRS - The wine include directories -# WINE_DEFINITIONS - Compiler switches required for using wine +# +# WINE_INCLUDE_DIR - Wine include directory +# WINE_BUILD - Path to winebuild +# WINE_CXX - Path to wineg++ +# WINE_GCC - Path to winegcc +# WINE_32_LIBRARY_DIRS - Path(s) to 32-bit wine libs +# WINE_32_FLAGS - 32-bit linker flags +# WINE_64_LIBRARY_DIRS - Path(s) to 64-bit wine libs +# WINE_64_FLAGS - 64-bit linker flags # MACRO(_findwine_find_flags output expression result) @@ -23,17 +30,49 @@ MACRO(_regex_replace_foreach EXPRESSION REPLACEMENT RESULT INPUT) ENDFOREACH() ENDMACRO() -LIST(APPEND CMAKE_PREFIX_PATH /opt/wine-stable /opt/wine-devel /opt/wine-staging /usr/lib/wine/) +# Prefer newest wine first +list(APPEND WINE_LOCATIONS + /opt/wine-staging + /opt/wine-devel + /opt/wine-stable + /usr/lib/wine) -FIND_PROGRAM(WINE_CXX - NAMES wineg++ winegcc winegcc64 winegcc32 winegcc-stable - PATHS /usr/lib/wine +# Prepare bin search +foreach(_loc ${WINE_LOCATIONS}) + if(_loc STREQUAL /usr/lib/wine) + # /usr/lib/wine doesn't have a "bin" + list(APPEND WINE_CXX_LOCATIONS "${_loc}") + else() + # expect "bin" + list(APPEND WINE_CXX_LOCATIONS "${_loc}/bin") + endif() +endforeach() +# Fallback +list(APPEND WINE_CXX_LOCATIONS "/usr/bin") + +# Prefer most-common to least common +FIND_PROGRAM(WINE_CXX NAMES + wineg++ + wineg++-stable + PATHS + ${WINE_CXX_LOCATIONS} + NO_DEFAULT_PATH ) -FIND_PROGRAM(WINE_BUILD NAMES winebuild) + +FIND_PROGRAM(WINE_GCC NAMES + winegcc + winegcc-stable + PATHS + ${WINE_CXX_LOCATIONS} + NO_DEFAULT_PATH +) + +FIND_PROGRAM(WINE_BUILD NAMES winebuild PATHS ${WINE_CXX_LOCATIONS} NO_DEFAULT_PATH) # Detect wine paths and handle linking problems IF(WINE_CXX) - execute_process(COMMAND ${WINE_CXX} -m32 -v /dev/zero OUTPUT_VARIABLE WINEBUILD_OUTPUT_32) - execute_process(COMMAND ${WINE_CXX} -m64 -v /dev/zero OUTPUT_VARIABLE WINEBUILD_OUTPUT_64) + # call wineg++ to obtain implied includes and libs + execute_process(COMMAND ${WINE_CXX} -m32 -v /dev/zero OUTPUT_VARIABLE WINEBUILD_OUTPUT_32 ERROR_QUIET) + execute_process(COMMAND ${WINE_CXX} -m64 -v /dev/zero OUTPUT_VARIABLE WINEBUILD_OUTPUT_64 ERROR_QUIET) _findwine_find_flags("${WINEBUILD_OUTPUT_32}" "^-isystem/usr/include$" BUGGED_WINEGCC) _findwine_find_flags("${WINEBUILD_OUTPUT_32}" "^-isystem" WINEGCC_INCLUDE_DIR) _findwine_find_flags("${WINEBUILD_OUTPUT_32}" "libwinecrt0\\.a.*" WINECRT_32) @@ -42,6 +81,9 @@ IF(WINE_CXX) _regex_replace_foreach("/wine/windows$" "" WINE_INCLUDE_HINT "${WINE_INCLUDE_HINT}") STRING(REGEX REPLACE "wine/libwinecrt0\\.a.*" "" WINE_32_LIBRARY_DIR "${WINECRT_32}") STRING(REGEX REPLACE "wine/libwinecrt0\\.a.*" "" WINE_64_LIBRARY_DIR "${WINECRT_64}") + # Handle winehq + STRING(REGEX REPLACE "/libwinecrt0\\.a.*" "/" WINE_32_LIBRARY_DIR "${WINE_32_LIBRARY_DIR}") + STRING(REGEX REPLACE "/libwinecrt0\\.a.*" "/" WINE_64_LIBRARY_DIR "${WINE_64_LIBRARY_DIR}") IF(BUGGED_WINEGCC) MESSAGE(WARNING "Your winegcc is unusable due to https://bugs.winehq.org/show_bug.cgi?id=46293,\n @@ -98,7 +140,11 @@ find_package_handle_standard_args(Wine DEFAULT_MSG WINE_CXX WINE_INCLUDE_DIRS) mark_as_advanced(WINE_INCLUDE_DIR WINE_LIBRARY WINE_CXX WINE_BUILD) IF(WINE_32_LIBRARY_DIR) - IF(WINE_32_LIBRARY_DIR MATCHES "wine*/lib") + IF(WINE_32_LIBRARY_DIR MATCHES "^/opt/wine-.*") + # winehq uses a singular lib directory + SET(WINE_32_FLAGS "-L${WINE_32_LIBRARY_DIR}") + SET(WINE_32_LIBRARY_DIRS "${WINE_32_LIBRARY_DIR}") + ELSEIF(WINE_32_LIBRARY_DIR MATCHES "wine*/lib") SET(WINE_32_FLAGS "-L${WINE_32_LIBRARY_DIR} -L${WINE_32_LIBRARY_DIR}../") SET(WINE_32_LIBRARY_DIRS "${WINE_32_LIBRARY_DIR}:${WINE_32_LIBRARY_DIR}/..") ELSE() @@ -108,7 +154,11 @@ IF(WINE_32_LIBRARY_DIR) ENDIF() IF(WINE_64_LIBRARY_DIR) - IF(WINE_64_LIBRARY_DIR MATCHES "wine*/lib") + IF(WINE_32_LIBRARY_DIR MATCHES "^/opt/wine-.*") + # winehq uses a singular lib directory + SET(WINE_64_FLAGS "-L${WINE_64_LIBRARY_DIR}") + SET(WINE_64_LIBRARY_DIRS "${WINE_64_LIBRARY_DIR}") + ELSEIF(WINE_64_LIBRARY_DIR MATCHES "wine*/lib") SET(WINE_64_FLAGS "-L${WINE_64_LIBRARY_DIR} -L${WINE_64_LIBRARY_DIR}../") SET(WINE_64_LIBRARY_DIRS "${WINE_64_LIBRARY_DIR}:${WINE_64_LIBRARY_DIR}/..") ELSE() @@ -117,6 +167,12 @@ IF(WINE_64_LIBRARY_DIR) ENDIF() ENDIF() -# Create winegcc wrapper +message(STATUS " WINE_INCLUDE_DIR: ${WINE_INCLUDE_DIR}") +message(STATUS " WINE_CXX: ${WINE_CXX}") +message(STATUS " WINE_GCC: ${WINE_GCC}") +message(STATUS " WINE_32_FLAGS: ${WINE_32_FLAGS}") +message(STATUS " WINE_64_FLAGS: ${WINE_64_FLAGS}") + +# Create winegcc (technically, wineg++) wrapper configure_file(${CMAKE_CURRENT_LIST_DIR}/winegcc_wrapper.in winegcc_wrapper @ONLY) SET(WINEGCC "${CMAKE_CURRENT_BINARY_DIR}/winegcc_wrapper")