雑記帳

ちょっとした文章とかメモ書きとか。

boost::filesystemが凄い。

boostライブラリに挑戦中です。
Kernelの自前構築後にする作業がめんどくさいので、
boost::filesystemを使ってコードを書いてみた。

というエントリです。

対象環境は

  • Ubuntu 11.04 (Natty)
  • boost1.42.0
  • Kernel 2.6.39.3
  • gcc 4.4.5(CUDA等の諸事情により)

です。
カーネルを自前構築してシンボリックリンクをプログラムに貼らせてしまえ〜
となんとも横着なエントリ。

以下<>は全角です。半角に直してからコンパイルして下さい。

kernelLink.cpp

#include <iostream>
#include <string>
#include <sys/utsname.h> //Kernel名を取得するためのヘッダー
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;

int main(void)
{
  //Kernel名を取得する
  struct utsname uts;
  uname(&uts);
  string kernel_version = uts.release;
  path lib = "/lib/modules";
  path headers = "/usr/src/linux-headers-";
  //path型では文字列演算が出来ないので変換
  string src = headers.string();
  //kernelの位置へのパス
  src += kernel_version;

  //シンボリックリンクの中身
  path to = src;
  //シンボリックリンクを作成するディレクトリ
  path from = lib / kernel_version / "build";
  //シンボリックリンクを貼る  
  //存在しているものには上書き出来ないので一旦消してから書き込み
  if(exists(from)){
	char ch;
	do{
	  cout << "Do you want to overwrite symblic link \"" << from << "\"?(Y/N)" << endl;
          cin >> ch;
	  if(ch == 'N' || ch == 'n'){
		cout << "stoppped." << endl;
		return -1;
	  }
	}while( ch != 'Y' && ch != 'y');
	remove( from );
  }
   create_symlink( to, from );

  return 0;
}

Makefile

CXX = g++
LIB = -lboost_filesystem
source = kernelLink.cpp
TARGET = KernelLink

KernelLink:
	$(CXX) -o $(TARGET) $(source) $(LIB)

clean:
	rm $(TARGET)

以下のコマンド

$make
$sudo ./KernelLink

でお目当てのフォルダにbuildシンボリックリンクが貼られます。

では。

ところでKernel3.0でコンパイルが通らないのはサポート対象外だからですかね…

別PCでコンパイルしたものに実行許可を与えたものを実行するとKernel3.0のUbuntu11.04でも同じように動きましたとさ。
(そりゃファイルシステムが同じext4ですものね…)

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。