再帰的フォルダ探索

Boost.Build には GLOB という特定パターンを与えるとそれにマッチするファイルのリストを返してくれるルール(関数)があります。しかし、これはサブフォルダまでたどってくれません。そこで、たどってくれるルールを作ってみました。

rule globRecursive ( dir : pattern ) {
    local files ;
    files = [ GLOB $(dir) : $(pattern) ] ;
    for f in [ GLOB $(dir) : * ] {
        if ( $(f:S) = "" ) && ( $(f:B) != CVS ) && ( $(f:B) != '.svn' ) {
            files += [ globRecursive $(f) : $(pattern) ] ;
        }
    }
    return $(files) ;
}

個人的趣味で CVS, .svn というフォルダは除外しています。使い方は、

cppFiles = [ globRecursive . : *.cpp ] ;

とすることで、カレント以下のすべての cpp ファイルを取得することができます。