◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:ビルド自動化ツールCMake Part.1 ->画像>1枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1623496111/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
CMakeは、コンパイラに依存しないビルド自動化のためのフリーソフトウェアです。主にC/C++のビルド管理で使用され、様々なビルド環境に対応しています。Windows、Linux、MacどこでもOK。
https://cmake.org/ 基本的な使い方はまず、ビルド環境にCMakeをインストールした後で、ビルド方法を記述したテキストファイルCMakeList.txtをソースと同じ場所に作成した上で、
cmakeをジェネレータを指定して実行するとMakefileやプロジェクトファイルなどが生成されるので、それを使ってビルドします。
ジェネレータの一覧は-Gオプションを付けてcmakeを実行すると見られます。
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) ############################################################################## # program.exe add_executable(program file1.cpp file2.cpp) ############################################################################## 【ここまで】 「#」で始まる行はコメントです。
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) ############################################################################## # program.exe add_executable(program WIN32 file1.cpp file2.cpp program_res.rc) target_link_libraries(program comctl32) ############################################################################## 【ここまで】 Win32の場合は「RC」と「WIN32」を付けるのを忘れないで下さい。 テンプレここまで。
>>1 訂正。CMakeLists.txtです。Listsは複数形です。
質問1. なぜMakefileを直接使わないの? 答え. Makefileには方言があって機種依存になっているため、あっちのMakefileがこっちで動かないことが多く、 開かれた幅広いサポートには不向きです。また、ビルドに関係ない記述も多く、移植作業の無駄になります。 CMakeはマルチプラットフォーム対応を少ない作業で実現します。
質問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. ... Visual Studio 9 2008 [arch] = Generates Visual Studio 2008 project files. Optional [arch] can be "Win64" or "IA64". Borland Makefiles = Generates Borland makefiles. NMake Makefiles = Generates NMake makefiles. NMake Makefiles JOM = Generates JOM makefiles. MSYS Makefiles = Generates MSYS makefiles. MinGW Makefiles = Generates a make file for use with ...
質問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" .
質問4. ビルドを自動化できると何かいいことあるの? 答え. GitHub Actionsなどと組み合わせて退屈なビルド・テスト作業を 自動化すると、人間がしなくていい無駄な仕事がなくなります。 GitHubでコミットしたときに複数の環境で自動ビルド・テストするようにすると、 人間はテスト結果の一覧を見るだけで次のコーディングに進むことができます。 CMakeは自動化・省力化を強力に支援します。
自動化するには、バッチ処理や設定などの記述が必要ですが、一度正しく記述できれば、後はクラウド・仮想化・自動化のパワーで 圧倒的な開発手順の革新となります。そのパワーは開発規模が大きいほど効果的です。
質問4. CMakeを扱うにはどんな知識・技術が必要? 答え.まず、コマンドプロンプトやシェルスクリプトを少し操れて、コマンドラインやバッチ処理が記述できる程度の技術が必要です。 また、CMakeの記述方法を自分で英語などでウェブ検索して情報を突き止める的確な検索技能が必要になります。
例えばCMakeで実行ファイルを作成するには「add_executable」というCMakeコマンドを使用しますが、これの使い方を検索して記述方法を3分の1でも理解できるようなレベルでなければいけません。 ライブラリを作成するには「add_library」というCMakeコマンドを使用します。こういったCMakeコマンドの並びをCMakeLists.txtというファイルに実際に記述するわけです。
add_testってgoogle testとか外部テストライブラリ使わなくても使用可能なの?
>>12 CMakeに付属するテストツールCTestを使うにはenable_testing()を書かないといけないらしい。
https://qiita.com/mrk_21/items/25ee7f00cebb9934b472 CMakeをインストールしてれぱCTestも入ってるはず。
>>12 常識的に考えてフレームワークは有ったほうが良いと思います。
CMakeLists.txtの変数の一覧はどこかで見れる?
完走出来るかはさておき次スレではビルドツール共用で
CMakeのプロジェクトのなかで変数一覧が記載されたファイルとかないの?
>>21 cmakeに成功すると、CMakeCache.txtというファイルができる。
この中に変数の設定内容が一時的に保存されている。
間違えずに書く自信のある人なら、CMakeCache.txtに書かれてる内容を直接書き換えてもいい。
>>17 蟻は調べながら受け売りコピペしてるだけ
結局自分で調べた方が早い
調べて載せてくれてるならいいじゃないのコピペだって 多少の間違いは周りが訂正してあげれば十分 そんな叩いてばかりしてたらコミュニティが過疎っしまいますよ
糞コミュニティなんていくらでもあるんだから、自分に必要ないと思ったら 寄っていかなきゃいいだけ。
Part 1とか付けると2まで伸びないというジンクスがある。
いつも思うことだがツールチェインとか特に 便利にしようと思って作ったのは気持ち的にはわからんでもないけど かえって手間が増えてんだよねえ・・ 移植作業が必要だのなんだのいっても普通にMakefileでいいわってなる たいした手間じゃないしな 他の奴らも全てに精通してるわけじゃないし
makefileが方言ありすぎてCMake使うようになったってきいた
makeに余計なこと書きすぎなのがいけない。酷いのになるとコロンの右側にstdio.hがあったりする。gcc -Mの出力をそのまんま喰わせてる感じ
cmakeは宣言型、makefileは手続型みたいな感じかな makefileはコマンドやシェルスクリプトを使って何でもできちゃうから他人には読めないようなものになってることがある
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と四種類のライブラリをビルドしようとすると 勝手にコンパイルスイッチをいじられるのでマクロを使って工夫する必要が出てくる。 こういうのを考慮するとcmakeにすると互換性ばっちりとは言い難い。 簡潔なMakefileを書けるなら、そっちで配布した方が結果的に互換性が高いと思う。
昔の教科書で習った make を使うことにしています、内部をしっかり把握しているのでこれが一番いろいろやりやすいのです
https://www.a ;mazon.co.jp/dp/4871481689/
https://www.a ;mazon.co.jp/dp/4871482006/
>>35 /MT, /MD, /MTd, /MDdについてだが、CMake 3.15よりMSVC_RUNTIME_LIBRARYという変数が使えるらしい。
https://cmake.org/cmake/help/latest/prop_tgt/MSVC_RUNTIME_LIBRARY.html https://stackoverflow.com/a/56490614 ターゲットを分けて、それぞれについて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
MSVC_RUNTIME_LIBRARY "MultiThreadedDLL$<$<CONFIG:Debug>:Debug>")
...
3.15より前は、ちょっとややこしいコードになる。
>>38 訂正。
「MultiThreadedDLL$<$<CONFIG:Debug>:Debug>」
じゃなくて
「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」。
「$<$<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)も付けた方がいいらしい。
そうすると四種類のビルドをやるにはこうすると出来るけど、 [ --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 PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") set_property(TARGET xx_mtd PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") set_property(TARGET xx_md PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreadedDLL") set_property(TARGET xx_mdd PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreadedDLL$<$<CONFIG:Debug>:Debug>") target_include_directories(xx_mt PUBLIC "../include") target_include_directories(xx_md PUBLIC "../include") target_include_directories(xx_mtd PUBLIC "../include") target_include_directories(xx_mdd PUBLIC "../include")
うーん、あとこれだと自分で記述する場合はいいけど、 GitHubとかで取ってきたgcc用のtar-ballの移植の場合は MSVC_RUNTIME_LIBRARYのためのTARGET沢山増設して CMakeLists.txtが殆ど書き直しに近い状態になるなあ
う~ん、ターゲットは二種類でいいんじゃないか。generator expressionsでデバッグとリリースの差異を吸収できるし。 結局、IDEでデバッグ・リリース切り替えないといけないっしょ。
それって二種類書けば --configのDebug/Releaseで四種類そろうって意味?
そうだよ。プロパティに指定したgenerator expressionの 「MultiThreaded$<$<CONFIG:Debug>:Debug>DLL」は、「MultiThreadedDebugDLL」と 「MultiThreadedDLL」になる。
そうなるとこれでいいんだ。ありがとう。 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 "MultiThreadedDLL$<$<CONFIG:Debug>:Debug>") target_include_directories(xx_mt PUBLIC "../include") target_include_directories(xx_md PUBLIC "../include")
これが正解になるのかな 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 "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL") target_include_directories(xx_mt PUBLIC "../include") target_include_directories(xx_md PUBLIC "../include")
結局こうやって人を実験台にする気満々で初めて誰にも相手にされなくなるんだよね。 メタ系の言語を推すバカの末路だわ。
バーカバーカ ヘビメタだぜ。奉ろうベイビー! みんな優秀だから質問しなくてもできる。 偉い偉い。
そもそもマルチOSで出そうなんて苦労の割にメリット低いわ。 それもわからんバカがこういうデラックスなツールを使いたがるんだよね。
VSCodeだけでC++やろうとするとこれが一番楽なんよ。マルチは苦労増えるだけやな
cmakeってそんなにデラックスかな? マルチプラットフォームでなくてもmakefile直書きよりメリットあると思うけど makefile → コンパイルやリンクなど手続きを記述していく cmake → 手続きではなく関係性などを定義していく
広く使われることを考えてなかったような設計だよな なんかいまいち近代的じゃない
>>58 その程度の用途でmakefileも満足に書けないならc/c++での開発なんかするべきじゃない。
そんなこといったって・・・ プラットフォームごとに使えるコマンドとか違うじゃん cmakeに関係性を記述して各プラットフォームごとのMakefileは自動生成のほうが楽なんだもん
大した差ではないし、その差が理解できないやつは問題起きた時に明らかに詰むからやめろや。
でも現実には使われてるからな 個別にmakefileなんて書かない
そうやってexcel方眼紙ができていったわけだけれど。
>>60 C/C++の開発からこそCMakeLists.txtを書くんだよ
手元のCのプロジェクトをmakefileからcmakeへ移行したお陰でVSでビルド出来るようになったし、ninjaでもビルド出来るようになって、こっちはビルドが爆速になって良いことしかない
configureオプションとcmakeとを対照できる手段あるかな? ClamAVのビルドツールがcmakeになってしまったので、指定していたconfigureオプションをcmakeに翻訳してやらないとならない。
read.cgi ver 07.7.23 2024/12/25 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20250302035221このスレへの固定リンク: http://5chb.net/r/tech/1623496111/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。 TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「ビルド自動化ツールCMake Part.1 ->画像>1枚 」 を見た人も見ています:・自動化ツールUWSC使いよ集まれ29 ・自動化ツールUWSC使いよ集まれ16 ・自動化ツールUWSC使いよ集まれ30 ・自動化ツールUWSC使いよ集まれ25 ・自動化ツールuwsc使いよ集まれ5 ・自動化ツールUWSC使いよ集まれ20 ・自動化ツールUWSC使いよ集まれ19 ・自動化ツールUWSC使いよ集まれ22 ・ツムツム ハート交換 自動化ツール Part6 ・ツムツム ハート交換 自動化ツール Part7 ・【戦争】アフガン少女グールさん、両親殺害したタリバン戦闘員2人を自動小銃AK47で射殺 [かわる★] ・【チャイルドシート】使用率上がらぬ自動車大国新潟 「付け替え面倒」 ・【画像】川口市「クルド人の皆さんは車検なしの自動車乗り回してもお咎めなしです😂」 ・ワークマンの時価総額、日本マクドナルドを超えジャスダックトップの7218億円 東証1部の三菱自動車やヤマトも抜く ・自動車整備の資格を持つ男、己の大型バイクを整備し配管つなぎ間違えオイルドボドボでサーキット走行、滑った7台2人死亡で書類送検 [水星虫★] ・【自動車】【マツダ MX-30】プレーンかつサスティナブル、マイルドハイブリッド搭載のコンパクトSUV…価格は242万円から [エリオット★] ・[AKITA931] 三菱自動車、3月期260億円の赤字 ・【軽電気自動車】日産と三菱、軽EV「SAKURA」「ekクロスEV」発表 価格は180万円台から★3 [七波羅探題★] ・【PELOコイン】自動売買ツール12 ・三菱自動車、今度は隠さずリコール発表 ・【FF14】自動演奏・MIDIその他ツールスレ ・自動生成ツール考えている、と言ってた人間だけど ・★080911 VIP麻雀スレ保守ツールによる「自動保守」荒らし報告スレ ・設計支援/自動化, ドキュメント作成支援ツール ・【自動車】マツダからSUVスタイルの軽トールワゴン登場 ・自動車メーカーは次々と新車のEV化を決めてるけど・・・ ・【国際/経済】ドイツ自動車5社がリコール、排ガス浄化機能が低下 ・【自動車】ロールス・ロイスの新SUV、カリナン見参! ・【韓国】現代の電気自動車、相次ぐ炎上で全世界で77000台リコール [動物園φ★] ・なんで自動車メーカーって株主総会終わってから、一斉にリイコールするの? ・トヨタ自動車、プリウスなど13車種計2万1065台をリコール ・【自動車】スバルの大量リコール、安価な部品で材料選定ミス [ぐれ★] ・【自動車】警察、救急車両リコール トヨタ系メーカー240台 ・有期から無期雇用転換、自動車10社中7社が無期雇用にならないよう阻害ルールを設ける ・【自動車】すべての新車にアルコール検知システムを搭載するよう国家運輸安全委員会が要求 米 [すらいむ★] ・【USA】飲酒運転疑われた男性、「ビール自動醸造症候群」だった 体内でアルコール醸造 ・【EV】Apple Car製造をヒュンダイ自動車が担当か [田杉山脈★] ・【自動車】ベンツが雨漏り…ML350など7車種1万1387台リコール、エンジン停止の恐れ [ぐれ★] ・佐藤まーちゃんですら軽自動車にネガティブなイメージを持っているとは・・・ ・【自動車】日産『エクストレイル』3000台以上をリコール…先行車や対向車にハイビームを勝手に照射 [シャチ★] ・【ニュース動画あり】名阪国道で軽自動車がコーナー曲がり切らずにガードレールに突き刺さり若い男女2人死亡 ・テスラ、ウイグルでショールームオープン! インテル、中国メーカーと自動運転車を開発!→ネトウヨ錯乱 ・Apple さん 韓国現代自動車との電気自動車生産協議中断へ 理由、合意前の公表 ・【電気自動車】ついに日本上陸!中国「EV電池」の忍び寄る影 パナソニックを抜いた超新星「CATL」の正体 ・語られぬ韓国自動車業界の危機 7カ月連続の国内販売落ち込み 現代自「EVオールイン」宣言から短期間での路線変更 [9/7] [昆虫図鑑★] ・【現代自動車】 日本進出発表日、インドでは不買運動、米ではリコール… 初日から「注目度」高く ★2 [2/10] [昆虫図鑑★] ・【青森】軽自動車が街路灯に衝突し大破 大学生6人が死傷 運転していた男子大学生からアルコール検出 六戸町 ★2 [さかい★] ・【トヨタ】東南アジア配車最大手「グラブ(シンガポール)」に1100億円出資 自動運転車両「eパレット」でサービスの展開検討 ・【自動車保険】広がる「ドラレコ」特約、損保各社がレンタル 衝撃検知→コールセンター映像送信→オペレーターが消防やレッカー手配 ・【韓国プロ野球】最悪の審判陣、「うそ」謀議か…ABS(自動投球判定システム)の「ストライク」を「ボール」に [4/15] [昆虫図鑑★] ・【江南タイムズ】 韓国製ハイブリッド車で深刻な不具合続出、現代自動車コナで走行中エンストも…リコールはなし [1/5] [仮面ウニダー★] ・【朗報】幸楽苑さん、最先端な自動配膳殺人ロボットをラーメン業界で初めて導入・・・・・・・・・・・・・・・ ・【自動車】世界のEV市場で日本勢が勝つには「ホンダと日産が合併」専門家が指摘 [尺アジ★] ・【懐かしい曲】自動車CMソングを語ろう【最新の曲】 ・フジテレビCM差し止め、今日も相次ぐ 新たにアフラック、花王、日産自動車も ・【GPS衛星】 誤差10mが数cmに精度飛躍的に向上 日本版GPS衛星本日打上げ 自動運転、ナビ、ドローン輸送などに活用 ・【話題】韓国の有名女優が三菱自動車のCM出演オファーを拒否! 中国版ツイッターで注目ワード1位に 中国ネットも反応[4/12] ・全自動肛門機 ・三重日野自動車 ・全自動手ケツ機 ・令和時代の自動車 ・統計 全自動化 ・佐賀の自動車について ・自動車は廃止すべき ・自動改札機について ・自動運転反対スレ
05:35:08 up 64 days, 6:33, 0 users, load average: 11.81, 10.72, 10.94
in 0.08293890953064 sec
@0.08293890953064@0b7 on 062018