Forum: Ruby Building C++ with Rake

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
23595723d932d8516ed3aaf0986aaca8?d=identicon&s=25 Magnus Falk (Guest)
on 2007-06-03 22:21
(Received via mailing list)
I'm familiarizing myself with Rake (and learning a spot of Ruby while
doing it) by making a build environment for a C++ project I'm doing.
I've run into a few issues though...

First off; here's the code I have so far:

require 'rake/clean'

PROJ_NAME = "testproj"
BUILD_DIR = ENV['BUILD_DIR']
OBJ_DIR = File.join(BUILD_DIR, PROJ_NAME,
File.expand_path('.').pathmap("%f"), 'objects')
SRC_FILES = FileList['src/**/*.c*']
OBJ_FILES = FileList[File.join(OBJ_DIR + '**/*.o')]

CLEAN.include(OBJ_DIR)

directory OBJ_DIR

def compileTask inclDirs, flags
  includes = inclDirs.collect { |dir| '-I' + dir + ' ' }
  compFlags = flags.collect { |flag| flag + ' ' }

  SRC_FILES.each do |srcFile|
    objFile = File.join(OBJ_DIR, srcFile.pathmap("%f").ext('o'))

    file objFile => [srcFile] do
      sh "g++ #{includes} #{compFlags} -c #{srcFile} -o #{objFile}"
    end
  end
end

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

  if (File.extname(target) == '.so') then
    linkFlags = linkFlags + ['-shared' + ' ']
  else
    linkFlags = linkFlags + ['-c' + ' ']
  end

  targetFile = File.join(BUILD_DIR, target)

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

#----This here below I would like to have in a separate file

task :default => [:link]

task :compile => [OBJ_DIR] do
  inclDirs = ['/tmp/testdir1', '/tmp/testdir2']
  flags = ['-g', '-v']

  compileTask(inclDirs, flags)
end

task :link => [:compile] do
  target = 'libTest.so'
  depLibDirs = ['/usr/lib']
  depLibs = []
  flags = ['-fpic']

  linkTask(depLibDirs, depLibs, flags, target)
end

And my issues:

1: The file task thingy doesn't work as I thought it would, but I'm
probably using it wrong. I hope it's evident from the context what I'm
trying to do though.

2: I have lots of ugly "insert space between the arguments in my
arrays". How do I do it in a nicer way?

3: I would like to separate the "defined" tasks from the "regular"
ones so that the part furthest down is content of each "satellite"
rakefile which then includes the top part as a kind of library. But
when I tried doing it by simply putting the top part in a file and
then putting 'require "../../cppBuildLib.rb"' at the top of the
satellite file I got a message that file couldn't be found (or
something to that effect).

As I said before, I'm learning Rake and Ruby at the same time, so feel
free to point out any oddities or other stuff that could/should be
done differently.
A4852818d512c2ed472bdb0ec3e21102?d=identicon&s=25 Urban Hafner (Guest)
on 2007-06-04 18:54
(Received via mailing list)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


On Jun 3, 2007, at 23:20 , Magnus Falk wrote:

> 2: I have lots of ugly "insert space between the arguments in my
> arrays". How do I do it in a nicer way?

Just build your array and then call array.join(' ') to get a string of
the array elements separated by a space.

> 3: I would like to separate the "defined" tasks from the "regular"
> ones so that the part furthest down is content of each "satellite"
> rakefile which then includes the top part as a kind of library. But
> when I tried doing it by simply putting the top part in a file and
> then putting 'require "../../cppBuildLib.rb"' at the top of the
> satellite file I got a message that file couldn't be found (or
> something to that effect).

Yes, it's a bit hard to say where ruby thinks that the current directory
is. But as the string you give to require doesn't have to be static you
can just make it an absolute path buy prepending File.dirname(__FILE__)
(and maybe use File.join to create the path out of its pieces).

Urban


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (Darwin)

iD8DBQFGZEMxggNuVCIrEyURAm59AJoDF/dQejNJ4rSGapzJu2OWEdCFnQCfeJxY
LnIud7fAAIn85LowMZCn5Pw=
=kXVn
-----END PGP SIGNATURE-----
23595723d932d8516ed3aaf0986aaca8?d=identicon&s=25 Magnus Falk (Guest)
on 2007-06-05 09:42
(Received via mailing list)
The Array.join worked beautifully, thanks for the tip.

Also, I seem to have lied about the import issue (I was recreating an
issue I had earlier before I moved it all into one file). I managed to
resolve it now and my best guess is that it was appending ".rb" to the
filename that did it.

Cheers,
Magnus
This topic is locked and can not be replied to.