PaperHouse で C のライブラリをコンパイルする

1 はじめに

前回では PaperHouse を使えば簡単に C から実行ファイルをコンパイルできることを説明しました.なんと実行ファイルのほかにも, PaperHouse を使えばライブラリ (スタティックライブラリや共有ライブラリ) も同様に簡単にコンパイルできます.

2 スタティックライブラリを作る

スタティックライブラリを作るときの面倒臭さって, .a ファイルを作るための gcc のオプションやコマンド (ar と ranlib) がすぐに思い出せないことです.

PaperHouse::StaticLibraryTask はスタティックライブラリをコンパイルするための rake タスクです.PaperHouse::ExecutableTask と同じく単純なインタフェースで,gcc のオプションやコマンドを知らなくとも簡単にスタティックライブラリをコンパイルできます.

次の例は hello.c から libhello.a をコンパイルする Rakefile の例です.何もむずかしいことはありません.

PaperHouse::StaticLibraryTask.new :libhello do |task|
  task.sources = 'hello.c'
end

rake libhello で libhello.a をコンパイルできます.必要なコマンドが自動的に呼び出されていることが分かります.

$ rake libhello
gcc -H -fPIC -I. -c hello.c -o ./hello.o
ar -cq ./libhello.a ./hello.o
ranlib ./libhello.a

PaperHouse::ExecutableTask と組み合わせれば,こうしてできたスタティックライブラリに実行ファイルをリンクするのも簡単です.

task :hello => :libhello

PaperHouse::ExecutableTask.new :hello do |task|
  task.ldflags = '-L.'
  task.sources = 'main.c'
end

PaperHouse::StaticLibraryTask.new :libhello do |task|
  task.sources = 'hello.c'
end

これを Makefile で書くとなると,少し本気を出さなければいけません.でも PaperHouse を使えばこのようにとてもお手軽です.

3 共有ライブラリを作る

共有ライブラリは PaperHouse::SharedLibraryTask です.スタティックライブラリと違って共有ライブラリではファイル名にバージョン番号が必須なので,.new の第二引数にバージョン番号を渡してください.

PaperHouse::SharedLibraryTask.new :libhello, '0.1.0' do |task|
  task.sources = 'hello.c'
end

rake libhello を実行してみましょう.

$ rake libhello
gcc -H -fPIC -I. -c hello.c -o ./hello.o
gcc -shared -Wl,-install_name,libhello.so.0 -o ./libhello.so.0.1.0 ./hello.o

何も考えなくても libhello.so.0.1.0 ができました.これで共有ライブラリでもスタティックライブラリでも何でも来いです.

4 おわりに

PaperHouse でスタティックライブラリと共有ライブラリをコンパイルする方法を紹介しました.次回は,Ruby の C 拡張モジュールをコンパイルする方法です.

Tagged ,

PaperHouseでCをコンパイルする

1 はじめに

PaperHouse は C のソースコードをコンパイルするための強力な Rake タスクライブラリです.Trema の一部は C で書かれていますが,Trema はこの C で書かれた部分をコンパイルするのに PaperHouse を使っています.

PaperHouse がコンパイルできるターゲットは次の 4 つです.

  1. 実行ファイル
  2. スタティックライブラリ
  3. 共有ライブラリ
  4. Ruby の C 拡張ライブラリ

今日はこのうち,実行ファイルをコンパイルする方法を紹介します.素の Rake も十分強力ですが,PaperHouse を使えばもっと簡潔に書けることを示します.

2 実行ファイルを作る

まずは一番単純な例から見てみましょう.あるディレクトリに *.c*.h があって,これらをコンパイルして実行ファイル hello を作るには Rakefile を次のように書きます.

PaperHouse::ExecutableTask.new :hello

なんとたったの一行です.PaperHouse::ExecutableTask クラスを使うと,次の 3 つの Rake タスクが自動的に使えるようになります.

rake hello
カレントディレクトリに hello という実行ファイルをコンパイルします.
rake clean
オブジェクトファイル (*.o) を消します.
rake clobber
実行ファイル (hello) とオブジェクトファイルをすべて消します.

もちろん,(再) コンパイルでは必要なファイルだけをコンパイルします.PaperHouse は賢くて,*.c と *.h ファイルの依存関係を解析して更新したファイルと依存するファイルだけをコンパイルしてくれます.まるでうまく書かれた make ファイルのようにです.

3 rake で書くとどうなるか

ためしに,まったく同じことをする Rakefile を Rake の標準機能だけを使って書くとどうなるでしょうか?

file :hello => FileList['*.o'] do
  sh "gcc -o #{t.name} #{t.prerequisites.join ' '}"
end

rule '.o' => '.c' do |t|
  sh "gcc -o #{t.name} #{t.source}"
end

CLEAN.include '*.o'
CLOBBER.include "hello"

6 行かかりました.これとまったく同じことが PaperHouse では 1 行だけでできるのです.

4 PaperHouse の特長

