問題タブ [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 - CMake の add_custom_command は最初の出力を時々削除しますか?
私の CMake ファイルには、外部コード生成を呼び出すカスタム コマンドがあります。生成されたファイルは、ユーザーが自分のコードを入れるためのスタブです。したがって、コード生成では、既存のファイルが上書きされないようにします。私のカスタムコマンドは次のようになります。
${generatedOnceSrc}
ここで、 (foo.h
この場合) の最初の要素が削除されて再生成されることがあることに気付きました。もちろん、ユーザーが生成された を編集し始めると、問題が発生しfoo.h
ます。
のドキュメントでadd_custom_command
は、そのような動作については言及されていませんが、否定もされていません。だから私の質問は:
私の観察は正しいですか?
私はすでに次のような回避策を見つけたことに注意してください。
残念ながら、${generateCmd}
シンボリック ファイルgeneratorOutput
は常に古くなっていると見なされ、CMake はそれ以上の存在をチェックしないため、これはすべてのビルドで呼び出され${generatedOnceSrc}
ます。
バージョン
- ジェネレーター: Unix Makefile
- CMake 3.5.1
- Ubuntu 16.04
編集
私のUbuntu 16.04システムでデフォルトで使用されているUnix Makefilesジェネレーターでこの動作を観察したことを忘れていました。
cmake - cmake 3.15 JOB_POOLをadd_custom_command SOMETIMESに追加
cmake 3.15 以降を使用し、Ninja をジェネレーターとして使用しているユーザーのために、新しい JOB_POOL 引数をいくつかの大きなadd_custom_command()ブロックに設定したいと考えています。他のユーザーについては、add_custom_command() を同じ (JOB_POOL なし) に保ちたいと考えています。
以前の手順で、バージョンとジェネレーターを確認し、${JOB_POOLS} を設定し、プールを使用する必要があるユーザーが表示されるように変数を設定しました (次のようなもの)。
@Tsyvarev は、これが私の問題の原因であると指摘していますが、歴史的な理由から、これをここに残します。ここでは二重引用符は不要です。
プールを使用していないユーザーには、その変数セットはありません。
カスタムコマンドでその変数を活用する方法は...?
1.) 前の行にテキストを含めるだけで、ジェネレータ式が機能しません...
2.) 前の行に変数の内容を含めるだけで、コマンドに変数を単純に配置することはできないようです。たとえば、${JOB_POOL} が文字列 "JOB_POOL pool_A" に設定されている場合、このコードは...
@Tsyvarev は、これが私の問題の原因であると指摘していますが、歴史的な理由から、これをここに残します。STRING を使用しないでください。二重引用符はありません!
このエラーが発生します...
${JOB_POOL} 文字列を別の依存関係と見なすだけです。
3.) add_custom_command() の「APPEND」機能を使用できません。無視されるだけです…
機能しているように見える唯一のことは、コマンド全体を「if」で囲むことです。これは、あまり多くのコードを複製するのが好きではないため、私の感性を傷つけます...
もっと良いアイデアはありますか...?
@tsyvarev のスタンドアロンの例を次に示します。
文字列は依存関係と見なされます...USE_POOLをコメントの後に移動すると、コメントの一部と見なされます...コマンドの後に移動すると、コマンドの一部と見なされます...