I decided to make DRODUtil on Linux. It was a fairly eventful piece of work, so here's what happened:
1. I run "
scons target=util"
in the Master/Linux directory. After a bunch of compiling, GCC gives me a bunch of undefined reference errors. A little investigation shows that they're in DROD.
2. Now, I manually try and meet the dependencies by playing around in the SConstruct. Eventually, I run into more undefined references than I can count, some are even in FrontEndLib. This doesn't seem to work that well.
3. I poke around, and realise that the DRODUtil project includes a number of source files from DROD. I modify the SConstruct by adding the following code just in front of the line that says "
srcs.sort()"
in makelib:
if opt['util']:
pat = re.compile(r'RelativePath="\.?\\?\.\.\\[Dd][Rr][Oo][Dd]\\([^.]*).cpp"')
for line in open(srcpath + '/' + mod + '.vcproj'):
match = pat.search(line)
if match:
srcs.append('../DROD/' + match.group(1))
4. Still more undefined references. This time, to "
typeinfo for CGameScreen"
. I locate them, and realise it needs in info to
dynamic_cast CScreen into CGameScreen. I figure that since DRODUtil doesn't need a screen, I can just remove them via conditional inclusion. I created a new macro name (UTIL) and removed the offending casts. In theory, I could also have modified DRODUtil's GameScreenDummy.h to include the function(s) that would cause GCC to emit the typeinfo, but that's not quite as portable (and the "
first non-virtual non-inline"
trick wasn't working for me). I didn't feel like looking it up though. I added the lines to the SConstruct, near the end:
if opt['util']:
env.Append(CCFLAGS = ' -DUTIL')
BAM! Completed DRODUtil!
This fix would do well in the official SConstruct, although something different might be employed to deal with the typeinfo references (possibly finding the function that GCC needs to emit that info)
FAKE EDIT (edit-before-post): I just did some more testing and discovered that the function that emits the typeinfo for CGameScreen is the destructor, which, if defined, gives undefined references to almost every other function, as well as the vtable. It's not worth it to define dummy functions for all of those, too.