1. ホーム
  2. リナックス

cmakeの基本的な使い方

2022-02-26 10:37:07

このブログの記事の大枠:内部には繰り返しがあり、時間があれば再編成される

1. cmakeの紹介、ダウンロード、インストール、使用方法

2、cmakeマニュアルの詳細、私は-Cと-Gの使い方を中心に説明します。

3, Linux での cmake プロジェクトの構築

最初の質問です。cmakeの紹介、ダウンロードとインストール、そして使い方: https://fukun.org/archives/0421949.html

cmakeは、kitwareと多くのオープンソース開発者によるいくつかのツールキット(VTK)の開発から派生したものです。その後、開発が進み、最終的には2001年に独立したオープンソースプロジェクトとしてシステムとして形成されました。その公式サイトはwww.cmake.org、cmakeの詳細な情報を得ることができます。また、公式の英語ドキュメントも以前よりかなり改善されており、実際にリファレンスマニュアルとして使用することができます。

cmakeの人気は、10年近くautotoolsを使ってきたKDE開発者が、KDE4のプロジェクトに新しいプロジェクトビルドツールを選択することにしたことによります。その理由は、KDE 開発者自身の言葉を借りれば、KDE の現在のビルドシステムを使いこなすことができる "コンパイルの専門家"は数少ないからです。unsermake、scons、cmake の選択と実験を経て、KDE4 は最終的に cmake をビルドシステムとして使用することを決定しました。移行作業中もスムーズに進み、cmake の開発者の支持を得ることができました。そのため、現在の KDE4 の開発バージョンは、すべて cmake でビルドされています。

KDE4プロジェクトでのcmakeの成功により、cmakeをビルドツールとして使用するプロジェクトが増え、cmakeがビルドシステムの主流となりつつあります。

I. なぜプロジェクトのビルドツールを使うのか?

なぜcmakeやautotoolsのようなプロジェクトビルドツールを使うのでしょうか?これは、ソフトウェア・プロジェクトに初めて参加する人が尋ねるべき最も重要な質問の一つだと思います。

最も古典的なプログラム、"Hello, world!"は、誰もが書いたことがあるのではないでしょうか。このプログラムをコンパイルして実行するには、プラットフォームに関係なく、非常に簡単な操作だけで済みます。しかし、実はhello,worldはせいぜいサンプルプログラムであり、実際のソフトウェアプロジェクトでは全くないのです。

ソフトウェア・プロジェクトにおいて、コードを書くこと以上に重要な作業は、そのコードをいかに整理して管理し、プロジェクトのコード階層を明確で読みやすいものにするかということであり、これは後のメンテナンスに大きなメリットをもたらすものです。KDE4 のような大きなプロジェクトを hello world のような main.cpp ファイルにまとめることがどれほど恐ろしいことか想像してみてください。KDE4はもちろん、数千行のコードの小さなプロジェクトでそんなバカなことをする人はいないでしょう。

コードをどのように構成し、どのようにコンパイルするかを決めるのも、プログラミングの一部です。そのため、プロジェクトのコードを構築し、維持するために、cmakeやautotoolsのようなツールが必要です。
これを見ると、makefileを思い浮かべるかもしれませんね。makefileは、コードの自動コンパイルを管理するツールではないでしょうか?なぜ別のビルドツールが必要なのでしょうか?

実は、cmake と autotools は makefile の上位ツールで、移植性の高い makefile を生成し、自分で makefile を書くという膨大な作業を簡略化するために作られたものなのです。自分で makefile を書いたことがある人なら、makefile は通常、現在のビルドプラットフォームに依存し、依存関係を解決する際に、より多くの作業とエラーが発生しやすいことがわかるでしょう。したがって、ほとんどのプロジェクトでは、自分で makefile を書くよりも、より自動化された cmake や autotools を使って makefile を生成することを考えるべきでしょう。

要するに、プロジェクトのビルドツールは、私たちのコードとそのコンパイルプロセスをプラットフォーム間でよりよく整理・管理するのに役立ち、それが私たちがツールを使用する主な理由なのです。

