cmake 中如何 filterout 字符串列表(正则过滤)

没有找到原生的(CMake 的文档真心烂)。然后看到一个实现,改了一下可以用过,这是最小测试样例:

project( filter_out )
cmake_minimum_required( VERSION 2.6 )

macro( filter_out FILTERS INPUTS OUTPUTS )
    set( FOUT "" )
    foreach( INP ${INPUTS} )
        set( FILTERED 0 )
        foreach( FILT ${FILTERS} )
            if( ${FILTERED} EQUAL 0 )
                if( "${FILT}" STREQUAL "${INP}" )
                    set( FILTERED 1 )
                endif( "${FILT}" STREQUAL "${INP}" )
            endif( ${FILTERED} EQUAL 0 )
        endforeach( FILT ${FILTERS} )
        if( ${FILTERED} EQUAL 0 )
            set( FOUT ${FOUT} ${INP} )
        endif( ${FILTERED} EQUAL 0 )
    endforeach( INP ${INPUTS} )
    set( ${OUTPUTS} ${FOUT} )
endmacro( filter_out FILTERS INPUTS OUTPUTS )

set( INPUTS foo bar baz FOO BAR BAZ )
set( FILTERS foo FOO baz BAZ )
filter_out("${FILTERS}" "${INPUTS}" OUTPUTS )
message( STATUS "outputs are: ${OUTPUTS}")

输出(去掉了无关紧要的内容):

outputs are: bar;BAR

可以看到可以去掉完全 match 的内容。但,能不能按照正则过滤?
比如我想过滤掉 ".*CMakeCXXCompilerId.cp?p?$"。

上面的实现必须得指定 "D:gitcmake-templatesqt4buildCMakeCXXCompilerId.c" 和 "D:gitcmake-templatesqt4buildCMakeCXXCompilerId.cpp" 才能过滤。实在太不友好。

参考:https://cmake.org/Wiki/CMakeMacroFilterOut


现在已经解决了:https://github.com/district10/cmake-templates/tree/master/qt4-project

就跟 Linux 下的

qmake -project
qmake
make

一样。

阅读 6.2k
1 个回答

在写问题的时候发现找到了解决方案(虽然丑了一点):

project( filter_out )
cmake_minimum_required( VERSION 2.6 )

macro( filter_out FILTERS INPUTS OUTPUTS )
    set( FOUT "" )
    foreach( INP ${INPUTS} )
        set( FILTERED 0 )
        foreach( FILT ${FILTERS} )
            if( ${FILTERED} EQUAL 0 )
                if( "${FILT}" STREQUAL "${INP}" )
                    set( FILTERED 1 )
                endif( "${FILT}" STREQUAL "${INP}" )
                if( ${INP} MATCHES ${FILT} ) 
                    set( FILTERED 1 )
                endif( ${INP} MATCHES ${FILT} ) 
            endif( ${FILTERED} EQUAL 0 )
        endforeach( FILT ${FILTERS} )
        if( ${FILTERED} EQUAL 0 )
            set( FOUT ${FOUT} ${INP} )
        endif( ${FILTERED} EQUAL 0 )
    endforeach( INP ${INPUTS} )
    set( ${OUTPUTS} ${FOUT} )
endmacro( filter_out FILTERS INPUTS OUTPUTS )

set( INPUTS foo bar baz regexpfoo regexpbar regexpbaz )
set( FILTERS bar baz "regexpb.*" )
filter_out("${FILTERS}" "${INPUTS}" OUTPUTS )
message( STATUS "outputs are: ${OUTPUTS}")

输出为:

outputs are: foo;regexpfoo

有没有更好的答案?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进