오늘은 지난 번에 iPhone에 Theos를 설정한 것과 달리 WSL에서도 설정을 하는 것을 목표로 하겠습니다. 원래는 18.04 환경에서 진행을 하려고 했으나 이미 제가 사용하고 있는 관계로 20 버전에서 세팅합니다.


현재 다음의 환경에서 진행하고 있습니다.

WSL 설치하기

먼저 시작하기 전에 Powershell을 관리자 권한으로 열고 다음 명령을 실행하여 장치에서 WSL을 활성화해야 합니다.

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

그리고 Microsoft Store에서 원하는 버전을 설치해주세요. 원래는 18.04 LTS 버전을 사용하려고 했으나 이미 제가 실사용 중에 있는 관계로 이 글에서는 20.04 LTS 버전을 사용합니다. 18.04 LTS의 경우에도 모든 과정이 동일합니다. 오히려 20.04 LTS에서 몇 가지 더 할게 있습니다.

사용자 설정

설치가 완료되고 앱을 열면 자연스럽게 Windows 내에 설치가 진행되고 첫 번째 사용자를 설정하게 됩니다.

미러 서버 변경 및 업데이트 설치

여기에서는 빠른 시스템 업데이트를 위해 미러 서버를 DaumKakao로 변경할 것입니다. sed 명령을 사용해 source.list 파일을 업데이트해줍니다.

sudo sed -i 's/archive.ubuntu.com/mirror.kakao.com/' /etc/apt/sources.list

그리고 시스템 업데이트해주세요.

sudo apt update
sudo apt upgrade -y

파일 시스템 구성 변경

그 다음으로 기본적으로 WSL에서 허용하지 않는 파일 시스템 옵션들을 직접 활성화해야 합니다. /etc/wsl.conf를 열고 metadata와 umask 등의 옵션을 활성화해줍니다.

sudo nano /etc/wsl.conf
[automount]
enabled=true
options="metadata,umask=22,fmask=11"

그리고 umask 값을 더 정확히 잡아주기 위해서 .profile 파일에서도 한 번 더 처리를 해주도록 합니다. ~/.profile 파일에 다음 줄을 추가해주세요.

# Note: Bash on Windows does not currently apply umask properly.
if [[ "$(umask)" = "0000" ]]; then
  umask 0022
fi

이렇게 하면 이제 파일 시스템에 권한이 정상적으로 작동합니다. 쉘을 다시시작하여 변경 사항을 적용해주세요.

Theos 설치하기

괜찮으시다면 언제나 GitHub의 Theos 위키에서 최신 버전의 설치 방법을 유지하도록 하세요. 그리고 여기에서부터는 반드시 명령어를 root가 아닌 일반 사용자 계정을 설치하도록 합니다.

종속성 패키지 설치하기

아래 명령어로 올바른 Clang-6.0 종속성 패키지를 설치하기 위해 LLVM 저장소를 추가합니다.

bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
sudo apt update

그리고 다음 패키지를 설치해주세요. 만약 패키지를 찾을 수 없다면 sudo apt update 명령으로 목록을 새로고침해주어야 합니다.

sudo apt-get install fakeroot git perl clang-6.0 build-essential git -y

그리고 실제 빌드 시에도 영향을 최소화하기 위해서 fakeroot를 설정합니다.

sudo update-alternatives --set fakeroot /usr/bin/fakeroot-tcp

버전별 추가 설치 필요 패키지

아래는 특정 버전에서 일부 종속성이 기본적으로 설치되어 있지 않거나 필요한 경우 서술하였습니다.

  • Ubuntu 20.04 LTS: libncurses5
  • Ubuntu Minimal Installation: git nano

Theos 저장소 다운로드

이제 Git으로 Theos를 로컬로 가져올겁니다.

환경 변수 설정

그 전에 원하는 경로를 포함하여 아래 명령어로 $THEOS 환경 변수에 경로를 설정해줍니다. 대부분의 Theos 스니펫이나 스크립트는 아래 환경 변수를 필히 이용하기 때문입니다.

echo "export THEOS=~/theos" >> ~/.profile

그리고 즉시 반영이 되지 않기 때문에 환경 변수를 적용하기 위해 쉘을 다시시작해야 합니다. 다시시작한 후에도 echo $THEOS 명령을 통해 환경 변수가 정확히 설정되어 있는지 확인해주세요.

로컬에 저장소 가져오기

이제 아래 명령을 통해 Git으로 저장소를 가져옵니다.

git clone --recursive https://github.com/theos/theos.git $THEOS

Toolchain 및 SDK 설치하기

Toolchain은 x86_64에서 Apple이 Arm 환경(iOS)으로의 크로스 컴파일을 위해 만들어진 도구 집합입니다. 저희는 여기에서 Sam Bingner의 Toolchain을 설치하여 arm64e 컴파일을 가능하게 함과 동시에 현재 이슈에 열려있는 버그인 528번 이슈를 해결할 예정입니다. 그리고 iOS 13의 API 사용을 위해서 iOS 13의 Private SDK를 설치하도록 하겠습니다.

Toolchain 다운로드 및 설치

먼저 GitHub에서 Toolchain을 다운로드해줍니다.

wget https://github.com/sbingner/llvm-project/releases/download/v10.0.0-1/linux-ios-arm64e-clang-toolchain.tar.lzma

그리고 Toolchain 폴더를 미리 만들어줍니다.

mkdir -p $THEOS/toolchain/linux/iphone

마지막으로 압축을 풀고 폴더를 이동시켜줍니다.

tar --lzma -xvf linux-ios-arm64e-clang-toolchain.tar.lzma
mv ios-arm64e-clang-toolchain/* $THEOS/toolchain/linux/iphone

그럼 이렇게 Toolchain 설치가 완료됩니다.

Swift Toolchain 설치

추가로 Swift로 개발을 하고픈 분들은 Swift Toolchain을 설치해주시면 됩니다. (그래도 Objective-C의 굴레에서 벗어날 수 없다고)

curl https://kabiroberai.com/toolchain/download.php?toolchain=swift-ubuntu-latest -Lo swift-toolchain.tar.gz
tar xzf swift-toolchain.tar.gz -C $THEOS/toolchain
rm swift-toolchain.tar.gz

iOS 13 Private SDK 설치

아래 저장소에서 iOS 13 Private SDK를 설치해줍니다. 보통 나오는 최신 버전의 iOS SDK들은 Apple의 비공개 코드와 헤더를 포함하는 PrivateFrameworks 그리고 이전 버전의 Private API들을 통합해 만들어져 Public API 외에도 모든 API 접근을 가능하게 해줍니다.

SniperGER/iOS13-Private-SDK
iOS 13.3 SDK, complete with PrivateFrameworks and included headers. For use in jailbroken development. - SniperGER/iOS13-Private-SDK
sudo apt install zip unzip -y

wget https://github.com/SniperGER/iOS13-Private-SDK/archive/master.zip
unzip master.zip

그리고 다운로드받은 파일들을 맞는 위치에 옮겨줍니다.

cd iOS13-Private-SDK-master/

mv sdks/* $THEOS/sdks
cp -r include/* $THEOS/include/

Test

이제 모두 설치가 끝났으니 잘 작동하는지 테스트해보겠습니다. 아래는 간단히 샘플 프로젝트를 성공적으로 빌드하는 모습입니다.

네, 여기까지입니다. 그럼 좋은 iOS 개발되세요!