make cmake って?
良い感じにビルドしてくれる便利なもの、
ということは知ってるけれど使い方が分からないので調べてみたものをメモします
Make
MakeFile に依存関係を書き,make で MakeFile のコマンドを実行してくれるもの
差分をコンパイルしてくれるらしく、どうやら賢い
MakeFile のフォーマット
.PHONY: ターゲット
ターゲット : 依存ファイル
実行コマンド
# ↑ indent する
で,このターゲットをタスクターゲットとも呼ぶらしい.
$ make [ターゲット]
で実行
※ .PHONY とは
タスクターゲットを宣言するもの
しかし,もしタスク名と同名のファイルやディレクトリがあると混乱しますので,.PHONYは積極的に書くようにしましょう.
ということがあるらしい
いろいろなルール
タスクターゲットは,依存ターゲット
を複数持つことができる.
が,ちょっと文章を読んだだけでは少し理解が難しかった.
それなりにややこしそうだし,cmake の方が扱いやすいと書いてあったので,make
はまた余裕があるときに,追記しようと思う.(目的が,cpp コンパイルのためもある)
CMake
make でいう MakeFile は CMakeLists.txt
になります.
# CMakeのバージョンを設定
cmake_minimum_required(VERSION 2.8)
# プロジェクト名と使用する言語を設定
project(test_cmake CXX)
# a.outという実行ファイルをmain.cppとhello.cppから作成
add_executable(a.out main.cpp hello.cpp)
とりあえず,これで,実行できるらしいでございます.
そして,ライブラリを作成するには...
# 静的ライブラリ
cmake_minimum_required(VERSION 2.8)
project(test_cmake CXX)
# hello.cppとgood_morning.cppをコンパイルして静的ライブラリlibgreetings.aを作成
add_library(greetings STATIC hello.cpp good_morning.cpp)
# a.outという実行ファイルをmain.cppから作成
add_executable(a.out main.cpp)
# a.outを作成する際にlibgreetings.aをリンク
target_link_libraries(a.out greetings)
# 共有ライブラリ
cmake_minimum_required(VERSION 2.8)
project(test_cmake CXX)
# hello.cppとgood_morning.cppをコンパイルして共有ライブラリlibgreetings.soを作成
add_library(greetings SHARED hello.cpp good_morning.cpp)
add_executable(a.out main.cpp)
# a.outを作成する際にlibgreetings.soをリンク
target_link_libraries(a.out greetings)
cmake
を使うときは,build
ディレクトリ以下で行ったほうが管理が楽になるみたいです
ソースファイルが,複数のディレクトリをまたいでいるとき
ディレクトリごとにコンパイル.ライブラリの作成みたいなフローになるのでしょうか.
cmake では,ディレクトリごとに CMakeLists.txt
を作成
cmake_minimum_required(VERSION 2.8)
project(test_cmake CXX)
# サブディレクトリを登録
add_subdirectory(src)
add_subdirectory(test)
add_library(greetings SHARED hello.cpp good_morning.cpp)
add_executable(a.out main.cpp)
# a.outをコンパイルする際に/srcをインクルードファイルを探すパスとして登録
target_include_directories(a.out PUBLIC ${CMAKE_SOURCE_DIR}/src)
target_link_libraries(a.out greetings)
※正直なところ,コピペをさせていただいているだけで全然理解できていないです.cppを学習して,実際に使ってみて更新していきます.
参考
make
https://qiita.com/thaladabar/items/1f72a3359acb5cf7428e
http://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/gnu-make/rule.html
cmake