How do I exclude a single file from a cmake `file(GLOB ... )` pattern?

Cmake

Cmake Problem Overview


My CMakeLists.txt contains this line:

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

and the IlmImf folder contains b44ExpLogTable.cpp, which I need to exclude from the build.

How to achieve that?

Cmake Solutions


Solution 1 - Cmake

You can use the list function to manipulate the list, for example:

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

In your case, maybe something like this will work:

list(REMOVE_ITEM lib_srcs "IlmImf/b44ExpLogTable.cpp")

Solution 2 - Cmake

FILTER is another option which could be more convenient in some cases:

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

This line excludes every item ending with the required filename:

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

Here is Regex Specification for cmake:

The following characters have special meaning in regular expressions:

^         Matches at the beginning of input
$         Matches at the 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).

Solution 3 - Cmake

try this : 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

Solution 4 - Cmake

I have an alternative solution worth noticing: mark source as header file. This way it will not be part of the build process, but will be visible in IDE (verified on Visual Studio and Xcode):

set_source_files_properties(b44ExpLogTable.cpp,
                            PROPERTIES HEADER_FILE_ONLY TRUE)

I use this when some source file is platform specific. It is great since if some symbol has to be modified in many places and working on one platform then other platform specific source will can be visible and can be updated too.

For that I've created a helper function which works great in my current project.

I didn't use this method with file GLOB yet.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionberakView Question on Stackoverflow
Solution 1 - CmakeLindydancerView Answer on Stackoverflow
Solution 2 - CmakeEugeneView Answer on Stackoverflow
Solution 3 - CmakeJamesView Answer on Stackoverflow
Solution 4 - CmakeMarek RView Answer on Stackoverflow