編集の要約なし
 
36行目: 36行目:
execute_processコマンド / add_custom_commandコマンドの違いは実行タイミングである。<br>
execute_processコマンド / add_custom_commandコマンドの違いは実行タイミングである。<br>
execute_processコマンドはCMakeの設定時に即座に実行されるのに対して、add_custom_commandコマンドはビルド時に実行される。<br>
execute_processコマンドはCMakeの設定時に即座に実行されるのに対して、add_custom_commandコマンドはビルド時に実行される。<br>
<br>
例えば、外部のプロトコルバッファコンパイラを使用してソースファイルを生成することが挙げられる。<br>
<syntaxhighlight lang="cmake">
add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated.pb.cc
    COMMAND protoc --cpp_out=${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/message.proto
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/message.proto
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMENT "Generating protocol buffer code"
)
</syntaxhighlight>
<br>
<br>
パスの扱いでは、<code>WORKING_DIRECTORY</code>オプションを設定することにより、相対パスの問題を回避する必要がある。<br>
パスの扱いでは、<code>WORKING_DIRECTORY</code>オプションを設定することにより、相対パスの問題を回避する必要がある。<br>
138行目: 127行目:
<br><br>
<br><br>


== add_custom_commandコマンド ==
特に、<code>VERBATIM</code>オプションは重要であり、シェルによる引数の解釈の問題を回避することができる。<br>
このオプションは、コマンドライン引数をそのまま使用することを保証する。<br>
<br>
以下の例では、外部のプロトコルバッファコンパイラを使用してソースファイルを生成することが挙げられる。<br>
<br>
<syntaxhighlight lang="cmake">
add_custom_command(
    # 生成される出力ファイルを指定
    # ${CMAKE_CURRENT_BINARY_DIR}はビルドディレクトリを指す
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated_code.cpp    # 生成されるC++ソースファイル
          ${CMAKE_CURRENT_BINARY_DIR}/generated_code.h      # 生成されるヘッダーファイル
    # 実行するコマンドとその引数を指定
    COMMAND code_generator                                      # 外部コマンド code_generator
            --input ${CMAKE_CURRENT_SOURCE_DIR}/input.def        # 入力ファイルのパス
            --output ${CMAKE_CURRENT_BINARY_DIR}/generated_code  # 出力ファイルのベース名
    # 主要な入力依存ファイルを指定
    # このファイルが変更された場合、コマンドが再実行される
    MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/input.def
    # その他の依存関係を指定
    # この場合、code_generator実行ファイル自体への依存関係を示す
    DEPENDS code_generator
    # コマンドを実行するディレクトリを指定
    # ${CMAKE_CURRENT_BINARY_DIR}はビルドディレクトリを指す
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    # ビルド時に表示されるメッセージを指定
    COMMENT "Generating source code from input.def"
    # コマンドライン引数をそのまま使用することを指定
    # シェルによる引数の解釈の問題を回避するために重要なオプション
    VERBATIM
)
# 生成されたファイルを使用するターゲットを定義
add_library(my_library
    ${CMAKE_CURRENT_BINARY_DIR}/generated_code.cpp
    ${CMAKE_CURRENT_BINARY_DIR}/generated_code.h
)
# 生成されたファイルへの依存関係を確実にする
add_dependencies(my_library code_generator)
</syntaxhighlight>
<br>
* MAIN_DEPENDENCY
*: 主要な入力ファイルを指定する。
* DEPENDS
*: その他の依存関係 (他のファイルやターゲット) を指定できる。
* OUTPUT
*: 指定したファイルは自動的にビルドシステムの依存関係グラフに組み込まれ、必要な場合にのみコマンドが実行される。
<br>
<u>※注意</u><br>
<u>add_custom_commandコマンドで生成されたファイルを実際にビルドシステムで使用する場合、<code>add_custom_target</code>コマンドや<code>target_sources</code>コマンド等で明示的に組み込む必要がある。</u><br>
<br><br>


{{#seo:
{{#seo: