Mein CMakeLists.txt
enthält diese Zeile:
file(GLOB lib_srcs Half/half.cpp Iex/*.cpp IlmThread/*.cpp Imath/*.cpp IlmImf/*.cpp)
und der IlmImf
Ordner enthält b44ExpLogTable.cpp
, die ich vom Build ausschließen muss.
Wie erreicht man das?
Antworten:
Mit der list
Funktion 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")
CONFIGURE_DEPENDS
eine vom Build erstellte Datei verwenden und ausschließen müssen. Ein Filter in der Liste nach dem file
Aufruf löst immer noch eine Neuerstellung aus, die ich in meinem Fall zu vermeiden versuche.
list(FILTER
list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)
funktioniert jedoch gut bei mir.
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).
list(REMOVE_ITEM
list(FILTER ...)
in cmake v3.6 eingeführt wurde: stackoverflow.com/a/42167646/3476780
.*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
.
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