II. cmakeの主な機能。

cmakeとautotoolsは異なるプロジェクト管理ツールであり、それぞれ独自の機能とユーザーベースを持ちます。両者を比較することはしませんので、ここではcmakeの主な機能を紹介します。
        1. BSDライクなライセンスで配布されるオープンソース。
        2. クロスプラットフォームであり、ネイティブコンパイルプロファイル、Linux/Unixプラットフォームではmakefile、Appleプラットフォームではxcode、WindowsプラットフォームではMSVCプロジェクトファイルを生成することができます。
        KDE4で証明された、大規模なプロジェクトを管理する能力。
        Cmakeのツールチェーンは、cmake+makeという非常にシンプルなものです。
        5. 高効率、KDE 関係者によると、CMake は KDE4 kdelibs を、autotools を使って KDE3.5.6 kdelibs をビルドするよりも 40% 速い、主に Cmake はツールチェーンに libtool を持っていないからだ、としています。
        6. 6. 拡張性:cmake の機能を拡張する、機能固有のモジュールを書くことができます。

III. cmakeのインストール

cmakeのインストールは、もはやどんなユーザーにとっても問題ではないはずです。ほとんどの主要なLinuxディストリビューションは、ソースにcmakeのインストーラを含んでいるので、ソースから直接追加することができます。もちろん、公式サイトからソースコードをダウンロードし、自分でコンパイルしてインストールすることも可能です。

Windows、Macユーザーの方は、公式サイトにcmakeのインストーラーがありますので、そちらをダウンロードしてインストールしてください。

注意:この記事のサンプルプログラムをテストできるようにするため、お使いのLinuxシステムに2.6より低いバージョンのcmakeが付属している場合は、公式サイトからバージョン2.6以上のソースコードをダウンロードしてコンパイルとインストールをお願いします。
linuxでのcmakeのインストール

まず、ソースパッケージをダウンロードします。
        http://www.cmake.org/cmake/resources/software.html

        ここからダウンロードしたのは cmake-2.6.4.tar.gz です。

任意のディレクトリから解凍してください

<テーブル <キャプション 例
1
2
tar
-xzvf cmake-2.6.4.
tar
.gz
cd
cmake-2.6.4

        順番に実行されます。

<テーブル <キャプション 例
1
2
3
.
/bootstrap
make
make
install

        cmakeはデフォルトで/usr/local/binにインストールされます。

IV. Hello, world!".で始まる。

cmakeの基本を理解し、システムにインストールしたら、cmakeを使って古典的な"Hello, world!

最初のステップは、プロジェクトに名前をつけることです。ここではHELLOと呼ぶことにします。そこで、最初にプロジェクトコード用のディレクトリ hello を作成し、そこにプロジェクトに関連するすべてのコードとドキュメントを配置します。

第二のステップは、hello ディレクトリに以下のコードで main.c ファイルを作成することです。

<テーブル <キャプション 例
1
2
3
4
5
6
#include
int
main(
void
)
{
printf
("Hello,Worldn");
return

0;
}

3番目のステップは、CMakeLists.txtという新しいファイルをhelloディレクトリに作成することです。これは、cmakeが作業する"code"となります。実際、cmakeを使ってプロジェクトを管理すること自体がプログラミングですから、これを「コード(またはスクリプト)」"と呼んでも過言ではありません。CMakeLists.txt ファイルに、以下のコードを入力します(# 以降の内容はコードのコメント行です)。
        #cmake の最小バージョンが必要です。この行を含めない場合は警告メッセージが表示されます。
        cmake_minimum_required(version 2.6)
        PROJECT(HELLO) # プロジェクト名
        # カレントディレクトリ(...)にあるすべてのソースファイルとヘッダーファイルを変数SRC_LISTに追加します。
        aux_source_directory(. src_list)
        #アプリケーションhelloの生成 (Windowsではhello.exeが自動生成されます)
        ADD_EXECUTABLE(hello ${SRC_LIST})

