rake + gcc で C や C++ のオブジェクトファイルとヘッダファイルの間の依存関係を扱うにはどうしたら良いかなーと試行錯誤して、 一つの解答にたどり着きました。オブジェクトファイルを生成するときに MMD オプションで依存関係を *.d ファイルに吐いておき、 2回目以降のコンパイルでは、それを rake から読み込んで利用します。
Rakefile
def get_headers(file)
if File.exists?(file)
File.read(file).gsub("\\\n ", "").scan(/^\S+: (.+)$/)
.flatten.map {|s| s.split(' ') }.flatten
else
[]
end
end
# rule の場合は proc を通して
rule '.o' => ['%X.cpp',
proc {|file| get_headers(file.pathmap('%X.d')) }] do |t|
sh "#{GXX} #{CFLAGS} -c -o #{t.name} -MMD #{t.prerequisites[0]}"
end
# file の場合は直接
file 'myapp.o' => ['myapp.cpp', *get_headers('myapp.d')] do |t|
sh "#{GXX} #{CFLAGS} -c -o #{t.name} -MMD #{t.prerequisites[0]}"
end