CMake と gettext の連携: 国際化とローカライズ (i18n & l10n) を容易に

2024-04-02

CMake Modules の FindGettext プログラミング解説

FindGettext は、CMake モジュールの一つで、GNU gettext ライブラリとツールを見つけ、ビルドプロジェクトで使用できるようにするためのものです。gettext は、国際化とローカライズ (i18n & l10n) をサポートするためのライブラリとツール群を提供します。

FindGettext は以下の機能を提供します。

  • gettext ランタイムライブラリ (LGPL) とヘッダーファイルの検索
  • gettext ツール (xgettext、msginit、msgmerge、msgcat、msgconv、msgfmt) の検索
  • gettext 関連の変数の設定
    • GETTEXT_INCLUDE_DIR: gettext ヘッダーファイルのパス
    • GETTEXT_LIBRARIES: gettext ライブラリのパス
    • GETTEXT_INTL_LIBRARY: gettext インターナショナルライブラリのパス
    • GETTEXT_RUNTIME_FOUND: gettext ランタイムライブラリが見つかったかどうか
    • GETTEXT_INFO_MSG: gettext に関する情報メッセージ
    • GETTEXT_XGETTEXT_EXECUTABLE: xgettext ツールのパス
    • GETTEXT_MSGINIT_EXECUTABLE: msginit ツールのパス
    • GETTEXT_MSGMERGE_EXECUTABLE: msgmerge ツールのパス
    • GETTEXT_TOOLS_FOUND: gettext ツールが見つかったかどうか
    • GETTEXT_FOUND: gettext ランタイムライブラリとツールが見つかったかどうか

FindGettext は、CMake の find_package() コマンドを使って使用できます。

find_package(Gettext REQUIRED)

# gettext ヘッダーファイルのインクルード
include_directories(${GETTEXT_INCLUDE_DIR})

# gettext ライブラリとのリンク
target_link_libraries(your_target ${GETTEXT_LIBRARIES})

FindGettext は、デフォルトでいくつかのパスを検索しますが、GETTEXT_SEARCH_PATH 変数を設定することで、検索パスをカスタマイズできます。

set(GETTEXT_SEARCH_PATH /usr/local /opt)

find_package(Gettext REQUIRED)

FindGettext の詳細については、以下のリソースを参照してください。

補足

  • FindGettext は、CMake バージョン 3.2 以降で使用できます。
  • gettext は、多くの Linux ディストリビューションと macOS にデフォルトでインストールされています。
  • Windows で gettext を使用するには、Cygwin や MinGW などの環境が必要となります。


FindGettext のサンプルコード

シンプルなサンプル

find_package(Gettext REQUIRED)

# gettext ヘッダーファイルのインクルード
include_directories(${GETTEXT_INCLUDE_DIR})

# gettext ライブラリとのリンク
target_link_libraries(your_target ${GETTEXT_LIBRARIES})

検索パスのカスタマイズ

set(GETTEXT_SEARCH_PATH /usr/local /opt)

find_package(Gettext REQUIRED)

gettext ツールの使用

find_package(Gettext REQUIRED)

# xgettext ツールを使って PO ファイルを生成
add_custom_command(
  OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/my.po
  COMMAND ${GETTEXT_XGETTEXT_EXECUTABLE}
    --from-code=utf-8
    --output=${CMAKE_CURRENT_SOURCE_DIR}/my.po
    ${CMAKE_CURRENT_SOURCE_DIR}/my.c
)

# msginit ツールを使って POT ファイルを初期化
add_custom_command(
  OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/my.pot
  COMMAND ${GETTEXT_MSGINIT_EXECUTABLE}
    --locale=ja
    --output=${CMAKE_CURRENT_SOURCE_DIR}/my.pot
)

# msgmerge ツールを使って PO ファイルを更新
add_custom_command(
  OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/my.po
  COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE}
    --update
    --output=${CMAKE_CURRENT_SOURCE_DIR}/my.po
    ${CMAKE_CURRENT_SOURCE_DIR}/my.po
    ${CMAKE_CURRENT_SOURCE_DIR}/my.pot
)

# msgfmt ツールを使って MO ファイルを生成
add_custom_command(
  OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/my.mo
  COMMAND ${GETTEXT_MSGFMT_EXECUTABLE}
    --output=${CMAKE_CURRENT_SOURCE_DIR}/my.mo
    ${CMAKE_CURRENT_SOURCE_DIR}/my.po
)

上記のサンプルコードは、あくまでも参考です。実際の使用例は、プロジェクトの環境や要件に合わせて変更する必要があります。



FindGettext 以外の方法

手動でパスを設定する

set(GETTEXT_INCLUDE_DIR /usr/local/include/gettext)
set(GETTEXT_LIBRARIES /usr/local/lib/libgettext.so)

# gettext ヘッダーファイルのインクルード
include_directories(${GETTEXT_INCLUDE_DIR})

# gettext ライブラリとのリンク
target_link_libraries(your_target ${GETTEXT_LIBRARIES})

注意

この方法は、gettext のインストールパスが分かっている場合にのみ使用できます。

外部プロジェクトを使う

ExternalProject モジュールなどの外部プロジェクトを使って、gettext をビルドしてインストールすることができます。

set(GETTEXT_VERSION 0.21)

