ターゲットが依存するすべてのソースファイルをCMakeで取得する

ペッタークヴァルヴァーグ

CMakeを使用して、実行可能ファイルが依存するすべてのターゲットのすべてのソースを含む、実行可能ターゲットに入るすべてのソースファイルのリストを取得するにはどうすればよいですか?

コードベースには、ソースツリーのファイル名とパスに基づいてビルドシステムによって初期化子の呼び出し元が生成されるパターンがあります。したがって、実行可能ターゲットが依存するすべてのソースファイルへのフルパス(またはソースルートからの相対パス)が必要です。

フロリアン

これは、1つのターゲットのリンク依存関係を取得するための私のコードです。

function(target_link_libraries _target)
    set(_mode "PUBLIC")
    foreach(_arg IN LISTS ARGN)
        if (_arg MATCHES "INTERFACE|PUBLIC|PRIVATE|LINK_PRIVATE|LINK_PUBLIC|LINK_INTERFACE_LIBRARIES")
            set(_mode "${_arg}")
        else()
            if (NOT _arg MATCHES "debug|optimized|general")
                set_property(GLOBAL APPEND PROPERTY GlobalTargetDepends${_target} ${_arg})
            endif()
        endif()
    endforeach()
    _target_link_libraries(${_target} ${ARGN})
endfunction()

function(get_link_dependencies _target _listvar)
    set(_worklist ${${_listvar}})
    if (TARGET ${_target})
        list(APPEND _worklist ${_target})
        get_property(_dependencies GLOBAL PROPERTY GlobalTargetDepends${_target})
        foreach(_dependency IN LISTS _dependencies)
            if (NOT _dependency IN_LIST _worklist)
                get_link_dependencies(${_dependency} _worklist)
            endif()
        endforeach()
        set(${_listvar} "${_worklist}" PARENT_SCOPE)
    endif()
endfunction()

古いCMakeバージョン(3.4より前)の場合、IN_LISTチェックをlist(FIND ...)呼び出しに置き換える必要があります。

[...]
        list(FIND _worklist ${_dependency} _idx)
        if (${_idx} EQUAL -1)
            get_link_dependencies(${_dependency} _worklist)
        endif()
[...]

そして、これが私が使用したテストコードです:

cmake_minimum_required(VERSION 3.4)

project(GetSources)

cmake_policy(SET CMP0057 NEW)

[... include functions posted above ...]

file(WRITE a.cc "")
add_library(A STATIC a.cc)

file(WRITE b.cc "")
add_library(B STATIC b.cc)

file(WRITE main.cc "int main() { return 0; }")
add_executable(${PROJECT_NAME} main.cc)

target_link_libraries(B A)
target_link_libraries(${PROJECT_NAME} B)

get_link_dependencies(${PROJECT_NAME} _deps)
foreach(_dep IN LISTS _deps)
    get_target_property(_srcs ${_dep} SOURCES)
    get_target_property(_src_dir ${_dep} SOURCE_DIR)
    foreach(_src IN LISTS _srcs)
        message("${_src_dir}/${_src}")
    endforeach()
endforeach()

参考文献

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

すべてのソース ファイルをターゲットに追加する Ruby スクリプト (xcodeproj)

分類Dev

cmakeでターゲットの依存関係をインストールする

分類Dev

CMakeターゲットはソースファイルをコンパイルするだけです

分類Dev

CMAKEターゲットファイルの場所を取得する方法

分類Dev

Javaファイルからすべてのゲッターを取得するgrep

分類Dev

実行可能ファイルのリストを個別のcmakeターゲットとして作成する方法

分類Dev

CMake-実行可能ファイルを作成するが、「すべて」のターゲットに追加しない方法は?

分類Dev

CMake:複数のターゲットが同じソースファイルを使用します

分類Dev

CMakeターゲットの依存関係を作成してprotobufファイルをコンパイルします

分類Dev

ターゲットドライブ+ブートドットの選択を除いて、centos-linuxをインストールするための自動生成されたキックスタートファイルですべてが機能します

分類Dev

Xcodeで1つのターゲットのすべてのファイルを一覧表示する方法

分類Dev

DockerでMavenプロジェクトをビルドすると、すべてのターゲットファイルがルート化されます

分類Dev

複数のターゲットの依存関係を指定してインストールするための単一のカートファイル

分類Dev

複数のターゲットが同じソースファイルを使用している場合、-save-tempsを使用してアセンブリファイルを保持するにはどうすればよいですか?

分類Dev

