Setting up a development environment for hacking GDC

Mike via D.gnu d.gnu at puremagic.com
Thu Oct 16 06:12:59 PDT 2014


On Sunday, 12 October 2014 at 09:11:16 UTC, Iain Buclaw via D.gnu 
wrote:
> On 12 October 2014 01:29, Mike via D.gnu <d.gnu at puremagic.com> 
> wrote:
>> I'm wondering, if some of you that do development on GDC could 
>> briefly
>> describe how you set up your development environment.
>>
>> I can build GDC fine, but I can't do the 30-minute build for 
>> every little
>> change.  The build script is just a black box to me right now.
>>  How do you
>> guys do incremental compile and debugging?  I've seen
>> https://gcc.gnu.org/wiki/DebuggingGCC, but that doesn't help 
>> me with
>> incremental compile.
>>
>> I could probably spend some time analyzing the build scripts 
>> and figure
>> something out, but it would take me quite a while and I'd 
>> probably just end
>> up with something non-ideal.
>>
>> So, please take a few minutes to give me the basic rundown.  
>> If I can get
>> set up, and if you think it would help, I'll give back by 
>> writing a wiki
>> page on how to get set up from a beginner's perspective.
>>
>> Thanks,
>> Mike
>
>
> I should spend some time on this as well.  The basic run-down I 
> can
> give assumes you've just installed Ubuntu, or some other 
> Debian-like
> distribution.
>
>
> Install packages:
>
>   apt-get install gcc g++ libmpc-dev libmpfr-dev libgmp3-dev
> autoconf2.64 automake1.11 flex bison patch git
>
>
> Source folder structure:
>
>   src/
>   . gdc/
>   . . gcc-devel/  (or gcc-4.9 if you use a specific version)
>   . . gdc/
>   . . objdir/
>
> I assume that you have checked out the git respository or 
> downloaded a
> tarball of the gdc/gcc sources and extracted them in their 
> appropriate
> place.  The objdir directory is the place where we will do the 
> build
> from.
>
>
> Setup GCC to build D:
>
> The setup-gcc script creates all necessary symlinks and patches 
> GCC to
> be aware of the D frontend.
>
>   cd gdc && ./setup-gcc.sh ../gcc-devel
>
>
> Configure and Build:
>
>   ../gcc-devel/configure --prefix=/usr --enable-languages=d
> --enable-checking --disable-bootstrap --disable-libgomp
> --disable-libmudflap --disable-libquadmath
>
> If you are doing cross compilation you will have to tweak the 
> --host,
> --target, and --build switches to be correct.
>
> To start building, simply run make with your preferred -j# 
> number for
> parallel builds.
>
>
> Initial installation:
>
> I prefer to keep all builds under ~/.local but you may have 
> another
> place to put it.
>
>   DESTDIR=$HOME/.local make install
>
> Then add the $DESTDIR/usr/bin location to your PATH.  For 
> instance I
> have the following in my ~/.bashrc folder
>
>   if [ -d $HOME/.local/usr/bin ]; then
>     export PATH="$HOME/.local/usr/bin:$PATH"
>   fi
>
>
> Incremental Builds:
>
> When you make a change to either the gdc or gcc sources, 
> running make
> inside objdir will keep on doing incremental builds for you.  
> Some
> exceptions to the rule:
>
> * Adding/Removing files from libphobos or libdruntime require 
> you to
> re-run the setup-gcc.sh script
>
>   ./setup-gcc.sh --update ../gcc-devel
>
> * I have noted in certain circumstances (updating the frontend
> mostly), changes to dfrontend/idgen.c or dfrontend/impcnvgen.c
> sometimes do not trigger rebuilds of other sources.  When this 
> occurs,
> crashes or errors will look rather confusing.  That's because 
> the
> symbol table between two object files differ. Clean out all 
> objects
> from the gdc build directory and re-make it.
>
>
> Changes to just gdc only require a rebuild of cc1d - or the 'D 
> compiler proper':
>
>   make -C gcc cc1d
>
> Changes to libphobos/libdruntime can be done using make:
>
>   make all-target-libphobos
>
>
> Incremental Installs:
>
> Changes to just gdc just require the installation of cc1d:
>
>   install gcc/cc1d $HOME/.local/usr/libexec/gcc/$TARGET/$VERSION
>
> Changes to libphobos/libdruntime can be done using make:
>
>   DESTDIR=$HOME/.local make install-target-libphobos
>
>
> Clean Builds:
>
> Cleaning out gdc / cc1d only (from the objdir):
>
>   rm gcc/gdc gcc/d/*
>
> Cleaning out libphobos/libdruntime:
>
>   make clean-target-libphobos
>
>
> Debugging GDC:
>
> Though GCC does allow you to debug the compiler using -wrapper.
>  I
> find it quicker to just pass --verbose
>
>   gdc -pipe -c --verbose bug.d
>
> This will print out the command used to invoke cc1d.  From 
> there you
> can copy it, and pass it to your favourite debugger and get 
> cracking.
>
> Noteworthy functions break at to catch ICE's:
>
>   internal_error
>   gcc_unreachable
>
>
> Noteworthy functions to debug trees/gimple:
>
>   debug_tree
>   debug_generic_expr
>   debug_gimple_stmt
>
>
>
> That's about it from a quick run-down side of things.

These instructions were very helpful, thank you!

I've started a wiki page here: 
http://wiki.dlang.org/GDC/Development/DevelopmentEnvironment

Mike


More information about the D.gnu mailing list