CMake文件后从给定模式中排除文件(GLOB_RECURSE)

时间:2015-08-14 18:42:01

标签: cmake pattern-matching

我有一个小库,其文件结构如下:

CMakeLists.txt
LibFoo/
  Foo.h
  FooWin.cpp
  FooWin.inl
  FooPosix.cpp
  FooPosix.inl

当我必须在特定操作系统(例如Windows)中构建库时,在使用宏之前使用文件(GLOB_RECURSE)之前,它们应该包含在列表中:

macro( add_recursive dir retVal)
file( GLOB_RECURSE ${retVal} ${dir}/*.h ${dir}/*.cpp ${dir}/*.c ${dir}/*.inl )
endmacro()

并且我的排除模式是这样的(当Windows是构建主机时):*Posix.*但是不起作用,我尝试了这种方法:

macro( add_recursive dir retVal pattern)
file( GLOB_RECURSE ${retVal} ${dir}/*.h ${dir}/*.cpp ${dir}/*.c ${dir}/*.inl EXCLUDE PATTERN "${pattern}")
endmacro()

但POSIX文件仍在此处,CMake不报告错误或任何建议。

2 个答案:

答案 0 :(得分:2)

EXCLUDE命令流没有file(GLOB_RECURSE ...)选项。您可能从file(COPY|INSTALL ...)中选择此选项,这是一个不同的命令流。

您可以遍历列表,从file(GLOB_RECURSE)获取并手动排除所需文件:

macro( add_recursive dir retVal)
    # Store unfiltered list of files into temporary list
    file( GLOB_RECURSE _tmp_list ${dir}/*.h ${dir}/*.cpp ${dir}/*.c ${dir}/*.inl )
    # Resulted list is initially empty. Copy all needed elements into it.
    set(${retval})
    foreach(f ${_tmp_list})
        if(NOT f MATCHES "Posix.")
            list(APPEND ${retVal} ${f})
        endif()
    endforeach()

endmacro()

答案 1 :(得分:0)

您可以使用列表过滤来删除GLOB_RECURSE之后的项目:

# x = [list of x coords]
# y = [list of y coords]
# colors = [list of color triples]
# sizes = [list of marker sizes]

f,ax = plt.figure()

N = 10000
for i in range(N):
    ax.plot(x[i],y[i], marker='.', color=colors[i], markersize = sizes[i])