CMake: コマンドライン引数の内容を最大限に活用! `CMAKE_ARGC` の活用テクニック


CMAKE_ARGC は、CMake スクリプト内でコマンドライン引数の数を格納する変数です。CMake を -P スクリプトモードで実行すると、この変数に渡された引数の数が設定されます。

使用方法

CMAKE_ARGC 変数は、以下の方法で使用できます。

  • 引数の内容を処理する。
  • 引数の数に基づいて条件分岐を行う。
  • スクリプト内で message() 関数を使用して、渡された引数の数を表示する。

以下の例は、CMAKE_ARGC 変数を使用して、渡された引数の数を表示する方法を示します。

# CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(MyProject)

message(STATUS "Number of arguments: ${CMAKE_ARGC}")

この例を実行すると、以下の出力がコンソールに表示されます。

Number of arguments: 0
  • 引数の内容にアクセスするには、CMAKE_ARGV<N> 変数を使用します。ここで、<N> は引数のインデックスです。最初の引数は CMAKE_ARGV0、2 番目の引数は CMAKE_ARGV1、... となります。
  • CMAKE_ARGC 変数の値は、0 以上の整数です。
  • CMAKE_ARGC 変数の値は、-P スクリプトモードで CMake を実行したときにのみ設定されます。
  • CMAKE_ARGC 変数は、CMake スクリプト内でのみ使用できます。
  • CMake の最新情報については、公式ドキュメントを参照してください。
  • この情報は、2024 年 7 月 20 日時点のものであり、将来的に変更される可能性があります。


# CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(MyProject)

message(STATUS "Number of arguments: ${CMAKE_ARGC}")

if(CMAKE_ARGC GREATER 0)
  message(STATUS "Arguments:")
  foreach(arg IN LISTS CMAKE_ARGV)
    message(STATUS "  ${arg}")
  endforeach()
endif()

出力例

Number of arguments: 2
Arguments:
  argument1
  argument2

例 2: 引数の数に基づいて条件分岐を行う

# CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(MyProject)

if(CMAKE_ARGC GREATER 0)
  # 引数が渡された場合は、特定の処理を実行する
  message(STATUS "Arguments passed, performing specific actions.")
else()
  # 引数が渡されなかった場合は、別の処理を実行する
  message(STATUS "No arguments passed, performing different actions.")
endif()

例 3: 引数の内容を処理する

# CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(MyProject)

if(CMAKE_ARGC GREATER 0)
  # 引数の内容を処理する
  foreach(arg IN LISTS CMAKE_ARGV)
    message(STATUS "Processing argument: ${arg}")
    # ここで、引数の内容に基づいて処理を行う
  endforeach()
else()
  message(STATUS "No arguments passed.")
endif()
  • 詳細については、CMake ドキュメントを参照してください。
  • 実際の使用例では、より複雑な処理を行う必要がある場合があります。
  • これらの例は、CMAKE_ARGC 変数を使用して、コマンドライン引数を処理する方法を示す基本的な例です。
  • CMake の最新情報については、公式ドキュメントを参照してください。
  • この情報は、2024 年 7 月 20 日時点のものであり、将来的に変更される可能性があります。


代替方法

以下の方法で CMAKE_ARGC 変数の機能を代替することができます。

ARGV マクロ

ARGV マクロは、CMAKE_ARGC 変数と同様に、コマンドライン引数の数と内容にアクセスできます。


# CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(MyProject)

list(LENGTH CMAKE_ARGV ARG_COUNT)

message(STATUS "Number of arguments: ${ARG_COUNT}")

foreach(arg IN LISTS CMAKE_ARGV)
  message(STATUS "Argument: ${arg}")
endforeach()

list() 関数

list() 関数は、リストを作成および操作するための関数です。list() 関数を使用して、コマンドライン引数をリストに変換し、その要素数を取得することができます。


# CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(MyProject)

list(APPEND ARG_LIST CMAKE_ARGV)
list(LENGTH ARG_LIST ARG_COUNT)

message(STATUS "Number of arguments: ${ARG_COUNT}")

foreach(arg IN LISTS ARG_LIST)
  message(STATUS "Argument: ${arg}")
endforeach()

外部スクリプト

複雑な処理が必要な場合は、外部スクリプトを使用してコマンドライン引数を処理することができます。


# CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(MyProject)

# 外部スクリプト "process_args.sh" を実行する
execute_process(PROCESS ${CMAKE_BINARY_DIR}/process_args.sh
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  ARGS ${CMAKE_ARGV})

process_args.sh スクリプト

#!/bin/bash

# コマンドライン引数の数を取得する
arg_count=$#

# 引数の数を表示する
echo "Number of arguments: $arg_count"

# 各引数を処理する
for arg in $@; do
  echo "Argument: $arg"
  # ここで、引数の内容に基づいて処理を行う
done
  • 外部スクリプトを使用する場合は、セキュリティ上のリスクに注意する必要があります。
  • 上記の例は、あくまでも代替方法の例です。状況に応じて適切な方法を選択してください。