From: Joe Van Dyk Date: 2005-07-15T16:37:24+09:00 Subject: Re: rake question On 7/15/05, Joe Van Dyk wrote: > On 7/14/05, Joe Van Dyk wrote: > > rule '.o' => ['.c'] do |t| > > sh "cc #{t.source} -c -o #{t.name}" > > end > > > > But, when I change the .c source file, it doesn't get compiled again. > > Why is that? > > > > Example: > > > > PowerBook:~/that_stuff/test1 joe$ ls > > Rakefile another_test.h test.cpp > > another_test.cpp main.cpp test.h > > > > PowerBook:~/that_stuff/test1 joe$ cat Rakefile > > require 'rake/clean' > > CLEAN.include '*.o', 'test' > > CPP_SOURCE = FileList['*.cpp'] > > OBJS = CPP_SOURCE.ext 'o' > > > > task :default => :run > > task :run => "test" do > > sh "./test" > > end > > file "test" => OBJS do > > sh "g++ -o test #{OBJS}" > > end > > rule '.o' => '.cpp' do |t| > > sh "g++ -c -o #{t.name} #{t.source}" > > end > > CPP_SOURCE.each do |cpp| > > headers = File.read(cpp).scan(/^#include "(.+)"/) > > task cpp => headers > > end > > > > PowerBook:~/that_stuff/test1 joe$ rake > > (in /Users/joe/that_stuff/test1) > > g++ -c -o another_test.o another_test.cpp > > g++ -c -o main.o main.cpp > > g++ -c -o test.o test.cpp > > g++ -o test another_test.o main.o test.o > > ./test > > Whassup > > what's up! > > > > > > PowerBook:~/that_stuff/test1 joe$ touch main.cpp > > PowerBook:~/that_stuff/test1 joe$ rake > > (in /Users/joe/that_stuff/test1) > > ./test > > Whassup > > what's up! > > > > It should've recompiled main.cpp and relinked everything, right? > > When I comment out > > CPP_SOURCE.each do |cpp| > > headers = File.read(cpp).scan(/^#include "(.+)"/) > > task cpp => headers > > end > > Then it works as expected. So, "task cpp => headers" is the culprit. > But I'm still not sure why it breaks everything else. (I hope it's clear what I'm trying to do. I'm trying to scan the included header files and if the header files have been changed, I want to recompile all source files that include those header files. I tried using "file cpp => headers", but that didn't help either.)