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.