Vala プログラミング

GNUstep プログラミング

おなが@京都先端科学大

Camlkit v0.2 & GNUstep

GhostBSD の新しい バージョン、GhostBSD-24.07.3 がリリースされました。
これまで利用していた devtools (os-generic-userland-devtools) が変更になって
います。devtools をインストールするには、以下のようにします。
 sudo pkg install -g 'GhostBSD*-dev'

Camlkit のバージョンが v0.2 にバージョンアップされました。
Foundation, AppKit とともに CoreFoundation, CoreGrahpics も、インストールした
ライブラリから利用できるようになっています。

しかしながら、このライブラリを GNUstep で利用する場合、実行時にエラーが
出ます。
これは、このライブラリに GNUstep でインプリメントされていない文が含まれているためです。これらはFoundation_globals.ml, AppKit_globals.ml 等で定義されています。

v0.1 ではこれらのファイルを修正して利用するこができましたが、v0.2 ではこれらのファイル(モジュール)がライブラリ内で読み込まれるため、修正することができません。
このため、GNUstep で利用するには、これらを修正したローカルライブラリを作成し、opam でインストールして利用します。

GNUstepのインストール
libobjc2, Foundation, AppKitライブラリ、ビルドツール、gnustepアプリケーションは、前回同様、GhostBSDのSoftware Stationからインストールします。

ビルドツールを利用するため、環境設定を行います。
Homeフォルダの .profile に以下の行を追加します。
. /usr/local/GNUstep/System/Makefiles/GNUstep.sh

CoreFoundation, CoreGraphics, CoreAnimationのライブラリは、ソースファイルからビルド、インストールします。
インストール先:/usr/local/GNUstep/Local/Library/

CoreFoundation
gnustep/libs-corebase
ビルド、インストールは以下のようにします。
./configure
gmake
sudo gmake install

このライブラリはlibdispatchライブラリに依存しているので、これを先に
インストールします。
しかしここで問題が起こります。
問題点
FreeBSD系のシステムでは、libdispatchとgnustepはconflictします。
libdispatchをインストールするとgnustepが削除されます。また逆も同様です。
そこで一旦libdispatchをインストールし、Homeフォルダにコピーしておきます。
コピーするファイル
/usr/local/include/dispatch, /os フォルダ
/usr/local/lib/libdispatch.so ファイル
その後、gnustep をインストールし、コピーしてあったdispatch 関連ファイルを戻します。
これで CoreFoundation のビルドができます。

CoreGraphics
gnustep/libs-opal
gmake
sudo -E gmake install

CoreAnimation
gmake
sudo -E gmake install

Camlkit ローカルライブラリの作成
1dune project を作成
 dune init project camlkitGS
 (camlkitGSがライブラリ名になる)
 作成時はcamlkitGS.opam は空なので、dune buildで再生成する。

2lib, test フォルダを削除
 lib, test フォルダは使用しないので、削除する。

3 必要ライブラリをコピー
 camlkitのソースファイルから必要なライブラリをコピーする。
 camlkit ソースファイルは、https://github.com/dboris/camlkit からダウンロード。
 runtime, Foundation, Appkit, Appkit_extra, camlkit, CoreFoundation,
 CoreGraphics, CoreAnimationをコピー。

4各ライブラリの修正必要なファイルの編集
 修正が必要なファイル
 各ライブラリのduneファイル
 Foundation_globals.ml
 AppKit_globals.ml
 CoreFoundation_fn.ml
 CoreFoundation_globals.ml
 CoreGraphics_fn.ml
 CoreGraphics_globals.ml
 具体的な編集箇所は以下のファイルを参照して下さい。
 https://drive.google.com/file/d/1tMgyGonrLQCiBFo2WC3STwqKoyDvNMci/view?usp=sharing


5 binフォルダをコピー
 binフォルダにあるdune, main.ml を修正する。

dune
(executable
 (public_name camlkitv02_test1)
 (name main)
   (flags -ccopt -L/usr/local/GNUstep/System/Library/Libraries -cclib -lgnustep-base -cclib -lgnustep-gui)
 (libraries Foundation AppKit))

 

main.ml
open Foundation
open Runtime
open AppKit

let win_width = 400.
let win_height = 300.

let app_window () =
  let win =
    alloc NSWindow.self
    |> NSWindow.initWithContentRect
      (CGRect.make ~x: 0. ~y: 0. ~width: win_width ~height: win_height)
      ~styleMask: Bitmask.(
        _NSWindowStyleMaskTitled +
        _NSWindowStyleMaskClosable +
        _NSWindowStyleMaskResizable)
      ~backing: _NSBackingStoreBuffered
      ~defer: false
  in
  win
  |> NSWindow.cascadeTopLeftFromPoint (CGPoint.init ~x:20. ~y:20.)
  |> ignore;
  win |> NSWindow.setTitle (new_string "Hello Caml");
  win |> NSWindow.makeKeyAndOrderFront nil;
  win

let make_button ~title ~frame ~target ~action =
  let btn = alloc NSButton.self |> NSButton.initWithFrame frame in
  btn |> NSControl.setTarget target;
  btn |> NSControl.setAction action;
  btn |> NSButton.setTitle title;
  btn

let main () =
  let _ = new_object "NSAutoreleasePool"
  and app = NSApplication.self |> NSApplicationClass.sharedApplication
  and win = app_window ()
  in
  let btn =
    make_button
      ~title:(new_string "Quit")
      ~target:app
      ~action:(selector "terminate:")
      ~frame:(CGRect.make
        ~x:10. ~y:(win_height -. 40.)
        ~width:100. ~height:30.)
  in
  win |> NSWindow.contentView |> NSView.addSubview btn;
  (*
  assert (app |> NSApplication.setActivationPolicy
    _NSApplicationActivationPolicyRegular);
  *)
    app |> NSApplication.activateIgnoringOtherApps true;
  NSApplication.run app

let () = main ()

5ビルドと実行
 ビルド、実行します。
 dune build
 dune exec ./bin/main.exe

6ライブラリのインストール
 opam ライブラリとしてインストールします。
 opam install .
 Homeフォルダの .opam/default/lib/ にインストールされる。