ExternalProject_Add(gettext
  URL https://ftp.gnu.org/gnu/gettext/gettext-${GETTEXT_VERSION}.tar.gz
  BUILD_IN_SOURCE 1
  CONFIGURE_COMMAND ./configure --prefix=${CMAKE_BINARY_DIR}/gettext-install
  BUILD_COMMAND make
  INSTALL_COMMAND make install
)

# gettext ヘッダーファイルのインクルード
include_directories(${GETTEXT_INSTALL_DIR}/include)

# gettext ライブラリとのリンク
target_link_libraries(your_target ${GETTEXT_INSTALL_DIR}/lib/libgettext.so)

注意

この方法は、複雑な手順が必要となります。

CMakeLists.txt を直接編集する

gettext ツールを使う場合は、CMakeLists.txt を直接編集して、ツールを実行するコマンドを記述することができます。

add_custom_command(
  OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/my.mo
  COMMAND ${GETTEXT_MSGFMT_EXECUTABLE}
    --output=${CMAKE_CURRENT_SOURCE_DIR}/my.mo
    ${CMAKE_CURRENT_SOURCE_DIR}/my.po
)

注意

この方法は、可読性が低く、保守性が悪くなります。

FindGettext は、gettext を CMake プロジェクトで使用するための最も簡単な方法です。ただし、プロジェクトの環境や要件によっては、他の方法の方が適している場合があります。




CMakeにおける"get_target_property()"コマンド: ターゲットの情報を自在に操る

get_target_property()コマンドは、CMakeプロジェクトで定義されたターゲットからプロパティを取得するために使用されます。ターゲットプロパティは、ターゲットのビルド方法や動作を制御するために使用される情報です。構文引数VAR: ターゲットプロパティの値を格納する変数名



CMake include() で効率的なビルドを実現

include() は CMake の重要なコマンドの一つで、他の CMake ファイルやモジュールを読み込むために使用されます。 これにより、コードを分割し、再利用性と保守性を向上させることができます。機能他の CMake ファイルを読み込んで、その中のコマンドを実行する


CMakeのCommandsにおけるuse_mangled_mesa()

use_mangled_mesa() は CMake の Commands における関数で、Mesa ライブラリの mangled シンボル名を解決するために使用されます。Mesa は OpenGL の実装であり、古いバージョンの Mesa ではシンボル名が mangled されるため、use_mangled_mesa() を使用してこれらのシンボル名を解決する必要があります。


C++標準ライブラリ、テンプレートエンジン、シェルスクリプト... string()コマンドの代替方法を徹底比較

CMakeのstring()コマンドは、文字列処理を行うための強力なツールです。C++のstd::stringのような機能に加え、CMake特有の便利な機能も備えています。主な機能文字列の連結、分割、置換、比較大文字・小文字変換部分文字列の抽出


CMake で変数を削除する3つの方法:unset() 以外にも使えるテクニック

<variable_name> は、削除したい変数の名前です。変数の名前は、文字、数字、下線(_)で構成され、先頭に数字以外のアクティブ文字が来る必要があります。変数の削除この例では、MY_VAR という変数を作成し、"Hello, world!" という値を設定します。その後、unset() コマンドを使用して MY_VAR を削除します。2番目の message() コマンドは、MY_VAR が削除されたことを確認するために使用されます。



CTest ダッシュボードクライアントスクリプトのベストプラクティス:CTEST_SUBMIT_INACTIVITY_TIMEOUT を含めた効率的な設定

設定方法:例:デフォルト値:CTEST_SUBMIT_INACTIVITY_TIMEOUT のデフォルト値は 300秒 (5分) です。詳細:CTest サーバーとの通信が途絶えた場合、クライアントは再接続を試みます。再接続の試行回数は CTEST_SUBMIT_MAX_RETRIES で設定できます。


CMake find_file() コマンドの代替方法:もっと柔軟なファイル検索

<variable>: 検索結果を格納する CMake 変数<file_names>: 検索するファイル名のリスト (スペース区切り)<path_list>: 検索するパス名のリスト (スペース区切り)<options>: 検索オプション (後述)


CMake find_libraryコマンドとfind_packageモジュールの比較

find_library() コマンドは、CMake で外部ライブラリを見つけるために使用されます。これは、プロジェクトに必要なライブラリを自動的に検出して、ビルドプロセスを簡略化するのに役立ちます。コマンドフォーマット<VAR>: 検索結果を格納する変数名


CMake の INTERFACE_SYSTEM_INCLUDE_DIRECTORIES とは?

INTERFACE_SYSTEM_INCLUDE_DIRECTORIES は、CMake のターゲットプロパティの一つであり、他のターゲットがこのターゲットを依存関係として使用する際に、コンパイル時に自動的に追加されるシステムヘッダーディレクトリを指定します。これは、ターゲットが提供するインターフェースの一部として公開されるヘッダーファイルへのパスを指定するために使用されます。


CMakeのLANG_CPPLINTプロパティによる静的コード解析

LANG_CPPLINTは、CMakeでC++コードの静的コード解析を行うためのプロパティです。Properties: Targetsに設定することで、特定のターゲットに対してC++ Lintツールを実行することができます。設定方法LANG_CPPLINTは以下の方法で設定できます。