[過去ログ] ビルド自動化ツールCMake Part.1 (72レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1(1): 蟻人間 ◆T6xkBnTXz7B0 2021/06/12(土)20:08 ID:bymgAWyc(1/5) AAS
CMakeは、コンパイラに依存しないビルド自動化のためのフリーソフトウェアです。主にC/C++のビルド管理で使用され、様々なビルド環境に対応しています。Windows、Linux、MacどこでもOK。
外部リンク:cmake.org
基本的な使い方はまず、ビルド環境にCMakeをインストールした後で、ビルド方法を記述したテキストファイルCMakeList.txtをソースと同じ場所に作成した上で、
cmakeをジェネレータを指定して実行するとMakefileやプロジェクトファイルなどが生成されるので、それを使ってビルドします。
ジェネレータの一覧は-Gオプションを付けてcmakeを実行すると見られます。
2: 蟻人間 ◆T6xkBnTXz7B0 2021/06/12(土)20:27 ID:rWz1JMsc(1/6) AAS
CMakeLists.txtの標準的な記述方法は以下の通りです。
【ここから】
# CMakeLists.txt --- CMake project settings
# ex) cmake -G "Visual Studio 9 2008" .
# ex) cmake -DCMAKE_BUILD_TYPE=Release -G "MinGW Makefiles" .
##############################################################################
# CMake minimum version
cmake_minimum_required(VERSION 3.0)
# project name and languages
project(MyProject C CXX)
省6
3: 蟻人間 ◆T6xkBnTXz7B0 2021/06/12(土)20:30 ID:rWz1JMsc(2/6) AAS
Win32アプリの場合のCMakeLists.txtの記述方法は以下の通りです。
【ここから】
# CMakeLists.txt --- CMake project settings
# ex) cmake -G "Visual Studio 9 2008" .
# ex) cmake -DCMAKE_BUILD_TYPE=Release -G "MinGW Makefiles" .
##############################################################################
# CMake minimum version
cmake_minimum_required(VERSION 3.0)
# project name and languages
project(MyProject C CXX RC)
省8
4: 蟻人間 ◆T6xkBnTXz7B0 2021/06/12(土)20:42 ID:rWz1JMsc(3/6) AAS
>>1
訂正。CMakeLists.txtです。Listsは複数形です。
5: 蟻人間 ◆T6xkBnTXz7B0 2021/06/12(土)22:27 ID:bymgAWyc(2/5) AAS
質問1. なぜMakefileを直接使わないの?
答え. Makefileには方言があって機種依存になっているため、あっちのMakefileがこっちで動かないことが多く、
開かれた幅広いサポートには不向きです。また、ビルドに関係ない記述も多く、移植作業の無駄になります。
CMakeはマルチプラットフォーム対応を少ない作業で実現します。
6: 蟻人間 ◆T6xkBnTXz7B0 2021/06/12(土)22:39 ID:rWz1JMsc(4/6) AAS
質問2. ジェネレータって何ですか?
答え. ジェネレータとは何かのデータを生成する「生成器」のことです。
CMakeではビルド環境に対応したジェネレータを選ぶことでビルドができる
ようになります。以下はジェネレータの例です(環境によって異なります):
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>"C:\Program Files\CMake\bin\cmake.exe" -G
CMake Error: No generator specified for -G
Generators
* Visual Studio 16 2019 = Generates Visual Studio 2019 project files.
Use -A option to specify architecture.
...
省8
7: 蟻人間 ◆T6xkBnTXz7B0 2021/06/12(土)22:45 ID:rWz1JMsc(5/6) AAS
質問3. Visual Studioでビルドしたい場合はどうすればいいですか?
答え. Visual Studioをインストールした場合は、Visual Studio専用の
コマンドプロンプトがWindowsメニューのプログラムリストの中にあります。
VSコマンドプロンプトを起動して、CDコマンドでソースのあるフォルダに
移動して、cmakeを実行して下さい。NMakeを使う方法と
VSソリューションファイルを使う方法の2種類あります。
cmake -G "NMake Makefiles" .
cmake -G "Visual Studio 16 2019" -A Win32 .
cmake -G "Visual Studio 9 2008 Win64" .
8: 蟻人間 ◆T6xkBnTXz7B0 2021/06/12(土)23:01 ID:rWz1JMsc(6/6) AAS
質問4. ビルドを自動化できると何かいいことあるの?
答え. GitHub Actionsなどと組み合わせて退屈なビルド・テスト作業を
自動化すると、人間がしなくていい無駄な仕事がなくなります。
GitHubでコミットしたときに複数の環境で自動ビルド・テストするようにすると、
人間はテスト結果の一覧を見るだけで次のコーディングに進むことができます。
CMakeは自動化・省力化を強力に支援します。
9: 蟻人間 ◆T6xkBnTXz7B0 2021/06/12(土)23:17 ID:bymgAWyc(3/5) AAS
自動化するには、バッチ処理や設定などの記述が必要ですが、一度正しく記述できれば、後はクラウド・仮想化・自動化のパワーで
圧倒的な開発手順の革新となります。そのパワーは開発規模が大きいほど効果的です。
10: 蟻人間 ◆T6xkBnTXz7B0 2021/06/12(土)23:27 ID:bymgAWyc(4/5) AAS
質問4. CMakeを扱うにはどんな知識・技術が必要?
答え.まず、コマンドプロンプトやシェルスクリプトを少し操れて、コマンドラインやバッチ処理が記述できる程度の技術が必要です。
また、CMakeの記述方法を自分で英語などでウェブ検索して情報を突き止める的確な検索技能が必要になります。
11: 蟻人間 ◆T6xkBnTXz7B0 2021/06/12(土)23:36 ID:bymgAWyc(5/5) AAS
例えばCMakeで実行ファイルを作成するには「add_executable」というCMakeコマンドを使用しますが、これの使い方を検索して記述方法を3分の1でも理解できるようなレベルでなければいけません。
ライブラリを作成するには「add_library」というCMakeコマンドを使用します。こういったCMakeコマンドの並びをCMakeLists.txtというファイルに実際に記述するわけです。
12(2): 2021/06/13(日)00:59 ID:cRYSJGQ8(1/3) AAS
add_testってgoogle testとか外部テストライブラリ使わなくても使用可能なの?
13: 蟻人間 ◆T6xkBnTXz7B0 2021/06/13(日)01:06 ID:rRRSYwbM(1/2) AAS
>>12
CMakeに付属するテストツールCTestを使うにはenable_testing()を書かないといけないらしい。
外部リンク:qiita.com
14: 蟻人間 ◆T6xkBnTXz7B0 2021/06/13(日)01:11 ID:rRRSYwbM(2/2) AAS
CMakeをインストールしてれぱCTestも入ってるはず。
15: 2021/06/13(日)01:37 ID:lvxMBUj+(1) AAS
>>12
常識的に考えてフレームワークは有ったほうが良いと思います。
16: 2021/06/13(日)02:01 ID:CEo6Ln9Y(1) AAS
「はず」ねえ
17(1): 2021/06/13(日)03:36 ID:8vbdM5AU(1) AAS
蟻人間の説明に誤りが多い。このスレは伸びない
18(1): 2021/06/13(日)07:19 ID:cRYSJGQ8(2/3) AAS
CMakeLists.txtの変数の一覧はどこかで見れる?
19: 2021/06/13(日)09:43 ID:7hKf4K7h(1) AAS
完走出来るかはさておき次スレではビルドツール共用で
20: 蟻人間 ◆T6xkBnTXz7B0 2021/06/13(日)09:57 ID:grfIiy8/(1/2) AAS
>>18
「cmake variables」で検索すれば次のページが出てくる:
外部リンク[html]:cmake.org
21(1): 2021/06/13(日)13:16 ID:cRYSJGQ8(3/3) AAS
CMakeのプロジェクトのなかで変数一覧が記載されたファイルとかないの?
22: 蟻人間 ◆T6xkBnTXz7B0 2021/06/13(日)13:59 ID:grfIiy8/(2/2) AAS
>>21
cmakeに成功すると、CMakeCache.txtというファイルができる。
この中に変数の設定内容が一時的に保存されている。
23: 蟻人間 ◆T6xkBnTXz7B0 2021/06/13(日)15:30 ID:otNLJkw4(1) AAS
間違えずに書く自信のある人なら、CMakeCache.txtに書かれてる内容を直接書き換えてもいい。
24: 2021/06/14(月)10:48 ID:LnG83xz5(1) AAS
>>17
蟻は調べながら受け売りコピペしてるだけ
結局自分で調べた方が早い
25: 2021/06/14(月)13:15 ID:shEIUH7U(1) AAS
調べて載せてくれてるならいいじゃないのコピペだって
多少の間違いは周りが訂正してあげれば十分
そんな叩いてばかりしてたらコミュニティが過疎っしまいますよ
26: 2021/06/14(月)16:44 ID:xr9L9qN8(1) AAS
そんなクソコミュニティ、元々いらんのだが。
27: 2021/06/14(月)18:27 ID:6p9bp5Dj(1) AAS
糞コミュニティなんていくらでもあるんだから、自分に必要ないと思ったら
寄っていかなきゃいいだけ。
28: 2021/06/14(月)18:53 ID:U7CM/gao(1) AAS
Part 1とか付けると2まで伸びないというジンクスがある。
29(1): 2021/06/15(火)01:22 ID:cmWMd34J(1) AAS
いつも思うことだがツールチェインとか特に
便利にしようと思って作ったのは気持ち的にはわからんでもないけど
かえって手間が増えてんだよねえ・・
移植作業が必要だのなんだのいっても普通にMakefileでいいわってなる
たいした手間じゃないしな
他の奴らも全てに精通してるわけじゃないし
30: 2021/06/15(火)15:30 ID:dTl1pSLY(1) AAS
cmakeスレも昔いくつかあったな
31: 2021/06/15(火)18:46 ID:jlLB8m57(1) AAS
>>29
いや全然違う。
32: 2021/06/15(火)20:08 ID:BeYGJoYp(1) AAS
makefileが方言ありすぎてCMake使うようになったってきいた
33: 2021/06/15(火)20:23 ID:ULdPzagS(1) AAS
makeに余計なこと書きすぎなのがいけない。酷いのになるとコロンの右側にstdio.hがあったりする。gcc -Mの出力をそのまんま喰わせてる感じ
34: 2021/06/15(火)23:41 ID:0F6z4l8H(1) AAS
cmakeは宣言型、makefileは手続型みたいな感じかな
makefileはコマンドやシェルスクリプトを使って何でもできちゃうから他人には読めないようなものになってることがある
35(2): 2021/06/16(水)18:27 ID:z1aHwQBP(1/7) AAS
makeの場合、環境変数PATHの切り替えで32bit用と64bit用のコンパイラが簡単に切り替えられるが、
cmakeは余計なことをしてくれるので不具合が発生する。
cmake -G "Visual Studio 16 2019" -A Win32 ..
こっちは動くが
cmake -G "Visual Studio 16 2019" -A Win64 ..
こっちは動かない。
ただ、何もしないと勝手にWin64のコンパイラを起動するので指定なしで代用できる。
この時のCMakeLists.txtは自分の書いたものでなくて、そこそこ有名なGitHubのソフトのものなので、
CMakeLists.txtの問題でなく、cmakeそのものの問題だと予想される。
さらに、/MT, /MD, /MTd, /MDdと四種類のライブラリをビルドしようとすると
省3
36: 蟻人間 ◆T6xkBnTXz7B0 2021/06/16(水)18:34 ID:Qk2ktN9D(1/5) AAS
>>35
それはよくある間違いで、Win64ではなくx64を指定しないといけないらしい。
外部リンク:stackoverflow.com
37: ◆QZaw55cn4c 2021/06/16(水)19:13 ID:ujIwgEeO(1) AAS
昔の教科書で習った make を使うことにしています、内部をしっかり把握しているのでこれが一番いろいろやりやすいのです
外部リンク:www.amazon.co.jp
外部リンク:www.amazon.co.jp
38(2): 蟻人間 ◆T6xkBnTXz7B0 2021/06/16(水)19:13 ID:Qk2ktN9D(2/5) AAS
>>35
/MT, /MD, /MTd, /MDdについてだが、CMake 3.15よりMSVC_RUNTIME_LIBRARYという変数が使えるらしい。
外部リンク[html]:cmake.org
外部リンク:stackoverflow.com
ターゲットを分けて、それぞれについてset_propertyすれば可能。
add_executable(foo1 foo.c)
set_property(TARGET foo2 PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
add_executable(foo2 foo.c)
set_property(TARGET foo2 PROPERTY
省3
39: 蟻人間 ◆T6xkBnTXz7B0 2021/06/16(水)19:17 ID:Qk2ktN9D(3/5) AAS
>>38
訂正。変数じゃなくてプロパティ。
40: 2021/06/16(水)19:33 ID:Qk2ktN9D(4/5) AAS
>>38
訂正。
「MultiThreadedDLL$<$<CONFIG:Debug>:Debug>」
じゃなくて
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」。
41: 蟻人間 ◆T6xkBnTXz7B0 2021/06/16(水)19:38 ID:Qk2ktN9D(5/5) AAS
「$<$<CONFIG:Debug>:Debug>」というのはgenerator expressionsの一種で、
デバッグ版のときは"Debug", リリース版のときは空文字列に展開されるらしい。
つまり、
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」
は、デバッグ版では「MultiThreadedDebugDLL」となり、
リリース版では「MultiThreadedDLL」となる。
なお、MSVC_RUNTIME_LIBRARYを使う場合は、
cmake_minimum_required(VERSION 3.15)の後に
cmake_policy(SET CMP0091 NEW)も付けた方がいいらしい。
42: 2021/06/16(水)20:48 ID:z1aHwQBP(2/7) AAS
そうすると四種類のビルドをやるにはこうすると出来るけど、
[ --build . --config Release ]
この場合のReleaseとDebugとの関係性はどうなるの?
cmake_minimum_required(VERSION 3.15)
set(SRC a.cpp b.cpp c.cpp d.cpp e.cpp f.cpp g.cpp h.cpp i.cpp)
add_library(xx_mt ${SRC})
add_library(xx_md ${SRC})
add_library(xx_mtd ${SRC})
add_library(xx_mdd ${SRC})
set_property(TARGET xx_mt
省13
43: 2021/06/16(水)21:09 ID:z1aHwQBP(3/7) AAS
うーん、あとこれだと自分で記述する場合はいいけど、
GitHubとかで取ってきたgcc用のtar-ballの移植の場合は
MSVC_RUNTIME_LIBRARYのためのTARGET沢山増設して
CMakeLists.txtが殆ど書き直しに近い状態になるなあ
44: 蟻人間 ◆T6xkBnTXz7B0 2021/06/16(水)21:25 ID:woJNV48Q(1/3) AAS
う〜ん、ターゲットは二種類でいいんじゃないか。generator expressionsでデバッグとリリースの差異を吸収できるし。
結局、IDEでデバッグ・リリース切り替えないといけないっしょ。
45: 2021/06/16(水)21:27 ID:z1aHwQBP(4/7) AAS
それって二種類書けば --configのDebug/Releaseで四種類そろうって意味?
46: 蟻人間 ◆T6xkBnTXz7B0 2021/06/16(水)21:33 ID:woJNV48Q(2/3) AAS
そうだよ。プロパティに指定したgenerator expressionの
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」は、「MultiThreadedDebugDLL」と
「MultiThreadedDLL」になる。
47(1): 2021/06/16(水)21:55 ID:XZ06lrte(1) AAS
共通がたくさんあるのであればfunction()〜endfunction()使うのもありじゃない?
外部リンク[html]:cmake.org
48(1): 2021/06/16(水)21:57 ID:z1aHwQBP(5/7) AAS
そうなるとこれでいいんだ。ありがとう。
cmake_minimum_required(VERSION 3.15)
set(SRC a.cpp b.cpp c.cpp d.cpp e.cpp f.cpp g.cpp h.cpp i.cpp)
add_library(xx_mt ${SRC})
add_library(xx_md ${SRC})
set_property(TARGET xx_mt
PROPERTY MSVC_RUNTIME_LIBRARY
"MultiThreaded$<$<CONFIG:Debug>:Debug>")
set_property(TARGET xx_md
PROPERTY MSVC_RUNTIME_LIBRARY
省3
49: 2021/06/16(水)22:01 ID:z1aHwQBP(6/7) AAS
>>47
ありだと思う
50: 蟻人間 ◆T6xkBnTXz7B0 2021/06/16(水)22:07 ID:woJNV48Q(3/3) AAS
>>48
「DLL」は後ろにつけて。
51: 2021/06/16(水)22:11 ID:z1aHwQBP(7/7) AAS
これが正解になるのかな
cmake_minimum_required(VERSION 3.15)
set(SRC a.cpp b.cpp c.cpp d.cpp e.cpp f.cpp g.cpp h.cpp i.cpp)
add_library(xx_mt ${SRC})
add_library(xx_md ${SRC})
set_property(TARGET xx_mt
PROPERTY MSVC_RUNTIME_LIBRARY
"MultiThreaded$<$<CONFIG:Debug>:Debug>")
set_property(TARGET xx_md
PROPERTY MSVC_RUNTIME_LIBRARY
省3
52: 2021/07/11(日)15:46 ID:lbKLD5N+(1) AAS
結局こうやって人を実験台にする気満々で初めて誰にも相手にされなくなるんだよね。
メタ系の言語を推すバカの末路だわ。
53: 蟻人間 ◆T6xkBnTXz7B0 2021/07/19(月)23:06 ID:6UpSDY/2(1) AAS
バーカバーカ
ヘビメタだぜ。奉ろうベイビー!
みんな優秀だから質問しなくてもできる。
偉い偉い。
54: 2021/09/14(火)01:26 ID:Mj50vLs9(1) AAS
広く使われてるけどあんまり話題がないのな
55: 2021/09/14(火)06:15 ID:pTMW8GY7(1) AAS
自作自演の即死スレ
56: 2021/09/15(水)11:48 ID:PYzW5a+n(1) AAS
そもそもマルチOSで出そうなんて苦労の割にメリット低いわ。
それもわからんバカがこういうデラックスなツールを使いたがるんだよね。
57: 2021/09/15(水)19:05 ID:5Un5Xbsb(1) AAS
VSCodeだけでC++やろうとするとこれが一番楽なんよ。マルチは苦労増えるだけやな
58(1): 2021/09/15(水)23:44 ID:9XE/xHox(1) AAS
cmakeってそんなにデラックスかな?
マルチプラットフォームでなくてもmakefile直書きよりメリットあると思うけど
makefile → コンパイルやリンクなど手続きを記述していく
cmake → 手続きではなく関係性などを定義していく
59: 2021/09/16(木)06:19 ID:QQbmBwad(1) AAS
広く使われることを考えてなかったような設計だよな
なんかいまいち近代的じゃない
60(1): 2021/09/22(水)02:27 ID:H7+/Tu0q(1) AAS
>>58
その程度の用途でmakefileも満足に書けないならc/c++での開発なんかするべきじゃない。
61: 2021/09/22(水)09:37 ID:85DYkwM1(1/2) AAS
そんなこといったって・・・
プラットフォームごとに使えるコマンドとか違うじゃん
cmakeに関係性を記述して各プラットフォームごとのMakefileは自動生成のほうが楽なんだもん
62: 2021/09/22(水)19:08 ID:xKA5BBWf(1) AAS
大した差ではないし、その差が理解できないやつは問題起きた時に明らかに詰むからやめろや。
63: 2021/09/22(水)21:21 ID:85DYkwM1(2/2) AAS
ごめんね・・
64: 2021/09/22(水)22:10 ID:fOdtASHT(1) AAS
でも現実には使われてるからな
個別にmakefileなんて書かない
65: 2021/09/23(木)00:37 ID:1QHTb9H7(1) AAS
便利だと思えば自分で使えば良いだけで他人に強制するものではないんだよ
外部リンク:www.tokyo-np.co.jp
66: 2021/09/23(木)10:01 ID:u1LIdCP+(1) AAS
別に強制はしてないから
67: 2021/09/23(木)11:42 ID:AZNHMrAu(1) AAS
そうやってexcel方眼紙ができていったわけだけれど。
68: 2021/09/25(土)16:56 ID:wzNzdXVE(1) AAS
>>60
C/C++の開発からこそCMakeLists.txtを書くんだよ
69: 2021/10/04(月)08:16 ID:S53xZnhz(1) AAS
手元のCのプロジェクトをmakefileからcmakeへ移行したお陰でVSでビルド出来るようになったし、ninjaでもビルド出来るようになって、こっちはビルドが爆速になって良いことしかない
70: 2021/10/06(水)17:43 ID:XJEs7oM2(1) AAS
おめ
71: 2021/12/31(金)11:32 ID:+Lg1Sgs9(1) AAS
configureオプションとcmakeとを対照できる手段あるかな?
ClamAVのビルドツールがcmakeになってしまったので、指定していたconfigureオプションをcmakeに翻訳してやらないとならない。
72: 2023/09/21(木)20:25 ID:QerBhdvC(1) AAS
アレ、なんかすごいことになってるやんか!
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.390s*