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 <http://www.dsource.org/projects/build> and DSSS <http://www.dsource.org/projects/dsss> are abandoned. I'm not sure whether development on xfBuild <https://bitbucket.org/h3r3tic/xfbuild/overview> 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:

    * Jam (ftjam) <http://www.freetype.org/jam/index.html>,
      cross-platform and platform independent build language. Lots of
      variants with the same name, therefore finding it hard to find
      good tutorials and documentation.
    * Boost.Build (bjam) <http://www.boost.org/boost-build2/>, not
      sure how it differs to ftjam.
    * Cook <http://miller.emu.id.au/pmiller/software/cook/>, can't
      find whether it can be built for use on Windows. No pre-built
      Windows binary. Very extensive documentation, although I think
      the default build file name is silly "Howto.cook" :-) .

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 <http://www.dsource.org/projects/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.

Reply via email to