Trying CDGC HOWTO
by Leandro Lucarella on 2010- 10- 10 19:28 (updated on 2010- 10- 10 19:28)- with 0 comment(s)
Here are some details on how to try CDGC, as it needs a very particular setup, specially due to DMD not having precise heap scanning integrated yet.
Here are the steps (in some kind of literate scripting, you can copy&paste to a console ;)
# You probably want to do all this mess in some subdirectory :) mkdir cdgc-test cd cdgc-test # First, checkout the repositories. git clone git://git.llucax.com/software/dgc/cdgc.git # If you have problems with git:// URLs, try HTTP: # git clone https://git.llucax.com/r/software/dgc/cdgc.git svn co http://svn.dsource.org/projects/tango/tags/releases/0.99.9 tango # DMD doesn't care much (as usual) about tags, so you have to use -r to # checkout the 1.063 revision (you might be good with the latest revision # too). svn co -r613 http://svn.dsource.org/projects/dmd/branches/dmd-1.x dmd # Now we have to do some patching, let's start with Tango (only patch 3 is # *really* necessary, but the others won't hurt). cd tango for p in 0001-Fixes-to-be-able-to-parse-the-code-with-Dil.patch \ 0002-Use-the-mutexattr-when-initializing-the-mutex.patch \ 0003-Add-precise-heap-scanning-support.patch \ 0004-Use-the-right-attributes-when-appending-to-an-empty-.patch do wget -O- "https://llucax.com/blog/posts/2010/10/10-trying-cdgc-howto/$p" | patch -p1 done cd .. # Now let's go to DMD cd dmd p=0001-Create-pointer-map-bitmask-to-allow-precise-heap-sca.patch wget -O- "https://llucax.com/blog/posts/2010/10/10-trying-cdgc-howto/$p" | patch -p1 # Since we are in the DMD repo, let's compile it (you may want to add -jN if # you have N CPUs to speed up things a little). make -C src -f linux.mak cd .. # Good, now we have to wire Tango and CDGC together, just create a symbolic # link: cd tango ln -s ../../../../../cdgc/rt/gc/cdgc tango/core/rt/gc/ # Since I don't know very well the Tango build system, I did a Makefile of my # own to compile it, so just grab it and compile Tango with it. It will use # the DMD you just compiled and will compile CDGC by default (you can change # it via the GC Make variable, for example: make GC=basic to compile Tango # with the basic GC). The library will be written to obj/libtango-$GC.a, so # you can have both CDGB and the basic collector easily at hand): wget https://llucax.com/blog/posts/2010/10/10-trying-cdgc-howto/Makefile make # Again add -jN if you have N CPUs to make a little faster # Now all you need now is a decent dmd.conf to put it all together: cd .. echo "[Environment]" > dmd/src/dmd.conf echo -n "DFLAGS=-I$PWD/tango -L-L$PWD/tango/obj " >> dmd/src/dmd.conf echo -n "-defaultlib=tango-cdgc " >> dmd/src/dmd.conf echo "-debuglib=tango-cdgc -version=Tango" >> dmd/src/dmd.conf # Finally, try a Hello World: cat <<EOT > hello.d import tango.io.Console; void main() { Cout("Hello, World").newline; } EOT dmd/src/dmd -run hello.d # If you don't trust me and you want to be completely sure you have CDGC # running, try the collect_stats_file option to generate a log of the # collections: D_GC_OPTS=collect_stats_file=log dmd/src/dmd -run hello.d cat log
Done!
If you want to make this DMD the default, just add dmd/src to the PATH environment variable or do a proper installation ;)
Let me know if you hit any problem...