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:
- Jam (ftjam),
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),
not sure how it differs to ftjam.
- 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 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.