본문 바로가기

컴퓨터

[Linux] 최신버전 Yuzu github에서 Appimage로 스팀덱에 설치하기

이 글은 yuzu-mainline이 아닌 현재 개발되고 있는 가장 최신버전을 AppImage로 변환하는 글이다. 

호스트 OS: Fedora 37

도커 환경: Archlinux

cd /home/[유저]/
git clone --recursive https://github.com/yuzu-emu/yuzu
cd yuzu/
git config --global --add safe.directory "*"

원하는 디렉터리로 들어가 yuzu repository를 clone한다.

아래는 취사선택 하면 되는데 나 같은 경우에는 스팀덱과 유사한 바이너리 환경에서 컴파일하고 싶어서 도커를 이용했다.

또 도커의 장점으로 뒤에서 AppImage로의 변환을 하게 되는데 이게 내 호스트 컴퓨터에선 실행이 되어도 스팀덱에서는 안될 수 있다. AppImage파일을 매번 옮기면서 테스트하기는 번거로우므로 도커 컨테이너 상에서 AppImage를 만들고 내 호스트에서 다시 테스트하면 편리하다. 이때 잘 된다면 스팀덱에서도 잘 될 가능성이 99%이다.

docker run -t -v /home/[유저]/yuzu:/yuzu \
           -d --rm \
           --device /dev/fuse \
           --cap-add SYS_ADMIN \
           --security-opt apparmor:unconfined \
           --name yuzu \
      <image_id/name>
docker exec -it yuzu bash

AppImage실행을 위해 fuse 관련 설정을 도커에 해주어야 한다. 이후 yuzu github wiki대로 진행하면 된다. 나는 아치리눅스 컨테이너에서 진행한다.

sudo pacman -Syu --needed base-devel boost catch2 cmake \
	ffmpeg fmt git glslang libzip lz4 mbedtls ninja nlohmann-json \
    openssl opus qt5 sdl2 zlib zstd zip unzip vulkan-devel

필요한 패키지들을 설치해준다. 

mkdir build && cd build
mkdir AppDir
cmake .. -GNinja -DYUZU_USE_BUNDLED_VCPKG=ON -DYUZU_TESTS=OFF \
	-DCMAKE_INSTALL_PREFIX=AppDir \
    -DCMAKE_CXX_FLAGS="-I/usr/include/qt/QtWebEngineWidgets"

위 코드는 Make를 하기 위한 세팅을 해준다. 여기서 yuzu wiki와는 다르게 나는 AppImage로 만들 것이기 때문에 AppDir이라는 디렉터리를 새로 만들어주고 이곳으로 인스톨 하도록 CMAKE_INSTALL_PREFIX를 설정해주었다.

ninja
ninja install

이후 ninja를 이용해 자동 컴파일을 시켜준 후 다 되었다면 ninja install 명령어를 이용해 앞서 만들었던 AppDir 디렉터리에 설치해준다. 모든게 끝나면 AppDir아래에 다음과 같은 디렉터리들이 있을 것이다.

$ ls
bin/ share/

AppDir 아래에 usr라는 새로운 디렉터리를 만들어주고 bin과 share를 옮겨준다.

mkdir usr
mv bin/ share/ usr/

이제부터 AppImage로 만들어야 한다. yuzu/build 디렉터리로 돌아간다. 여기서 AppImage로 만들어주는 도구들을 다운받을 것이다. 

https://github.com/linuxdeploy/linuxdeploy/releases 

 

Releases · linuxdeploy/linuxdeploy

AppDir creation and maintenance tool. Featuring flexible plugin system. - linuxdeploy/linuxdeploy

github.com

위 링크에서 linuxdeploy-x86_64.AppImage 로 되어있는 것을 받는다.

이 AppImage 파일을 yuzu/build 폴더로 옮겨준다. (옮기는 이유는 그냥 편의성을 위해 하는거라 일일히 다운로드 받은 경로 쳐가며 해도 상관없다.)

그리고 linux deploy의 qt plugin이 필요하다. 

https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases

 

Releases · linuxdeploy/linuxdeploy-plugin-qt

Qt plugin for linuxdeploy, bundling Qt resources, plugins, QML files and a lot more. - linuxdeploy/linuxdeploy-plugin-qt

github.com

위 링크에서 linuxdeploy-plugin-qt-x86_64.AppImage 로 되어있는 것을 받는다. 이 파일은 앞서 받았던 linuxdeploy-x86_64.AppImage 파일과 같은 경로에 넣어야 한다. 나는 yuzu/build 폴더로 옮겨주었다.