今まで見てきたように,PaperHouse は Rake で C をコンパイルするときに便利な gem です.素の rake が提供してくれる文法を使うよりも,もっと短く手軽に Rakefile を書けます.

大きな特長は Pure Ruby であることです.PaperHouse に似た Ruby のツールはいくつかありますが,それらは依存関係の解析に外部ツールの力を借りています.つまり,使うためには makedepend などの別ツールを別途インストールしなくてはなりません.

一方で,PaperHouse は依存関係解析を gcc の機能だけを使って行います.仕組みの詳細は省きますが,gcc や gcc から派生したコンパイラがインストールされていさえすれば,PaperHouse をすぐに使いはじめることができます.もともと C のプログラムをコンパイルしようとしているのですから,gcc がインストールされているのは当然ですね.

Pure Ruby なので Linux や Mac でも動作します.加えて,Ruby のメジャーバージョン (2.0, 1.9.3, 1.8.7) のすべてで動作します.

5 そのほかのオプション

上で見てきた単純な例のほかに,PaperHouse::ExecutableTask は次のようなオプションもサポートします.

PaperHouse::ExecutableTask.new :hello do | task |
  task.executable_name = 'hello'
  task.target_directory = 'objects'
  task.sources = 'sources/*.c'
  task.includes = 'includes'
  task.cflags = %w(-Wall -Wextra)
  task.ldflags = "-Llib"
  task.library_dependencies = %w(sqlite3 pthread mylib)
end
  • 実行ファイル名の指定 (タスク名と異なる場合)
  • ソースファイルやヘッダファイル,オブジェクトファイルを置くディレクトリの指定
  • コンパイルオプション (CFLAGS) やリンカオプション (LDFLAGS) の指定
  • リンクするライブラリの指定

このように,Makefile でできることはほとんど PaperHouse でもできます.しかもずっと簡潔に書けるのです。

6 おわりに

ちょっとした C のプログラムを書くときには,ゴリゴリと Makefile を書くかわりに PaperHouse を検討してみてください.小規模なプロジェクトであれば PaperHouse で十分な場面も多いはずです.ぜひ試してみてください.

Tagged ,

ブログとレビュー

Trema 本の出版から 2 ヶ月が過ぎ、Trema についてのブログ記事や、本のレビューを書いてくれる方がどんどんと増えてきました。その中からとくに気になるリンクをまとめてみました。

Tagged

API の設計方針とツール

Trema の API をどのように決めているか、舞台裏を紹介します。Trema API の唯一の設計方針は「短く簡潔に書けるかどうか」ですが、具体的にはこんな方法で設計しています。

API

Continue reading

Tagged , ,

OpenFlow実践入門

  • 書名: クラウド時代のネットワーク技術 OpenFlow実践入門 (SoftwareDesign plusシリーズ)
  • 著者: 高宮安仁、鈴木一哉
  • 体裁: A5版、336ページ
  • 発売日: 2013年1月8日
  • 価格: 3,360円 (本体3,200円)
  • 発行: 技術評論社

もくじ

完全なもくじはこちら

Part 1:SDN/OpenFlow入門
  第1章:OpenFlowって何?
    1.1:ソフトウェアで思いどおりにコントロールする
    1.2:SDN: ネットワークをソフトウェアで制御しよう
    1.3:OpenFlowの仕組み
    1.4:OpenFlowのうれしさ
    1.5:OpenFlowで気をつけること
    1.6:まとめ
  第2章:OpenFlowのユースケース
    2.1:OpenFlowはアカデミア出身
    2.2:なぜOpenFlowが注目されているのか?
    2.3:ユースケースあれこれ
    2.4:まとめ
  第3章:OpenFlowの仕組み
    3.1:スイッチとコントローラ間のやりとり
    3.2:フローエントリの中身
    3.3:まとめ
  第4章:OpenFlowの開発フレームワーク
    4.1:開発フレームワークを活用しよう
    4.2:Trema
    4.3:NOX
    4.4:POX
    4.5:Floodlight
    4.6:どれを選べばいい?
    4.7:その他のツール(Cbench)
    4.8:まとめ

