mirror of
https://github.com/LMMS/lmms.git
synced 2026-05-11 08:14:25 -04:00
186 lines
7.1 KiB
CMake
186 lines
7.1 KiB
CMake
# - Try to find the wine libraries
|
|
# Once done this will define
|
|
#
|
|
# WINE_FOUND - System has 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)
|
|
STRING(REPLACE " " ";" WINEBUILD_FLAGS "${output}")
|
|
FOREACH(FLAG ${WINEBUILD_FLAGS})
|
|
IF("${FLAG}" MATCHES "${expression}")
|
|
LIST(APPEND ${result} "${FLAG}")
|
|
ENDIF()
|
|
ENDFOREACH()
|
|
ENDMACRO()
|
|
|
|
MACRO(_regex_replace_foreach EXPRESSION REPLACEMENT RESULT INPUT)
|
|
SET(${RESULT} "")
|
|
FOREACH(ITEM ${INPUT})
|
|
STRING(REGEX REPLACE "${EXPRESSION}" "${REPLACEMENT}" ITEM "${ITEM}")
|
|
LIST(APPEND ${RESULT} "${ITEM}")
|
|
ENDFOREACH()
|
|
ENDMACRO()
|
|
|
|
# Prefer newest wine first
|
|
list(APPEND WINE_LOCATIONS
|
|
/opt/wine-staging
|
|
/opt/wine-devel
|
|
/opt/wine-stable
|
|
# Gentoo Systems
|
|
/etc/eselect/wine
|
|
/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_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)
|
|
# call wineg++ to obtain implied includes and libs
|
|
if(LMMS_HOST_X86_64 OR LMMS_HOST_X86)
|
|
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)
|
|
else()
|
|
execute_process(COMMAND ${WINE_CXX} -v /dev/zero OUTPUT_VARIABLE WINEBUILD_OUTPUT_64 ERROR_QUIET)
|
|
endif()
|
|
|
|
_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)
|
|
_findwine_find_flags("${WINEBUILD_OUTPUT_64}" "libwinecrt0\\.a.*" WINECRT_64)
|
|
_regex_replace_foreach("^-isystem" "" WINE_INCLUDE_HINT "${WINEGCC_INCLUDE_DIR}")
|
|
_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
|
|
Consider either upgrading or downgrading wine.")
|
|
RETURN()
|
|
ENDIF()
|
|
IF(WINE_32_LIBRARY_DIR STREQUAL WINE_64_LIBRARY_DIR)
|
|
MESSAGE(STATUS "Old winegcc detected, trying to use workaround linking")
|
|
# Fix library search directory according to the target bitness
|
|
IF(WINE_32_LIBRARY_DIR MATCHES "/lib/(x86_64|i386)-")
|
|
# Debian systems
|
|
STRING(REPLACE "/lib/x86_64-" "/lib/i386-" WINE_32_LIBRARY_DIR "${WINE_32_LIBRARY_DIR}")
|
|
STRING(REPLACE "/lib/i386-" "/lib/x86_64-" WINE_64_LIBRARY_DIR "${WINE_64_LIBRARY_DIR}")
|
|
ELSEIF(WINE_32_LIBRARY_DIR MATCHES "/(lib|lib64)/wine/$")
|
|
# WineHQ (/opt/wine-stable, /opt/wine-devel, /opt/wine-staging)
|
|
STRING(REGEX REPLACE "/lib64/wine/$" "/lib/wine/" WINE_32_LIBRARY_DIR "${WINE_32_LIBRARY_DIR}")
|
|
STRING(REGEX REPLACE "/lib/wine/$" "/lib64/wine/" WINE_64_LIBRARY_DIR "${WINE_64_LIBRARY_DIR}")
|
|
ELSEIF(WINE_32_LIBRARY_DIR MATCHES "/lib32/")
|
|
# Systems with old multilib layout
|
|
STRING(REPLACE "/lib32/" "/lib/" WINE_64_LIBRARY_DIR "${WINE_32_LIBRARY_DIR}")
|
|
ELSEIF(WINE_32_LIBRARY_DIR MATCHES "/lib64/")
|
|
# We need to test if the corresponding 64bit library directory is lib or lib32
|
|
STRING(REPLACE "/lib64/" "/lib32/" WINE_32_LIBRARY_DIR "${WINE_64_LIBRARY_DIR}")
|
|
IF(NOT EXISTS "${WINE_32_LIBRARY_DIR}")
|
|
STRING(REPLACE "/lib64/" "/lib/" WINE_32_LIBRARY_DIR "${WINE_64_LIBRARY_DIR}")
|
|
ENDIF()
|
|
ELSEIF(WINE_32_LIBRARY_DIR MATCHES "/lib/")
|
|
# Test if this directory is for 32bit or 64bit
|
|
STRING(REPLACE "/lib/" "/lib32/" WINE_32_LIBRARY_DIR "${WINE_64_LIBRARY_DIR}")
|
|
IF(NOT EXISTS "${WINE_32_LIBRARY_DIR}")
|
|
SET(WINE_32_LIBRARY_DIR "${WINE_64_LIBRARY_DIR}")
|
|
STRING(REPLACE "/lib/" "/lib64/" WINE_64_LIBRARY_DIR "${WINE_64_LIBRARY_DIR}")
|
|
ENDIF()
|
|
ELSE()
|
|
MESSAGE(WARNING "Can't detect wine installation layout. You may get some build errors.")
|
|
ENDIF()
|
|
SET(WINE_LIBRARY_FIX "${WINE_32_LIBRARY_DIR} and ${WINE_64_LIBRARY_DIR}")
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
FIND_PATH(WINE_INCLUDE_DIR wine/exception.h
|
|
HINTS ${WINE_INCLUDE_HINT}
|
|
)
|
|
|
|
SET(_ARCHITECTURE ${CMAKE_LIBRARY_ARCHITECTURE})
|
|
|
|
SET(CMAKE_LIBRARY_ARCHITECTURE ${_ARCHITECTURE})
|
|
|
|
SET(WINE_INCLUDE_DIRS ${WINE_INCLUDE_DIR} )
|
|
|
|
include(FindPackageHandleStandardArgs)
|
|
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 "^/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()
|
|
SET(WINE_32_FLAGS "-L${WINE_32_LIBRARY_DIR} -L${WINE_32_LIBRARY_DIR}wine/")
|
|
SET(WINE_32_LIBRARY_DIRS "${WINE_32_LIBRARY_DIR}:${WINE_32_LIBRARY_DIR}wine/")
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
IF(WINE_64_LIBRARY_DIR)
|
|
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()
|
|
SET(WINE_64_FLAGS "-L${WINE_64_LIBRARY_DIR} -L${WINE_64_LIBRARY_DIR}wine/")
|
|
SET(WINE_64_LIBRARY_DIRS "${WINE_64_LIBRARY_DIR}:${WINE_64_LIBRARY_DIR}wine/")
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
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")
|