From: Jim Weirich Date: 2004-06-22T11:57:29+09:00 Subject: Re: Rake and timestamps (ideoms or methods?) Phil Tomson wrote: > If I don't want to run certain tasks if the file the task is to work on > already is up-to-date (like how make works) how do I tell Rake to not > execute a particular task if the files being worked on are up-to-date? Normal tasks don't look at timestamps. If the goal of a task is to create a file, then use a "file" task rather than a "task" task. File tasks will not trigger if the file named by the task is up to date with its dependents (which should also be file tasks ... a file task is always out of date if it depends on a regular task ... think about it). So a simple file task declaration could look like: file "copy_of_a.txt" => ["a.txt"] do cp "a.txt", "copy_of_a.txt" end Translation: The copy depends on the original. If the original changes, then copy the original into the copy. > Also, notice the 'raise "blah" system("command")' that I'm doing above. As long as your external programs exit with status 0 for normal and non-zero for errors, then rake will automatically abort. The explicit tests and raises aren't needed > Here's my rakefile: And here's my translation. I didn't understand everything you were doing, so I made some of the following up. But you should be able to translated it into something appropriate. I assume that ncvhdl is some compiler-like script and the .vhd file is the input. I'm assuming that the output file will be a .vhdo file. I don't know what ncdlab does, so I just made it a normal task. It will run every time this way. Here's the file -------------------------------------------------------- #!/usr/bin/env ruby # This adds a :clean and :clobber target to your Rakefile. # We also add all intermediate .vhdo files to the clobber target. require 'rake/clean' CLOBBER.include("*.vhdo") # Lets make a list of all the .vhd source files in the directory. VHD_FILES = FileList['*.vhd'] # And now use that to make a list of all the .vhdo file we # want to generate. VHDO_FILES = VHD_FILES.sub(/$/, 'o') # No change to this task task :default => [ :sim_jtag_tb ] do puts "done..." end # I use "sh" instead of system. "sh" understands # when to echo commands in Rake. task :sim_jtag_tb => [ :build_jtag_tb ] do puts "simulate it..." sh %{ncsim -gui jtag_tb:jtag_tb_behavior} end # I don't know what ncdlab does, but I'm assuming it needs # all the .vhdo files to be present before it can run, so # we make a dependency. Fortunately, we already calculated # the list of .vhdo files. (Note: If I know what kind of output # file was produced in this step, I would make this a file task # with the name of the output file.) task :build_jtag_tb => VHDO_FILES do puts "build jtag_tb" sh %{ncdlab jtag_tb:jtag_tb_behavior -access +r+w} end # Here follows the three files that are processed by ncvhdl. # The jtag_tb_c was bundled with :build_jtag_tb task before, # but it looks to me like it could be broken out. (I could # be wrong.) Notice the "output file depends on input file" # pattern. file "jtag_tb_c.vhdo" => ["jtag_tb_c.vhd"] do puts "build jtag_tb_c" sh %{ncvhdl -linedebug jtag_tb_c.vhd} end file "jtag_driver.vhdo" => ["jtag_driver.vhd"] do puts "build jtag_driver" sh %{ncvhdl -linedebug jtag_driver.vhd} end file "jtag.vhdo" => ["jtag.vhd"] do puts "build jtag..." sh %{ncvhdl -linedebug jtag.vhd} end End of Rakefile------------------------------------------------- There is a lot of duplication in those last three file tasks. You could iterate over VHD_FILES and create the file tasks in a loop. A simpler way is to write a rule that describes how to turn .vhd files into .vhdo files, e.g. rule ".vhdo" => [".vhd"] do |t| puts "build #{t.source}" sh %{ncvhdl -linedebug #{t.source}} end Use that single rule in place of the final three file tasks. Here is the output from the mockup I did... ---------------------------------------------------- $ rake (in /home/jim/pgm/misc/philtomson) build jtag.vhd ncvhdl -linedebug jtag.vhd Creating jtag.vhdo build jtag_driver.vhd ncvhdl -linedebug jtag_driver.vhd Creating jtag_driver.vhdo build jtag_tb_c.vhd ncvhdl -linedebug jtag_tb_c.vhd Creating jtag_tb_c.vhdo build jtag_tb ncdlab jtag_tb:jtag_tb_behavior -access +r+w simulate it... ncsim -gui jtag_tb:jtag_tb_behavior done... $ $ $ rake clobber (in /home/jim/pgm/misc/philtomson) rm -r jtag.vhdo rm -r jtag_driver.vhdo rm -r jtag_tb_c.vhdo ---------------------------------------------------- I hope this helps. -- -- Jim Weirich jim@weirichhouse.org http://onestepback.org ----------------------------------------------------------------- "Beware of bugs in the above code; I have only proved it correct, not tried it." -- Donald Knuth (in a memo to Peter van Emde Boas)