私の CMake ファイルには、外部コード生成を呼び出すカスタム コマンドがあります。生成されたファイルは、ユーザーが自分のコードを入れるためのスタブです。したがって、コード生成では、既存のファイルが上書きされないようにします。私のカスタムコマンドは次のようになります。
set(generatedOnceSrc foo.h foo.cpp bar.h bar.cpp)
add_custom_command(
OUTPUT ${generatedOnceSrc}
COMMAND ${generateCmd}
VERBATIM
)
add_executable(myProg ${generatedOnceSrc} ${frameworkSrc})
${generatedOnceSrc}
ここで、 (foo.h
この場合) の最初の要素が削除されて再生成されることがあることに気付きました。もちろん、ユーザーが生成された を編集し始めると、問題が発生しfoo.h
ます。
のドキュメントでadd_custom_command
は、そのような動作については言及されていませんが、否定もされていません。だから私の質問は:
私の観察は正しいですか?
私はすでに次のような回避策を見つけたことに注意してください。
set(generatedOnceSrc foo.h foo.cpp bar.h bar.cpp)
set_source_files_properties(generatorOutput PROPERTIES SYMBOLIC true)
add_custom_command(
OUTPUT generatorOutput
BYPRODUCTS ${generatedOnceSrc}
COMMAND ${generateCmd}
VERBATIM
)
add_custom_target(generatorTarget DEPENDS generatorOutput)
add_executable(myProg ${generatedOnceSrc} ${frameworkSrc})
add_dependencies(myProg generatorTarget)
残念ながら、${generateCmd}
シンボリック ファイルgeneratorOutput
は常に古くなっていると見なされ、CMake はそれ以上の存在をチェックしないため、これはすべてのビルドで呼び出され${generatedOnceSrc}
ます。
バージョン
- ジェネレーター: Unix Makefile
- CMake 3.5.1
- Ubuntu 16.04
編集
私のUbuntu 16.04システムでデフォルトで使用されているUnix Makefilesジェネレーターでこの動作を観察したことを忘れていました。