Của tôi CMakeLists.txt
chứa dòng này:
file(GLOB lib_srcs Half/half.cpp Iex/*.cpp IlmThread/*.cpp Imath/*.cpp IlmImf/*.cpp)
và IlmImf
thư mục chứa b44ExpLogTable.cpp
, mà tôi cần loại trừ khỏi bản dựng.
Làm thế nào để đạt được điều đó?
Câu trả lời:
Bạn có thể sử dụng list
hàm để thao tác danh sách, ví dụ:
list(REMOVE_ITEM <list> <value> [<value> ...])
Trong trường hợp của bạn, có thể một cái gì đó như thế này sẽ hoạt động:
list(REMOVE_ITEM lib_srcs "IlmImf/b44ExpLogTable.cpp")
CONFIGURE_DEPENDS
và cần loại trừ tệp do bản dựng tạo ra. Một bộ lọc trong danh sách sau file
cuộc gọi vẫn kích hoạt xây dựng lại, trong trường hợp của tôi, tôi đang cố gắng tránh.
list(FILTER
list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)
hoạt động tốt đối với tôi.
FILTER là một tùy chọn khác có thể thuận tiện hơn trong một số trường hợp:
list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)
Dòng này loại trừ mọi mục kết thúc bằng tên tệp bắt buộc:
list(FILTER lib_srcs EXCLUDE REGEX ".*b44ExpLogTable.cpp$")
Đây là Thông số kỹ thuật của Regex cho 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 ...)
đã được giới thiệu trong cmake v3.6: stackoverflow.com/a/42167646/3476780
.*test/.*
có thể loại trừ mọi thứ nếu dự án của bạn nằm trong cây thư mục nơi một trong các thư mục mẹ được gọi là một cái gì đó giống như vậy mytest
.
thử đi : 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