Thanks to everyone for the help and advice on choosing a build tool for my D+LLVM project. I settled on Jam (ftjam) in the end, the major factor being cross-platform support and prebuilt binaries for a variety of operating systems.

The documentation for Jam I've found is very lacking but have struggled to put together a working build script. My Jamfile looks like this so far:


CC = dmd ;
CCFLAGS = -fPIC -O -inline -release -w ;
DFILES =
    src/main.d ;    # should be scanned from src dir
LINK = $(CC) ;
LINKFLAGS = -L-lstdc++ -L-ldl ;

C++ = g++ ;
C++FLAGS =
    -I/usr/include
    -DNDEBUG
    -D_GNU_SOURCE
    -D__STDC_LIMIT_MACROS
    -D__STDC_CONSTANT_MACROS
    -O3
    -fomit-frame-pointer
    -fno-exceptions
    -fPIC
    -Woverloaded-virtual
    -Wcast-qual ;   # should be generated from `llvm-config --cxxflags`

# override the Link action to correct for the dmd compiler -o flag
actions Link bind NEEDLIBS {
    $(LINK) $(LINKFLAGS) -of$(<) $(UNDEFS) $(>) $(NEEDLIBS) $(LINKLIBS)
}

Objects $(DFILES) ;
MainFromObjects puckc : $(DFILES:S=.o) ;
LinkLibraries puckc : libllvmd ;
Library libllvmd : libs/llvm-2.9/Ext.cpp libs/llvm-2.9/Target.cpp ;



I'm not very experienced dealing with linker errors, the build output shows these errors:

