To compare, GNU make:require 'rake/clean' CLEAN.include('*.o') CLOBBER.include('hello') task :default => ["hello"] SRC = FileList['*.c'] OBJ = SRC.ext('o') rule '.o' => '.c' do |t| sh "cc -c -o #{t.name} #{t.source}" end file "hello" => OBJ do sh "cc -o hello #{OBJ}" end # File dependencies go here ... file 'main.o' => ['main.c', 'greet.h'] file 'greet.o' => ['greet.c']
I guess this is a testament to ruby that it can actually do this and make it look so close to the real thing.SRC := $(wildcard *.c) OBJ := $(patsubst %.c,%.o,$(SRC)) default: hello clean: rm -f *.o clobber: clean rm -f hello hello: $(OBJ) cc -o hello $(OBJ) %.o: %.c cc -c -o $@ $< # File dependencies go here ... main.o: main.c greet.h greet.o: greet.c
I actually can think of several reasons why the rake version is superior, among them:
- The ability to use a fully developed programming language instead of the GNU Make $(...) macros, some of which use very bizarre semantics
- The ability to extend it easily, by adding more ruby code.
- You do need to learn Ruby, and be comfortable with some of the Ruby contortions - but considering that Ruby appears to be the current fashion, it would probably be a good thing to learn regardless....
- In the end, you still use "sh" to invoke a shell. I really wished they addressed the shell quoting problem in a different way - I bet even after 30 years, things will fail spectacularly if any of the files have a space in them.
- It doesn't appear to me that rake really has any novel idea - in spite of there being a long history of make clones, some of which do present interesting extensions:
- Augmenting file timestamps with file hashing, in order to avoid rebuilding aggregate targets when a rebuild of an ingredient doesn't actually produce a different file...
- Extending rules to include "cascade dependencies", a way to express: "If you need X, you will also need Y". This allows you to express a C include dependency in a more direct way: "anyone who uses main.c (in the example above) will also need to depend on greet.h". This is subtly different from the classic dependencies.
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.