View mode: basic / threaded / horizontal-split · Log in · Help
June 01, 2006
building GDC-0.18 on an AMD64
Below is a mini HOWTO, that describes how to build GDC-0.18(GCC-3.4.4)
on an AMD64. The steps required migth differ from system to system.

I highly recomend that you use "--prefix=/some/where/", otherwise you
might override your system's GCC with a broken one. ^-^

1) unpack gcc
tar -xjf /download/gcc-3.4.4.tar.bz2

2) unpack gdc
cd /build/gcc-3.4.4/gcc
tar -xzf /download/gdc-0.18.tar.gz

3) setup gdc
cd /build/gcc-3.4.4
./gcc/d/setup-gcc.sh

4) adapt d/d-lang.h
- --- /build/gcc-3.4.4/gcc/d/d-lang.h
+++ /build/gcc-3.4.4/gcc/d/d-lang.h
@@ -221,4 +221,10 @@
static inline tree build2(enum tree_code c, tree t, tree a, tree b) { return build(c, t, a, b); }
#endif

+#define D_CPU_VERSYM "X86"
+#define D_OS_VERSYM "linux"
+#define D_OS_VERSYM2 "Unix"
+#define POINTER_SIZE 32
+#define UNITS_PER_WORD 4
+
#endif

5) build gcc (will fail to build Phobos)
cd /build/gcc-3.4.4
./configure --enable-languages=c,d
make

6) configure Phobos
cd /build/gcc-3.4.4/gcc/d/phobos
PATH=/build/gcc-3.4.4/gcc/:$PATH CFLAGS="-m32" ./configure --target=i386-unknown-linux

7) fix Phobos' Makefile
- --- /build/gcc-3.4.4/gcc/d/phobos/Makefile
- --- /build/gcc-3.4.4/gcc/d/phobos/Makefile
@@ -16,7 +16,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

target_alias = i386-unknown-linux
- -host_alias =
+host_alias = i386-unknown-linux

AR = ar
RANLIB = ranlib
@@ -49,8 +49,8 @@

# Note that the real gdc knows what LIBS to use
LIBS=-lm  -lpthread
- -CC=gcc
- -GDC=gdc
+CC=gcc -m32
+GDC=gdc -m32

srcdir=.

8) build Phobos
cd /build/gcc-3.4.4/gcc/d/phobos
mkdir -p i386-unknown-linux/gcc
PATH=/build/gcc-3.4.4/gcc/:$PATH make

9) install
cd /build/gcc-3.4.4
make install

10) try to use gdc:
/where/ever/bin/gdc -m32 -L/usr/lib32 test.d

11) adapt gdmd 1/2
(should enable you to compile with gdmd)

- --- /where/ever/bin/gdmd
- --- /where/ever/bin/gdmd
@@ -119,12 +119,12 @@
}
use subs qw(errorExit);

- -my $gcc_version = `$gdc -dumpversion`;
+my $gcc_version = `$gdc -m32 -dumpversion`;
chomp $gcc_version;
$gcc_version =~ m/^(\d+)\.(\d+)/;
my ($gcc_maj, $gcc_min) = ( $1, $2 );

- -my $target_machine = `$gdc -dumpmachine`;
+my $target_machine = `$gdc -m32 -dumpmachine`;
chomp $target_machine;

sub addSourceFile($) {
@@ -282,7 +282,7 @@
}

if (! scalar(@sources) && ! ($link && scalar(@objects))) {
- -    my @cmd = ($gdc, '--version', @out);
+    my @cmd = ($gdc, '-m32', '--version', @out);
    my $result = system(@cmd);
    errorExit if $result & 0xff; # Give up if can't exec or gdc exited with a signal
    printUsage;
@@ -323,7 +323,7 @@
    }

    # Step 2: Run the compiler driver
- -    my @cmd = ($gdc, @out, '-c', @all_sources_hack, $srcf, '-o', $outf );
+    my @cmd = ($gdc, @out, '-m32', '-c', @all_sources_hack, $srcf, '-o', $outf );
    if ( $show_commands ) {
	print join(' ', @cmd), "\n";
    }


12) adapt gdmd 2/2
(should enable you to link with gdmd)

Adapt /where/ever/bin/gdmd's
|
| my @cmd = ($gdc, @out, @dobjects, @objects, @link_out);
|

A simple solution might be:
|
| my @cmd = ($gdc, "-m32", "-L/usr/lib32", @out, @dobjects, @objects, @link_out);
|

If the simple way doesn't work, check what gcc is doing in step 10:
/where/ever/bin/gdc -m32 -verbose -L/usr/lib32 test.d

In my case it's a bit more compilcated: (undefined reference to `__gmon_start__' ...)
|   my @cmd = ("/opt/gdc/gdc-0.18/libexec/gcc/x86_64-unknown-linux-gnu/3.4.4/collect2",
|      "--eh-frame-hdr",
|      "-m", "elf_i386",
|      "-dynamic-linker", "/lib/ld-linux.so.2", "/usr/lib/../lib/../lib32/crt1.o",
|      "/usr/lib/../lib/../lib32/crti.o",
|      "/opt/gdc/gdc-0.18/lib/gcc/x86_64-unknown-linux-gnu/3.4.4/32/crtbegin.o",
|      "-L/usr/lib32",
|      "-L/opt/gdc/gdc-0.18/lib/gcc/x86_64-unknown-linux-gnu/3.4.4/32",
|      "-L/opt/gdc/gdc-0.18/lib/gcc/x86_64-unknown-linux-gnu/3.4.4",
|      "-L/opt/gdc/gdc-0.18/lib/",
|      "-L/lib/",
|      "-L/usr/lib/",
|      @out, @dobjects, @objects, @link_out,
|      "-lgphobos",
|      "-lm",
|      "-lgcc_s_32",
|      "-lgcc",
|      "-lpthread",
|      "-lc",
|      "/opt/gdc/gdc-0.18/lib/gcc/x86_64-unknown-linux-gnu/3.4.4/32/crtend.o",
|      "/usr/lib/../lib/../lib32/crtn.o"
|   );
|

Thomas
Top | Discussion index | About this forum | D home