Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
52
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

CMake言語の基本構造

はじめに

みなさん、こんにちは。CMake は、いろいろ使われているにもかかわらず、なぜか日本語の情報が少ないので、この Advent Clendar で言語仕様や Tips などを書いていこうかと思います。なお、対象となる CMake のバージョンは、基本的に現時点での最新の安定版、3.0.2 となります。

CMake言語の基本構造

まず、CMakeの言語仕様を知るために、公式ドキュメントの cmake-language という言語仕様について書いてあるページを見てみました。

すると、CMake言語は以下のような構造になっていることがわかりました。

file         ::=  file_element*
file_element ::=  command_invocation line_ending |
                  (bracket_comment|space)* line_ending
line_ending  ::=  line_comment? newline
space        ::=  <match '[ \t]+'>
newline      ::=  <match '\n'>

cmake-language(7) — CMake 3.0.2 Documentation, Source Files

command_invocation  ::=  space* identifier space* '(' arguments ')'
identifier          ::=  <match '[A-Za-z_][A-Za-z0-9_]*'>
arguments           ::=  argument? separated_arguments*
separated_arguments ::=  separation+ argument? |
                         separation* '(' arguments ')'
separation          ::=  space | line_ending

cmake-language(7) — CMake 3.0.2 Documentation, Command Invocations

これを見るとCMake言語は、すべてがコマンド呼び出しであることがわかります。これは、if()foreach()といった制御構文も同様です。endif()endforeach()についていた不自然な括弧は、この言語仕様のためだったのです。

コマンドの特徴

さて、CMake言語がコマンド呼び出しの羅列であることがわかったので、その中核のコマンドがどのような特徴を持っているのかにいて述べます。

コマンドに渡す引数の区切り文字は空白文字

コマンドに渡す引数の区切りは、空白文字となっていてカンマ,ではありません。

command(arg1 arg2 arg3) # OK
command(arg1,arg2,arg3) # NG; arg1,arg2,arg3 という一つの引数と解釈される

コマンド名は大文字小文字を区別しない

コマンド名は、大文字小文字を区別しません。以下はすべて同じコマンドを呼び出します。

message(arg)
MESSAGE(arg)
Message(arg)

コマンド名に使える文字は英数字とアンダースコア

function()コマンドとmacro()コマンドを使って独自のコマンドを定義することができますが、コマンド名に使えるのは英数字とアンダースコア(_)のみとなります。ただし、数字で始めることはできません(呼び出すときにエラーになります)。

# OK
function(my_command1)
  message(my_command1)
endfunction()
my_command1()

# OK
function(_my_command2)
  message(_my_command2)
endfunction()
_my_command2()

# NG
function(3_my_command)
  message(3_my_command)
endfunction()
3_my_command() # エラー

コマンドは戻り値がない

CMakeのコマンドには戻り値という概念がありません。なんらかの情報を呼び出し元に返したい場合は、格納する変数をコマンドの引数として渡すことになります。

string(TOUPPER hoge output_variable) # 文字列をすべて大文字にするコマンド
message(${output_variable}) # HOGE

おわりに

以上、CMake言語の基本構造とその中核であるコマンドについてでした。

明日は、mrk_21 さんの『CMake: コマンド引数の種類』です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
52
Help us understand the problem. What are the problem?