cmake 3.15 以降を使用し、Ninja をジェネレーターとして使用しているユーザーのために、新しい JOB_POOL 引数をいくつかの大きなadd_custom_command()ブロックに設定したいと考えています。他のユーザーについては、add_custom_command() を同じ (JOB_POOL なし) に保ちたいと考えています。
以前の手順で、バージョンとジェネレーターを確認し、${JOB_POOLS} を設定し、プールを使用する必要があるユーザーが表示されるように変数を設定しました (次のようなもの)。
@Tsyvarev は、これが私の問題の原因であると指摘していますが、歴史的な理由から、これをここに残します。ここでは二重引用符は不要です。
set(USE_POOL "JOB_POOL pool_A")
プールを使用していないユーザーには、その変数セットはありません。
カスタムコマンドでその変数を活用する方法は...?
1.) 前の行にテキストを含めるだけで、ジェネレータ式が機能しません...
add_custom_command(
...
$<USE_POOL>
)
2.) 前の行に変数の内容を含めるだけで、コマンドに変数を単純に配置することはできないようです。たとえば、${JOB_POOL} が文字列 "JOB_POOL pool_A" に設定されている場合、このコードは...
@Tsyvarev は、これが私の問題の原因であると指摘していますが、歴史的な理由から、これをここに残します。STRING を使用しないでください。二重引用符はありません!
add_custom_command(
OUTPUT foo
DEPENDS bar
# Comment line here...
${USE_POOL}
COMMAND
${CMAKE_COMMAND} -E ...
)
このエラーが発生します...
ninja: error: '../path/to/src/dir/JOB_POOL pool_A', needed by 'path/to/src/dir/foo', missing and no known rule to make it
${JOB_POOL} 文字列を別の依存関係と見なすだけです。
3.) add_custom_command() の「APPEND」機能を使用できません。無視されるだけです…
if (${USE_POOL})
add_custom_command(
...
APPEND
JOB_POOL pool_A
)
endif()
機能しているように見える唯一のことは、コマンド全体を「if」で囲むことです。これは、あまり多くのコードを複製するのが好きではないため、私の感性を傷つけます...
if(${USE_POOL})
add_custom_command(
...many lines...
JOB_POOL pool_A
)
else()
add_custom_command(
...many lines...
)
endif()
もっと良いアイデアはありますか...?
@tsyvarev のスタンドアロンの例を次に示します。
cmake_minimum_required(VERSION 3.15)
project foo
set_property(GLOBAL PROPERTY JOB_POOLS pool_A=2)
# For historical reasons, I leave this here, although @Tsyvarev
# points out that this is the source of my problem!
# Don't use a STRING! No double-quotes!
set(USE_POOL "JOB_POOL pool_A")
add_custom_command(
OUTPUT foo.out
DEPENDS foo.in
${USE_POOL}
COMMAND
${CMAKE_COMMAND} -E copy foo.in foo.out
COMMENT "Converting foo.in -> foo.out"
VERBATIM
)
add_custom_target(foo-out
DEPENDS foo.out
)
% cmake -GNinja .
% ninja foo-out
ninja: error: 'JOB_POOL pool_A', needed by 'foo.out', missing and no known rule to make it
文字列は依存関係と見なされます...USE_POOLをコメントの後に移動すると、コメントの一部と見なされます...コマンドの後に移動すると、コマンドの一部と見なされます...