Làm cách nào để loại trừ một tệp duy nhất khỏi mẫu cmake `tệp (GLOB…)`?


86

Của tôi CMakeLists.txtchứa dòng này:

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

IlmImfthư 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:


100

Bạn có thể sử dụng listhà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")

1
bên cạnh lib_srcs thay vì lib_src và IlmImf thay vì IlmThread, Điều đó đã thực hiện thủ thuật! cảm ơn rất nhiều!
berak

20
Lưu ý: Khi xóa mục của danh sách, hãy đảm bảo rằng giá trị bạn đang tìm kiếm khớp chính xác với giá trị có trong danh sách. Tôi đang gặp một số vấn đề khi trộn $ {CMAKE_SOURCE_DIR} /src/file_to_remove.cpp với $ {CMAKE_CURRENT_SOURCE_DIR} /../ file_to_remove.cpp. Nó trỏ đến cùng một vị trí, nhưng không cùng một chuỗi. thông báo ("$ {VARIABLE_NAME}") có thể giúp bạn gỡ lỗi những nội dung đó.
hbobenicio

Điều này không hữu ích nếu bạn đang sử dụng CONFIGURE_DEPENDSvà 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 filecuộ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.
simon.watts 21/02/19

Tốt hơn là sử dụng nhiềulist(FILTER
hukeping

2
Giải pháp trên không hoạt động với tôi với phiên bản camke 3.10.2 Nhưng giải pháp bên dưới: list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>) hoạt động tốt đối với tôi.
MH Yip

42

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).

Có thể đáng tin cậy hơn nhiều so với việc vỗ về tuyệt đối / tương đối
EFraim

1
Nhiều hơnlist(REMOVE_ITEM
ceztko

1
Lưu ý rằng list(FILTER ...)đã được giới thiệu trong cmake v3.6: stackoverflow.com/a/42167646/3476780
yano

Đây chắc chắn là một câu trả lời tốt hơn, mặc dù nếu bạn đang cố gắng sử dụng điều này để loại trừ toàn bộ thư mục hoặc nếu regex của bạn bị rối, bạn có thể loại trừ nhiều hơn mức bạn muốn. Ví dụ: cố gắng loại trừ .*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.
AnthonyD973,

1

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.