모든 준비는 완료되었고 linux deploy를 실행한다. yuzu/build 디렉터리에서 아래 커맨드를 입력한다.

./linuxdeploy-x86_64.AppImage --appdir AppDir --plugin qt

위 커맨드를 입력하면 이제 거의 모든 디펜던시들은 알아서 AppDir/usr/lib 으로 옮겨준다.

문제는 여기서 "거의" 라는 것이다. 몇 개는 안 옮겨준다. 그 남은 디펜던시를 해결해주어야 한다.

https://github.com/darealshinji/AppImageKit-checkrt

 

GitHub - darealshinji/AppImageKit-checkrt: Have your AppImage check libgcc and libstdc++ dependencies at runtime.

Have your AppImage check libgcc and libstdc++ dependencies at runtime. - GitHub - darealshinji/AppImageKit-checkrt: Have your AppImage check libgcc and libstdc++ dependencies at runtime.

github.com

위 리파지토리를 클론한다.

git clone https://github.com/darealshinji/AppImageKit-checkrt

바이너리 제공을 해주지 않아서 직접 컴파일을 해야한다. 아래와 같이 입력한다.

cd AppImageKit-checkrt/src
make

이렇게 입력하면 해당 디렉터리(src)에 checkrt 라는 실행파일이 생긴다. 이 파일을 AppDir/usr/optional/ 로 옮겨준다. 해당 디렉터리가 없으면 만들어준다. 그리고 AppDir/usr/optional 경로로 가 checkrt를 실행해준다.

mkdir /yuzu/build/AppDir/usr/optional
cp checkrt /yuzu/build/AppDir/usr/optional/
cd /yuzu/build/AppDir/usr/optional
chmod a+x checkrt
./checkrt

이러면 optional 디렉터리 밑에 cxx, gcc 디렉터리가 생긴다. cxx 아래로 들어가면 libstdc++.so.6 이라는 파일이 있는데 이걸 AppDir/usr/lib/ 으로 옮겨주어야 한다. 

cd cxx/
cp libstdc++.so.6 ../../lib/

아래는 해야되는지 확실하진 않지만 난 옮겨준 내용이다.

cd ../gcc
cp libgcc_s.so.1 ../../lib/

참고로 난 위 파일들을 AppDir/usr/lib64/ 디렉터리를 만들고 그곳에다가도 복사했다.

 

위에서 한 내용들은 사실 시스템의 라이브러리를 그대로 갖다가 붙여넣기 해도 된다. 그게 checkrt가 하는 역할이다. 여기서 checkrt를 다운받고 컴파일하고 실행하는 과정을 적은 이유는 나는 이렇게 한 상태에서 진행했고 이렇게 하지 않으면 또 에러가 발생할지 몰라 일단 내가 한대로 적은 것이다. 시스템 라이브러리를 직접 복사 붙여넣기 해도 될 거라 생각한다.

 

그리고 라이브러리가 또 남았다. 아래와 같이 입력한다.

cd /usr/lib/
cp libharfbuzz* /yuzu/build/AppDir/usr/lib/

위와 같이 입력하면 내 환경에서 모든 dependecy는 해결된다. 또 다른 디펜던시가 있을수도 있는데 지금 가장 최신버전 스팀덱에서 AppImage가 실행되므로 이 글을 읽는 누군가의 스팀덱에서도 될 거라 생각한다. 아래부터는 AppImage를 만드는 코드이다. 다시 yuzu/build 디렉터리로 들어간다.

cd /yuzu/build/
./linuxdeploy-x86_64.AppImage --appdir AppDir --output appimage

이렇게 하면 해당 경로에 yuzu-*-x86_64.AppImage 파일이 생길 것이다. 잘 되는지 테스트하기 위해 실행가능하도록 바꾼 후 컨테이너 환경과 호스트 환경에서 모두 테스트해본다.

chmod a+x yuzu-*-x86_64.AppImage
./yuzu-*-x86_64.AppImage

컨테이너는 X 설정을 하지 않았으므로 디스플레이를 찾지 못했다는 에러가 뜨면 성공이고 호스트에서 실행하면 yuzu gui가 뜨면 성공이다. 호스트(나는 Fedora 37이다.)에서 성공했다면 99% 확률로 다른 환경에서도 실행되므로 바로 스팀덱으로 AppImage를 옮겨서 즐기면 된다.