リストのすべてのファイル名に共通のパスプレフィックスを自動的に付加するにはどうすればよいですか?たとえば、CMakeLists.txtにファイルのリストがあるとします。
SET(SRC_FILES foo1.cpp foo2.cpp)
これと同等のリストを取得したいのですが。
${CMAKE_CURRENT_SOURCE_DIR}/foo1.cpp ${CMAKE_CURRENT_SOURCE_DIR}/foo2.cpp
PARENT_SCOPEコンテキストでファイル名を使用するには、これが必要です。
SET(FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${SRC_FILES} PARENT_SCOPE)
そのため、別のディレクトリにあるCMakeFiles.txtでもこれらのファイルを見つけることができます。
本質的に、私はこのようなもの(疑似コード)を期待します:
SET(FILES_TO_TRANSLATE PREPEND_ALL_NAMES(${CMAKE_CURRENT_SOURCE_DIR} ${SRC_FILES}) PARENT_SCOPE)
これは簡単に実行できますか、または「foreach」ループを使用してファイルの新しいリストを作成する必要がありますか?
CMake 3.12はリストトランスフォーマーを追加しました-これらのトランスフォーマーの1つはPREPEND
です。したがって、以下をインラインで使用して、リスト内のすべてのエントリを付加できます。
list(TRANSFORM FILES_TO_TRANSLATE PREPEND ${CMAKE_CURRENT_SOURCE_DIR})
...どこ FILES_TO_TRANSLATE
はリストの変数名です。
詳細については、 CMakeのドキュメント を参照してください。
次の機能はあなたが望むものかもしれません。
FUNCTION(PREPEND var prefix)
SET(listVar "")
FOREACH(f ${ARGN})
LIST(APPEND listVar "${prefix}/${f}")
ENDFOREACH(f)
SET(${var} "${listVar}" PARENT_SCOPE)
ENDFUNCTION(PREPEND)
それを使うには
PREPEND(FILES_TO_TRANSLATE ${CMAKE_CURRENT_SOURCE_DIR} ${SRC_FILES})
string(REGEX REPLACE "([^;]+)" "ANYPREFIX/\\1.cpp" outputlist "${inputlist}")
ANYPREFIXを任意の接頭辞に、「。cpp」を必要な任意の接尾辞に置き換えます。
foreach
ループを使用する必要があります。しかし、プロジェクトのいくつかの部分でそれを使用する場合は、関数またはマクロを作成することができます。
Ding-Yi Chenの回答の改善として、3.12より前のCMakeをサポートする必要がある場合は、次のコードを使用できます。
_function(list_transform_prepend var prefix)
set(temp "")
foreach(f ${${var}})
list(APPEND temp "${prefix}${f}")
endforeach()
set(${var} "${temp}" PARENT_SCOPE)
endfunction()
_
このソリューションの利点は、インターフェースがCMake 3.12 list(TRANSFORM ...)
に近く、変更がインプレースで行われることです。
このように使用
_list_transform_prepend(FILES_TO_TRANSLATE "${CMAKE_CURRENT_SOURCE_DIR}/")
_
$ {CMAKE_CURRENT_SOURCE_DIR}を前に付けるため、絶対ファイル名が必要だと思います。 FILE(GLOB <VAR> <PATTER>)
を使用している場合、すべてのファイルにすでに絶対パスが設定されています。
file(GLOB_RECURSE SOURCE_FILES src/*.cpp)
GLOBを使用してソースファイルを追加しない理由については、 ドキュメントのCMakeのコメント を参照してください。