7

だから私はこのようなファイル(または値)のリストを持っています

set(HEADER_FILES DirA/header1.h DirA/header2.hpp
                DirB/header3.h DirB/stuff.hpp)

次に、DirAでのみファイルのサブリストを取得するにはどうすればよいですか?私はCMake2.8.xを使用していますが、正規表現の一致に疲れました:

string(REGEX MATCHALL "DirA/(.+)" DirA_FILES ${HEADER_FILES})

ただし、結果は、「DirA / header1.h DirA / header2.hpp DirB / header3.hDirB/stuff.hpp」のような元の文字列のコピーになります。

いつものように、この質問を書いている間、私はそれを解決しました:

set(SubListMatch)
foreach(ITR ${HEADER_FILES})
    if(ITR MATCHES "(.*)DirA/(.*)")
        list(APPEND SubListMatch ${ITR})
    endif()
endforeach()

しかし、CMakeは私にとってまったく新しいものなので、そのコードを関数にラップするにはどうすればよいですか?私はこれまでCMake関数を書いたことがありません。

4

1 に答える 1

6

次のような関数に変換できます。

# Define function
function(GetSubList resultVar)
  set(result)
  foreach(ITR ${ARGN})  # ARGN holds all arguments to function after last named one
    if(ITR MATCHES "(.*)DirA/(.*)")
      list(APPEND result ${ITR})
    endif()
  endforeach()
  set(${resultVar} ${result} PARENT_SCOPE)
endfunction()

# Call it
GetSubList(SubListMatch ${HEADER_FILES})

このコードが実行SubListMatchされると、一致した要素が保持されます。

たとえば、ディレクトリ名に追加のパラメーターを与えることで関数を改善できます。これにより、他のものDirAと一致する可能性があります。

function(GetSubList resultVar dirName)
  # as before, except the if()
    if(ITR MATCHES "(.*)${dirName}/(.*)")
  # same as before
endfunction()
于 2013-03-22T18:47:06.813 に答える