問題タブ [cmake-custom-command]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cmake - add_custom_command が機能しない
add_custom_command の使用法を理解しようとしています。次のような最小限のメイク ファイル (CMakeLists.txt) を作成しました。
$cmake.
$makeperfecthash.cpp
作成されているのが見えず、ビルドが壊れる
$cmake .
$make
以下のエラーを与える
cmake - Cmake: 変数の内容に基づく add_custom_command 引数
いくつかのバイナリを特定の場所にコピーするための Cmake 関数が必要です。これには、次の関数定義があります。
そして、次の使用法:
プロジェクト ツリー内に target_1、target_2、および target_3 が定義されています。これを念頭に置いて、次の Cmake configure 出力を得ました。
binary_copy.cmake:15 (add_custom_command) での CMake 警告 (dev):
ポリシー CMP0040 が設定されていません: add_custom_command() の TARGET 署名のターゲットが存在する必要があります。ポリシーの詳細については、「cmake --help-policy CMP0040」を実行してください。cmake_policy コマンドを使用してポリシーを設定し、この警告を抑制します。
このコンテキストでは、そのターゲットは不明のようです...しかし、それは存在し、タイプミスはありません。ここでの問題は何ですか?
c - print を使用した CMake ビルド後の出力コマンド
CLion 1.2 を使用して、STM32 ターゲット用の組み込み C プロジェクトをビルドしています。GNU ARM ツールを使用したクロス コンパイルはうまく機能しarm-none-eabi-size
ますが、実行可能ファイルがビルドされた後に実行し、そのコマンドの出力をビルド出力ウィンドウに出力したいと考えています。
マクロを徹底的に調べましたがadd_custom_command
、出力ファイルを生成するつもりはありません。これは、マクロが実行しているように見えます。
以下は、CMakeLists.txt
私がプロジェクトで使用しているものです。
arm-none-eabi-size
コンソールで実行すると、次のように表示されます。
それを実行して、その出力をビルド ウィンドウに表示するにはどうすればよいでしょうか。
ありがとう!
linux - CMake: add_custom_command(...) で if 条件を使用する方法
add_custom_command(...) によって CMakeLists.txt の if 条件を Linux で使用したいのは、これらの if 条件を実行し、makefile で判断を行う必要があるためです。このような:
使いたい場合はどうすればいいですか
いつmakefileを作るのですか?助けてくれてどうもありがとう!
cmake - add_custom_command を使用して、ジェネレータ式を使用して dll をコピーする方法は?
コンパイル時にソリューションの dll をコピーする必要があるため、次のように add_custom_command を使用しています。
cmakelist.txt で、上記の関数を次のように呼び出しています。
しかし、私は次のようにエラーが発生しています:
それで、qt関連のものがインストールされている場所に到達できないのか、それとも add_custom_command ジェネレーター式で間違いを犯しているのでしょうか? 関数を非常に一般的なものにして、ソリューションで取得したい dll がコンパイル中にターゲット内に配置されるようにしたいと考えています。
cmake - 既存の最上位ターゲットへのcmake bind customコマンドが失敗する
トップレベルのカスタム ターゲットが 1 つあり、custom_command を追加/バインドすることでこの既存のターゲットを拡張できるネストされたサブモジュールが必要です。今のところ、私は問題に直面しています:add_custom_command(TARGET target_name ...)
ターゲットが定義されているファイルで使用されていない場合 (ターゲットは最上位の CMakeLists.txt で定義されています)、この custom_command は単純に無視されます。
詳細:
1) 最上位の CMakelists.txt で作成されたcustom_target
2)サブディレクトリ「sub」には、カスタムコマンドで既存のターゲットを拡張できることを望んでいた他のCMakeLists.txt(モジュール)があります。
3)ビルドディレクトリを作成して実行すると
出力ファイルはcustom_target.txtとcustom_command1.txtですが、 custom_command2.txtはありません。それが実際に私の問題です。
build/CMakeFiles/custom_tg.dir/build.makeを調べると、そこにはcustom_command2.txtについての言及がありません。build.makeファイルの内容は次のとおりです: http://pastebin.com/zVVS4sYL。
実際、Cmake によって生成されたファイルのツリーにcustom_command2.txtに関する言及が見つかりません。これは私には奇妙に見えます。
あなたの助けを楽しみにしています。
cmake - 別の add_custom_command に依存する add_custom_command
2 つのadd_custom_command
節があり、一方が他方に依存しています。
最初のコマンドは、コンパイラを使用して
.osl
ソース ファイルを.oso
オブジェクト ファイルにコンパイルします。oslc
への依存関係に注意してください。このコマンドを実行する前に存在することを確認する必要があるため、
${oslc}
明示的に依存しています。${oslc}
2 番目のコマンドは、別の場所からコンパイラをコピーして、コンパイラを "ビルド" (実際にはデプロイ) し
/li>oslc
ます。
.osl
このセットアップは機能しますが、入力ファイルが変更されていない場合でも、両方のコマンドが常に実行されるという副作用があります(2 番目のコマンドの後に最初のコマンドが続きます) 。
この動作は Windows に固有のようです。Linux では問題なく動作するようです。
への依存関係が${oslc}
最初のコマンドから削除された場合、2 番目のコマンドは、oslc
コンパイラが見つからない場合でもまったく実行されなくなります。しかし一方で、.osl
ファイルは、最後のビルド以降に変更された場合にのみ、必要に応じて (存在する限りoslc
) 再コンパイルされるようになりました。
この設定に何か問題はありますか?そうでない場合、両方の機能を組み合わせる正しい方法は何ですか:前回のビルド以降にファイルが変更された場合にのみ.osl
ファイルをコンパイルし、コンパイラがまだ存在しない場合はコンパイラ (最初のステップで必要)を「ビルド」しますか?oslc
実際の CMake スクリプトは GitHub で入手できます。
cmake - 失敗時に add_custom_command が再実行されない
CMakeでは、失敗する可能性add_custom_command(... POST_BUILD ...)
のある aで使用したいと考えています。COMMAND
観察
- の終了コードが ではないため、最初の実行
make
は失敗します。--> これは私が期待するものです。add_custom_command( ... COMMAND exit 1)
0
make
で指定されたコマンドは再度実行されないため、2 回目の実行はパスしadd_custom_command
ます。--> これは私が望んでいるものではありません。make
カスタムコマンドが機能するまで失敗したいと思います。
最小限の失敗の例
質問
- この問題を解決するにはどうすればよいですか?
- これは CMake の意図した動作ですか?
1 つのソリューション
ではなく、成功時POST_BUILD
にファイルを出力するカスタムコマンドを作成できることを認識しています。TARGET.passed
ただし、これは避けたいと思います。ここでは POST_BUILD が最も適切な使用法と思われるためです。(結果のファイルの機能を変更しています。)