Zaczęło się od tego, że gdzieś na Mastodonie mignęła mi informacja, że Mozilla zaczyna coraz bardziej pchać ejaj do Firefoxa. Zniesmaczony tą perspektywą przypomniałem sobie, że istnieje coś takiego jak LibreWolf, którego jedynym celem jest "odchamienie" Firefoxa. Nie zastanawiając się zbyt długo, wklepałem w Terminal komendę do instalacji i moim oczom ukazał się taki obraz:
% brew info librewolf
==> **librewolf**: 145.0.1,2
https://librewolf.net/
Deprecated because it does not pass the macOS Gatekeeper check! It will be disabled on 2026-09-01.
Not installed
From: https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/l/librewolf.rb
==> **Name**
LibreWolf
==> **Description**
Web browser
==> **Artifacts**
LibreWolf.app (App)
/opt/homebrew/Caskroom/librewolf/145.0.1,2/librewolf.wrapper.sh -> librewolf (Binary)
==> **Analytics**
install: 5,017 (30 days), 15,861 (90 days), 69,140 (365 days)
"Deprecated because macOS cośtam" - no wspaniale, nie dość, że Mozilla z jednej strony, to jeszcze Apple z drugiej. Czasami żałuję, że wyspecjalizowałem się w technologii, której właściciel może mnie zakneblować. Już wolałbym programować na Linuxie.
Ale zaraz. Przecież ja już mam komputer z Linuxem - konkretnie to z Fedorą. I co z tego, że na MacBooku, może nawet lepiej!
Ponieważ domyślnie jestem programistą aplikacji na iOSa, fundamentalnym problemem do rozwiązania stała się możliwość uruchomienia Xcode'a. Xcode będzie działał tylko i wyłącznie na macOS, więc pierwszą rzeczą, jaka przyszła mi do głowy była maszyna wirtualna. W internetach pełno jest projektów ułatwiających postawienie takiej maszyny z macOS na Linuxie, ja postanowiłem przetestować dwie opcje: Quickemu oraz ULTMOS. Oba narzędzia robią mniej więcej to samo, ale ostatecznie wybrałem ULTMOSa, samodzielnie ogarnia trochę więcej rzeczy.
No więc zainstalowałem zależności, narzędzie, stworzyłem maszynę wirtualną, uruchomiłem... i matko jedyna, jak to koszmarnie wolno działa. Ja wiem, że to pewnie wirtualizacja programowa, że stary komputer, ale żeby nawet instalator macOSa się zacinał, no to jest wyczyn. Przebolałem jakoś proces instalacji, który oprócz koszmarnego laga przeszedł bez większych problemów, i odpaliłem system. O dziwo, większość rzeczy działała bardzo przyzwoicie. Ponownie, pomijając szybkość. Gdybym miał mocniejszy komputer oraz umiał bardziej w maszyny wirtualne niż odpalanie skryptów, to to mogłaby być sensowna opcja. Ale w tym momencie odpada.
Zacząłem więc szukać dalej. I dalej okazało się, że ktoś rozwija warstwę kompatybilności macOS na Linuxa! Nazywa się to Kochanie (Darling), od Darwin+Linux, Darwin to nazwa kernela używanego na macOS. No więc znowu, klonuję repozytorium i zabieram się za instalację. Żeby zainstalować Darling, trzeba go najpierw zbudować. To samo w sobie nie jest trudne, ale jest koszmarnie czasochłonne. Ale dobra, odpalam budowanie i wracam do klikania po internecie.
Gdy zbudowana była jakaś 1/3 projektu, znalazłem coś, co wydaje się rewolucyjne i idealnie skrojone na moje potrzeby. xtool, narzędzie napisane w Swifcie, którego jedynym celem jest budowanie aplikacji w Xcode na dowolnym systemie! To brzmi zbyt dobrze, żeby było prawdziwe.
Instalujemy.
Swift dostępny jest natywnie, więc wystarczy sudo dnf install swift-lang. Do uruchamiania aplikacji na ajfonie po USB wymagany jest pakiet usbmuxd, ale ten akurat jest dostępny na Fedorze 43 od razu. Kolejne bardzo przydatne narzędzie, które kojarzę nawet z macOSa, to libimobiledevice i ono również jest dostępne dla Fedory natywnie sudo dnf install libimobiledevice-utils. Potrzebny jest instalator Xcode'a - można go pobrać ze strony Xcode Releases, trzeba jednak się zalogować na portalu developerskim Apple'a - pobieram wersję 26.1.1.
Kolejny krok to konfiguracja SDK w xtool za pomocą xtool sdk path/to/xcode.xip - tutaj napotkałem na pierwszy poważny problem, który na moje szczęście ktoś inny już rozwiązał. Okazuje się, że xtool próbował rozpakować Xcode'a do tmpfs, czyli do systemu plików w RAMie. Na ten system Fedora nakłada organiczenie, do którego Xcode dobił, i zaczął rzucał nieskoordynowanymi błędami. Rozwiązaniem było stworzenie tymczasowego folderu na dysku: mkdir .temporary && TMPDIR=~/.temporary xtool sdk Xcode-26.1.1.xip. Kolejny krok to autoryzacja xtoola, żeby mógł podpisywać aplikacje: xtool auth login, znowu - trzeba mieć konto w Apple.
Teraz lecę zgodnie z instrukcją budowania pierwszej aplikacji i okazuje się, że projekt pięknie się kompiluje i uruchamia na telefonie. Muszę przyznać, że jestem pod wielkim wrażeniem.
Ciekawe, kiedy Apple to zepsuje.
mateusz@fedora:~/Development$ xtool new Hello
Creating package: Hello
Creating Package.swift
Creating xtool.yml
Creating .gitignore
Creating .sourcekit-lsp/config.json
Creating Sources/Hello/HelloApp.swift
Creating Sources/Hello/ContentView.swift
Finished generating project Hello. Next steps:
- Enter the directory with `cd Hello`
- Build and run with `xtool dev`
mateusz@fedora:~/Development$ cd Hello/
mateusz@fedora:~/Development/Hello$ xtool dev
Planning...
Building for debugging...
[8/8] Linking Hello-App
Build complete! (13.71s)
Waiting for device to be connected...
Installing to device: iPhone (Mateusz) (udid: 00000000-0000000000000000)
[Unpacking app] 100%
[Preparing device] 100%
[Provisioning] 100%
[Signing] 100%
[Packaging] 100%
[Connecting] 100%
[Installing] 100%
[Verifying] 100%