システム構築のCMake

6345 ワード

CMakeは、さまざまなフロントエンド操作のクライアント、各プラットフォーム上のコマンドラインクライアント、GUIクライアントを提供します.まず、コマンドラインの操作方法を主に見てみましょう.
公式チュートリアル , 公式APIドキュメント
一、簡単な手順
0、プロジェクト準備:プロジェクトの各ディレクトリの下にCMakeListsが必要である.txt(名前の大文字と小文字を区別)ファイル
1、cd/path/to/build.#buildディレクトリの下でcmakeを実行します.cmakeは現在のディレクトリをbuildディレクトリとして、生成ファイルとcacheファイルを格納するためです.
2、cmake/path/to/project.
3、make.#このコマンドの入力は/path/to/projectにあるCMakeListsである.txファイルincludeまたはadd_subdirectoryコマンドは、新しい入力ファイルを追加します.
4、./target.#生成されたプログラムの実行
5、target:make cleanを整理する.ただしmake distcleanは無効で、構築プロセスファイルをクリーンアップできません.だから、最初のステップでbuildディレクトリに入ります.これは、いわゆる外部構築(out-of-source build)です.
 
二、CMakeLists.txt構文
0、共通ルール:
a#先頭の動作コメント行.
b指令(パラメータ1パラメータ2…)パラメータは括弧で囲まれ、パラメータ間はスペースまたはセミコロンで区切られ、パラメータは二重引用符でSET(SRC_LIST"main.c")を包むことができます.命令は大文字と小文字に関係なく、パラメータと変数は大文字と小文字に関係します.ただし、推奨命令はすべて大文字を使用します.
c変数は${}方式で値をとるが、IF制御文では直接変数名を使う
d/文字はエスケープ文字として使用される.
eユーザーはmacroとfunctionをカスタマイズでき、command命令と同じ使い方をする.
1、変数タイプ:Lists and Strings
a変数の基本タイプはString
b変数はlistタイプであってもよい.Listはforeachコマンドによって列挙され、listコマンドによって操作され得る.リストメソッドを定義するには、次の手順に従います.
2、プロセス制御
a条件判断:if
# some_command will be called if the variable's value is not:
# empty, 0, N, NO, OFF, FALSE, NOTFOUND, or -NOTFOUND.
if(var)
   some_command(...)
elseif(var)
   other_command(...)
else(var)
   last_option(...)
endif(var) 

bサイクル:foreach
set(VAR a b c)
  # loop over a, b,c with the variable f
foreach(f ${VAR})
    message(${f})
endforeach(f) 

cサイクル:while
while(var)
    message(${var})
endwhile(var)

dプロセス定義:macroとfunction
関数は2.6以降でサポートされています.関数とマクロの違いは、関数ではローカル変数を定義できますが、マクロで定義された変数はグローバル変数であるか、関数がローカルであるべきか、マクロはグローバルです.
# define a macro hello
macro(hello MESSAGE)
    message(${MESSAGE})
endmacro(hello)
# call the macro with the string "hello world"
hello("hello world")

# define a function hello
function(hello MESSAGE)
    message(${MESSAGE})
endfunction(hello) 

3、正規表現をサポートする
^ Matches at beginning of a line or string
$ Matches at end of a line or string
 . Matches any single character other than a newline
[ ] Matches any character(s) inside the brackets
[^ ] Matches any character(s) not inside the brackets
[-] Matches any character in range on either side of a dash
* Matches preceding pattern zero or more times
+ Matches preceding pattern one or more times
? Matches preceding pattern zero or once only
() Saves a matched expression and uses it in a later replacement

 
三、命令API
KitwareはMastering CMakeという本を厚かましく売っているし、ネット上には電子版がないようだが、公式に提供されたドキュメントは十分だ.この心得を書いたときcmakeは2.8リリース。でした
ドキュメントは、「cmake--help-html」>「help_name.html」で現在実行されているディレクトリで生成することもできます.
1、 command api
2、 variables api
 
四、テクニック
1、どのように構築中にdebugなどの情報をconsoleに印刷しますか?
MESSAGEコマンドを使用します.message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display"...)
2、プロセスファイルと最終的に構築されたターゲットファイルのパス設定の問題.
cmakeには、さまざまなパスを設定するために事前に定義された変数があります.
PROJECT_BINARY_DIR:ディレクトリを実行し、プロシージャファイルのディレクトリを生成します.cmakeを実行..を選択します.このディレクトリには、プロシージャファイルが生成されることがあるため、外部構築が必要です.
PROJECT_SOURCE_DIR:コードディレクトリ、cmakeを実行..の場合指定されたディレクトリ
工程組織方式:
proj +
       |
       +src
       +bin
       +build
       |    + bin_1
       +CMakeLists.txt

一般的にCMakeLists.txtファイルでADD_を使用SUBDRECTORY(source_dir[binary_dir][EXCLUDE_FROM_ALL])は、src、binディレクトリを指定し、相対パスでも絶対パスでも構いません.
ただし、相対パスを使うとsource_dirは相対PROJECT_SOURCE_DIR(ここはprojディレクトリ)の、binary_dirは相対PROJECT_BINARY_DIR(ここではbuild)です.だからadd_ならsubdirectory(src bin)ならbinはbuildの下のbin_1.
 
EXECUTABLE_OUTPUT_PATHとLIBRARY_OUTPUT_PATHは純粋な最終目標ファイルの位置を定義し、以下の方法で修正することができる.
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
 
1、定義済み変数
PROJECT_BINARY_DIR
PROJECT_SOURCE_DIR
EXECUTABLE_OUTPUT_PATH
LIBRARY_OUTPUT_PATH
CMAKE_INSTALL_PREFIX
2、基本指令
PROJECT(projectname [CXX] [C] [Java])
SET(VAR [VALUE [VALUE2] [VALUE3]] [CACHE TYPE DOCSTRING [FORCE]])
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
ADD_EXECUTABLE(targetRunable ${SRC_LIST})
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
ディレクトリのインストール:INSTALL(DIRECTORY src_dirs…DESTINATION
                           [FILE_PERMISSIONS permissions...]
                           [DIRECTORY_PERMISSIONS permissions...]
                           [USE_SOURCE_PERMISSIONS]
                           [CONFIGURATIONS [Debug|Release|...]]
                           [COMPONENT ]
                           [[PATTERN | REGEX ] [EXCLUDE] [PERMISSIONS permissions...]][...])
DIRECTORYの後ろに接続されているsrc_dirsはabcとabc/に大きな違いがあることに注意した.ディレクトリ名が/エンドでない場合、このディレクトリはターゲットパスの下のabcにインストールされ、ディレクトリ名が/エンドである場合、このディレクトリの内容はターゲットパスにインストールされますが、このディレクトリ自体は含まれません.
3、場所を変えて目標バイナリを保存する:ADD_EXECECUTABLEまたはADD_LIBRARYが存在するCMakeLists.txtファイルで定義
    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)