...found 152 target(s)...
...updating 5 target(s)...
C++ libs/llvm-2.9/Ext.o
C++ libs/llvm-2.9/Target.o
Archive libllvmd.a
ar: creating libllvmd.a
Ranlib libllvmd.a
Dc src/main.o
Link puckc
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(gcx_3d4_122.o): In function `_D2gc3gcx3Gcx4markMFPvPvZv':
src/gc/gcx.d:(.text._D2gc3gcx3Gcx4markMFPvPvZv+0x165): undefined reference to `_D4core5bitop3btsFNbPmmZi'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(gcx_3d4_122.o): In function `_D2gc3gcx3Gcx11fullcollectMFPvZm':
src/gc/gcx.d:(.text._D2gc3gcx3Gcx11fullcollectMFPvZm+0x3e4): undefined reference to `_D4core5bitop3bsfFNaNbmZi'
src/gc/gcx.d:(.text._D2gc3gcx3Gcx11fullcollectMFPvZm+0x47f): undefined reference to `_D4core5bitop3bsfFNaNbmZi'
src/gc/gcx.d:(.text._D2gc3gcx3Gcx11fullcollectMFPvZm+0x596): undefined reference to `_D4core5bitop3btrFNbPmmZi'
src/gc/gcx.d:(.text._D2gc3gcx3Gcx11fullcollectMFPvZm+0x792): undefined reference to `_D4core5bitop3btrFNbPmmZi'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(lifetime_5c0_478.o): In function `_D2rt8lifetime11newCapacityFmmZm':
src/rt/lifetime.d:(.text._D2rt8lifetime11newCapacityFmmZm+0x3a): undefined reference to `_D4core5bitop3bsrFNaNbmZi'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(gcbits_3c0_21c.o): In function `_D2gc6gcbits6GCBits9testClearMFmZm':
src/gc/gcbits.d:(.text._D2gc6gcbits6GCBits9testClearMFmZm+0x18): undefined reference to `_D4core5bitop3btrFNbPmmZi'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(gcbits_3c0_21c.o): In function `_D2gc6gcbits6GCBits7testSetMFmZm':
src/gc/gcbits.d:(.text._D2gc6gcbits6GCBits7testSetMFmZm+0x18): undefined reference to `_D4core5bitop3btsFNbPmmZi'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(array_13b_5f7.o): In function `_D3std5array16__T8AppenderTAaZ8Appender11newCapacityFmZm':
std/array.d:(.text._D3std5array16__T8AppenderTAaZ8Appender11newCapacityFmZm+0x1a): undefined reference to `_D4core5bitop3bsrFNaNbmZi'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(bitmanip_18c_31e.o): In function `_D3std8bitmanip8BitArray7opIndexMxFmZb':
std/bitmanip.d:(.text._D3std8bitmanip8BitArray7opIndexMxFmZb+0x15): undefined reference to `_D4core5bitop2btFNaNbxPmmZi'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(bitmanip_18c_31e.o): In function `_D3std8bitmanip8BitArray13opIndexAssignMFbmZb':
std/bitmanip.d:(.text._D3std8bitmanip8BitArray13opIndexAssignMFbmZb+0x1f): undefined reference to `_D4core5bitop3btsFNbPmmZi'
std/bitmanip.d:(.text._D3std8bitmanip8BitArray13opIndexAssignMFbmZb+0x2e): undefined reference to `_D4core5bitop3btrFNbPmmZi'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(array_76d_638.o): In function `_D3std5array17__T8AppenderTAyaZ8Appender11newCapacityFmZm':
std/array.d:(.text._D3std5array17__T8AppenderTAyaZ8Appender11newCapacityFmZm+0x1a): undefined reference to `_D4core5bitop3bsrFNaNbmZi'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(numeric_86a_120.o): In function `_D3std7numeric3Fft6__ctorMFAfZC3std7numeric3Fft':
std/numeric.d:(.text._D3std7numeric3Fft6__ctorMFAfZC3std7numeric3Fft+0x5f): undefined reference to `_D4core5bitop3bsfFNaNbmZi'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(numeric_86c_4d8.o): In function `_D3std7numeric12isPowerOfTwoFmZb':
std/numeric.d:(.text._D3std7numeric12isPowerOfTwoFmZb+0xd): undefined reference to `_D4core5bitop3bsrFNaNbmZi'
std/numeric.d:(.text._D3std7numeric12isPowerOfTwoFmZb+0x1b): undefined reference to `_D4core5bitop3bsfFNaNbmZi'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(numeric_872_5ab.o): In function `_D3std7numeric14__T6StrideTAfZ6Stride6nStepsMFNdmZm':
std/numeric.d:(.text._D3std7numeric14__T6StrideTAfZ6Stride6nStepsMFNdmZm+0x2a): undefined reference to `_D4core5bitop3bsfFNaNbmZi'
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.0/../../../../lib/libphobos2.a(array_162_6f0.o): In function `_D3std5array18__T8AppenderTAAyaZ8Appender11newCapacityFmZm':
std/array.d:(.text._D3std5array18__T8AppenderTAAyaZ8Appender11newCapacityFmZm+0x1e): undefined reference to `_D4core5bitop3bsrFNaNbmZi'
collect2: ld returned 1 exit status
--- errorlevel 1

    dmd -L-lstdc++ -L-ldl -ofpuckc  src/main.o libllvmd.a

...failed Link puckc ...
...failed updating 1 target(s)...
...updated 4 target(s)...

Anyone got any experience using Jam or advice and help on solving the link errors.

Cheers,

Chris


On 13/05/11 18:38, Chris Molozian wrote:
Hey All,

This is my first post to the mailing list, I'm an avid follower of D's development and am currently using it to develop a compiler for my thesis work. One of the goals of this stage of the development work is to provide a simple build environment to compile the codebase on Linux, Windows and Mac OS X. The only complex aspects of the build process is compiling the LLVM-D bindings and linking to LLVM.

I'm evaluating build tools for this purpose and have concluded (correct me if I'm wrong) that the D-orientated build tools: Bud and DSSS are abandoned. I'm not sure whether development on xfBuild is still going on.

I'd like to use a tool that is easy for testers to install on their system (preferably pre-built binaries are available) and use to compile my work. I've been looking at C/C++ build tools and have narrowed it down to these:
After all this preamble I guess what I'm asking is... what (if any) cross-platform build tools does everyone use with their D projects? Any feedback on experiences with any of the build tools I've mentioned is also greatly appreciated. If you can suggest any alternatives, please do.

If you've read this far, thanks for taking the time to read it  :-) and sorry for the long message.

Cheers,

Chris

PS: I've seen the CMakeD module, I know a lot of people recommend CMake for cross-platform builds and that the KDE guys use it. I have tried to like it... but settled on hating it. The procedural language is daft and ugly and I loathe the CMakeLists.txt file that goes in each directory. I've already ruled it out.