はじめに
以前 https://github.com/syuu1228/fedora-chroot-image を使わせて頂いて,OSv をビルドできる環境を整えた.
で,自分で書いたC のHello World を動かそうとしてうまくいかなくて終わったような気がする.
今回こそはC のHello World を動かす.
最新版のコードをビルドする
自分の環境は2,3ヶ月放置していたものなので,まずはOSv の最新のコードをpull してくる.
まぁ,pull してmake すればいいだろうと軽い気持ちでpull し始めたわけだが…
chroot 環境で
# cd /root/osv
# git pull
とりあえず何も考えずにmake 叩く
# make
ばばーん
...(中略)
make[1]: Entering directory `/root/osv/build/release.x64'
/root/osv/build.mk:928: *** Error: libstdc++.a needs to be installed.. Stop.
make[1]: Leaving directory `/root/osv/build/release.x64'
make: *** [all] Error 2
新しいライブラリが必要になっているみたいなので,それをインストール
# yum install libstdc++-static.x86_64
もう一回make
# make -j7
ばばーん(2回目)
...(中略)
CC libc/errno/strerror.o
/root/osv/libc/errno/strerror.c:12:45: fatal error: ../../musl/src/errno/__strerror.h: No such file or directory
#include "../../musl/src/errno/__strerror.h"
^
compilation terminated.
CC libc/locale/duplocale.o
make[1]: *** [libc/errno/strerror.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make[1]: Leaving directory `/root/osv/build/release.x64'
make: *** [all] Error 2
サブモジュールが増えてるらしい.
サブモジュールもちゃんとアップデートする.
# git submodule update --init --recursive
3度目の正直
# make -j7
ばばーん
...(中略)
make[3]: Leaving directory `/root/osv/modules/lua/build/luarocks-2.1.2'
out/bin/luarocks install luasocket 3.0-rc1
Warning: Failed searching manifest: Failed loading manifest: Failed extracting manifest file
Installing http://luarocks.giga.puc-rio.br/luasocket-3.0rc1-1.src.rock...
Using http://luarocks.giga.puc-rio.br/luasocket-3.0rc1-1.src.rock... switching to 'build' mode
Error: Failed unpacking rock file: /tmp/luarocks_luarocks-rock-luasocket-3.0rc1-1-2801/luasocket-3.0rc1-1.src.rock
make[2]: *** [out/lib/lua/5.2/socket/core.so] Error 1
make[2]: Leaving directory `/root/osv/modules/lua'
Traceback (most recent call last):
File "/root/osv/scripts/module.py", line 239, in <module>
args.func(args)
File "/root/osv/scripts/module.py", line 196, in build
make_modules(modules, args)
File "/root/osv/scripts/module.py", line 100, in make_modules
raise Exception('make failed for ' + module.name)
Exception: make failed for lua
make[1]: *** [process-modules] Error 1
make[1]: Leaving directory `/root/osv/build/release.x64'
make: *** [all] Error 2
要らないファイルが残ってたらしい.
とりあえずmake clean, git clean した.
# make clean
# git clean -xdf
で解決.
4度目の正直
# make -j7
でやっとビルドができた.
これでスタート地点.
リハビリ: Java のHello World の組み込み型を思い出す
参考URL https://github.com/cloudius-systems/osv-apps/tree/master/java-example
- 最低限必要なファイルは以下の模様.
- Hello.java
- Makefile
- module.py
- usr.manifest
- Hello.java
Hello.java
Java プログラムの本体
public class Hello{
public static void main(String args[]){
System.out.println("Hello");
}
}
Makefile
特に難しいところはなさそう.
普通と違うのは
module: Hello.class
の行くらいか?module: Hello.class
%.class: %.java
javac $^
clean:
rm -rf *.class
module.py
デフォルトの起動コマンドや引数を指定しているっぽい.
from osv.modules import api
api.require('java')
default = api.run_java(classpath=['/my-example'], args=['Hello'])
usr.manifest
これはあんまりわかってない.
/my-example/Hello.class: ${MODULE_DIR}/Hello.class
ビルド&実行
ここでは,my-example というイメージ名で上記のプログラムを組み込んだイメージを作る.
上記4つのプログラムをapps/my-example 以下に置く.
osv のルートディレクトリで以下のコマンドを実行.
make image=my-example
scripts/run.py
本題: C のプログラムを組み込む
memcached をビルドしてみる
参考にしているmemchached のソースツリーにあるMakefile を見てみると,make 時にusr.manifest などを作成しているらしい.
作成した後の状態を見たいので,まずはこれをビルドしてみる
ビルドしようとしたら,あれこれ無いと言われるのでインストールする
# yum install libevent-devel.x86_64
僕がビルドしたときは,apps/memcached/src が空っぽだった.
本来はここにソースコードがダウンロードされるはずなのだが,何かが原因でうまくダウンロードされていなかったみたい.
これは,以下のようにmemcached ディレクトリをclean すれば解決した.
# pushd apps/memcached/
# make clean
# popd
memcached のビルド完了
Makefile
色々見た結果,気をつけないといけなさそうなのはMakefile のCFLAGS くらいに見える.
memcached では以下のように指定されている.
CFLAGS = -std=gnu99 -fpie -rdynamic -DHAVE_CONFIG_H
CFLAGSのオプション
- -std=gnu99
- C99+GNU拡張
- -fpie
- 位置独立実行形式(Position-Independent Executalbe)
ちなみに,共有ライブラリをコンパイルするときの-fpicは位置独立コード(Position-Independent Code) - rdynamic
- 動的リンク可能なバイナリを作る
- -DHAVECONFIGH
- …よくわからん
たぶん,-DHAVECONFIGH はmemcached 特有な気がするので,今回のHello World アプリからは削除.
最終的なコード
あとは,細々した要らないところを消していくだけで動いた.
最終的なコードは以下の通り.
(以下のdiff のルートディレクトリはapps/ なので注意)
---
native-example/Makefile | 10 ++++++++++
native-example/hello.c | 6 ++++++
native-example/module.py | 3 +++
native-example/usr.manifest | 1 +
4 files changed, 20 insertions(+)
create mode 100644 native-example/Makefile
create mode 100644 native-example/hello.c
create mode 100644 native-example/module.py
create mode 100644 native-example/usr.manifest
diff --git a/native-example/Makefile b/native-example/Makefile
new file mode 100644
index 0000000..0271bcb
--- /dev/null
+++ b/native-example/Makefile
@@ -0,0 +1,10 @@
+.PHONY: module
+module: hello
+
+CFLAGS = -std=gnu99 -fpie -rdynamic
+
+hello: hello.c
+ $(CC) -pie -o $@ $(CFLAGS) $(LDFLAGS) hello.c
+
+clean:
+ rm -f hello
diff --git a/native-example/hello.c b/native-example/hello.c
new file mode 100644
index 0000000..be1cf2b
--- /dev/null
+++ b/native-example/hello.c
@@ -0,0 +1,6 @@
+#include <stdio.h>
+
+int main(){
+ printf("Hello from C code\n");
+ return 0;
+}
diff --git a/native-example/module.py b/native-example/module.py
new file mode 100644
index 0000000..16c9bae
--- /dev/null
+++ b/native-example/module.py
@@ -0,0 +1,3 @@
+from osv.modules import api
+
+default = api.run("/hello")
diff --git a/native-example/usr.manifest b/native-example/usr.manifest
new file mode 100644
index 0000000..b79ddd9
--- /dev/null
+++ b/native-example/usr.manifest
@@ -0,0 +1 @@
+/hello: ${MODULE_DIR}/hello
--
1.9.3
以上で,C のHello World をOSv に組み込めました.
おわりに
実は上記のようなCで書かれたHello Worldをポーティングするようなサンプルコードはこれまでosv-apps のリポジトリになかった.
そこで,syuu先生の勧めで上記のパッチをOSvのメーリングリストに送ってみたところめでたくマージされた.
--
My Emacs Files At GitHub
0 件のコメント:
コメントを投稿