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']
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 guess this is a testament to ruby that it can actually do this and make it look so close to the real thing.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.