Using Rake to build C++

I'm making myself a build environment and found this Rake thingy that
seemed just to good to pass upon. But since I don't know any Ruby I'm
struggling a bit.

I'm making a couple of tasks to compile and link C++ code and it seems
like I've misunderstood the file task somewhat. In the example code
below, the compilation and linking is never run, what am I doing wrong?

cppTasks.rb:
def compileTask inclDirs, flags
  inclDirs = inclDirs.collect { |dir| '-I' + dir }
  inclDirs = inclDirs.join(' ')
  flags = flags.join(' ')

  SRC_FILES.each do |srcFile|
    objFile = File.join(OBJ_DIR, srcFile.pathmap("%f").ext('o'))
    file objFile => [srcFile] do
      sh "g++ #{inclDirs} #{flags} -c #{srcFile} -o #{objFile}"
    end
  end
end

def linkTask libDirs, libs, flags, target
  libDirs = libDirs.collect { |dir| '-L' + dir}
  libs = libs.collect { |lib| '-l' + (lib[/lib(.+)\./, 1])}

  flags = flags + ((File.extname(target) == '.so') ? ['-shared'] :
['-c'])

  libDirs = libDirs.join(' ')
  libs = libs.join(' ')
  flags = flags.join(' ')

  targetFile = File.join(BUILD_DIR, target)

  file targetFile => OBJ_FILES do
    objFiles = OBJ_FILES.collect { |objFile| objFile + ' ' }
    sh "g++ #{libDirs} #{libs} #{flags} #{objFiles} -o #{targetFile}"
  end
end

Cheers,
Magnus

···

--
Posted via http://www.ruby-forum.com/.

Oh, another thing while I'm at it. Is there any way to "export"
variables defined in one task to make them visible in other task?
Similar to "antcall"
(http://ant.apache.org/manual/CoreTasks/antcall.html) with the flag
inheritAll.

I'm having problems with dependencies between variables and I would like
to have a little more control over when they are assigned instead of
just at the moment when they are imported.

···

--
Posted via http://www.ruby-forum.com/.

Any luck on your own yet?

Take a look at the Rake examples:
http://docs.rubyrake.org/read/chapter/1#page3
http://docs.rubyrake.org/read/chapter/9#page31

You need to make TASKs and FILEs, not just functions,
although each task and file declaration can call functions.

The tutorial is very good and shows a C example.

Les

···

On 6/5/07, Magnus Falk <magnus.falk@gmail.com> wrote:

I'm making myself a build environment and found this Rake thingy that
seemed just to good to pass upon. But since I don't know any Ruby I'm
struggling a bit.

I'm making a couple of tasks to compile and link C++ code and it seems
like I've misunderstood the file task somewhat. In the example code
below, the compilation and linking is never run, what am I doing wrong?

cppTasks.rb:
def compileTask inclDirs, flags
  inclDirs = inclDirs.collect { |dir| '-I' + dir }
  inclDirs = inclDirs.join(' ')
  flags = flags.join(' ')

  SRC_FILES.each do |srcFile|
    objFile = File.join(OBJ_DIR, srcFile.pathmap("%f").ext('o'))
    file objFile => [srcFile] do
      sh "g++ #{inclDirs} #{flags} -c #{srcFile} -o #{objFile}"
    end
  end
end

def linkTask libDirs, libs, flags, target
  libDirs = libDirs.collect { |dir| '-L' + dir}
  libs = libs.collect { |lib| '-l' + (lib[/lib(.+)\./, 1])}

  flags = flags + ((File.extname(target) == '.so') ? ['-shared'] :
['-c'])

  libDirs = libDirs.join(' ')
  libs = libs.join(' ')
  flags = flags.join(' ')

  targetFile = File.join(BUILD_DIR, target)

  file targetFile => OBJ_FILES do
    objFiles = OBJ_FILES.collect { |objFile| objFile + ' ' }
    sh "g++ #{libDirs} #{libs} #{flags} #{objFiles} -o #{targetFile}"
  end
end

--
I always thought Smalltalk would beat Java, I just didn't know it would be
called 'Ruby' when it did.
-- Kent Beck