29

ソース ツリー全体を解析する cmake コマンドを実行したいので、cmake の add_custom_command/add_custom_target コマンドで考えられるすべての依存関係を一覧表示することはできません。

条件なしでコマンドを実行するようにcmakeに指示することは可能ですか? ネットで見つかったすべてのソリューション(SOを含む)を試しましたが、それらはすべて、コマンドが最新のいくつかの既知のファイルに依存していると想定しています。

解決策を見つけましたが、確実に機能しません:

cmake_minimum_required(VERSION 2.6)

project(main)

add_custom_command(
   OUTPUT file1
   COMMAND echo touching file1
   COMMAND touch file1
   DEPENDS file2)
add_custom_target(dep ALL DEPENDS file1 file2)

# this command re-touches file2 after dep target is "built"
# and thus forces its rebuild
ADD_CUSTOM_COMMAND(TARGET dep
          POST_BUILD
          COMMAND echo touching file2
          COMMAND touch file2
)

これが出力されます:

queen3@queen3-home:~/testlib$ make
[100%] Generating file1
touching file1
touching file2
[100%] Built target dep
queen3@queen3-home:~/testlib$ make
[100%] Generating file1
touching file1
touching file2
[100%] Built target dep
queen3@queen3-home:~/testlib$ make
touching file2
[100%] Built target dep
queen3@queen3-home:~/testlib$ 

ご覧のとおり、3 回目の実行では、file2 が以前に変更されていたにもかかわらず、file1 を生成しませんでした。2回ごとに発生することもあれば、3回ごとに発生することもあれば、4回ごとに発生することもあります。バグですか?cmake に依存せずにコマンドを実行する別の方法はありますか?

奇妙ですが、file2 をリタッチするために 2 つのコマンドを追加すると、つまり、ビルド後のコマンドをコピーして貼り付けるだけで、確実に機能しますまたは、1000回実行するたびに失敗するかもしれませんが、まだわかりません;-)

4

4 に答える 4

25

私はこの解決策にまったく満足していませんが、このページに出くわして言及されていなかったので投稿します.

不足しているファイルを参照するカスタム ターゲットを追加できます。

例えば:

add_custom_target(
    my_custom_target_that_always_runs ALL
    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/__header.h
)

add_custom_command(
    OUTPUT
        ${CMAKE_CURRENT_BINARY_DIR}/__header.h  # fake! ensure we run!
        ${CMAKE_CURRENT_BINARY_DIR}/header.h    # real header, we write.
    # this command must generate: ${CMAKE_CURRENT_BINARY_DIR}/header.h
    COMMAND some_command
)

__header.hが見つからないため、カスタム コマンドを実行し続けます。

これが使用されている実際のを参照してください。

于 2015-07-20T13:44:14.747 に答える
12

まったく同じものを検索したところ、最終的に「notSoWorkaround」ソリューションが見つかりました。

ADD_CUSTOM_TARGET(do_always ALL COMMAND yourCommandRegardlessOfAnyDependency)

これにより、ALL の後に実行されるターゲットが追加されます。また、カスタム ターゲットは常に古くなっていると見なされるため、常に実行されます。

DEPENDS yourA.outビルド後に実行する必要がある場合があります

私の情報源:

于 2017-04-04T11:55:20.320 に答える
1

だからここに私の解決策があります。偽のライブラリを追加します:

add_subdirectory(fake)
add_dependencies(${PROJECT_NAME} fake)

そこで私はこれを行います:

cmake_minimum_required (VERSION 2.6)
project(fake CXX)
add_library(${PROJECT_NAME} SHARED fake.cpp)
add_custom_command(TARGET fake
    POST_BUILD
    COMMAND ./mycommand.sh
    COMMAND rm ${ROOT_BIN_DIR}/libfake.so
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

ご覧のとおり、ビルド後に .so ファイルを削除するだけです。これにより、偽の lib が毎回再構築され、POST_BUILD が実行されます。これはすべて、偽に依存しているため、メインの PROJECT_NAME の前に行われます。

于 2012-12-18T08:34:23.833 に答える