====== GNUstep ソースからのインストール on Fedora 43 ====== ===== 目標 ===== Fedora 43 に Clang/Objective-C 2/GNUstep のGUIアプリケーションの開発環境を構築する。 ===== 前もって必要なもの ===== 以下をあらかじめパッケージマネージャーでインストールしておきます。 * clang * lld * libobjc2 ※libobjc2 はソースからインストールしたほうが良いかもしれません。 ===== GNUstepのソースコードの入手 ===== [[https://home.gnustep.org/resources/downloads.html|GNUstep: Download]] から GNUstep Core にある以下のソースを入手します。 - GNUstep Make - GNUstep Base - GNUstep GUI - GNUstep Backend 上から順にビルドしてインストールしていく必要があります。 GitHubのリポジトリを使う場合、以下のようにします。 $ git clone https://github.com/gnustep/tools-make.git $ git clone https://github.com/gnustep/libs-base.git $ git clone https://github.com/gnustep/libs-gui.git $ git clone https://github.com/gnustep/libs-back.git ===== 1. GNUstep Make (tools-make) ===== 詳しい説明は [[https://github.com/gnustep/tools-make/blob/master/INSTALL|INSTALL]] に書かれています。 GNUstep Make は GNUstep を利用するプロジェクトをビルドするための基本的なビルドツールで、ほぼ必須です。 他のライブラリ (Base、GUI、Backend) をビルドするために必要なので、まず最初にインストールする必要があります。 GCC を使うならただ configure と make を実行すればよいだけですが、Clang を利用するためには調整が必要です。 そして最もつまづきやすいポイントでもあります。 configureは以下のオプションを指定して実行します。 $ ./configure \ --enable-native-objc-exceptions \ --enable-objc-arc \ --with-runtime-abi=gnustep-2.1 \ --with-library-combo=ng-gnu-gnu \ CC="clang" CXX="clang++" CPP="clang -E" LDFLAGS="-fuse-ld=lld" ''%%--%%with-runtime-abi=gnustep-x.y'' の ''x.y'' は libobjc2 のバージョンに合わせます。 素直に上記のコマンドを実行すると、たぶんエラーになります。 エラーになったら config.log を確認します。 ※エラーにならなかったらmakeに進んでください。 おそらく、clang のオプション ''-V'' と ''-qversion'' をテストしているところで失敗してるのがわかります。 このオプションをサポートするclangのバージョンは存在しません。 configureスクリプトの該当箇所を探して修正します。 ''-V'' と ''-qversion'' を、clangがサポートする適切なオプション ''-v'' や ''%%--%%version'' に書き換えます。 あるいは削除してしまいます。 libobjc (2ではない) が存在していると、たぶんエラーになります。 この場合 libobjc をアンインストールすることで通すことができます。 残念ながら、この回避策を取るとGCCでObjective-Cを利用できなくなってしまいます。 どのみち GNUstep を GCC と Clang 両方で使えるようにするのは難しいので、どちらかを諦めざるを得ないです。 configure が通ったら make でインストールします。 $ make # たぶん何も処理は行われないので省略可 $ sudo make install prefixを指定しなければ /usr/local 以下にインストールされます。 アンインストールは ''make uninstall'' でできます。 ''make install'' が通ったら、次のコマンドを実行すると GNUstep Make の環境が有効になります。 $ source /usr/local/share/GNUstep/Makefiles/GNUstep.sh gnustep-config を実行して、正しく GNUstep Make の環境がセットアップされていることを確認しておきます。 $ gnustep-config --objc-libs -fuse-ld=lld -pthread -fexceptions -rdynamic -fobjc-runtime=gnustep-2.1 -fblocks -L/home/username/GNUstep/Library/Libraries -L/usr/local/lib -lpthread -lobjc -lm 大まかにこのような出力にならなければどこかで失敗しています。 source は、別のシェルを起動したらそのたびに実行する必要があります。 面倒であれば、シェルの profile や rc ファイルなどに書いてしまうのもひとつの手です。 以降の作業は GNUstep Make が有効になっている前提で進めます。 ===== 2. GNUstep Base (libs-base) ===== 詳しい説明は [[https://github.com/gnustep/libs-base/blob/master/INSTALL|INSTALL]] に書かれています。 依存するライブラリは dnf でインストールできます。 $ sudo dnf install libffi-devel libicu-devel gnutls-devel libxml2-devel libxslt-devel libxslt-devel avahi-devel zlib-ng-compat-devel openssl-devel libcurl-devel libdispatch-devel configureとmake を実行します。 $ ./configure $ make $ sudo make install /usr/local/include や /usr/local/lib 以下にヘッダーとライブラリが配置されていることを確認しておきます。 この時点で一度コンソール版の Hello World を書いて動作するか確認しておくのが良いでしょう。 ===== 3. GNUstep GUI (libs-gui) ===== 詳しい説明は [[https://github.com/gnustep/libs-gui/blob/master/INSTALL|INSTALL]] に書かれています。 依存するライブラリは dnf でインストールできます。 $ sudo dnf install libtiff-devel libjepg-devel libpng-devel giflib-devel aspell-devel cups-devel audiofile-devel portaudio-devel configure と make を実行します。 $ ./configure $ make $ sudo make install /usr/local/include や /usr/local/lib 以下にヘッダーとライブラリが配置されていることを確認しておきます。 ===== 4. GNUstep Backend (libs-back) ===== 詳しい説明は [[https://github.com/gnustep/libs-back/blob/master/INSTALL|INSTALL]] に書かれています。 configure と make を実行します。 $ ./configure $ make -j4 $ sudo make install GNUstep 本体のインストールはこれで完了ですが、まだやらないといけなことがあります。 ===== フォントの問題の対応 ===== この段階で Objective-C 2 でプログラムのコードを書いてビルドするところまではできます。 しかし、まだ実行環境としては不完全です。 フォント周りで致命的な問題があって、このままではGUIアプリケーションが動作しません。 具体的には、デフォルトのシステムフォント Helvetica が GNUstep に同梱されていないためです。 Helvetica はプロプライエタリなフォントであるため扱いにくいです。 代わりに別のフォントを使用するように設定する必要があります。 残念ながら、その手順はあまり分かりやすいものではありません。 (([[https://gist.github.com/darkoverlordofdata/e8ef317dfeb2bbf2f348e7d62e121469/5d33f22d7ab004e45d0a786d4d9ff7bb3cbdd676|ここ]]の情報を参考にしました。)) 以下の手順でフォントの設定を変更します。 - 既存の TTF/OTF などのフォントから nfont を生成する - .nfont フォルダを適切な場所に配置する - その nfont を使用するように設定する GNUstep は TTF/OTF のフォントを直接使うことはできないので nfonts という形式にまとめないといけないけません。 これは mknfonts というツールで自動化できます。 デフォルトで使用するフォントの設定は defaults というコマンドで行います。 次の一連のコマンドは、これらを実際に行う一例です。 $ git clone https://salsa.debian.org/gnustep-team/mknfonts.git $ cd mknfonts $ make # GNUstep Make が有効になっている前提 $ cd obj $ ./mknfonts /usr/share/fonts/liberation-sans-fonts/* # liberation-sans-fonts でなくても好みのものを選べば良い $ mv 'Liberation Sans.nfont' LiberationSans.nfont # 空白が入っていると扱いづらいので、リネームしておく $ mkdir $HOME/GNUstep/Fonts # もし存在していなければ作成しておく $ sudo cp -R ./LiberationSans.nfont $HOME/GNUstep/Fonts # システム全体で共有するならば /usr/local/lib/GNUstep/Fonts に配置する $ defaults write NSGlobalDomain NSFont "LiberationSans" # フォント名は .nfont フォルダにある FontInfo.plist の PostScriptName に合わせる これで、ひとまずGUIアプリケーションも実行できるようになります。 ===== 確認のためのテストプログラム ===== 単純なパネルを表示するプログラムを書いて、実行できることを確認しておきます。 main.m: #import #import int main (void) { @autoreleasepool { [NSApplication sharedApplication]; NSRunAlertPanel (@"Does work fine?", @"Hello, world!", nil, nil, nil); } return 0; } GNUmakefile: include $(GNUSTEP_MAKEFILES)/common.make APP_NAME = PanelExample PanelExample_HEADERS = PanelExample_OBJC_FILES = main.m PanelExample_RESOURCE_FILES = include $(GNUSTEP_MAKEFILES)/application.make ビルドと実行: $ make $ openapp ./PanelExample 実行結果: {{:gnustep:screenshot_panelexample.png|PanelExample app screenshot}} 実行中に数行程度の煩わしいログが流れるかもしれません。 今の段階では無視しておくことにします。