From e026b66bbbb78f3c43c067eb94675d4782fb70b6 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 15 Jan 2018 20:53:53 -0700 Subject: [PATCH 1/3] Build: Add unicorn as a submodule and build it if needed Adds a cmake custom target that will build unicorn on first compile and uses this in the build scripts as well. Updates Appveyor and Travis build scripts to work with the new unicorn build, and updates the paths to all of the different artifacts. --- .gitmodules | 3 +++ .travis/linux/docker.sh | 10 ++-------- .travis/macos/build.sh | 2 +- .travis/macos/deps.sh | 6 ------ CMakeLists.txt | 25 +++++++++++++++++++++++++ appveyor.yml | 20 +++++++++----------- externals/unicorn | 1 + src/core/arm/unicorn/arm_unicorn.cpp | 2 +- 8 files changed, 42 insertions(+), 27 deletions(-) create mode 160000 externals/unicorn diff --git a/.gitmodules b/.gitmodules index 07479dd78..d5a7ade4f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,6 @@ [submodule "lz4"] path = externals/lz4 url = http://github.com/lz4/lz4.git +[submodule "unicorn"] + path = externals/unicorn + url = https://github.com/yuzu-emu/unicorn diff --git a/.travis/linux/docker.sh b/.travis/linux/docker.sh index a85225c5a..8a23b54b1 100755 --- a/.travis/linux/docker.sh +++ b/.travis/linux/docker.sh @@ -1,22 +1,16 @@ #!/bin/bash -ex apt-get update -apt-get install -y build-essential git libcurl4-openssl-dev libqt5opengl5-dev libsdl2-dev libssl-dev python qtbase5-dev wget +apt-get install -y build-essential git libqt5opengl5-dev libsdl2-dev libssl-dev python qtbase5-dev wget # Get a recent version of CMake wget https://cmake.org/files/v3.10/cmake-3.10.1-Linux-x86_64.sh sh cmake-3.10.1-Linux-x86_64.sh --exclude-subdir --prefix=/ --skip-license -mkdir /unicorn -cd /unicorn -git clone https://github.com/yuzu-emu/unicorn . -UNICORN_ARCHS=aarch64 ./make.sh -./make.sh install - cd /yuzu mkdir build && cd build -cmake .. -DUSE_SYSTEM_CURL=ON -DCMAKE_BUILD_TYPE=Release +cmake .. -DYUZU_BUILD_UNICORN=ON -DCMAKE_BUILD_TYPE=Release make -j4 ctest -VV -C Release diff --git a/.travis/macos/build.sh b/.travis/macos/build.sh index e1c54af55..177e8ac3b 100755 --- a/.travis/macos/build.sh +++ b/.travis/macos/build.sh @@ -8,7 +8,7 @@ export UNICORNDIR=$(pwd)/externals/unicorn mkdir build && cd build cmake --version -cmake .. -DUSE_SYSTEM_CURL=ON -DCMAKE_OSX_ARCHITECTURES="x86_64;x86_64h" -DCMAKE_BUILD_TYPE=Release +cmake .. -DYUZU_BUILD_UNICORN=ON -DCMAKE_OSX_ARCHITECTURES="x86_64;x86_64h" -DCMAKE_BUILD_TYPE=Release make -j4 ctest -VV -C Release diff --git a/.travis/macos/deps.sh b/.travis/macos/deps.sh index 7dea80438..b46482bbe 100755 --- a/.travis/macos/deps.sh +++ b/.travis/macos/deps.sh @@ -2,9 +2,3 @@ brew update brew install dylibbundler p7zip qt5 sdl2 - -mkdir externals/unicorn -pushd externals/unicorn -git clone https://github.com/yuzu-emu/unicorn . -UNICORN_ARCHS=aarch64 ./make.sh macos-universal-no -popd diff --git a/CMakeLists.txt b/CMakeLists.txt index 3da8465b9..f1a4d0152 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -224,6 +224,31 @@ if (YUZU_USE_BUNDLED_UNICORN) set(LIBUNICORN_INCLUDE_DIR "${UNICORN_PREFIX}/include" CACHE PATH "Path to Unicorn headers") set(LIBUNICORN_LIBRARY "${UNICORN_PREFIX}/lib/x64/unicorn_dynload.lib" CACHE PATH "Path to Unicorn library") set(UNICORN_DLL_DIR "${UNICORN_PREFIX}/lib/x64/" CACHE PATH "Path to unicorn.dll") +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() + set(UNICORN_LIB_NAME "libunicorn.a") + endif() + + set(UNICORN_FOUND YES) + set(UNICORN_PREFIX ${CMAKE_SOURCE_DIR}/externals/unicorn) + set(LIBUNICORN_LIBRARY "${UNICORN_PREFIX}/${UNICORN_LIB_NAME}" CACHE PATH "Path to Unicorn library") + set(LIBUNICORN_INCLUDE_DIR "${UNICORN_PREFIX}/include" CACHE PATH "Path to Unicorn headers") + set(UNICORN_DLL_DIR "${UNICORN_PREFIX}/" CACHE PATH "Path to unicorn dynamic library") + + add_custom_command(OUTPUT ${LIBUNICORN_LIBRARY} + COMMAND ${CMAKE_COMMAND} -E env UNICORN_ARCHS="aarch64" /bin/sh make.sh + WORKING_DIRECTORY ${UNICORN_PREFIX} + ) + # ALL makes this custom target build every time + # but it won't actually build if LIBUNICORN_LIBRARY exists + add_custom_target(unicorn-build ALL + DEPENDS ${LIBUNICORN_LIBRARY} + ) + unset(UNICORN_LIB_NAME) else() find_package(Unicorn REQUIRED) endif() diff --git a/appveyor.yml b/appveyor.yml index f491e5f0b..9d2aa156b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,7 +28,6 @@ install: if ($env:BUILD_TYPE -eq 'mingw') { $dependencies = "mingw64/mingw-w64-x86_64-cmake", "mingw64/mingw-w64-x86_64-qt5", - "mingw64/mingw-w64-x86_64-curl", "mingw64/mingw-w64-x86_64-SDL2" # redirect err to null to prevent warnings from becoming errors # workaround to prevent pacman from failing due to cyclical dependencies @@ -42,9 +41,9 @@ before_build: - ps: | if ($env:BUILD_TYPE -eq 'msvc') { # redirect stderr and change the exit code to prevent powershell from cancelling the build if cmake prints a warning - cmd /C 'cmake -G "Visual Studio 15 2017 Win64" -DYUZU_USE_BUNDLED_QT=1 -DYUZU_USE_BUNDLED_SDL2=1 -DYUZU_USE_BUNDLED_UNICORN=1 -DCMAKE_USE_OPENSSL=0 .. 2>&1 && exit 0' + cmd /C 'cmake -G "Visual Studio 15 2017 Win64" -DYUZU_USE_BUNDLED_QT=1 -DYUZU_USE_BUNDLED_SDL2=1 -DYUZU_USE_BUNDLED_UNICORN=1 .. 2>&1 && exit 0' } else { - C:\msys64\usr\bin\bash.exe -lc "cmake -G 'MSYS Makefiles' -DUSE_SYSTEM_CURL=1 -DYUZU_USE_BUNDLED_CURL=1 -DCMAKE_BUILD_TYPE=Release .. 2>&1" + C:\msys64\usr\bin\bash.exe -lc "cmake -G 'MSYS Makefiles' -DYUZU_BUILD_UNICORN=1 -DCMAKE_BUILD_TYPE=Release .. 2>&1" } - cd .. @@ -81,11 +80,12 @@ after_build: $env:BUILD_SYMBOLS = $MSVC_BUILD_PDB $env:BUILD_UPDATE = $MSVC_SEVENZIP - 7z a -tzip $MSVC_BUILD_PDB .\msvc_build\bin\release\*.pdb - rm .\msvc_build\bin\release\*.pdb + mkdir pdb + Get-ChildItem ".\msvc_build\bin\" -Recurse -Filter "*.pdb" | Copy-Item -destination .\pdb + 7z a -tzip $MSVC_BUILD_PDB .\pdb\*.pdb mkdir $RELEASE_DIST - Copy-Item .\msvc_build\bin\release\* -Destination $RELEASE_DIST -Recurse + Get-ChildItem ".\msvc_build\bin\" -Recurse -Filter "yuzu*.exe" | Copy-Item -destination $RELEASE_DIST Copy-Item .\license.txt -Destination $RELEASE_DIST Copy-Item .\README.md -Destination $RELEASE_DIST 7z a -tzip $MSVC_BUILD_ZIP $RELEASE_DIST\* @@ -104,16 +104,14 @@ after_build: $env:BUILD_UPDATE = $MINGW_SEVENZIP $CMAKE_SOURCE_DIR = "$env:APPVEYOR_BUILD_FOLDER" - $CMAKE_BINARY_DIR = "$CMAKE_SOURCE_DIR/mingw_build" + $CMAKE_BINARY_DIR = "$CMAKE_SOURCE_DIR/mingw_build/bin" $RELEASE_DIST = $RELEASE_DIST + "-mingw" mkdir $RELEASE_DIST mkdir $RELEASE_DIST/platforms # copy the compiled binaries and other release files to the release folder - Get-ChildItem "$CMAKE_BINARY_DIR" -Recurse -Filter "yuzu*.exe" | Copy-Item -destination $RELEASE_DIST - # copy the libcurl dll - Get-ChildItem "$CMAKE_BINARY_DIR" -Recurse -Filter "libcurl.dll" | Copy-Item -destination $RELEASE_DIST + Get-ChildItem "$CMAKE_BINARY_DIR" -Filter "yuzu*.exe" | Copy-Item -destination $RELEASE_DIST Copy-Item -path "$CMAKE_SOURCE_DIR/license.txt" -destination $RELEASE_DIST Copy-Item -path "$CMAKE_SOURCE_DIR/README.md" -destination $RELEASE_DIST # copy all the dll dependencies to the release folder @@ -122,7 +120,7 @@ after_build: # QT dll dependencies "libbz2-*.dll","libicudt*.dll","libicuin*.dll","libicuuc*.dll","libffi-*.dll", "libfreetype-*.dll","libglib-*.dll","libgobject-*.dll","libgraphite2.dll","libiconv-*.dll", - "libharfbuzz-*.dll","libintl-*.dll","libpcre-*.dll","libpcre16-*.dll","libpng16-*.dll", + "libharfbuzz-*.dll","libintl-*.dll","libpcre-*.dll","libpcre2-16-*.dll","libpcre16-*.dll","libpng16-*.dll", # Runtime/Other dependencies "libgcc_s_seh-*.dll","libstdc++-*.dll","libwinpthread-*.dll","SDL2.dll","zlib1.dll" foreach ($file in $MingwDLLs) { diff --git a/externals/unicorn b/externals/unicorn new file mode 160000 index 000000000..73f457353 --- /dev/null +++ b/externals/unicorn @@ -0,0 +1 @@ +Subproject commit 73f45735354396766a4bfb26d0b96b06e5cf31b2 diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp index 13f6c658c..0cd519ea3 100644 --- a/src/core/arm/unicorn/arm_unicorn.cpp +++ b/src/core/arm/unicorn/arm_unicorn.cpp @@ -11,7 +11,7 @@ #include "core/hle/kernel/svc.h" // Load Unicorn DLL once on Windows using RAII -#ifdef _WIN32 +#ifdef MSVC #include struct LoadDll { private: From b5b0d4e7c3adf840cbe3cc7b838e7ca7eca1ed96 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 16 Jan 2018 01:20:11 -0700 Subject: [PATCH 2/3] Build: Update Appveyor and Travis secret keys The keys are github auth_tokens and are assigned to yuzubot for the yuzu-nightly repository to allow Appveyor and Travis to upload releases --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8bad23208..2051d225c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,7 +32,7 @@ matrix: deploy: provider: releases api_key: - secure: Mck15DIWaJdxDiS3aYVlM9N3G6y8VKUI1rnwII7/iolfm1s94U+tgvbheZDmT7SSbFyaGaYO/E8HrV/uZR9Vvs7ev20sHsTN1u60OTWfDIIyHs9SqjhcGbtq95m9/dMFschOYqTOR+gAs5BsxjuoeAotHdhpQEwvkO2oo5oR0zhGy45gjFnVvtcxT/IfpZBIpVgcK3aLb9zT6ekcJbSiPmEB15iLq3xXd0nFUNtEZdX3D6Veye4n5jB6n72qN8JVoKvPZAwaC2K0pZxpcGJaXDchLsw1q+4eCvdz6UJfUemeQ/uMAmjfeQ3wrzYGXe3nCM3WmX5wosCsB0mw4zYatzl3si6CZ1W+0GkV4Rwlx03dfp7v3EeFhTsXYCaXqhwuLZnWOLUik8t9vaSoFUx4nUIRwfO9kAMUJQSpLuHNO2nT01s3GxvqxzczuLQ9he5nGSi0RRodUzDwek1qUp6I4uV3gRHKz4B07YIc1i2fK88NLXjyQ0uLVZ+7Oq1+kgDp6+N7vvXXZ5qZ17tdaysSbKEE0Y8zsoXw7Rk1tPN19vrCS+TSpomNMyQyne1k+I5iZ/qkxPTLAS5qI6Utc2dL3GJdxWRAEfGNO9AIX3GV/jmmKfdcvwGsCYP8hxqs5vLYfgacw3D8NLf1941lQUwavC17jm9EV9g5G3Pn1Cp516E= + secure: IuTT8DjxzNgOtaEsyOpz1JaSmtDtHSsWZnJKmSBwXAzgP2ZU4Ja3/q0z5PwbC5Ql7kuFahuYTE5oi7lbJBuu2P3y1Wj2zvFozGUkA3JUvEXDNOPS9QTJ1EYd6O+wenZoj7d/Pn+ZeIgyEafnnZsGBb8lMQnV9MfIHgYlZQ5EyF3n4XikT2h1UbDBYx74ciXZIxFEulx68kDr9Q4/U+zIYQmYv2N+lgXSLDkFrCJ046gRcujPYGPqE6jVw0kKni80CTTpuDF5prU8yIBeiffjkJ3Qx1a17G07eZ4r83P4XUOlaHbRBmA/8ywZvLF2Gep3wGKfSFgMWbPxBJk5ZSYcOOAgMsEcg0+gBK9gLTwO4pbmc2GvqP21yRQBzgtbFoEtAHLu5lVPBkZU7kZuRMJtRdqvFIwOLhpnRS8IknFOD5vjtaFiNdGWaK9ePdsGvplijnXcPafkumakc4+eVEiXb6/KzdX1zXdur5tuUPFytm0Oy6IJcGIf8FHXGvUlmWsnPzwfusij9JgeQOP+uegc9PdBfL+h7L5rk+ilELt3cXD5K7wgov/4hkl5istNJ2bm0IioIstWss8QQQTkyscGoeh/oXmUpOL4FdsTvsWhDR3QKeq8nSzgDkqLe0iSbplQGnC7o7ytNbldmxJvf3nylwglA8w3HlqLHtZLkUOcuQ0= file_glob: true file: "artifacts/*" skip_cleanup: true diff --git a/appveyor.yml b/appveyor.yml index 9d2aa156b..954be4e8f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -163,7 +163,7 @@ deploy: provider: GitHub release: $(appveyor_repo_tag_name) auth_token: - secure: "dbpsMC/MgPKWFNJCXpQl4cR8FYhepkPLjgNp/pRMktZ8oLKTqPYErfreaIxb/4P1" + secure: "argb6oi2TYLB4wDy+HoCC8PuGAmsnocSk12CQ5614XAPO+NVPndlkLv1utnDFfg2" artifact: update,build draft: false prerelease: false From 2d7a85f7afc2240c5dd0ac35f5981382c494d81c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 16 Jan 2018 09:39:07 -0700 Subject: [PATCH 3/3] 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 --- CMakeLists.txt | 96 ++++++++++++++-------------- src/core/arm/unicorn/arm_unicorn.cpp | 2 +- 2 files changed, 50 insertions(+), 48 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f1a4d0152..2ec9467e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,8 +12,6 @@ option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" OFF) option(ENABLE_QT "Enable the Qt frontend" ON) 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) message(STATUS "Copying pre-commit hook") file(COPY hooks/pre-commit @@ -29,7 +27,7 @@ function(check_submodules_present) foreach(module ${gitmodules}) string(REGEX REPLACE "path *= *" "" module ${module}) 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") endif() endforeach() @@ -204,59 +202,63 @@ else() set(SDL2_FOUND NO) endif() -if (YUZU_USE_BUNDLED_UNICORN) - # Detect toolchain and platform - 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) - download_bundled_external("unicorn/" ${UNICORN_VER} UNICORN_PREFIX) - endif() - - if (DEFINED UNICORN_VER) - download_bundled_external("unicorn/" ${UNICORN_VER} UNICORN_PREFIX) - endif() - - set(UNICORN_FOUND YES) - set(LIBUNICORN_INCLUDE_DIR "${UNICORN_PREFIX}/include" CACHE PATH "Path to Unicorn headers") - set(LIBUNICORN_LIBRARY "${UNICORN_PREFIX}/lib/x64/unicorn_dynload.lib" CACHE PATH "Path to Unicorn library") - set(UNICORN_DLL_DIR "${UNICORN_PREFIX}/lib/x64/" CACHE PATH "Path to unicorn.dll") -elseif (YUZU_BUILD_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(FATAL_ERROR "Cannot build unicorn on msvc. Use YUZU_USE_BUNDLED_UNICORN instead") - elseif (MINGW) - set(UNICORN_LIB_NAME "unicorn.a") + message(STATUS "unicorn not found, falling back to bundled") + # Detect toolchain and platform + 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) + download_bundled_external("unicorn/" ${UNICORN_VER} UNICORN_PREFIX) + endif() + + if (DEFINED UNICORN_VER) + download_bundled_external("unicorn/" ${UNICORN_VER} UNICORN_PREFIX) + endif() + + set(UNICORN_FOUND YES) + 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" FORCE) + set(UNICORN_DLL_DIR "${UNICORN_PREFIX}/lib/x64/" CACHE PATH "Path to unicorn.dll" FORCE) else() - set(UNICORN_LIB_NAME "libunicorn.a") + message(STATUS "unicorn not found, falling back to externals") + if (MINGW) + set(UNICORN_LIB_NAME "unicorn.a") + else() + set(UNICORN_LIB_NAME "libunicorn.a") + endif() + + set(UNICORN_FOUND YES) + set(UNICORN_PREFIX ${CMAKE_SOURCE_DIR}/externals/unicorn) + 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" FORCE) + set(UNICORN_DLL_DIR "${UNICORN_PREFIX}/" CACHE PATH "Path to unicorn dynamic library" FORCE) + + add_custom_command(OUTPUT ${LIBUNICORN_LIBRARY} + COMMAND ${CMAKE_COMMAND} -E env UNICORN_ARCHS="aarch64" /bin/sh make.sh + WORKING_DIRECTORY ${UNICORN_PREFIX} + ) + # ALL makes this custom target build every time + # but it won't actually build if LIBUNICORN_LIBRARY is up to date + add_custom_target(unicorn-build ALL + DEPENDS ${LIBUNICORN_LIBRARY} + ) + unset(UNICORN_LIB_NAME) endif() - - set(UNICORN_FOUND YES) - set(UNICORN_PREFIX ${CMAKE_SOURCE_DIR}/externals/unicorn) - set(LIBUNICORN_LIBRARY "${UNICORN_PREFIX}/${UNICORN_LIB_NAME}" CACHE PATH "Path to Unicorn library") - set(LIBUNICORN_INCLUDE_DIR "${UNICORN_PREFIX}/include" CACHE PATH "Path to Unicorn headers") - set(UNICORN_DLL_DIR "${UNICORN_PREFIX}/" CACHE PATH "Path to unicorn dynamic library") - - add_custom_command(OUTPUT ${LIBUNICORN_LIBRARY} - COMMAND ${CMAKE_COMMAND} -E env UNICORN_ARCHS="aarch64" /bin/sh make.sh - WORKING_DIRECTORY ${UNICORN_PREFIX} - ) - # ALL makes this custom target build every time - # but it won't actually build if LIBUNICORN_LIBRARY exists - add_custom_target(unicorn-build ALL - DEPENDS ${LIBUNICORN_LIBRARY} - ) - unset(UNICORN_LIB_NAME) -else() - find_package(Unicorn REQUIRED) endif() if (UNICORN_FOUND) add_library(unicorn INTERFACE) target_link_libraries(unicorn INTERFACE "${LIBUNICORN_LIBRARY}") target_include_directories(unicorn INTERFACE "${LIBUNICORN_INCLUDE_DIR}") +else() + message(FATAL_ERROR "Could not find or build unicorn which is required.") endif() if (ENABLE_QT) diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp index 0cd519ea3..fd64eab39 100644 --- a/src/core/arm/unicorn/arm_unicorn.cpp +++ b/src/core/arm/unicorn/arm_unicorn.cpp @@ -11,7 +11,7 @@ #include "core/hle/kernel/svc.h" // Load Unicorn DLL once on Windows using RAII -#ifdef MSVC +#ifdef _MSC_VER #include struct LoadDll { private: