Rake: How do I Override Var's Used by a Rule?

B

Brock Rycenga

All:

For our rakefile system, we would like to have the ability to build
either a "debug" version of our code, or a "release" version. My plan is
to have 2 separate high-level tasks, where one of them invokes the other
- except with overridden variables. I wish I knew how to do this. ;-)
Please help.

Here are my tasks (edited for brevity):

=============================
task :debug_build => [:build_depend, :build_obj] do
# handle the linking
end

task :release_build do
# Invoke the debug_build task, but override the following var's:
# C_OPTIMIZE_LVL="-o2"
# C_DEBUG=""
end
=============================

My .c -> .obj rule looks like this:

=============================
rule ".#{OBJ_EXT}" => lambda{|objfile| find_source(objfile)} do |t|
sh "#{COMPILER} #{C_OPTS} #{C_DEBUG} #{C_OPTIMIZE_LVL} #{C_OBJ_DIR}
#{C_INC_PATHS} #{C_FLAGS} #{C_TARGET} #{t.source}"
end
=============================

So the only difference between the debug_build and release_build tasks
is the compile line. NOTE: I currently read those variables (COMPILER,
C_OPTS, etc.) from another rakefile.

Any suggestions? Am I going about this the wrong way?



Thanks,
Brock
 
B

Brock Rycenga

As usual, right after I finally decide to post something to a forum, I
trip over an answer myself. I found that this seems to do the trick.

task :release_build do
C_OPTIMIZE_LVL="-o2"
C_DEBUG=""
Rake::Task[:debug_build].invoke
end

Is this a good way to do this? Is there a better one? Should I just stop
asking questions and move on?



Thanks,
B


Brock said:
All:

For our rakefile system, we would like to have the ability to build
either a "debug" version of our code, or a "release" version. My plan is
to have 2 separate high-level tasks, where one of them invokes the other
- except with overridden variables. I wish I knew how to do this. ;-)
Please help.

Here are my tasks (edited for brevity):

=============================
task :debug_build => [:build_depend, :build_obj] do
# handle the linking
end

task :release_build do
# Invoke the debug_build task, but override the following var's:
# C_OPTIMIZE_LVL="-o2"
# C_DEBUG=""
end
=============================

My .c -> .obj rule looks like this:

=============================
rule ".#{OBJ_EXT}" => lambda{|objfile| find_source(objfile)} do |t|
sh "#{COMPILER} #{C_OPTS} #{C_DEBUG} #{C_OPTIMIZE_LVL} #{C_OBJ_DIR}
#{C_INC_PATHS} #{C_FLAGS} #{C_TARGET} #{t.source}"
end
=============================

So the only difference between the debug_build and release_build tasks
is the compile line. NOTE: I currently read those variables (COMPILER,
C_OPTS, etc.) from another rakefile.

Any suggestions? Am I going about this the wrong way?



Thanks,
Brock
 
B

Brock Rycenga

This is really starting to feel like I am having a conversation with
myself...

Even if this is the correct way to do this, it would be really nice to
know how to override var's from the command line. For example, with
make, I could do the following:

make -f mymakefile OPT1="new_val" OPT2="over_new_val" mytarget

This would override value for OPT1 and OPT2 in the makefile. Is there
something equivalent in rake?



Thanks,
B

Brock said:
As usual, right after I finally decide to post something to a forum, I
trip over an answer myself. I found that this seems to do the trick.

task :release_build do
C_OPTIMIZE_LVL="-o2"
C_DEBUG=""
Rake::Task[:debug_build].invoke
end

Is this a good way to do this? Is there a better one? Should I just stop
asking questions and move on?



Thanks,
B
 
M

Michael Guterl

This is really starting to feel like I am having a conversation with
myself...

Even if this is the correct way to do this, it would be really nice to
know how to override var's from the command line. For example, with
make, I could do the following:

make -f mymakefile OPT1="new_val" OPT2="over_new_val" mytarget

This would override value for OPT1 and OPT2 in the makefile. Is there
something equivalent in rake?
OPT1 = ENV['OPT1'] || 'default value'

On another note, top posting is discouraged on this list.

HTH,
Michael Guterl
 
H

Hugh Sasse

As usual, right after I finally decide to post something to a forum, I
trip over an answer myself. I found that this seems to do the trick.

task :release_build do
C_OPTIMIZE_LVL="-o2"
C_DEBUG=""
Rake::Task[:debug_build].invoke
end

Is this a good way to do this? Is there a better one? Should I just stop
asking questions and move on?

I'd make them global variables, just to make them stand out, show they
are shared between tasks, but I don't use rake that much at the moment

As to the next question about command line options, then my reading of
rake --help suggests you can't set them from the command line, but you
could set environment vars and read those inside the rakefile. Or read
a config file with values in it.
Thanks,
B
Hugh
 
B

Brock Rycenga

Michael said:
This would override value for OPT1 and OPT2 in the makefile. Is there
something equivalent in rake?
OPT1 = ENV['OPT1'] || 'default value'

On another note, top posting is discouraged on this list.

HTH,
Michael Guterl


Thanks Michael. That does help, and that's what I was looking for.


Brock
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top