]> git.llucax.com Git - personal/website.git/blob - source/blog/posts/2010/10/10-trying-cdgc-howto.rst
Update resume with The Podcast App
[personal/website.git] / source / blog / posts / 2010 / 10 / 10-trying-cdgc-howto.rst
1 Title: Trying CDGC HOWTO
2 Tags: en, d, gc, dgc, cdgc, howto, patch, tango, dmd, makefile
3
4 Here are some details on how to try CDGC, as it needs a very particular setup,
5 specially due to DMD__ not having `precise heap scanning`__ integrated yet.
6
7 __ http://www.dsource.org/projects/dmd
8 __ http://d.puremagic.com/issues/show_bug.cgi?id=3463
9
10 Here are the steps (in some kind of literate__ scripting, you can copy&paste to
11 a console ;)
12
13 __ http://en.wikipedia.org/wiki/Literate_programming
14
15 ::
16
17    # You probably want to do all this mess in some subdirectory :)
18    mkdir cdgc-test
19    cd cdgc-test
20
21    # First, checkout the repositories.
22    git clone git://git.llucax.com/software/dgc/cdgc.git
23    # If you have problems with git:// URLs, try HTTP:
24    # git clone https://git.llucax.com/r/software/dgc/cdgc.git
25    svn co http://svn.dsource.org/projects/tango/tags/releases/0.99.9 tango
26
27    # DMD doesn't care much (as usual) about tags, so you have to use -r to
28    # checkout the 1.063 revision (you might be good with the latest revision
29    # too).
30    svn co -r613 http://svn.dsource.org/projects/dmd/branches/dmd-1.x dmd
31
32    # Now we have to do some patching, let's start with Tango (only patch 3 is
33    # *really* necessary, but the others won't hurt).
34    cd tango
35    for p in 0001-Fixes-to-be-able-to-parse-the-code-with-Dil.patch \
36             0002-Use-the-mutexattr-when-initializing-the-mutex.patch \
37             0003-Add-precise-heap-scanning-support.patch \
38             0004-Use-the-right-attributes-when-appending-to-an-empty-.patch
39    do
40       wget -O- "##POST_URL##/10-trying-cdgc-howto/$p" |
41             patch -p1
42    done
43    cd ..
44
45    # Now let's go to DMD
46    cd dmd
47    p=0001-Create-pointer-map-bitmask-to-allow-precise-heap-sca.patch
48    wget -O- "##POST_URL##/10-trying-cdgc-howto/$p" |
49          patch -p1
50
51    # Since we are in the DMD repo, let's compile it (you may want to add -jN if
52    # you have N CPUs to speed up things a little).
53    make -C src -f linux.mak
54    cd ..
55
56    # Good, now we have to wire Tango and CDGC together, just create a symbolic
57    # link:
58    cd tango
59    ln -s ../../../../../cdgc/rt/gc/cdgc tango/core/rt/gc/
60
61    # Since I don't know very well the Tango build system, I did a Makefile of my
62    # own to compile it, so just grab it and compile Tango with it. It will use
63    # the DMD you just compiled and will compile CDGC by default (you can change
64    # it via the GC Make variable, for example: make GC=basic to compile Tango
65    # with the basic GC). The library will be written to obj/libtango-$GC.a, so
66    # you can have both CDGB and the basic collector easily at hand):
67    wget ##POST_URL##/10-trying-cdgc-howto/Makefile
68    make # Again add -jN if you have N CPUs to make a little faster
69
70    # Now all you need now is a decent dmd.conf to put it all together:
71    cd ..
72    echo "[Environment]" > dmd/src/dmd.conf
73    echo -n "DFLAGS=-I$PWD/tango -L-L$PWD/tango/obj " >> dmd/src/dmd.conf
74    echo -n "-defaultlib=tango-cdgc " >> dmd/src/dmd.conf
75    echo "-debuglib=tango-cdgc -version=Tango" >> dmd/src/dmd.conf
76
77    # Finally, try a Hello World:
78    cat <<EOT > hello.d
79    import  tango.io.Console;
80
81    void main()
82    {
83       Cout("Hello, World").newline;
84    }
85    EOT
86    dmd/src/dmd -run hello.d
87
88    # If you don't trust me and you want to be completely sure you have CDGC
89    # running, try the collect_stats_file option to generate a log of the
90    # collections:
91    D_GC_OPTS=collect_stats_file=log dmd/src/dmd -run hello.d
92    cat log
93
94
95 Done!
96
97 If you want to make this DMD the default, just add dmd/src to the PATH
98 environment variable or do a proper installation ;)
99
100 Let me know if you hit any problem...
101
102
103 .. vim: set et sw=3 sts=3 :