Rakefile template for building C code.

Outputs to a separate build tree

Escapes filenames correctly (for bash at least).

Author: mark at markferry dot net

Licence: public domain, use it as you wish

require 'rake/clean'
require 'shellwords'

Tasks

Dir['tasks/*.rake'].each { |f| import f }

Inputs ######

SRC_DIR = "src"

Not working. Needs pathmap variables

CONFIG = ENV["CONFIG"] || "Release"

Arch-ABI-Configuration

ARCH = "x86"
ABI = "gnuabi"
AAC = [ARCH, ABI, CONFIG].join('-')

OBJ_DIR = File.join("build", AAC)
DIST_DIR = File.join("dist", AAC)

PROJ = "raketest"

DIST_EXE = File.join(DIST_DIR, PROJ).ext('exe')

CC

CC = "gcc"

C_SRCS = FileList["#{SRC_DIR}/\/*.c"]

def to_obj(objdir, f)
  f.sub(/^#{SRC_DIR}/, objdir).ext('.o')
end

C_OBJS = C_SRCS.map { |f|
  to_obj(OBJ_DIR, f)
}

Targets ######

CLEAN.include C_OBJS
CLEAN.include DIST_DIR

directory OBJ_DIR
directory DIST_DIR

Create output dirs for each include dir

C_OBJS.each do |d|
  directory d.pathmap('%d')
end

task :default => :build

desc "Build"
task :build => DIST_EXE

task :info do
  p C_SRCS
  p C_OBJS
  p DIST_EXE
end

Rules ######

CC

rule '.o' => [
    proc { |tn| tn.sub(/#{OBJ_DIR}/, SRC_DIR).ext('.c') },
    '%d'
  ] do |t|
  sh %Q{#{CC} -c #{t.source.shellescape} -o #{t.name.shellescape}}
end

LD

rule '.exe' => [*C_OBJS, '%d'] do |t|
  sh %Q{#{CC} -o #{t.name.shellescape} #{C_OBJS.shelljoin}}
end
 

$[Get Code]1