macro example

macro(getDirRelative result curdir)
    set(result )
    set(dirlist )
    file(GLOB children RELATIVE ${curdir} ${curdir}/*)
    foreach(child ${children})
        if(IS_DIRECTORY ${curdir}/${child})
            list(APPEND dirlist ${child})
        endif()
    endforeach()
    set(${result} ${dirlist})
endmacro()

macro(getDirRelativeR result curdir)
    set(result )
    set(_file_and_dir )
    set(_file_only )

    file(GLOB_RECURSE _file_and_dir LIST_DIRECTORIES true RELATIVE ${curdir} ${curdir}/*)
    file(GLOB_RECURSE _file_only LIST_DIRECTORIES false RELATIVE ${curdir} ${curdir}/*)

    foreach(_file ${_file_only})
        list(FIND _file_and_dir ${_file} pos)
        if(pos GREATER -1)
            list(REMOVE_ITEM _file_and_dir ${_file})
        endif()
    endforeach()

    set(${result} ${_file_and_dir})
endmacro()

macro(getDirRelativeRecurByPattern result curdir pattern)
    set(temp )
    set(all_dir )

    getDirRelativeR(all_dir ${curdir})

    foreach(dir ${all_dir})
        if (${dir} MATCHES ${pattern})
            list(APPEND temp ${dir})
        endif()
    endforeach()

    set(${result} ${temp})
endmacro()

set(dir )
getDirRelative(dir ${CMAKE_SOURCE_DIR})

set(dirR)
getDirRelativeR(dirR ${CMAKE_SOURCE_DIR})

set(dirP)
set(pattern ".*2$")
getDirRelativeRecurByPattern(dirP ${CMAKE_SOURCE_DIR} ${pattern})

foreach(d ${dirP})
    message(STATUS ${d})
endforeach()
posted @ 2020-12-23 09:31  fndefbwefsowpvqfx  阅读(74)  评论(0编辑  收藏  举报