この時点で、helloプロジェクト全体がビルドされ、コンパイルできるようになりました。

ステップ4: プロジェクトをコンパイルします。

外部コンパイル方式でプロジェクトをコンパイルするには、まず、ディレクトリ hello の下に新しいディレクトリ build (他のディレクトリ名でも可) を作成する必要があります。さて、プロジェクト全体のディレクトリ構成は以下のようになります。
        ハロー/
        |- CMakeLists.txt
         |- ビルド /
        `- main.c

Windowsでは、cmakeはグラフィカルなインターフェースを提供しており、ソースディレクトリにhello、バイナリディレクトリにbuildを設定し、configureをクリックしてビルドを開始し、その後ビルドディレクトリに移動してmakeコマンドを実行するとコンパイルされます。

linuxのコマンドラインでは、まずビルドディレクトリに移動し、コマンドを実行します(注意:"."がないことが必要です)。

このコマンドにより、cmakeはコンパイル環境を検出し、対応するmakefileを生成します。コンパイル後、生成された中間ファイルや実行ファイルはすべてビルドディレクトリに置かれることになります。以下は、ubuntuで実行したときの様子です。


        $ ls
        ハロー
        $ cd hello/build/
        $ ls
        $ cmake ...
        - Cコンパイラの識別はGNU
        - CXX コンパイラの識別は GNU です。
        - Cコンパイラが動作しているか確認します。/usr/bin/gcc
        - Cコンパイラが動作しているか確認します。/usr/bin/gcc - 動作します。
        - CコンパイラのABI情報を検出する
         - C コンパイラの ABI 情報の検出 - 完了
        - CXXコンパイラが動作しているか確認します。/usr/bin/c++
        - CXXコンパイラが動作しているか確認する。/usr/bin/c++ - 動作します。
        - CXX コンパイラの ABI 情報の検出
        - CXX コンパイラの ABI 情報の検出 - 完了
        - 設定完了
        - 生成完了
        - ビルドファイルが書き込まれました。/ホーム/kermit/Project/cmake/hello/build に書き込まれました。
        $ make
        ターゲットhelloの依存関係をスキャンする
        [100%] C言語のオブジェクトをビルドする CMakeFiles/hello.dir/main.c.o
        C実行ファイルのリンク hello
        [100%] ターゲット hello のビルド
        $ ls
        CMakeCache.txt CMakeFiles cmake_install.cmake こんにちは Makefileです。
        $ . /hello
        こんにちは、世界

上記で、外部ビルド方式と呼ばれる言葉を紹介しました。実は、cmakeはビルドディレクトリを作らずに、カレントディレクトリで直接コンパイルすることも可能なのです。しかし、この方法では、生成された中間ファイルをすべてソースコードに混ぜてしまい、cmakeが生成するmakefileは中間ファイルをすべて把握していない、つまり、"make distclean"コマンドで中間ファイルをすべて削除することができないのです。そこで、コンパイル用のビルドディレクトリを作成し、すべての中間ファイルをビルドディレクトリに生成し、削除する必要があるときは直接空にできるようにすることをお勧めします。これを外部ビルド方式と呼びます.

2つ目の質問です。cmakeのマニュアルに詳細があります: http://www.cnblogs.com/coderfenghc/archive/2012/06/16/CMake_ch_01.html

私は主に-Cと-Gの引数を使用しています。

私の会社のあるプロジェクトでは、クロスプラットフォームのビルドツールとしてCMakeを使用しており、業務上必要なので、もちろん公式の技術マニュアルを読む必要があります。現在の計画では、CMakeの様々なコマンド、プロパティ、変数の使用法を理解するために、公式マニュアルを翻訳する予定です。CMakeのバージョンは常に更新されており、バージョンアップで新しいコマンドや変数が追加されることもありますが、それは後回しにして、今はCMake 2.8.3がマニュアル翻訳バージョンとしてロックされています。

      庭の新参者として、用語や表現など、ご指導をお願いします。また、ローマは一日にして成らず、長いマニュアルの翻訳を終えるのに、何日何ヶ月かかるか分かりませんが、続けていけたらと思います :-)。

<スパン CMake 2.8.3メインインデックス

  • コマンド名
  • <スパン 使用方法
  • <スパン 説明
  • <スパン コマンドオプション
  • <スパン ジェネレータ
  • <スパン コマンド
  • <スパン 属性
  • <スパン グローバルドメイン属性
  • ディレクトリプロパティ
  • <スパン 対象属性
  • <スパン テスト属性
  • <スパン ソースコードの属性
  • Cache Entriesプロパティ
  • <スパン 互換性コマンド
  • CMake標準モジュール
  • <スパン CMake戦略
  • <スパン 変数
  • <スパン 行動を変化させる変数
  • システムを記述する変数
  • <スパン 言語変数
  • ビルドを制御する変数
  • 情報を提供する変数
  • <スパン 著作権について
  • <スパン その他の参考資料

<スパン コマンド名

<スパン <スパン cmake - クロスプラットフォームなMakefile生成ツール。

<スパン 使用方法

  cmake [オプション] <source path>

  cmake [オプション] <既存のビルドパス>

<スパン 説明

<スパン   cmake実行ファイルは、CMakeのコマンドラインインターフェースです。スクリプトを使用してプロジェクトを設定することができます。プロジェクトの構成設定は、コマンドラインで -D オプションを使用して指定できます。i オプションを使用すると、cmake はプロンプトを表示して対話的にこの設定を行います。

<スパン   CMake は、クロスプラットフォームのビルドシステム生成ツールです。プラットフォームに依存しない CMake マニフェスト ファイル CMakeLists.txt を使用して、プロジェクトのビルド プロセスを指定します。このファイルは、ソース ツリーの各パスの下で利用可能です。CMake は、ユーザーがプロジェクトをビルドするために使用するプラットフォーム固有のビルドシステムを生成します。

<スパン オプション

-C <initial-cache> : キャッシュファイルを投入するためのスクリプトをプリロードします。
  cmake が空のビルドツリーで最初に実行されたとき、CMakeCache.txt ファイルを作成し、カスタマイズ可能なプロジェクト設定データをそこに書き込みます。C オプションを使用すると、プロジェクトの cmake マニフェスト ファイルが初めて解析されるときに、キャッシュ エントリーが読み込まれるファイルを指定できます。読み込まれたキャッシュ・エントリーは、プロジェクトのデフォルト値よりも高い優先度を持ちます。引数で指定するファイルは、キャッシュ・フォーマット・ファイルではなく、CACHE オプションを指定した SET コマンドを含む CMake スクリプトである必要があります。

-D <var>:<type>=<value> : CMake 用のキャッシュ・エントリを作成します。

  cmake が空のビルドカウントで最初に実行されたとき、CMakeCache.txt ファイルが作成され、このファイルにカスタマイズ可能なプロジェクト設定が入力されます。このオプションを使用すると、プロジェクトのデフォルト値よりも高い優先度を持つプロジェクト設定値を指定できます。このパラメーターを複数回繰り返して、必要な数のキャッシュエントリーを入力することができます。

-U <globbing_expr> : CMake のキャッシュファイルから、一致するエントリーを削除します。
  このオプションは、CMakeCache.txt ファイルから 1 つまたは複数の変数を削除するために使用されます。ファイル名マッチング式(グロビング式)は、ワイルドカードの * と ? をサポートします。このオプションを複数回繰り返すことで、希望する数のキャッシュエントリーを削除することができます。使用する際は、そのために CMakeCache.txt をダウンさせる可能性があるので、注意してください。

-G <generator-name> : makefile生成ツールを指定します。

  特定のプラットフォームでは、CMake は複数のネイティブビルドシステムをサポートすることができます。利用可能な生成ツールの名前は、生成ツールセクションに記載されています。

-Wno-dev : 開発者の警告を抑制します。

  CMakeLists.txt ファイルの作者に対して、これらの警告メッセージを抑制します。

-Wdev : 開発者向け警告メッセージの出力を有効にします。

  CMakeLists.txt ファイルの作者に対して、それらの警告メッセージを許可します。

-E : CMake のコマンドラインモードです。
  真にプラットフォームに依存しないために、CMakeはすべてのシステムで使用できるコマンド群を提供します。CMakeを-E引数で実行すると、これらのコマンドの使い方を知ることができます。使用できるコマンドは、chdir, copy, copy_if_different copy_directory, compare_files, echo, echo_append, environment, make_directory, md5sum, remove_ directory, remove, tar, time, and directory, remove, tar, time, touch, touch_nocreate, write_regv, delete_regv, comspec, create_symlink といったコマンドです。

-i : CMakeをウィザードモードで実行します。

  ウィザードモードは、GUIがない場合にcmakeを対話的に実行するモードです。cmakeは、プロジェクトの構成に関する一行の質問に答えるよう、一連のプロンプトをポップアップします。これらの回答は、cmake のキャッシュ値を設定するために使用されます。

-L[A][H] : キャッシュ内のアドバンストでない変数をリストアップします。
-L オプションは、CMake を実行し、その中で INTERNAL または ADVANCED とマークされているすべての CMake キャッシュ変数をリストアップします。これは、現在の CMake 設定情報を表示し、その後 -D オプションで変更することができます。いくつかの変数を変更すると、より多くの変数が作成される可能性があります。A オプションを指定すると、advanced 変数も表示されます。H オプションを指定すると、各変数のヘルプ情報が表示されます。

第3の問題:Linuxでcmakeを使ったアプリケーションのビルド http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/

CMakeはクロスプラットフォームな自動ビルドシステムで、CMakeLists.txtというファイルを使ってビルドプロセスを記述し、UnixのMakefileやWindows Visual C++のprojects/workspacesなどの標準ビルドファイルを生成することができる。CMakeLists.txtは手動で記述する必要がありますが、スクリプトを記述することで半自動的に生成することも可能です。linuxでCMakeを使用してMakefileを生成し、コンパイルする手順は以下の通りです。

  1. Write
     CmakeLists.txt
    .
    
    Execute the command
    "
    cmake PATH
    "
    or
    "
    ccmake PATH
    "
    Generate
     Makefile ( PATH 
    is
     CMakeLists.txt 
    Directory
     )
    .
    Use
     make 
    command to compile.
    First project
    Now suppose we have a project with only one
    source file
     main.cpp
    Listing 1 Source file main.cpp
    1 #include<iostream>
    2 
    3 int main()
    4 {
    5 std::cout<<"Hello word!"<<<std::endl;
    6 return 0;
    7 }
    To build the project, we need to write the file CMakeLists.txt and put it in the same directory as main.cpp: 
    Listing 2 CMakeLists.txt
    1
     PROJECT(main)
    
    2
     CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
    
    3
     AUX_SOURCE_DIRECTORY(. DIR_SRCS)
    
    4
     ADD_EXECUTABLE(main 
    ${
    DIR_SRCS
    }
    )
    The syntax of CMakeLists.txt is relatively simple, consisting of commands, comments, and spaces, where commands are case-insensitive and the content after the symbol "#" is considered a comment. The command consists of the command name, parentheses and parameters, and the parameters are separated by spaces. For example, for the CMakeLists.txt file in Listing 2: the first line is a command with the name PROJECT and the parameter main, which means that the name of the project is main. The second line of the command specifies the version of CMake. The third line uses the command AUX_SOURCE_DIRECTORY to assign the name of the source file in the current directory to the variable DIR_SRCS. The command AUX_SOURCE_DIRECTORY is described in the CMake manual as follows: 
    
    aux_source_directory(<dir> <variable>)
    This command assigns all the source file names in the parameter <dir> to the parameter <variable>. The fourth line uses the command ADD_EXECUTABLE to indicate that the source files in the variable DIR_SRCS need to be compiled into an executable file with the name main.
    After writing the CMakeLists.txt file, you need to use the cmake or ccmake command to generate the Makefile. The difference between ccmake and the command cmake is that ccmake provides a graphical interface. ccmake is executed as follows: 
    cmake [options] <path-to-source>
    Here we enter the directory where main.cpp is located and execute "cmake ." to get the Makefile and compile it with make, as shown in the following image.
    Figure 1. camke's run results
    
CMake 
Processing source code points

is distributed as follows
: 

 PROJECT(main)


 CMAKE_MINIMUM_REQUIRED(VERSION 2.6) 


ページの先頭へ戻る

複数のソースファイルディレクトリを扱うための方法

 ADD_SUBDIRECTORY( src )

ソースコードが異なるディレクトリに分散しているケースも非常にシンプルです。ここでは、ソースコードが
 AUX_SOURCE_DIRECTORY(. DIR_SRCS)
5 ADD_EXECUTABLE(main 

図2. ソースコードの分布

src ディレクトリのファイルがリンクされたライブラリにコンパイルされる場所です。

まず最初に、プロジェクトのホームディレクトリにあるCMakeLists.txt

step2ディレクトリにCMakeLists.txtを作成します。ファイルの中身は以下の通りです。

リスト3 step2ディレクトリのCMakeLists.txt

1


DIR_SRCS


2


  )



3


 TARGET_LINK_LIBRARIES( main Test )


4


 AUX_SOURCE_DIRECTORY(. DIR_TEST1_SRCS)



${

<未定義



 ADD_LIBRARY ( Test 


}


DIR_TEST1_SRCS


6


)

リスト2とは逆に、以下のように追加されています。3 行目、ADD_SUBDIRECTORY コマンドを使用して、プロジェクトに src サブディレクトリが含まれることを指定しています。6 行目、TARGET_LINK_LIBRARIES コマンドで、実行可能な main が Test という名前のリンクされたライブラリーにリンクする必要があることを指定しています。

ステップ2、サブディレクトリにあるCmakeLists.txt

サブディレクトリsrcに、以下のファイル内容でCmakeLists.txtを作成します。

リスト4. src ディレクトリの CmakeLists.txt

1


 MESSAGE(STATUS "Using bundled Findlibdb.cmake... ")



2


 FIND_PATH(



${

<未定義



   LIBDB_CXX_INCLUDE_DIR
05 db_cxx.h 



}


   /usr/include/ 


このファイルのADD_LIBRARYコマンドを使用して、srcディレクトリにあるソースファイルを共有ライブラリにコンパイルしてください。

ステップ3:cmakeの実行

これで、プロジェクト内の全てのCMakeLists.txtの書き込みが終わりましたので、step2のディレクトリに移動して、"cmake ."と"make"を順番に実行すると、以下の結果が出ます。

図3. 複数のソースファイルディレクトリを扱った場合のcmake実行結果

cmakeの実行中、まずstep2のCMakeLists.txtが解析され、ADD_SUBDIRECTORY( src )というコマンドを実行すると、srcディレクトリに入り、そこでCMakeLists.txtが解析されることになるのです。

プロジェクトで他のライブラリを見つけて使用する方法

ソフトウェアを開発する際、システムによって異なる場所にインストールされている可能性のあるライブラリを使用します。コンパイルの際には,コンパイルオプションを生成するために,まずこれらのパッケージのヘッダーファイルと,リンクされているライブラリのあるディレクトリを見つける必要があります.例えば、Bockleyデータベースを使用する必要があるプロジェクトでは、ヘッダーファイルdb_cxx.hとリンクライブラリlibdb_cxx.soが必要となり、現在、プロジェクトのルートディレクトリにソースコードファイルmain.cppが存在します。

最初のステップ、ライブラリ記述ファイル

プロジェクトのルートにcmake/modules/というディレクトリを作成し、cmake/modules/の下にFindlibdb_cxx.cmakeというファイルを以下の内容で作成します。

リスト5. ファイル Findlibdb_cxx.cmake

01


   /usr/local/include/ 



0203


   )



04


 
10 FIND_LIBRARY(



06


   LIBDB_CXX_LIBRARIES NAMES db_cxx



07


   PATHS /usr/lib/ /usr/local/lib/



08


   )


09


command
 MESSAGE 
will
Set the parameter
to the content of
Output to the terminal
.
command
 FIND_PATH 
Specifies the path where the header file is found.
The prototype is as follows

find_path(<VAR> name1 [path1 path2 ...]) This command takes the following arguments in the path* Find the file in the directory indicated name1 and saves the path found in the variable VAR in the List 5 Page 3 - 8 The meaning of the line in /usr/include/ and /usr/local/include/ Find the file in db_cxx.h , and will db_cxx.h The path to the location is saved in the LIBDB_CXX_INCLUDE_DIR in. command FIND_LIBRARY Same as FIND_PATH Similar to , is used to find the linked library and save the result in a variable. List 5 Page 10 - 13 The line means that in the directory /usr/lib/ and /usr/local/lib/ Look for the file with the name db_cxx The link library for , and save the results in the LIBDB_CXX_LIBRARIES . Step 2, CmakeList.txt in the root of the project Create CmakeList.txt in the root of the project: Listing 6. CMakeList.txt where you can find linked libraries 01 PROJECT(main) 02 CMAKE_MINIMUM_REQUIRED(VERSION 2.6) 03 SET(CMAKE_SOURCE_DIR .) 04 SET(CMAKE_MODULE_PATH ${ CMAKE_ROOT } /Modules ${ CMAKE_SOURCE_DIR } /cmake/modules) 05 AUX_SOURCE_DIRECTORY(. DIR_SRCS) 06 ADD_EXECUTABLE(main ${ DIR_SRCS } ) 0708 FIND_PACKAGE( libdb_cxx REQUIRED) 09 MARK_AS_ADVANCED( 10 LIBDB_CXX_INCLUDE_DIR 11 LIBDB_CXX_LIBRARIES 12 ) 13 IF (LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBRARIES) 14 MESSAGE(STATUS "Found libdb libraries") 15 INCLUDE_DIRECTORIES( ${ LIBDB_CXX_INCLUDE_DIR } ) 16 MESSAGE( ${ LIBDB_CXX_LIBRARIES } ) 17 TARGET_LINK_LIBRARIES(main ${ LIBDB_CXX_LIBRARIES } 18 ) 19 ENDIF (LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBRARIES) Line 4 of this file indicates the process of going to the directory . /cmake/modules, lines 8-19 show the process of finding the linked libraries and headers. The command FIND_PACKAGE is used in line 8. After this command is executed, CMake will look for the file Findlibdb_cxx.cmake in the directory indicated by the variable CMAKE_MODULE_PATH and execute it. Lines 13-19 are conditional statements, indicating that if both LIBDB_CXX_INCLUDE_DIR and LIBDB_CXX_LIBRARIES have been assigned, then compile time is set to look for headers in LIBDB_CXX_INCLUDE_DIR and set the executable main to be linked to the library LIBDB_CXX_LIBRARIES. LIBRARIES. Step 3, execute cmake After completing Findlibdb_cxx.cmake and CMakeList.txt in the root directory of the project, execute "cmake . " and "make" to compile, the result is shown below. Figure 4. cmake execution results when using other libraries
11 PROJECT(main) 12 CMAKE_MINIMUM_REQUIRED(VERSION 2.6) 13 SET(CMAKE_SOURCE_DIR .)

Findlibdb_cxx.cmakeは、仕様に沿ったファイル名になっています。FindlibNAME.cmake , NAME はライブラリの名前です。ここでは、3つのコマンドを使用しています。MESSAGE、FIND_PATH、FIND_LIBRARYです。

  •  SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
    
    
 SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")


cmakeを使ったプログラムのデバッグ版とリリース版の生成

Visual Studio では、プログラムのデバッグ版とリリース版の両方を生成することができますが、CMake でも同じことができます。デバッグプロジェクトでは、デバッグ情報と最適化なしの実行ファイルを生成し、リリースプロジェクトでは、デバッグ情報は必要ありませんが最適化は必要です。これらの機能は、gcc/g++のコンパイル時引数で決定されます。最適化レベルの最高値は-O3、最低値は-O0で、最適化なしを意味します。デバッグ情報を追加するパラメータは-g -ggdb 、このパラメータを追加しない場合、デバッグ情報は生成されたバイナリに含まれません。

CMake には CMAKE_BUILD_TYPE という変数があり、Debug Release RelWithDebInfo と MinSizeRel という値を取ることができます。この変数の値が Debug の場合、CMake は CMAKE_CXX_FLAGS_DEBUG および CMAKE_C_FLAGS_DEBUG という変数を使用します。この変数の値が Debug の場合、CMake は変数 CMAKE_CXX_FLAGS_DEBUG と CMAKE_C_FLAGS_RELEASE の文字列をコンパイルオプションとして使用して Makefile を生成し、この変数の値が Release の場合、変数は CMAKE_CXX_FLAGS_RELEASE と CMAKE_C_FLAGS_RELEASE オプションを用いてプロジェクトは Makefile を生成することになります。

プロジェクトにはmain.cppという1つのファイルしかないと仮定して、デバッグ版とリリース版のプログラムを生成するオプションを指定したCMakeList.txtを以下に示します。

リスト7

1


 AUX_SOURCE_DIRECTORY(. DIR_SRCS)



2


 ADD_EXECUTABLE(main 


3


DIR_SRCS


45


)


6


CMakeFiles/main.dir/flags.make:CXX_FLAGS = -O0 -Wall -g -ggdb 
CMakeFiles/main.dir/link.txt:/usr/bin/c++ -O0 -Wall -g -ggdb 
CMakeFiles/main.dir/main.cpp.o -o main -rdynamic 
CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")


78


CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")


9


CMakeCache.txt:CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
CMakeCache.txt:CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
CMakeFiles/main.dir/flags.make:CXX_FLAGS = -O3 -Wall 
CMakeFiles/main.dir/link.txt:/usr/bin/c++ -O3 -Wall 
CMakeFiles/main.dir/main.cpp.o -o main -rdynamic 
CMakeLists.txt:SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")


${

<未定義



5


}


Page

5行目と6行目では、CMAKE_CXX_FLAGS_DEBUG と CMAKE_CXX_FLAGS_RELEASE という二つの変数を設定し、それぞれデバッグ用とリリース用のコンパイルオプションとしています。CMakeList.txt を編集した後,Makefile を生成するために ccmake コマンドを実行する必要があります.プロジェクトのルート・ディレクトリに移動した後、次の画像に示すように "ccmake ." と入力して、グラフィカル・インターフェースにアクセスします。

図5 ccmakeのインターフェース

インターフェイスのプロンプトに従い、"c"を押して設定すると、インターフェイスに設定変数CMAKE_BUILD_TYPEのエントリーが表示されます。次の図に示すようにです。

図6 configure後のccmakeのインターフェイス

CMAKE_BUILD_TYPE 変数を Debug に設定し、 "c" を押して configure を行い、 "g" を押して Makefile を生成し、終了してください。この時点で、find * | xargs grep "O0"というコマンドを実行すると、以下のような結果になります。

リスト8 Find * | xargs grep "O0" 実行結果
10

この結果は、生成された Makefile が変数 CMAKE_CXX_FLAGS_DEBUG をコンパイル時のパラメーターとして使用していることを示します。

CMAKE_BUILD_TYPE を Release に設定し、Makefile を生成して終了します。find * | xargs grep "O0" と実行すると、次のような結果が得られます。

リスト9 Find * | xargs grep "O0" 実行結果
-

そして、find * | xargs grep "O3"というコマンドを実行すると、以下のような結果が得られます。

リスト10.find * | xargs grep "O3" 実行結果
13

これら2つの結果は、生成された Makefile が変数 CMAKE_CXX_FLAGS_RELEASE をコンパイル時のパラメーターとして使用していることを示しています。