CMake - ファイル
概要
コピー
configure_file
コマンドを使用して、ソースディレクトリ内のファイルをビルドディレクトリへコピーする。
また、@ONLY
オプションを付加して、@<文字列>@形式の変数をファイル内で置換することもできる。
configure_file(<コピー元のファイルのパス> ${CMAKE_CURRENT_BINARY_DIR}/<コピー先のファイルのパス> @ONLY)
# 例:
# /<プロジェクトディレクトリ>/etc/hoge.conf.inファイルを/<ビルドディレクトリ>/etcディレクトリにコピー
# @ONLYオプションを付加して、hoge.conf.inファイル内の@<文字列>@形式の変数をCMake変数で置換
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/etc/hoge.conf.in ${CMAKE_CURRENT_BINARY_DIR}/etc/hoge.conf @ONLY)
インストールルール
install
コマンドを使用して、ファイルを任意のディレクトリにインストールする。
CACHE PATH
オプションを付加して独自の変数を定義することにより、CMakeのコマンドラインオプション-D<オプション名>=を付加してパスをカスタマイズすることができる。
install(FILES <インストール元のファイルのパス> DESTINATION <インストール先のディレクトリのパス>)
# 例:
# /<ビルドディレクトリ>/etc/hoge.confファイルを、CMake変数SYSCONF_DIRで指定したディレクトリへインストール
# cmakeコマンドの実行時にデフォルトのインストールディレクトリを上書きする場合は、cmake .. -DSYSCONF_DIR=$HOME/.config/hogeのように指定する
set(SYSCONF_DIR "/etc/hoge" CACHE PATH "Directory to install hoge.conf")
install(FILES ${CMAKE_BINARY_DIR}/hoge.conf DESTINATION ${SYSCONF_DIR})
インストールするファイルに実行権限を付与する場合は、install
コマンドにPROGRAM
オプションを付加する。
# 実行権限を付与して、インストール先のディレクトリにコピーする
install(PROGRAMS
${CMAKE_CURRENT_BINARY_DIR}/sample.sh
DESTINATION ${CMAKE_INSTALL_BINDIR}
)
実行ファイルの構築 (add_executableコマンド)
add_executable
コマンドは、CMakeにソースファイルのセットから実行ファイルを作成する。
add_executable(
<ターゲット名>
<ソースコードファイル名 1>
<ソースコードファイル名 2>
# ...略
)
# 例. myAppまたはmyApp.exeという名前の実行ファイルが生成される
add_executable(
myApp
main.cpp
)
<ターゲット名>
には、英数字、アンダースコア、ハイフンを使用することができる。
CMakeプロジェクトのビルドが正常に終了すると、<ターゲット名>
として実行ファイルが作成される。
ターゲット名は、CMakeの機能であるターゲットプロパティでカスタマイズすることもできる。
また、ターゲット名を変更して、add_executable
コマンドを複数回呼び出すことにより、1つのCMakeLists.txtファイル内で複数の実行ファイルを定義することができる。
ただし、同じターゲット名を複数のadd_executable
コマンドで使用する場合は、CMakeは失敗してエラーがハイライトされる。
# CMakeプロジェクトの例
cmake_minimum_required(VERSION 3.2)
# C++コンパイラは未使用とするため、プラットフォームが持っていない場合に備えて、projectコマンドで使用されないように指定する
project(MyApp VERSION 4.7.2 LANGUAGES C)
# メインの実行ファイルを生成
add_executable(
mainTool
main.c
debug.c # リリースビルドのために最適化される
)
# サブの実行ファイルの生成
add_executable(
testTool
testTool.c
)
ライブラリの構築 (add_libraryコマンド)
CMakeは様々な種類のライブラリのビルドをサポートしている。
ライブラリを作成して使用する場合、add_library
コマンドを使用する。
add_library(
<ターゲット名>
[<STATIC または SHARED または MODULE>]
[EXCLUDE_FROM_ALL]
<ソースコードファイル名 1>
<ソースコードファイル名 2>
# ...略
)
<ターゲット名>
は、CMakeLists.txtファイル内でライブラリを参照するために使用される。
ビルドされたライブラリ名は、<ターゲット名>
となる。
EXCLUDE_FROM_ALL
オプションは、add_executable
コマンドと同様、ライブラリがデフォルトのALLターゲットに含まれないようにする。
構築するライブラリの種類は、STATIC
、SHARED
、MODULE
のうちの1つを指定する。
- STATICオプション
- 静的ライブラリまたはアーカイブを指定する。
- Windowsでは、デフォルトのライブラリ名は、<ライブラリファイル名>.libとなる。
- Linuxでは、デフォルトのライブラリ名は、lib<ライブラリファイル名>.aとなる。
- SHARED
- 共有ライブラリまたは動的ライブラリを指定する。
- Windowsでは、デフォルトのライブラリ名は、<ライブラリファイル名>.dllとなる。
- Linuxでは、デフォルトのライブラリ名は、lib<ライブラリファイル名>.soとなる。
- MODULE
- 共有ライブラリに似ているが、ライブラリや実行ファイルに直接リンクされるのではなく、実行時に動的にロードされることを意図しているライブラリを指定する。
- これらは、ユーザがロードするかどうかを選択できるプラグイン、または、オプションのコンポーネントである。
- Windowsでは、DLL向けのインポートライブラリは作成されない。
よほどのことがない限り、STATIC
またはSHARED
オプションは、それが必要であることが分かるまで付加しないことを推奨する。
これにより、プロジェクト全体を通して、スタティックライブラリかダイナミックライブラリかをより柔軟に選択することができる。
ビルドするライブラリの種類を定義するオプションを省略することも可能である。
特定のライブラリが必要でない限り、プロジェクトファイルには指定せずに、プロジェクトの構築時に開発者が選択できるようにすることが望ましい。
そのような場合、ライブラリはSTATIC
かSHARED
のどちらかになり、変数BUILD_SHARED_LIBS
の値により選択される。
変数BUILD_SHARED_LIBS
がtrue
を代入する場合はライブラリのターゲットはダイナミックライブラリ、それ以外の場合はスタティックライブラリとなる。
add_library
コマンドを呼び出すたびに変更する必要がなく、1ヶ所に記述するだけで設定を変更することができる。
ただし、add_library
コマンドを呼び出す前に、変数BUILD_SHARED_LIBS
を記述する必要がある。
set(BUILD_SHARED_LIBS YES)
変数BUILD_SHARED_LIBS
を設定する方法として、cmake
コマンドに-DBUILD_SHARED_LIBS
オプションを付加する方法がある。
cmake -DBUILD_SHARED_LIBS=YES /path/to/source