1
0
Fork 0
forked from suyu/suyu

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
This commit is contained in:
James Rowe 2018-01-16 09:39:07 -07:00
parent b5b0d4e7c3
commit 2d7a85f7af
2 changed files with 50 additions and 48 deletions

View file

@ -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,7 +202,11 @@ 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
find_package(Unicorn QUIET)
if (NOT UNICORN_FOUND)
if (MSVC)
message(STATUS "unicorn not found, falling back to bundled")
# Detect toolchain and platform # Detect toolchain and platform
if (MSVC14 AND ARCHITECTURE_x86_64) if (MSVC14 AND ARCHITECTURE_x86_64)
set(UNICORN_VER "unicorn-yuzu") set(UNICORN_VER "unicorn-yuzu")
@ -221,13 +223,12 @@ if (YUZU_USE_BUNDLED_UNICORN)
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) else()
if (MSVC) message(STATUS "unicorn not found, falling back to externals")
message(FATAL_ERROR "Cannot build unicorn on msvc. Use YUZU_USE_BUNDLED_UNICORN instead") if (MINGW)
elseif (MINGW)
set(UNICORN_LIB_NAME "unicorn.a") set(UNICORN_LIB_NAME "unicorn.a")
else() else()
set(UNICORN_LIB_NAME "libunicorn.a") set(UNICORN_LIB_NAME "libunicorn.a")
@ -235,28 +236,29 @@ elseif (YUZU_BUILD_UNICORN)
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)

View file

@ -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: