タイトル/名前 | 更新者 | 更新日 |
---|---|---|
技術/Linux/localeメモ | msakamoto-sf | 2009-11-18 12:42:39 |
C言語系/memos/pkg-config | msakamoto-sf | 2009-11-18 11:41:42 |
日記/2009/11/18/自覚していた以上にdeepにmentalがbreakしてたみたい。 | msakamoto-sf | 2009-11-18 02:56:06 |
C言語系/memos/libtool | msakamoto-sf | 2009-11-18 01:17:46 |
C言語系/memos/automake | msakamoto-sf | 2009-11-18 00:01:34 |
C言語系/memos/autoconf | msakamoto-sf | 2009-11-17 22:17:23 |
日記/2009/11/16/autoconf,automake,libtoolsのチュートリアル本さがしてるのだけど・・・ | msakamoto-sf | 2009-11-16 22:37:14 |
C言語系/memos/gmake | msakamoto-sf | 2009-11-16 18:29:26 |
技術/vim/vimrc | msakamoto-sf | 2009-11-16 14:18:52 |
日記/2009/11/15/「作りながら学ぶOSカーネル」読了・・・一応。 | msakamoto-sf | 2009-11-16 13:47:26 |
Linux locale の自分用メモ
出典:
ロカール名の構造:
language[_territory][.codeset][@modifier]
language | 言語名 : ISO 639 で定義された言語コードの小文字(2文字) |
territory | 国家名 or 地域名 : ISO 3166 で定義された国/地域コード大文字2文字 |
codeset | IANA定義の文字コード名 |
modifier | 任意の修飾子 |
※プログラムの起動時は常に"C"or"POSIX"ロカールとなっている。変更するにはsetlocale(3)を呼ぶ必要がある。"POSIX"ロカールは"C"ロカールと同じで、基本的に英語のみ使用可能なロカールである。
なお省略や別名定義が行われている場合もあり、"ja_JP.UTF-8"なら"ja_JP", "ja.UTF-8", "ja", さらには"japanese"ロカールが準備されている場合もある。
カテゴリ:通常は環境変数として、"LC_XXYY=ja_JP.UTF-8"のように設定する。
ロカール定義情報の確認 : localeコマンドで確認できる。
$ locale -a # 現在システムにインストールされているロカールの一覧 C POSIX aa_DJ aa_DJ.iso88591 ...
$ locale -m # 利用可能な文字コードの一覧 ANSI_X3.110-1983 ANSI_X3.4-1968 ...
# 幾つかのキーを指定して取得 $ LC_ALL=zh_CN.UTF8 locale -k yesexpr day yesexpr="^[yY是]" day="星期日;星期一;星期二;星期三;星期四;星期五;星期六" $ LC_ALL=en_US locale -k yesexpr day yesexpr="^[yY].*" day="Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday" $ LC_ALL=ja_JP.UTF8 locale -k yesexpr day yesexpr="^([yYyY]|はい|ハイ)" day="日曜日;月曜日;火曜日;水曜日;木曜日;金曜日;土曜日"
基本:
char *setlocale(int category, const char *locale);
全てのカテゴリで"ja_JP.UTF-8"を設定:
setlocale(LC_ALL, "ja_JP.UTF-8");
ロカール名は環境変数から取得:
setlocale(LC_ALL, "");
現在のロカール名を取得:
char *current = NULL; current = setlocale(LC_CTYPE, NULL);
ロカール名を環境変数から取得する場合、具体的にどの環境変数を検査するのかは実装依存となる。
glibcの場合は以下の順序で環境変数を検査し、最初に見つかった値を使う。
ロカール名として不正であれば、setlocale()はNULLを返す。
pkg-configの自分用メモ
ライブラリなどのパッケージ毎に、インストール先やコンパイル/リンクオプションを定義したメタデータファイルを用意しておき、
$ gcc -c `pkg-config --cflags gtk+-2.0` -o foo.o foo.c $ gcc `pkg-config --lflags gtk+-2.0` -o gtktest foo.o
のように組み込む事で、コンパイルオプションやリンクオプションを展開してくれる開発ツールである。
対応するメタデータファイルは、"パッケージ名" + ".pc"となり、上の例だと"gtk+-2.0.pc"が後述のメタデータファイル読み込みディレクトリに存在する必要がある。
単独で使用してみるとどう展開されるかが確認できる。
$ pkg-config --cflags gtk+-2.0 -I/usr/include/gtk-2.0 \ # ここからは/usr/lib/pkgconfig/gtk+-2.0.pc で定義されている # 依存パッケージを辿って出力される"-I"オプション -I/usr/lib/gtk-2.0/include \ -I/usr/include/atk-1.0 \ (...) -I/usr/include/libpng12
$ pkg-config --libs gtk+-2.0 -L/lib \ -lgtk-x11-2.0 \ # ここからは/usr/lib/pkgconfig/gtk+-2.0.pc で定義されている # 依存パッケージを辿って出力される"-l"オプション -lgdk-x11-2.0 \ (...) -lglib-2.0
他:
パッケージのバージョン取得: $ pkg-config --modversion libssl 0.9.8b 最小バージョンのチェック(プロセス終了時の戻り値で判別): $ pkg-config --atleast-version 0.9.7 libssl $ echo $? 0 $ pkg-config --atleast-version 0.9.9 libssl $ echo $? 1 バージョンの正確な一致チェック(プロセス終了時の戻り値で判別): $ pkg-config --exact-version 0.9.8 libssl $ echo $? 1 $ pkg-config --exact-version 0.9.8b libssl $ echo $? 0 最大バージョンのチェック(プロセス終了時の戻り値で判別): $ pkg-config --max-version 0.9.10 libssl $ echo $? 0 $ pkg-config --max-version 0.9.7 libssl $ echo $? 1
CentOS 5.2, pkgconfig-0.21 の構成:
$ rpm -ql pkgconfig /usr/bin/pkg-config /usr/lib/pkgconfig /usr/share/aclocal/pkg.m4 /usr/share/man/man1/pkg-config.1.gz /usr/share/pkgconfig
シンプルな構成になっている。"*.pc"ファイルは次のディレクトリから検索される。
/usr/lib/pkgconfig /usr/share/pkgconfig
なおこの2ディレクトリは、pkg-configをコンパイル・インストールする時のオプションによって変わる。上記値はあくまでもCentOS 5.2におけるpkgconfigの値である。
PKG_CONFIG_PATH環境変数が設定されている場合は、先にPKG_CONFIG_PATHを検索した後、上記2ディレクトリを検索する。
PKG_CONFIG_PATHに複数ディレクトリを設定する場合は、UNIX系なら":"(カンマ), Windowsなら";"(セミコロン)で区切る。
configure.acに、次のm4マクロを組み込む。
PKG_CHECK_MODULES(VARIABLE-PREFIX,MODULES[,ACTION-IF-FOUND,[ACTION-IF-NOT-FOUND]]) → MYSTUFF_LIBS と MYSTUFF_CFLAGS にそれぞれ "--libs", "--cflags" の展開値がセットされる。
例:
PKG_CHECK_MODULES([MYSTUFF], [gtk+-2.0 >= 1.3.5 libxml = 1.8.4]) ... PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.0.0, have_gtk=yes, AC_MSG_ERROR(Cannot find GTK+ 2.0)) echo "have_gtk=$have_gtk" ...
Makefile.amに組み込む時は、"***_LIBS", "***_CFLAGS"を使えば良い。
configure.ac :
PKG_CHECK_MODULES(GTK, ...)
Makefile.am :
bin_PROGRAMS = gtktest gtktest_SOURCES = gtktest.c gtktest_LDADD = @GTK_LIBS@ gtktest_CFLAGS = @GTK_CFLAGS@
※"XXYY_CFLAGS"を追加すると "Makefile.am: required file `config/compile' not found" というエラーになった場合は、"automake -a -c"すると良い。"compile"サポートスクリプトがコピーされ、Makefile.inも正常に生成される。
なお単純にpkg-configプログラムの存在チェックだけを行いたい場合は、次のm4マクロをconfigure.acに組み込む。
PKG_PROG_PKG_CONFIG([MIN-VERSION])
ライブラリのパッケージなどを開発しており、pkg-configサポートとして独自のメタデータファイルを作成したい場合はAutoconfを利用すると良い。
具体的には、メタデータファイル名を"libfoo.pc"とすれば、configure.acのAC_CONFIG_FILESに"libfoo.pc"を追加し、
AC_CONFIG_FILES(Makefile) ↓ AC_CONFIG_FILES(Makefile libfoo.pc)
さらに"libfoo.pc.in"ファイルを準備する。libfoo.pc.in ファイル中ではMakefile.inと同様の"@変数名@"が利用できる。
これにより、"./configure"コマンドによりMakefileと同様にlibfoo.pcファイルも生成され、"@変数名@"は適切に置換される。
このようにしておけば、ファイルのインストール先や各種オプションがメタデータファイルに適切に同期される。
数日前の話になるが、先週の金曜日、近くのメンタルクリニックに行って診てもらってきた。
いろいろ症状とか不安感だとか喋ってるうちに、ふと子供の頃からずーっと意識せずになんとなく行ってきたクセについて話した。どういうクセかというと、外を歩いている時、自分のすぐ前・後ろの電柱だとか、ガードレールだとか、扉とか建物の角とか、そうした「区切り」点みたいなところで、目の前の両側の区切り点を結ぶ「線」を意識してしまって、それを「意識して踏みつけるか、またぐ」ように歩いているクセ。
うーん非常に文章にしずらいのだけれど、とにかく、外を歩いている時間の半分くらいは「あ、この線を踏み越えたら次はあそことあの電柱を結ぶ線を」が延々と意識の底で処理され続けている。
もっとも人と話している時とか、深く考え事をしていたりする時、ぼーっと歩いているだけの時などは全く意識しないし、室内でも意識されない。
・・・てなことを喋ったら。
「強迫神経症か鬱病で診断書作成しましょうか?」
とか言われた。・・・え・・・適応障害じゃなくて・・・?
「あなたの場合、ご自身で思っている以上に本来攻撃的というか、アグレッシブな性質があるんですが、それをかなり押さえ込んで今まで生活してきてるようです。」
・・・!お、思い当たる節が・・・ありすぎる・・・!!
自覚している以上に、「~でなければならない」でがんじがらめにしていたっぽい。
実はその時は話さなかったのだけれど、これに加えて自分はかなり深爪をしている。普通の爪切りではなくて、プラモデルを作ったりする時に使うニッパーという工具でかなり深めに爪を切ってる。
・・・のみならず、実は、指先の薄皮もニッパーで「剥いで」たりします・・・。
いや、お風呂入った後とか、指先ふやけて皮膚とか白くなって盛り上がるじゃないですか。
そこを、ぱちぱちとニッパーで「毟り取る」、んで、ほんのり赤い薄皮だけになるとようやく「ほっ」とするわけです。
・・・こ、これもかー!!!
というか、歩くクセにせよ、深爪を通り越して指先の皮を剥く行為にせよ、小学校高学年の時点で既に日常になっていたんですが・・・!!
いや、なんというか。うん・・・無理してたんだね、自分。
GNU Libtoolの自分用メモ
Libtoolは共有ライブラリに関する処理(compile/link/install, etc...)をエレガントに行えるようになっている。
コンパイル : 非PIC版がカレントディレクトリに、PIC版が".libs/"以下に生成される。
$ libtool --mode=compile gcc -c foo.c -o foo.lo
(foo.lo はlibtoolが扱うメタデータ用テキストファイル)
ライブラリの作成 : ".libs/"以下に静的ライブラリ(*.a)と共有ライブラリ(*.so)の両方が作成される。
$ libtool --mode=link gcc -o libfoo.la foo.lo -rpath /usr/lib
(libfoo.la はlibtoolが扱うメタデータ用テキストファイル, "-rpath"は共有ライブラリの生成指示であり、同時に共有ライブラリのインストール先を指定している)
実行可能形式の作成 : カレントディレクトリに作成されるのはラッパースクリプトで、実際のバイナリは".libs/"以下に生成される。
$ libtool --mode=compile gcc -c main.c -o main.lo $ libtool --mode=link gcc -o main main.lo -L. -lfoo
インストール : 実際のバイナリのコピー、ライブラリのシンボリックリンクの生成などが行われる。
$ libtool --mode=install install -m644 libfoo.la /install/path $ libtool --mode=install install -m755 main /install/path $ libtool --finish ("-rpath"に指定したディレクトリ) # optional, ldconfigの実行など
生成したファイルの削除 :
$ libtool --mode=clean rm -f *.lo *.la main
"link"モードで "-version-info" オプションにより指定する。
$ libtool --mode=link ... -version-info <current>:<revision>:<age>
soファイルのバージョン番号は、次のように若干組み替え・並び替えてつけられる。
libXXYY.so.(<current>-<age>).<age>.<revision>
例:
$ libtool --mode=link ... -version-info 3:2:0 → libXXYY.so.3.0.2 $ libtool --mode=link ... -version-info 3:2:1 → libXXYY.so.2.1.2
"<current> - <age>"となる理由は、サポートするバージョン番号の範囲の最小を指定する為である。"3:2:1"なら、バージョン番号2でも動作する。ということは、libXXYY.so.2.x.x というファイル名でも動く必要がある。このような事情で、".so"に続く1番目のメジャー番号は"<current>-<age>"となっている。
configure.acが用意されている状態を前提とする。
Autoconfへの組み込み:
Makefile.amへの組み込み:
例:
bin_PROGRAMS = testmain testmain_SOURCES = main.c testmain_LDADD = libfoo.la lib_LTLIBRARIES = libfoo.la libfoo_la_SOURCES = foo.c libfoo_la_LDFLAGS = -version-info 3:2:0
以下、GNU Libtool HTMLドキュメントでの主な見出しをポイントしておく。(見出しの番号については2009/11時点のものなので、将来変更される可能性がある)
GNU Automakeの自分用メモ
Automakeは基本的には以下の2大機能を提供する。
基本的な流れとしては以下の順序になる。
automakeはconfigure.acを読み込んでm4マクロを実行するが、Automakeが提供するm4マクロはそのままでは見つからないので実行できない。そこで、aclocalにより、configure.ac中で出てくる(Autoconf以外の)外部マクロをaclocal.m4に集約する。これにより、Automakeの提供するm4マクロはaclocal.m4に含まれる事になり、automakeにより実行可能となる。
なおautomake実行時にINSTALL, COPYINGの2ファイルが存在しないと"not found"エラーになる。そういう場合は、
automake -a -c
とすることでとりあえず自動的に用意する事ができる。他の"README"や"NEWS"などは手動で用意する必要がある。
また、"install-sh"なども自動的に追加されるようになるが、そうしたサポートスクリプトを追加するディレクトリを分けたい場合は、configure.acに
AC_CONFIG_AUX_DIR(ディレクトリ名)
と、AM_INIT_AUTOMAKEの前に指定する。
※なおGNU Automake HTMLドキュメントには、「aclocalは本来はAutoconfの機能に含まれるべきなので、将来的にはAutomakeからは無くなるかも」という記述がある。
以下、GNU Automake HTMLドキュメントでの主な見出しをポイントしておく。(見出しの番号については2009/11時点のものなので、将来変更される可能性がある)
GNU Autoconfの自分用メモ
以下はGNU Autoconf HTMLドキュメントより抜粋したファイル関連図。"*"付がコマンド実行、"[]"囲みはオプショナルファイル or コマンド実行を表す。
step1 : autoscan実行からconfigure.acの準備まで
your source files --> [autoscan*] --> [configure.scan] --> configure.ac
step2 : configure.ac, Makefile.in の準備から autoconf/autoheaderの実行, configureスクリプトの生成まで
configure.ac --. | .------> autoconf* -----> configure [aclocal.m4] --+---+ | `-----> [autoheader*] --> [config.h.in] [acsite.m4] ---' Makefile.in -------------------------------> Makefile.in
※aclocalはGNU Automakeに含まれるツールなので、当メモでは取り上げない
step3 : configureスクリプトの生成以降
.-------------> [config.cache] configure* ------------+-------------> config.log | [config.h.in] -. v .-> [config.h] -. +--> config.status* -+ +--> make* Makefile.in ---' `-> Makefile ---'(全て表示する)
autoconf/automake/libtoolsのチュートリアルor解説本を探している。
これがそうかな?と思ったのだけれど・・・
GNU Autoconf/Automake/Libtool
カスタマーレビューが良くない。amazon.comの方で原著である
GNU Autoconf, Automake, and Libtool (Circle)
を見てみると、amazon.co.jp側と同様なカスタマーレビューが載っていた。原著のレベルで、あまり評判がよろしくないのかもしれない。
じゃあこっちかな、と見てみたが・・・
Autotools: A Developer's Guide to Gnu Autoconf, Automake, and Libtool
2009/11/28発売、ということで予約待ちになっている。発売後、amazon.com側のカスタマーレビューを確認してから購入是非を考えても遅くはない。
amazon.com側も見て回ったのだけれど、中々autoconfなどのautotools系のガイド本が少ないようだ。
実は自分は以下の本を読み始めているのだが、意外と良書かも知れない。autoconf/automake/libtoolsについても、簡単ながらもチュートリアル形式で使い方のイロハが書かれていて、ちょうどこれから読み進める所だ。
まずはこっちを読み切ってからでも良いかもしれない。もともとPHPのconfigure周りを把握したいだけなので、細かいhowtoやcaseを突っ込んで知りたいわけではない。
GNU make コマンドの使い方を自分用にメモしておく。
なお、十人十色に書かれた「Makefileの書き方」ドキュメントが既に広くWeb上に存在する。
従ってこちらのメモでは、Makefileの細かい部分までメモする事はなく、あくまでも自分用のざっくりとしたリファレンスとして書き付けておく。
特に記述がない場合はCentOS 5.2 の GNU Make 3.81 のmanページを元にしている。その他のUNIX環境やWindowsのmakeについてはそれぞれ独自の機能拡張、あるいはGNU Makeにのみ実装されている機能、などがあると思うので、特に自動定義の変数や拡張子(SUFFIXES)に応じた事前定義のルールについてはそれぞれの環境で、都度manやドキュメントを調べる必要がある。
Linuxで使用可能な .vimrc. 人から貰った。
文字コードの自動判定辺りは、
周りから引き継がれた模様。
ようやく読み終わりました。
アセンブラや、C言語とアセンブラの連携は何となく分かる・・・その上で、OSやカーネルに興味があるけどそもそもx86アーキテクチャを知らない・・・という自分には丁度良い入門書だったと思います。
ただ不満点というか・・・個人的に理解しきれなかったというか。
1-4,5章くらいまでは、x86の機能を一つずつ取り上げて、「小さなコードでサンプル実行」→「あ、なるほど~」と理解できました。しかし7章になって、1-6章までの機能+7章でのタスクスイッチングの機能の全部入りのソースコードになってしまい、追いづらく+弄りづらく+デバッグしづらくなってしまいました。7章以降はタスクスイッチングやページングなど重めの機能を取り上げている事もあるので、どうしてもサンプルコードが複雑になるのは仕方ないとは思うのですが、もうちょっと「小さく作って実験→理解してから大きく作る」という流れは維持できなかったかなぁ~とその点が残念です、というか理解しきれなかった自分が悔しいなぁと。
ただ、こちらの本を併せて読めば、↑で理解しきれない部分もとりあえず図入りで解説されていたりします。まさに「あわせて読む」で効果が実感できた本です。
こちらのサンプルコードは、MS-DOS時代のものなので今や動かせません。ただし「作りながら学ぶ~」の方は9章を除く全てがアセンブラで書かれているのに対し、こちらはアセンブラとCの混在、ということで、C言語の部分は若干読みやすく・理解しやすくなっているように思われました。動かす事はできませんが、「あ、『作りながら学ぶ~』で全部アセンブラで書かれていたところが、こっちの本ではこんな風にアセンブラとC言語に分けて書いてあるんだな~」という読み方をして楽しむ事はできると思います。