用程式檢查程式 - 一定要引入的 header
專案一大,就會設定一些「慣例」,以簡化專案複雜度。但是我們無法叫 compiler 幫我們檢查「慣例」,久而久之,這些「慣例」反而會成為混亂的來源。因此,最終還是得想個辦法,自動檢查這些「慣例」是否有被遵守才行。例如,檢查某個一定要被引入的 header 有否被引入。
我習慣一個函式庫,會有一個 config.h,將所有 compile-time options 放在裡面,並規定函式庫裡的所有 header/source files 都一定要引入此 config.h,這樣子裡面的設定,才能廣為周知[1]。
假設這個函式庫叫 messy,則 config.h 會位於 include/messy/config.h,平常以 #include <messy/config.h> 引入。那我們可以用以下的 perl 程式片段,檢查是否每個 header/source files 皆有引入 config.h:
use File::Grep;
use File::Find::Rule;
print "CHECK: C/C++ sources must include <messy/config.h>.\n";
print join(
"\n",
map { "| $_->{'filename'}" }
grep { $_->{'count'} == 0 }
File::Grep::fgrep { /^\s*#\s*include\s+<messy\/config.h>/ }
grep { $_ !~ m/messy\/config.h$/o }
File::Find::Rule->or(
File::Find::Rule->directory->name('.svn')->prune->discard,
File::Find::Rule->file()->name(qr/\.(h|hpp|c|cpp)$/i)
)->in('include', 'src')
) || "[ok]";
print "\n\n";
把這段程式,放在 post-build 裡,每次編譯函式庫時,最後就會執行,檢查除了 include/messy/config.h 以外的所有 header/source 檔案,是否皆有引入 include/messy/config.h,沒有引入的檔名,就會列出來,若統統都有引入,就會印出 [ok] 字樣。如下:
CHECK: C/C++ sources must include <messy/config.h>. | include/messy/debug_tool/func_trace.hpp | src/messy.debug_tool.func_trace.cpp
修正後就會變成如下:
CHECK: C/C++ sources must include <messy/config.h>. [ok]
檢查結果會一併出現在 build log 的最後面,有需要時,就可以依據指定的「慣例」,去修正那些有問題的檔案。



Post a Comment