소스 검색

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.
James Rowe 8 년 전
부모
커밋
e026b66bbb
8개의 변경된 파일42개의 추가작업 그리고 27개의 파일을 삭제
  1. 3 0
      .gitmodules
  2. 2 8
      .travis/linux/docker.sh
  3. 1 1
      .travis/macos/build.sh
  4. 0 6
      .travis/macos/deps.sh
  5. 25 0
      CMakeLists.txt
  6. 9 11
      appveyor.yml
  7. 1 0
      externals/unicorn
  8. 1 1
      src/core/arm/unicorn/arm_unicorn.cpp

+ 3 - 0
.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

+ 2 - 8
.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

+ 1 - 1
.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

+ 0 - 6
.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

+ 25 - 0
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()

+ 9 - 11
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) {

+ 1 - 0
externals/unicorn

@@ -0,0 +1 @@
+Subproject commit 73f45735354396766a4bfb26d0b96b06e5cf31b2

+ 1 - 1
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 <unicorn_dynload.h>
 struct LoadDll {
 private: