2016-07-16 6 views
4

Also lerne ich ruby im Moment und entdeckte rake. Ich mag es, neue Werkzeuge zu lernen, indem ich Dinge, die ich bereits kenne, mit ihnen umsetze, also versuche ich, einen Makefile zu konvertieren, den ich zu rake habe.Makefile äquivalentes Verhalten in Rakefile

Lassen Sie uns sagen, dass es wie folgt aussieht:

main: build/*.o 
    clang -c $^ -o [email protected] 

build/%.o: src/%.c | build 
    clang -c $< -o [email protected] 

build: 
    mkdir build 

Was besondere über dieses Make lautet:

  1. Mustervergleich mit %
  2. Auftrag nur Abhängigkeit mit | build

Gibt es eine Möglichkeit, diese Logik mit rake zu implementieren, oder muss ich ruby selbst verwenden? Z.B.

task :default => "main" 

file "main" => "build/%.o" do 
    sh "clang -o 'main' ??" 
end 

file 'build/%.o' => "src/%.c" do # order only dependency on `build` 
    sh "clang -c ?? ??" 
end 

Antwort

1

Dies ist etwas, das bei recht gut Harke, und das ist tragisch zu wenig genutzt:

task :default => "main" 

# This assumes that your "main" is created by linking 
# all *.o files, each of which is the product of compiling a *.c file 

# FileList[] creates a list of all *.c source files. The pathmap then 
# changes the directory from /src/ to /out/ and the extension to .o 

file "main" => FileList["src/**/*.c"].pathmap("%{^src,out}d/%n.o") do |t| 
    sh "ld #{t.sources.join(" ")} #{t.name}" 
end 

# This is the rule that says: if you need a 
# file out/bla.o, this will create it from /src/bla.c.  
rule /out\/.+.o/ => ->(target) { target.pathmap("%{^out,src}d/%n.c") } do |t| 
    sh "cp #{t.source} #{t.name}" 
end 

Einige Anmerkungen:

  • Regel Namen können regex sein. Ich glaube, Glob-Stil-Muster sind auch möglich, aber finden Sie es einfacher, immer nur Regex verwenden
  • Wenn eine Regel Ziel bereits existiert, und neuer als alle seine Quellen ist, wird es nicht erneut ausgeführt werden (wie Make)
  • Pathmap- und Datei-Tasks sind Rake-Erweiterungen für Dateinamen. Es gibt nichts Ähnliches für andere Entitäten wie Datenbankeinträge, aber Sie können sie normalerweise selbst erstellen.