Hello,
I have been banging
my head on this for a couple too long so I need some help. Here is
the concept of what I am doing:
I use an intermediate language(.idl)
to generate 2 cpp and 2 hpp files. I have an exe(idlcompiler) (that
I build to do so) that take the .idl and
generate the cpp and hpp files.
What I want to have:
-If change one idl,
I want to regenerate its hpp/cpp files.
-If I change the
source code of the exe, I want to rebuild that exe and then I want all
hpp/cpp to be regenerated for their idls.
I ll post part of my jambase that I
find relevent. Feel free to ask for more if you think it is important
Thank you for any information that can
help me make this works !
rule Build( target : source * : projectName
: libFiles * : ignoredLibs * : type : aggregatedLibFiles * : ppdefs * :
postBuildCommand ? )
{
Depends clean : $(cleanTarget)
;
ALWAYS $(cleanTarget)
;
local CONFIG_NAME = $($(config).NAME)
;
# TODO include cleaning
information in variables
Clean $(cleanTarget) :
$(target) ;
local compiled = ;
for local src in $(source)
{
....
if $(src:S)
= ".idl"
{
#this are the file to be generated
genSourceCpp = $(src:D)\\$(src:B).cpp ;
genSourceHpp = $(src:D)\\$(src:B).hpp ;
genSourceCppWrapper = $(src:D)\\Wrapper_$(src:B).cpp ;
genSourceHppWrapper = $(src:D)\\Wrapper_$(src:B).hpp ;
#depend on the idl File
Depends $(genSourceCpp) : $(src) ;
Depends $(genSourceHpp) : $(src) ;
Depends $(genSourceCppWrapper) : $(src) ;
Depends $(genSourceHppWrapper) : $(src) ;
#depend on the generator
Depends $(src) : $($(config).IDLCOMPILER .EXE) ;
## I have tried depending on the project where my idlcompiler is made
#Depends $(src) : <projectname>idlcompiler ;
## I have tried depending on a txt file and my cpp/hpp were always regenerated
#Depends $(src) : z:\\test1.txt2 ;
Clean $(cleanTarget) : $(genSourceCpp) ;
Clean $(cleanTarget) : $(genSourceCppWrapper) ;
IDLCOMPILER on $(genSourceCpp) = $($(config).IDLCOMPILER.EXE ) ;
IdlCompile $(genSourceCpp) : $(src) ;
IDLCOMPILER on $(genSourceCppWrapper) = $($(config).IDLCOMPILER.EXE) ;
IdlCompile $(genSourceCppWrapper) : $(src) ;
comp = $(intermediateDir)\\$(genSourceCpp:B).cpp.obj ;
compiled += $(comp) ;
CompiledCode $(comp) : $(genSourceCpp) : $(config) : : $(ppdefs) ;
comp = $(intermediateDir)\\$(genSourceCppWrapper:B).cpp.obj ;
compiled += $(comp) ;
CompiledCode $(comp) : $(genSourceCppWrapper) : $(config) : : $(ppdefs)
;
}
}
Depends $(target) : $(compiled)
;
...
# When using multiple
CPUs/threads, make sure no .obj in the same project
# is built at the same
time (to avoid multiple access to .pdb).
JAM_SEMAPHORE on $(compiled)
= $(projectName:G=semaphore) ;
# Delete files that can't
be built.
# It seems to be useful
when .pch is invalid, in that case the
# .lib/.dll/.exe is still
there even if it fails to build.
RMOLD $(target) ;
}
Part of my output for dependency are
4 Name: z:\Intermediate\DebugTools\seed_language_test\seed_class.cpp.obj
1>
: Updating it
1>
: Depends on .\Techno5thGen\UnitTests\seed_language_test\seed\seed_class.cpp
(update)
1>
: Depends on .\Techno5thGen\UnitTests\seed_language_test\seed\seed_class.cpp
(internal node) (update)
1>-> 5 Name:
.\Techno5thGen\UnitTests\seed_language_test\seed\seed_class.cpp
1>
: Updating it
1>
: Depends on .\Techno5thGen\UnitTests\seed_language_test\seed\seed_class.seedunittest
(old) (max time)
1>-> 6 Name:
.\Techno5thGen\UnitTests\seed_language_test\seed\seed_class.seedunittest
1>
: Outdated, updating it
1>
: Depends on z:\test1.txt2 (newer) (max time)
1> 7
Name: z:\test1.txt2
1>
: Newer
<------------------------------------------ Why is this
always newer? The date doesnt change on the disk...
Olivier Pomerleau
Game Programmer
Artificial Mind & Movement