3

date +"%s" > ${TIMESTAMP}生成した 3 つの実行可能ファイルのそれぞれに対してを呼び出したいと思います (つまり、それぞれの実行可能ファイルが作成された場合にのみタイムスタンプを作成します) myapp_datamyapp_livemyapp_sim

バイナリを削除して再リンクした後でも、カスタム コマンドが実行されない理由がわかりません。ビルドは正常に機能します - タイムスタンプの生成のみが機能しません。

MACRO( MY_APP TAG )
  SET( BINARY_TGT "myapp_${TAG}" )
  SET( TIMESTAMP  "TIMESTAMP_${TAG}" )
  ADD_EXECUTABLE( ${BINARY_TGT} ${APP_SRCS} )

  ADD_CUSTOM_COMMAND(
    OUTPUT  ${TIMESTAMP}
    COMMAND date 
    ARGS    +\"%s\" > ${TIMESTAMP}
    DEPENDS ${BINARY_TGT}
  )
ENDMACRO( MY_APP )

SUBDIRS( data )
SUBDIRS( live )
SUBDIRS( sim  )

データディレクトリ内には、次のものがあります。

FILE(GLOB APP_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} main_data.cpp)
SET( MY_TAG data )
MY_APP( "${MY_TAG}" )
4

1 に答える 1

3

CMake は、出力に依存しない限り、自立したカスタム コマンドを実行しません。1 つのオプションは、カスタム コマンドをビルド後に変更することです。

add_custom_command(
  TARGET ${BINARY_TGT}
  POST_BUILD
  COMMAND date +\"%s\" > ${TIMESTAMP}
  VERBATIM
)

もう 1 つのオプションは、カスタム コマンドを駆動するカスタム ターゲットを追加することです。すべてのカスタム コマンドに対して 1 つのターゲットで十分です。

add_custom_target(
  GenerateTimestamps ALL
  DEPENDS ${yourListOfTimestampFiles}
)

ただし、リダイレクトが期待どおりに機能するかどうかはわかりません。シェル/コマンド プロンプトに入力>すると、それはプログラムへの引数ではなく、シェル/コマンド プロセッサへの指示になります。動作しない場合 (テストしたことはありません)、の呼び出しをdateスクリプトに入れる必要があります。

于 2012-11-16T18:40:19.283 に答える