Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FindWine improvements #7268

Merged
merged 9 commits into from
May 23, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 68 additions & 12 deletions cmake/modules/FindWine.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)

# 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_CXX
NAMES wineg++ winegcc winegcc64 winegcc32 winegcc-stable
PATHS /usr/lib/wine
FIND_PROGRAM(WINE_GCC NAMES
winegcc
winegcc-stable
PATHS
${WINE_CXX_LOCATIONS}
NO_DEFAULT_PATH
)
FIND_PROGRAM(WINE_BUILD NAMES winebuild)

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)
Expand All @@ -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
Expand Down Expand Up @@ -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()
Expand All @@ -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()
Expand All @@ -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")
Loading