Wie schließe ich eine einzelne Datei aus einem cmake `file (GLOB…)` Muster aus?

83

Mein CMakeLists.txtenthält diese Zeile:

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

und der IlmImfOrdner enthält b44ExpLogTable.cpp, die ich vom Build ausschließen muss.

Wie erreicht man das?

berak
quelle

Antworten:

97

Mit der listFunktion können Sie die Liste bearbeiten, zum Beispiel:

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

In Ihrem Fall funktioniert vielleicht so etwas:

list(REMOVE_ITEM lib_srcs "IlmImf/b44ExpLogTable.cpp")
Lindydancer
quelle
1
Abgesehen von lib_srcs anstelle von lib_src und IlmImf anstelle von IlmThread hat das den Trick getan! Danke vielmals !
Berak
19
Hinweis: Stellen Sie beim Entfernen des Listenelements sicher, dass der gesuchte Wert genau mit dem in der Liste übereinstimmt. Ich hatte einige Probleme beim Mischen von $ {CMAKE_SOURCE_DIR} /src/file_to_remove.cpp mit $ {CMAKE_CURRENT_SOURCE_DIR} /../ file_to_remove.cpp. Es zeigt auf dieselbe Position, aber es ist nicht dieselbe Zeichenfolge. Mit message ("$ {VARIABLE_NAME}") können Sie diese Inhalte debuggen.
Hbobenicio
Dies hilft nicht, wenn Sie CONFIGURE_DEPENDSeine vom Build erstellte Datei verwenden und ausschließen müssen. Ein Filter in der Liste nach dem fileAufruf löst immer noch eine Neuerstellung aus, die ich in meinem Fall zu vermeiden versuche.
simon.watts
Es ist viel besser zu benutzenlist(FILTER
hukeping
2
Die obige Lösung funktioniert bei Camke Version 3.10.2 nicht. Die folgende Lösung list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>) funktioniert jedoch gut bei mir.
MH Yip
41

FILTER ist eine weitere Option, die in einigen Fällen bequemer sein kann:

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

Diese Zeile schließt alle Elemente aus, die mit dem erforderlichen Dateinamen enden:

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

Hier ist die Regex-Spezifikation für 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).
Eugene
quelle
Kann viel zuverlässiger sein, als mit absoluten / relativen Pfaden herumzuspielen
EFraim
1
Viel besser alslist(REMOVE_ITEM
Ceztko
1
Beachten Sie, dass list(FILTER ...)in cmake v3.6 eingeführt wurde: stackoverflow.com/a/42167646/3476780
yano
Dies ist definitiv eine bessere Antwort. Wenn Sie jedoch versuchen, damit ein ganzes Verzeichnis auszuschließen, oder wenn Ihre Regex durcheinander ist, können Sie möglicherweise mehr ausschließen, als Sie möchten. Wenn Sie beispielsweise versuchen, auszuschließen, wird .*test/.*möglicherweise alles ausgeschlossen, wenn sich Ihr Projekt in einem Verzeichnisbaum befindet, in dem eines der übergeordneten Verzeichnisse so etwas wie heißt mytest.
AnthonyD973
1

Versuche dies : 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
James
quelle