Part 2:OpenFlowプログラミング入門
  第5章:OpenFlowフレームワークTrema
    5.1:作ってわかるOpenFlow
    5.2:Tremaとは
    5.3:Tremaのセットアップ
    5.4:Hello, Trema!
    5.5:tremaコマンド
    5.6:即席Ruby入門
    5.7:Tremaのファイル構成
    5.8:サンプルアプリ
    5.9:まとめ
  第6章:スイッチ監視ツール
    6.1:ネットワークを集中管理しよう
    6.2:SwitchMonitorコントローラ
    6.3:即席Ruby入門
    6.4:SwitchMonitorのソースコード
    6.5:まとめ
  第7章:インテリジェントなパッチパネル
    7.1:便利なインテリジェント・パッチパネル
    7.2:OpenFlow版インテリンジェント・パッチパネル
    7.3:PatchPanelコントローラ
    7.4:即席Ruby入門
    7.5:PatchPanelのソースコード
    7.6:まとめ
  第8章:すべての基本、ラーニングスイッチ
    8.1:ラーニングスイッチとは何か?
    8.2:スイッチの仕組み
    8.3:OpenFlow版スイッチ(ラーニングスイッチ)の仕組み
    8.4:LearningSwitchコントローラ
    8.5:即席Ruby入門
    8.6:LearningSwitchのソースコード
    8.7:まとめ
  第9章:トラフィックモニタ
    9.1:トラフィック情報を収集しよう
    9.2:TrafficMonitorコントローラ
    9.3:実行してみよう
    9.4:即席Ruby入門
    9.5:TrafficMonitorのソースコード
    9.6:まとめ
  第10章:シンプルなルータ(前編)
    10.1:ルータとスイッチの違いは?
    10.2:イーサネットだけならルータは不要?
    10.3:ルータの動作
    10.4:SimpleRouterのソースコード
    10.5:まとめ
  第11章:シンプルなルータ(後編)
    11.1:宛先ホストをまとめる
    11.2:ネットワーク宛てのエントリをまとめる
    11.3:RoutingTableのソースコード
    11.4:実行してみよう
    11.5:まとめ
  第12章:Tremaのアーキテクチャ
    12.1:OpenFlow先生が家にやってきた
    12.2:trema runの裏側
    12.3:Switch Manager
    12.4:Switch Daemon
    12.5:仮想ネットワーク
    12.6:Trema Cライブラリ
    12.7:低レベルデバッグツールTremashark
    12.8:Trema Apps
    12.9:まとめ

Part 3:ケーススタディ〜本格的なOpenFlowアプリケーション
  第13章:生活ネットワークをOpenFlowに移行する
    13.1:どんどん規模を広げていこう
    13.2:大ケガしないためのヘルメット
    13.3:私たちの失敗談
    13.4:OpenFlowへの移行パターン
    13.5:逆流防止フィルタ
    13.6:まとめ
  第14章:いくつものスイッチをルーティングスイッチで制御する
    14.1:美しい大規模ネットワーク
    14.2:複数のスイッチを制御する
    14.3:実行してみよう
    14.4:OpenFlowを使う利点
    14.5:まとめ
  第15章:スライス機能付きスイッチでネットワークを仮想化する
    15.1:クラウドサービスを作るには
    15.2:スライスとは何か?
    15.3:スライスによるネットワーク仮想化
    15.4:実行してみよう
    15.5:REST APIを使う
    15.6:OpenStackと連携する
    15.7:まとめ
  第16章:データセンター基盤をTremaで作る
    16.1:フリーソフトウェアでIaaS基盤を作ろう
    16.2:Wakame-VDC
    16.3:エッジによるネットワーク仮想化
    16.4:Wakame-VDCの全体アーキテクチャ
    16.5:なぜTremaを選んだのか
    16.6:まとめ
  第17章:OpenFlowでデータセンターをつなげる
    17.1:GoogleはOpenFlowを導入済み!
    17.2:WAN 回線を効率的に使うには?
    17.3:GoogleのWAN回線のしくみ
    17.4:まとめ

Appendix:
  Appendix A:2,000円でOpenFlowスイッチをDIY
    A.1:一家に1台、OpenFlowスイッチ
    A.2:OpenFlow化のしくみ
    A.3:OpenFlow化の手順
    A.4:Tremaとつないでみよう
    A.5:自作OpenFlowスイッチの制限
    A.6:まとめ
  Appendix B:Tremaでテスト駆動開発
    B.1:天才プログラマ達の伝説
    B.2:奥義、ソフトウェアテスト
    B.3:リピータハブの動き
    B.4:どこまでテストするか?
    B.5:リピータハブのテスト戦略
    B.6:最初のテスト
    B.7:パケット受信をテストする
    B.8:フローエントリのテスト
    B.9:再びパケットの受信をテスト
    B.10:まとめ

リピータハブを Trema, POX, NOX, Floodlight で書いてみた

主な OpenFlow フレームワーク 4 種類でリピータハブを実装してみました。さあ結果はどうなるか!? フレームワークごとの違いをお楽しみください。

Continue reading

Tagged , , ,

とれま塾

OpenFlow や SDN 一般に関する議論のための場所を作りました。誰でも参加できます。

# 2012/11/30 名前を『とれま寺』に変更しました。

Continue reading

DSL に書けること

仮想ネットワーク DSL は、Trema で書いたコントローラを仮想的に実行できる仮想ネットワークの構成を定義するのに使われます。今回は、この DSL で記述できる主なことを紹介します。

Continue reading

Tagged

Trema 自体のテスト

Trema は 3種類のテストフレームワークを使って網羅的にテストされています。今回はこのテストの概要を説明します。

Continue reading

Tagged , , ,

仮想ネットワークで任意のアプリを動かす

最近の Trema では、仮想ネットワークに network namespace をつなげることができるようになりました。この機能を使うと、Trema の標準的な仮想ホスト (vhost) だけでなく iperf など任意のアプリケーションでコントローラをテストできるようになります。

Continue reading

Tagged , ,