CMakeモジュール「FindGettext」でできることとは?使い方から代替手段まで徹底解説


CMakeのFindGettextモジュールは、GNU gettextライブラリとツールをプロジェクトに統合するためのツールです。gettextは、ソフトウェアの国際化とローカリゼーションを支援するオープンソースライブラリです。

FindGettextモジュールが提供する機能

  • gettext のバージョン情報を取得します。
  • gettext ツール (xgettext、msginit、msgmerge、msgcat、msgconv、msgfmt) の場所を検出します。
  • gettextライブラリのヘッダーファイルとライブラリファイルの場所を検出します。

FindGettextモジュールの使用方法

FindGettextモジュールを使用するには、以下の手順を実行します。

  1. プロジェクトの CMakeLists.txt ファイルに次の行を追加します。
find_package(Gettext)
  1. gettext ライブラリとツールを使用するコードを記述します。
target_link_libraries(my_program Gettext::Intl)

add_custom_target(translations
  COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o my_program.mo my_program.po
)

FindGettextモジュールの詳細

FindGettextモジュールの詳細については、以下のドキュメントを参照してください。

  • gettext ライブラリとツールは、別途インストールする必要があります。
  • FindGettextモジュールは、Unix および Windows システムでサポートされています。
  • FindGettextモジュールは、CMake 2.8 以降でのみ使用できます。

以下の例は、FindGettextモジュールを使用して、シンプルな "Hello, world!" プログラムを国際化するコードを示しています。

cmake_minimum_required(VERSION 3.0)

project(my_program)

find_package(Gettext)

set(PO_FILES my_program.po)
set(MO_FILE my_program.mo)

add_executable(my_program my_program.c)
target_link_libraries(my_program Gettext::Intl)

add_custom_target(translations
  COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${MO_FILE} ${PO_FILES}
)

add_custom_command(
  TARGET my_program
  POST_BUILD
  COMMAND ${CMAKE_EXE} --build . --target translations
)


cmake_minimum_required(VERSION 3.0)

project(my_program)

find_package(Gettext)

set(PO_FILES my_program.po)
set(MO_FILE my_program.mo)

add_executable(my_program my_program.c)
target_link_libraries(my_program Gettext::Intl)

add_custom_target(translations
  COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${MO_FILE} ${PO_FILES}
)

add_custom_command(
  TARGET my_program
  POST_BUILD
  COMMAND ${CMAKE_EXE} --build . --target translations
)

このコードは以下の処理を行います。

  1. cmake_minimum_required コマンドを使用して、CMake の最小バージョンを 3.0 に設定します。
  2. project コマンドを使用して、プロジェクトの名前を "my_program" に設定します。
  3. find_package コマンドを使用して、FindGettext モジュールを検索します。
  4. add_executable コマンドを使用して、my_program.c ファイルから実行可能ファイル my_program を作成します。
  5. target_link_libraries コマンドを使用して、my_program プログラムを Gettext ライブラリとリンクします。
  6. add_custom_target コマンドを使用して、translations という名前のカスタムターゲットを作成します。
  7. add_custom_command コマンドを使用して、translations カスタムターゲットが実行されたときに GETTEXT_MSGFMT_EXECUTABLE コマンドを実行するように設定します。このコマンドは、my_program.po ファイルを my_program.mo ファイルに変換します。
  8. add_custom_command コマンドを使用して、my_program プログラムがビルドされた後に translations カスタムターゲットが自動的に実行されるように設定します。
xgettext --language=en_US --output=my_program.po my_program.c
msgfmt -o my_program.mo my_program.po

プログラムの実行

my_program プログラムを実行するには、以下のコマンドを使用します。

./my_program


手動構成

最も基本的な方法は、Gettext ライブラリとツールのパスを手動で設定することです。 これは、CMakeLists.txt ファイルで以下の行を追加することで実現できます。

set(GETTEXT_INCLUDE_DIR "/path/to/gettext/include")
set(GETTEXT_LIB_DIR "/path/to/gettext/lib")
set(GETTEXT_MSGFMT_EXECUTABLE "/path/to/gettext/bin/msgfmt")
# ... (その他の Gettext ツールを設定)

この方法では、FindGettext モジュールを使用するよりも柔軟性が高くなりますが、Gettext ライブラリとツールのパスを自分で管理する必要があるという欠点があります。

サードパーティ製モジュール

FindGettext モジュールの機能を拡張または置き換えるサードパーティ製モジュールがいくつか存在します。

これらのモジュールを使用すると、FindGettext モジュールよりも高度な機能を利用できる場合があります。

カスタムスクリプト

Gettext 関連のタスクを自動化するために、カスタムスクリプトを作成することもできます。 これは、複雑なビルドシステムやワークフローを持つプロジェクトに適しています。

CMake 外部プロジェクト

Gettext を CMake 外部プロジェクトとして管理することもできます。 これは、Gettext を他のプロジェクトと独立してビルドおよびインストールしたい場合に役立ちます。

FindGettext の代替手段を選択する際の考慮事項

FindGettext の代替手段を選択する際には、以下の点を考慮する必要があります。

  • 移植性: サードパーティ製モジュールを使用する場合は、そのモジュールがすべてのプラットフォームで利用可能であることを確認する必要があります。
  • メンテナンス性: 手動構成を使用する場合は、Gettext ライブラリとツールのパスを自分で管理する必要があるため、メンテナンス性が低くなります。
  • プロジェクトの複雑さ: プロジェクトが複雑な場合は、FindGettext モジュールよりも高度な機能を提供するサードパーティ製モジュールまたはカスタムスクリプトが必要になる場合があります。