Build: Automagically handle unicorn

On MSVC if unicorn isn't found, fallback to bundled unicorn
On everything else, fallback to building unicorn in externals

Also fixes loading unicorn in msvc
pull/8/head
James Rowe 8 years ago
parent b5b0d4e7c3
commit 2d7a85f7af

@ -12,8 +12,6 @@ option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" OFF)
option(ENABLE_QT "Enable the Qt frontend" ON) option(ENABLE_QT "Enable the Qt frontend" ON)
option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" OFF) option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" OFF)
option(YUZU_USE_BUNDLED_UNICORN "Download bundled Unicorn binaries" OFF)
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/.git/hooks/pre-commit) if(NOT EXISTS ${CMAKE_SOURCE_DIR}/.git/hooks/pre-commit)
message(STATUS "Copying pre-commit hook") message(STATUS "Copying pre-commit hook")
file(COPY hooks/pre-commit file(COPY hooks/pre-commit
@ -29,7 +27,7 @@ function(check_submodules_present)
foreach(module ${gitmodules}) foreach(module ${gitmodules})
string(REGEX REPLACE "path *= *" "" module ${module}) string(REGEX REPLACE "path *= *" "" module ${module})
if (NOT EXISTS "${CMAKE_SOURCE_DIR}/${module}/.git") if (NOT EXISTS "${CMAKE_SOURCE_DIR}/${module}/.git")
message(SEND_ERROR "Git submodule ${module} not found." message(FATAL_ERROR "Git submodule ${module} not found. "
"Please run: git submodule update --init --recursive") "Please run: git submodule update --init --recursive")
endif() endif()
endforeach() endforeach()
@ -204,59 +202,63 @@ else()
set(SDL2_FOUND NO) set(SDL2_FOUND NO)
endif() endif()
if (YUZU_USE_BUNDLED_UNICORN) # If unicorn isn't found, msvc -> download bundled unicorn; everyone else -> build external
# Detect toolchain and platform find_package(Unicorn QUIET)
if (MSVC14 AND ARCHITECTURE_x86_64) if (NOT UNICORN_FOUND)
set(UNICORN_VER "unicorn-yuzu") if (MSVC)
else() message(STATUS "unicorn not found, falling back to bundled")
message(FATAL_ERROR "No bundled Unicorn binaries for your toolchain. Disable YUZU_USE_BUNDLED_UNICORN and provide your own.") # Detect toolchain and platform
endif() if (MSVC14 AND ARCHITECTURE_x86_64)
set(UNICORN_VER "unicorn-yuzu")
else()
message(FATAL_ERROR "No bundled Unicorn binaries for your toolchain. Disable YUZU_USE_BUNDLED_UNICORN and provide your own.")
endif()
if (DEFINED UNICORN_VER) if (DEFINED UNICORN_VER)
download_bundled_external("unicorn/" ${UNICORN_VER} UNICORN_PREFIX) download_bundled_external("unicorn/" ${UNICORN_VER} UNICORN_PREFIX)
endif() endif()
if (DEFINED UNICORN_VER) if (DEFINED UNICORN_VER)
download_bundled_external("unicorn/" ${UNICORN_VER} UNICORN_PREFIX) download_bundled_external("unicorn/" ${UNICORN_VER} UNICORN_PREFIX)
endif() endif()
set(UNICORN_FOUND YES) set(UNICORN_FOUND YES)
set(LIBUNICORN_INCLUDE_DIR "${UNICORN_PREFIX}/include" CACHE PATH "Path to Unicorn headers") set(LIBUNICORN_INCLUDE_DIR "${UNICORN_PREFIX}/include" CACHE PATH "Path to Unicorn headers" FORCE)
set(LIBUNICORN_LIBRARY "${UNICORN_PREFIX}/lib/x64/unicorn_dynload.lib" CACHE PATH "Path to Unicorn library") set(LIBUNICORN_LIBRARY "${UNICORN_PREFIX}/lib/x64/unicorn_dynload.lib" CACHE PATH "Path to Unicorn library" FORCE)
set(UNICORN_DLL_DIR "${UNICORN_PREFIX}/lib/x64/" CACHE PATH "Path to unicorn.dll") set(UNICORN_DLL_DIR "${UNICORN_PREFIX}/lib/x64/" CACHE PATH "Path to unicorn.dll" FORCE)
elseif (YUZU_BUILD_UNICORN)
if (MSVC)
message(FATAL_ERROR "Cannot build unicorn on msvc. Use YUZU_USE_BUNDLED_UNICORN instead")
elseif (MINGW)
set(UNICORN_LIB_NAME "unicorn.a")
else() else()
set(UNICORN_LIB_NAME "libunicorn.a") message(STATUS "unicorn not found, falling back to externals")
endif() if (MINGW)
set(UNICORN_LIB_NAME "unicorn.a")
else()
set(UNICORN_LIB_NAME "libunicorn.a")
endif()
set(UNICORN_FOUND YES) set(UNICORN_FOUND YES)
set(UNICORN_PREFIX ${CMAKE_SOURCE_DIR}/externals/unicorn) set(UNICORN_PREFIX ${CMAKE_SOURCE_DIR}/externals/unicorn)
set(LIBUNICORN_LIBRARY "${UNICORN_PREFIX}/${UNICORN_LIB_NAME}" CACHE PATH "Path to Unicorn library") set(LIBUNICORN_LIBRARY "${UNICORN_PREFIX}/${UNICORN_LIB_NAME}" CACHE PATH "Path to Unicorn library" FORCE)
set(LIBUNICORN_INCLUDE_DIR "${UNICORN_PREFIX}/include" CACHE PATH "Path to Unicorn headers") set(LIBUNICORN_INCLUDE_DIR "${UNICORN_PREFIX}/include" CACHE PATH "Path to Unicorn headers" FORCE)
set(UNICORN_DLL_DIR "${UNICORN_PREFIX}/" CACHE PATH "Path to unicorn dynamic library") set(UNICORN_DLL_DIR "${UNICORN_PREFIX}/" CACHE PATH "Path to unicorn dynamic library" FORCE)
add_custom_command(OUTPUT ${LIBUNICORN_LIBRARY} add_custom_command(OUTPUT ${LIBUNICORN_LIBRARY}
COMMAND ${CMAKE_COMMAND} -E env UNICORN_ARCHS="aarch64" /bin/sh make.sh COMMAND ${CMAKE_COMMAND} -E env UNICORN_ARCHS="aarch64" /bin/sh make.sh
WORKING_DIRECTORY ${UNICORN_PREFIX} WORKING_DIRECTORY ${UNICORN_PREFIX}
) )
# ALL makes this custom target build every time # ALL makes this custom target build every time
# but it won't actually build if LIBUNICORN_LIBRARY exists # but it won't actually build if LIBUNICORN_LIBRARY is up to date
add_custom_target(unicorn-build ALL add_custom_target(unicorn-build ALL
DEPENDS ${LIBUNICORN_LIBRARY} DEPENDS ${LIBUNICORN_LIBRARY}
) )
unset(UNICORN_LIB_NAME) unset(UNICORN_LIB_NAME)
else() endif()
find_package(Unicorn REQUIRED)
endif() endif()
if (UNICORN_FOUND) if (UNICORN_FOUND)
add_library(unicorn INTERFACE) add_library(unicorn INTERFACE)
target_link_libraries(unicorn INTERFACE "${LIBUNICORN_LIBRARY}") target_link_libraries(unicorn INTERFACE "${LIBUNICORN_LIBRARY}")
target_include_directories(unicorn INTERFACE "${LIBUNICORN_INCLUDE_DIR}") target_include_directories(unicorn INTERFACE "${LIBUNICORN_INCLUDE_DIR}")
else()
message(FATAL_ERROR "Could not find or build unicorn which is required.")
endif() endif()
if (ENABLE_QT) if (ENABLE_QT)

@ -11,7 +11,7 @@
#include "core/hle/kernel/svc.h" #include "core/hle/kernel/svc.h"
// Load Unicorn DLL once on Windows using RAII // Load Unicorn DLL once on Windows using RAII
#ifdef MSVC #ifdef _MSC_VER
#include <unicorn_dynload.h> #include <unicorn_dynload.h>
struct LoadDll { struct LoadDll {
private: private:

Loading…
Cancel
Save