Bagaimana cara mengecualikan satu file dari pola cmake `file (GLOB…)`?

90

Saya CMakeLists.txtberisi baris ini:

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

dan IlmImffoldernya berisi b44ExpLogTable.cpp, yang perlu saya kecualikan dari build.

Bagaimana cara mencapainya?

berak
sumber

Jawaban:

104

Anda dapat menggunakan listfungsi tersebut untuk memanipulasi daftar, misalnya:

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

Dalam kasus Anda, mungkin sesuatu seperti ini akan berhasil:

list(REMOVE_ITEM lib_srcs "IlmImf/b44ExpLogTable.cpp")
Lindydancer
sumber
1
selain lib_srcs daripada lib_src dan IlmImf daripada IlmThread, Itu berhasil! Terima kasih banyak !
berak
21
Catatan: Saat menghapus item dari daftar, pastikan nilai yang Anda cari cocok persis seperti yang ada di dalam daftar. Saya mengalami masalah saat mencampur $ {CMAKE_SOURCE_DIR} /src/file_to_remove.cpp dengan $ {CMAKE_CURRENT_SOURCE_DIR} /../ file_to_remove.cpp. Itu menunjuk ke lokasi yang sama, tetapi itu bukan string yang sama. message ("$ {VARIABLE_NAME}") dapat membantu Anda men-debug konten tersebut.
hbobenicio
Ini tidak membantu jika Anda menggunakan CONFIGURE_DEPENDSdan perlu mengecualikan file yang diproduksi oleh build. Filter pada daftar setelah filepanggilan masih memicu pembangunan kembali yang, dalam kasus saya, saya coba hindari.
simon.watts
Jauh lebih baik untuk digunakanlist(FILTER
hukeping
3
Solusi di atas tidak berfungsi untuk saya dengan camke versi 3.10.2 Tetapi solusi di bawah ini: list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>) berfungsi dengan baik untuk saya.
MH Yip
44

FILTER adalah opsi lain yang mungkin lebih nyaman dalam beberapa kasus:

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

Baris ini mengecualikan setiap item yang diakhiri dengan nama file yang diperlukan:

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

Berikut adalah Spesifikasi Regex untuk 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
sumber
Bisa jauh lebih dapat diandalkan daripada menyia-nyiakan dengan jalur absolut / relatif
EFraim
1
Jauh lebih baik darilist(REMOVE_ITEM
ceztko
1
Catatan yang list(FILTER ...)diperkenalkan di cmake v3.6: stackoverflow.com/a/42167646/3476780
yano
Ini jelas merupakan jawaban yang lebih baik, meskipun jika Anda mencoba menggunakan ini untuk mengecualikan seluruh direktori atau jika regex Anda kacau, Anda mungkin mengecualikan lebih dari yang Anda inginkan. Misalnya, mencoba mengecualikan .*test/.*mungkin mengecualikan semuanya jika proyek Anda berada di dalam pohon direktori di mana salah satu direktori induk disebut seperti mytest.
AnthonyD973
1

coba ini : 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
sumber