CMake:インストールルールのターゲットの場所を取得する方法

分類Dev

CMakeを使用してターゲットでファイルを追加します

分類Dev

CMake:重複せずにターゲット間でソースファイル定義を再利用する方法は?

分類Dev

独自のCMakeファイルとターゲットを生成するコードジェネレーター

分類Dev

Xcodeでターゲットのメンバーシップにあるすべてのファイルを表示する

分類Dev

Bazel-ターゲットのすべての一時的なソースを取得する方法

分類Dev

ターゲットディレクトリ内のすべてのファイルを再帰的にgunzipするにはどうすればよいですか?

分類Dev

Makefile ファイルのターゲットを別のパスに依存させるにはどうすればよいですか?

分類Dev

Eclipseエディターで開いているすべてのファイルのリストを取得するにはどうすればよいですか?

分類Dev

特定の文字列で始まり、特定の文字列で終わるすべてのzipファイルをターゲットにする

分類Dev

JDAイベントゲッターがnullを返し、ボット自体のみを返すロールのすべてのメンバーを取得する

分類Dev

すべてのソースファイルに自動ヘッダーコメントを追加する

分類Dev

Xcodeのすべてのターゲットに.plistファイルを追加するにはどうすればよいですか?

分類Dev

ケースクラスのすべてのフィールドのタイプとそのメソッドのリストを取得する

分類Dev

リストからすべてのソースファイルを作成し、オブジェクトを1つのディレクトリに出力する一般的なターゲット/ルール

Related 関連記事

  1. 1

    すべてのソース ファイルをターゲットに追加する Ruby スクリプト (xcodeproj)

  2. 2

    cmakeでターゲットの依存関係をインストールする

  3. 3

    CMakeターゲットはソースファイルをコンパイルするだけです

  4. 4

    CMAKEターゲットファイルの場所を取得する方法

  5. 5

    Javaファイルからすべてのゲッターを取得するgrep

  6. 6

    実行可能ファイルのリストを個別のcmakeターゲットとして作成する方法

  7. 7

    CMake-実行可能ファイルを作成するが、「すべて」のターゲットに追加しない方法は?

  8. 8

    CMake:複数のターゲットが同じソースファイルを使用します

  9. 9

    CMakeターゲットの依存関係を作成してprotobufファイルをコンパイルします

  10. 10

    ターゲットドライブ+ブートドットの選択を除いて、centos-linuxをインストールするための自動生成されたキックスタートファイルですべてが機能します

  11. 11

    Xcodeで1つのターゲットのすべてのファイルを一覧表示する方法

  12. 12

    DockerでMavenプロジェクトをビルドすると、すべてのターゲットファイルがルート化されます

  13. 13

    複数のターゲットの依存関係を指定してインストールするための単一のカートファイル

  14. 14

    複数のターゲットが同じソースファイルを使用している場合、-save-tempsを使用してアセンブリファイルを保持するにはどうすればよいですか?

  15. 15

    CMake:インストールルールのターゲットの場所を取得する方法

  16. 16

    CMakeを使用してターゲットでファイルを追加します

  17. 17

    CMake:重複せずにターゲット間でソースファイル定義を再利用する方法は?

  18. 18

    独自のCMakeファイルとターゲットを生成するコードジェネレーター

  19. 19

    Xcodeでターゲットのメンバーシップにあるすべてのファイルを表示する

  20. 20

    Bazel-ターゲットのすべての一時的なソースを取得する方法

  21. 21

    ターゲットディレクトリ内のすべてのファイルを再帰的にgunzipするにはどうすればよいですか?

  22. 22

    Makefile ファイルのターゲットを別のパスに依存させるにはどうすればよいですか?

  23. 23

    Eclipseエディターで開いているすべてのファイルのリストを取得するにはどうすればよいですか?

  24. 24

    特定の文字列で始まり、特定の文字列で終わるすべてのzipファイルをターゲットにする

  25. 25

    JDAイベントゲッターがnullを返し、ボット自体のみを返すロールのすべてのメンバーを取得する

  26. 26

    すべてのソースファイルに自動ヘッダーコメントを追加する

  27. 27

    Xcodeのすべてのターゲットに.plistファイルを追加するにはどうすればよいですか?

  28. 28

    ケースクラスのすべてのフィールドのタイプとそのメソッドのリストを取得する

  29. 29

    リストからすべてのソースファイルを作成し、オブジェクトを1つのディレクトリに出力する一般的なターゲット/ルール

ホットタグ

アーカイブ