1

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をコメントの後に移動すると、コメントの一部と見なされます...コマンドの後に移動すると、コマンドの一部と見なされます...

4

1 に答える 1

2

あなたのJOB_POOL オプションは、ユーザーの選択に役立ちます。の関連パラメータのシーケンスを含む別の変数を作成できますadd_custom_command

if(JOB_POOL)
  set(JOB_POOL_PARAMS JOB_POOL pool_A) # Will add 'JOB_POOL pool_A' sequence of params
else()
  set(JOB_POOL_PARAMS) # Will add nothing
endif()

add_custom_command次に、呼び出しで新しい変数を直接使用します。

add_custom_command(
  ...
  ${JOB_POOL_PARAMS} # Will expand to additional parameters when needed
)
于 2019-09-11T22:37:54.663 に答える