cmakeの `file(GLOB…)`パターンから単一のファイルを除外するにはどうすればよいですか?


86

私にCMakeLists.txtは次の行が含まれています:

file(GLOB lib_srcs Half/half.cpp Iex/*.cpp IlmThread/*.cpp Imath/*.cpp IlmImf/*.cpp)

IlmImfフォルダーにはb44ExpLogTable.cpp、ビルドから除外する必要のあるが含まれています。

それを達成する方法は?

回答:


100

このlist関数を使用して、リストを操作できます。次に例を示します。

list(REMOVE_ITEM <list> <value> [<value> ...])

あなたの場合、多分このようなものがうまくいくでしょう:

list(REMOVE_ITEM lib_srcs "IlmImf/b44ExpLogTable.cpp")

1
lib_srcの代わりにlib_srcsを、IlmThreadの代わりにIlmImfを追加すると、それでうまくいきました。トンありがとう!
berak 2013年

20
注:リストの項目を削除するときは、検索する値がリスト内の値と完全に一致することを確認してください。$ {CMAKE_SOURCE_DIR} /src/file_to_remove.cppと$ {CMAKE_CURRENT_SOURCE_DIR} /../ file_to_remove.cppのミキシングで問題が発生しました。同じ場所を指していますが、同じ文字列ではありません。message( "$ {VARIABLE_NAME}")は、これらのコンテンツのデバッグに役立ちます。
hbobenicio 2016年

これはCONFIGURE_DEPENDS、ビルドによって生成されたファイルを使用して除外する必要がある場合には役立ちません。file呼び出し後のリストのフィルターはまだ再構築をトリガーしますが、私の場合は回避しようとしています。
simon.watts

使用する方がはるかに優れていますlist(FILTER
hukeping

2
上記の解決策はcamkeバージョン3.10.2では機能しませんが、以下の解決策list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>) は私にとってはうまく機能します。
MHイップ

42

FILTERは、場合によってはより便利な別のオプションです。

list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)

この行は、必要なファイル名で終わるすべてのアイテムを除外します。

list(FILTER lib_srcs EXCLUDE REGEX ".*b44ExpLogTable.cpp$")

ここで正規表現の仕様cmakeのために:

The following characters have special meaning in regular expressions:

^         Matches at beginning of input
$         Matches at end of input
.         Matches any single character
[ ]       Matches any character(s) inside the brackets
[^ ]      Matches any character(s) not inside the brackets
 -        Inside brackets, specifies an inclusive range between
          characters on either side e.g. [a-f] is [abcdef]
          To match a literal - using brackets, make it the first
          or the last character e.g. [+*/-] matches basic
          mathematical operators.
*         Matches preceding pattern zero or more times
+         Matches preceding pattern one or more times
?         Matches preceding pattern zero or once only
|         Matches a pattern on either side of the |
()        Saves a matched subexpression, which can be referenced
          in the REGEX REPLACE operation. Additionally it is saved
          by all regular expression-related commands, including
          e.g. if( MATCHES ), in the variables CMAKE_MATCH_(0..9).

絶対パス/相対パスをいじくり回すよりもはるかに信頼性が高い可能性があります
EFraim

1
はるかに良いlist(REMOVE_ITEM
ceztko 2018年

1
list(FILTER ...)cmake v3.6で導入されたことに注意してください:stackoverflow.com/a/42167646/3476780
yano

これは間違いなくより良い答えですが、これを使用してディレクトリ全体を除外しようとしている場合、または正規表現が台無しになっている場合は、必要以上に除外する可能性があります。たとえば.*test/.*、プロジェクトがディレクトリツリー内にあり、親ディレクトリの1つがのような名前で呼ばれている場合、除外しようとするとすべてが除外される可能性がありますmytest
AnthonyD9 7319

1

これを試して : CMakeLists.txt

install(DIRECTORY   ${CMAKE_SOURCE_DIR}/ 
            DESTINATION ${CMAKE_INSTALL_PREFIX}
            COMPONENT   copy-files
            PATTERN     ".git*"   EXCLUDE
            PATTERN     "*.in"    EXCLUDE
            PATTERN     "*/build" EXCLUDE)

add_custom_target(copy-files
            COMMAND ${CMAKE_COMMAND} -D COMPONENT=copy-files
            -P cmake_install.cmake)
$cmake <src_path> -DCMAKE_INSTALL_PREFIX=<install_path>
$cmake --build . --target copy-files
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.