Difference between revisions of "Building DMD"

From D Wiki
Jump to: navigation, search
(note a dead link)
m (Update redirect)
 
(46 intermediate revisions by 15 users not shown)
Line 1: Line 1:
If you're looking for a stable version of D, you probably want to download the [http://dlang.org/download.html official releases]. This page is for those who want to try out D on platforms that aren't yet officially supported, those who are adventurous and wish to try out the latest development (unstable!) version of D, and developers who wish to contribute to D development.
+
#REDIRECT [[Starting as a Contributor#Building from source]]
 
 
==Existing tools==
 
 
 
There exist tools which can do some of the below steps automatically:
 
 
 
* [https://github.com/CyberShadow/Digger Digger] - can download and build D from any point in its recent history.
 
* [https://github.com/jacob-carlborg/dvm DVM] - can build and locally install D from source code.
 
 
 
==Getting the sources==
 
 
 
===Official releases===
 
 
 
The official release of DMD is available from the [http://dlang.org/download.html official download page].
 
 
 
===Latest git===
 
 
 
This is for those who want to test or contribute to the development version of D. The latest source code for the D compiler, runtime library, and standard library are available on [https://github.com/D-Programming-Language GitHub]. To build a working D compiler toolchain, you will need to checkout at least dmd, druntime, and phobos.
 
 
 
==Source code structure==
 
 
 
The D source code assumes a particular directory structure, which you probably would want to adopt so that you don't have to fiddle with the Makefiles all the time.
 
 
 
===Posix===
 
 
 
For Posix, it is assumed that you will have a common root directory where the compiler and library sources will sit under. For example, you can choose the common root directory to be /usr/src/d, then you can checkout the sources under this directory:
 
 
 
<syntaxhighlight lang=bash>
 
mkdir /usr/src/d
 
cd /usr/src/d
 
git clone git://github.com/D-Programming-Language/dmd.git
 
git clone git://github.com/D-Programming-Language/druntime.git
 
git clone git://github.com/D-Programming-Language/phobos.git
 
</syntaxhighlight>
 
 
 
Optionally, if you want some related tools, you can also checkout tools.git:
 
 
 
<syntaxhighlight lang=bash>
 
git clone git://github.com/D-Programming-Language/tools.git
 
</syntaxhighlight>
 
 
 
 
 
'''Note:''' if you're planning to submit [[Pull Requests|pull requests]], you should replace the above URLs with the URLs for your ''fork'' of the official sources, not the official sources themselves.
 
 
 
You should end up with this directory structure:
 
 
 
<pre>
 
/usr/src/d/
 
/usr/src/d/dmd
 
/usr/src/d/druntime
 
/usr/src/d/phobos
 
(/usr/src/d/tools)
 
</pre>
 
 
 
===Windows===
 
 
 
For windows, you can follow the first posix steps regarding checking out files from github.
 
 
 
You can checkout the sources wherever you like. If we call {{code|%DM_HOME%}} the root path, the it is ''recommended'' to have this structure:
 
 
 
<pre>
 
%DM_HOME%\dmd2\src
 
%DM_HOME%\dmd2\src\dmd
 
%DM_HOME%\dmd2\src\druntime
 
%DM_HOME%\dmd2\src\phobos
 
</pre>
 
 
 
Additionally, you should extract the digital mars compiler inside {{code|%DM_HOME%}}, alongside {{code|dmd2}}. You should finally create a {{code|windows}} directory with a {{code|bin}} and {{code|lib}} directory inside it. Your final structure should look like this:
 
 
 
<pre>
 
%DM_HOME%\dm
 
%DM_HOME%\dmd2\src
 
%DM_HOME%\dmd2\src\dmd
 
%DM_HOME%\dmd2\src\druntime
 
%DM_HOME%\dmd2\src\phobos
 
%DM_HOME%\dmd2\windows
 
%DM_HOME%\dmd2\windows\bin
 
%DM_HOME%\dmd2\windows\lib
 
</pre>
 
 
 
==Building the sources==
 
 
 
===Posix===
 
 
 
See also [https://xtzgzorex.wordpress.com/2011/07/31/d-building-dmd-and-phobos-on-linux/ Alex Rønne Petersen's blog post on building DMD (a dead link)]
 
 
 
Assuming your sources are checked out in {{code|/usr/src/d}}, you can do the following to build them:
 
 
 
<syntaxhighlight lang=bash>
 
cd /usr/src/d/dmd/src
 
make -f posix.mak
 
cd ../../druntime
 
make -f posix.mak DMD=../dmd/src/dmd
 
cd ../phobos
 
make -f posix.mak DMD=../dmd/src/dmd
 
</syntaxhighlight>
 
 
 
Note that the compiler, runtime library, and standard library have to be built in that order, as each depends on the previous one.  The addition of the build option  DMD=../dmd/src/dmd ensures that your newly-built dmd is being used to build druntime and phobos.
 
 
 
If you're using a 64-bit platform, you may want to append {{code|MODEL&#x3d;64}} to your make commands, as the default makefiles will build for 32-bit:
 
 
 
<syntaxhighlight lang=bash>
 
cd /usr/src/d/dmd/src
 
make -f posix.mak MODEL=64
 
cd ../../druntime
 
make -f posix.mak MODEL=64 DMD=../dmd/src/dmd
 
cd ../phobos
 
make -f posix.mak MODEL=64 DMD=../dmd/src/dmd
 
</syntaxhighlight>
 
 
 
Parallel make can drastically speed up compilation times. The {{code|-j<integer>}} option allows you to specify the number of job slots. Number_of_cores + 1 is a often a good choice E.g.:
 
 
 
<syntaxhighlight lang=bash>
 
make -f posix.mak -j5
 
</syntaxhighlight>
 
 
 
for a machine with 4 cores.
 
 
 
After building, you should have a working D compiler in {{code|/usr/src/d/dmd/src/dmd}}. You may need to edit {{code|dmd.conf}} so that the compiler can find druntime and phobos. You {{code|dmd.conf}} should contain:
 
 
 
<pre>
 
[Environment]
 
 
 
DFLAGS=-I/path/to/src/phobos -I/path/to/src/druntime/import -L-L/path/to/libs -L--no-warn-search-mismatch -L--export-dynamic
 
</pre>
 
 
 
Where the first two flags ({{code|-I}}) must be followed by the path to {{code|src/phobos}} et {{code|src/druntime/import}}. The {{code|-L-L}} flag must be followed by the path to {{code|libphobos.a}} (for example: {{code|-L-L/usr/local/lib/lib64}}).
 
 
 
You should probably also run the unittests to make sure your build is working correctly:
 
 
 
<syntaxhighlight lang=bash>
 
cd ../druntime
 
make -f posix.mak -j5 unittest
 
cd ../phobos
 
make -f posix.mak -j5 unittest
 
</syntaxhighlight>
 
 
 
(Running the unittests with {{code|-j}} is recommended if you have a multicore CPU, as some of them may take a while to run.)
 
 
 
====Installation====
 
{{code|posix.mak}} does not come with an install option (user supplied sample install script here: [[Attachment:posix-make-install-dmd.sh]]), but you can copy files manually to an appropriate location such as {{code|/usr/local}} or {{code|/opt/dmd}}.  For example:
 
 
 
<syntaxhighlight lang=bash>
 
cd /usr/src/d/dmd/src
 
mkdir /opt/dmd
 
mkdir /opt/dmd/bin
 
cp dmd /opt/dmd/bin
 
 
 
cd ../../druntime
 
mkdir /opt/dmd/include
 
mkdir /opt/dmd/include/d2
 
cp -r import/* /opt/dmd/include/d2
 
 
 
cd ../phobos
 
mkdir /opt/dmd/lib
 
cp generated/linux/release/64/libphobos2.a /opt/dmd/lib    # for 64-bit version
 
cp generated/linux/release/32/libphobos2.a /opt/dmd/lib    # for 32-bit version
 
cp -r std /opt/dmd/include/d2
 
cp -r etc /opt/dmd/include/d2
 
</syntaxhighlight>
 
 
 
Then, create the following {{code|dmd.conf}} in the {{code|/opt/dmd/bin}} directory:
 
 
 
<syntaxhighlight lang=bash>
 
[Environment]
 
DFLAGS=-I/opt/dmd/include/d2 -L-L/opt/dmd/lib -L--no-warn-search-mismatch -L--export-dynamic
 
</syntaxhighlight>
 
 
 
Note that you will have to add {{code|/opt/dmd/bin}} to your {{code|PATH}} to make use of your newly installed DMD.
 
 
 
'''Uninstallation''' is then as simple as removing the {{code|/opt/dmd}} directory.
 
 
 
===Windows===
 
The following instructions work for win32. May or may not work with win64. This scheme is a suggestion.
 
 
 
Assuming your sources are checked out {{code|C:\D}}, and that {{code|make}} from digital mars is in your path, you can do the following to build them:
 
 
 
<syntaxhighlight lang=dos>
 
set DM_HOME=C:\D
 
cd %DM_HOME%\dmd2\src\dmd\src
 
make -fwin32.mak -release
 
</syntaxhighlight>
 
 
 
From there, it is suggested to move the built binaries into your {{code|%DM_HOME%\windows\bin}} directory, and add that to your path:
 
<syntaxhighlight lang=dos>
 
copy *.exe %DM_HOME%\dmd2\windows\bin
 
set path=%path%;%DM_HOME%\dmd2\windows\bin
 
</syntaxhighlight>
 
 
 
From there, you have to create a {{code|sc.ini}} in your {{code|DMD.exe}} directory. It is suggested to just copy paste the one provided in the packaged {{Latest DMD Version}}, instead of writing your own.
 
 
 
Now build druntime:
 
<syntaxhighlight lang=dos>
 
cd %DM_HOME%\dmd2\src\druntime
 
make -fwin32.mak
 
</syntaxhighlight>
 
 
 
And phobos:
 
<syntaxhighlight lang=dos>
 
cd %DM_HOME%\dmd2\src\phobos
 
make -fwin32.mak
 
</syntaxhighlight>
 
 
 
You should copy the phobos lib into your {{code|windows\lib}} folder:
 
<syntaxhighlight lang=dos>
 
copy phobos.lib %DM_HOME%\dmd2\windows\lib
 
</syntaxhighlight>
 
 
 
Optionally, you can build rdmd from source if you have checked out {{code|tools}} in your sources:
 
<syntaxhighlight lang=dos>
 
cd %DM_HOME%\dmd2\src\tools
 
make -fwin32.mak rdmd.exe
 
copy *.exe %DM_HOME%\dmd2\windows\bin
 
</syntaxhighlight>
 
 
 
The last step is getting the additional libs. curl for D2 can be found at the bottom of the download section of dlang.org: [[http://dlang.org/download.html download]].
 
 
 
Additional libs that are necessary can simply be copy pasted from the {{Latest DMD Version}} package (without overwriting your {{code|phobos.lib}})
 
 
 
The very last step is to verify that everything works by unittesting phobos:
 
 
 
<syntaxhighlight lang=dos>
 
cd %DM_HOME%\dmd2\src\phobos
 
make -fwin32.mak unittest
 
</syntaxhighlight>
 
 
 
===Common Windows issues===
 
 
 
If when building druntime you get errors about missing MASM386, it's due to a required assembling of a file called '''minit.asm'''. However the druntime repository includes a prebuilt minit.obj file so you shouldn't need to assemble it again. As a workaround for the make error create an empty '''masm386.bat''' file and put it in a directory that's in your '''PATH'''.
 
 
 
==Additional Tools==
 
 
 
If you cloned {{code|D-Programming-Language/tools.git}}, you also have a {{code|tools}} folder where small helping programs live. There is no need to build them, you can just compile them using DMD:
 
 
 
<syntaxhighlight lang=dos>
 
dmd rdmd.d;
 
dmd ddemangle.d;
 
dmd dtab;
 
dmd tolf;
 
</syntaxhighlight>
 
 
 
{{code|rdmd}} builds your D modules automatically, from the one containing {{code|main}}. It'll deduce dependencies and compile/link them for you.
 
{{code|ddemangle}} will demangle its input, replacing all mangled D symbols with their unmangled form.
 
{{code|dtab}} transforms tabs into spaces in source code.
 
{{code|tolf}} replaces line endings with LF.
 
 
 
Using {{code|dtab}} and {{code|tolf}} is a good idea if you want to contribute to the D-Programming-Language repos.
 
 
 
== Building the Docs ==
 
<syntaxhighlight lang=dos>
 
git clone https://github.com/D-Programming-Language/tools.git
 
cd tools
 
make
 
cd generated/linux/default
 
PATH=$PATH:`pwd`
 
export PATH
 
cd ../../../..  # you should be in your top D folder
 
 
 
git clone https://github.com/D-Programming-Language/dlang.org.git
 
cd dlang
 
make -f posix.mak DMD=../dmd/src/dmd
 
cd ..
 
ln -s dlang/web .
 
 
 
cd phobos
 
make -f posix.mak DMD=../dmd/src/dmd html
 
cd ..
 
BROWSER web/phobos-prerelease/std_YOUR_CHOICE.html
 
</syntaxhighlight>
 
 
 
==Running the test suite==
 
 
 
Naturally if you are hacking on the dmd compiler (to fix your favorite bug, right?!), you'll want to run the test suite to ensure that you haven't broken anything.
 
 
 
===Windows===
 
 
 
On Windows, the test suite requires a very specific environment and careful configuration to run successfully:
 
 
 
* The <tt>PATH</tt> must be set up such that <tt>link.exe</tt> will execute [[OPTLINK]], however the test suite <tt>Makefile</tt> is written using GNU syntax.
 
* The <tt>CC</tt> variable must be set correspondingly to the C compiler for your Windows version: <tt>dmc</tt> for 32-bit, <tt>cl</tt> (Microsoft Visual C++) for 64-bit.
 
* To force the makefile to use the 32-bit C compiler on a 64-bit Windows machine, the <tt>OS</tt> variable must be overridden.
 
 
 
With that, here's how to get the test suite working on Windows:
 
 
 
* Get and install [http://www.cygwin.com/ Cygwin]. You'll need the basic packages containing <tt>make</tt>, <tt>mkdir</tt>, etc.
 
* Create the following batch file in the test directory (<tt>dmd\test\run_test_suite.bat</tt>):
 
@echo off
 
set PATH=C:\dm\bin;C:\cygwin\bin;%WINDIR%\System32;%WINDIR%
 
set CC=dmc
 
set MAKE=C:/cygwin/bin/make.exe
 
%MAKE% OS=win32 quick %*
 
:If necessary, replace the paths to DMC and Cygwin appropriately. Note that the <tt>MAKE</tt> variable must use forward slashes.
 
* Create an <tt>sc.ini</tt> file in the dmd source directory (<tt>dmd\src\sc.ini</tt>). This file has the same format as <tt>dmd.conf</tt> in the instructions for POSIX below. Here is an example:
 
[Environment]
 
LIB="%@P%\..\..\phobos"
 
DFLAGS="-I%@P%\..\..\phobos" "-I%@P%\..\..\druntime\import"
 
LINKCMD=C:\dm\bin\link.exe
 
:Again, replace <tt>C:\dm</tt> as appropriate.
 
 
 
This should allow running the test suite on Windows. See the POSIX section below for non-Windows-specific information.
 
 
 
===POSIX (Linux, OS X, FreeBSD)===
 
 
 
Since it wasn't obvious how to run the test suite, or why it failed the first couple of times, I'll add notes here on how to build on Linux/x86_64. If you are not on Linux and not on 64-bit, then you'll simply have to adjust the lines below. I wanted to be specific to avoid confusion.
 
 
 
====How to run the test suite in '''dmd/test''' ====
 
 
 
Location: If dmd/src/ is your source directory (that contains mars.c, impcnvgen.c, dmd_msc.vcproj, posix.mak, etc) then '''dmd/test''' is the test suite directory.
 
 
 
Before running: a freshly built dmd at dmd/src/dmd  does not have a dmd.conf file. You'll need to make dmd/src/dmd.conf file in order to run the tests.
 
 
 
To run the tests: (this will take a while)
 
 
 
<syntaxhighlight lang=dos>
 
cd dmd/test
 
make MODEL=64
 
</syntaxhighlight>
 
 
 
====Common problems and their solutions====
 
 
 
a) common error number one: lack of correct dmd.conf, and dmd.conf must point to the installed include files.
 
 
 
If you do not have a dmd.conf in place, you will get error:
 
<syntaxhighlight lang=dos>
 
Error: cannot find source code for runtime library file 'object.d'
 
      dmd might not be correctly installed. Run 'dmd -man' for installation instructions.
 
Specify path to file 'object.d' with -I switch
 
</syntaxhighlight>
 
 
 
See the installation section above.
 
 
 
b) common error number two: If you just say 'make' without adding the MODEL designation, you will get the default 32-bit tests on your 64-bit platform. You have to say 'make MODEL=64' in the src/dmd/test dir.
 
 
 
If you are on 64-bit and you do not do the MODEL=64, you will get this error:
 
 
 
<syntaxhighlight lang=dos>
 
Running runnable tests
 
... runnable/A16.d                (-inline -release -gc -O -fPIC)
 
Test failed.  The logged output:
 
../src/dmd -m32 -Irunnable  -odtest_results/runnable -oftest_results/runnable/A16_0 runnable/A16.d runnable/imports/A16a.d
 
/usr/bin/ld: cannot find -lphobos2
 
collect2: ld returned 1 exit status
 
--- errorlevel 1
 
 
 
 
 
==============================
 
Test failed: expected rc == 0, exited with rc == 1
 
</syntaxhighlight>
 
 
 
==== Run the druntime and phobos unit tests ====
 
 
 
Next run the unit tests for the standard libraries.
 
 
 
<syntaxhighlight lang=dos>
 
cd ../../druntime
 
make -f posix.mak MODEL=64 unittest
 
cd ../phobos
 
make -f posix.mak MODEL=64 unittest
 
</syntaxhighlight>
 
 
 
See also: [[Pull Requests]].
 

Latest revision as of 12:50, 5 May 2019