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/ にインストールされる。