Ddoc
$(D_S dmd - $(WINDOWS Windows)$(LINUX Linux)$(OSX Mac OS X)$(FREEBSD FreeBSD) D Compiler,
$(UL
$(WINDOWS $(LI dmd for $(LINK2 dmd-linux.html, Linux)))
$(WINDOWS $(LI dmd for $(LINK2 dmd-osx.html, OSX)))
$(WINDOWS $(LI dmd for $(LINK2 dmd-freebsd.html, FreeBSD)))
$(LINUX $(LI dmd for $(LINK2 dmd-windows.html, Windows)))
$(LINUX $(LI dmd for $(LINK2 dmd-osx.html, OSX)))
$(LINUX $(LI dmd for $(LINK2 dmd-freebsd.html, FreeBSD)))
$(OSX $(LI dmd for $(LINK2 dmd-windows.html, Windows)))
$(OSX $(LI dmd for $(LINK2 dmd-linux.html, Linux)))
$(OSX $(LI dmd for $(LINK2 dmd-freebsd.html, FreeBSD)))
$(FREEBSD $(LI dmd for $(LINK2 dmd-windows.html, Windows)))
$(FREEBSD $(LI dmd for $(LINK2 dmd-linux.html, Linux)))
$(FREEBSD $(LI dmd for $(LINK2 dmd-osx.html, OSX)))
$(LI $(LINK2 #requirements, Requirements and Downloads))
$(LI $(LINK2 #files, Files))
$(LI $(LINK2 #installation, Installation))
$(WINDOWS $(LI $(LINK2 #example, Example)))
$(LI $(LINK2 #switches, Compiler Arguments and Switches))
$(LI $(LINK2 #linking, Linking))
$(LI $(LINK2 #environment, Environment Variables))
$(WINDOWS $(LI $(LINK2 #sc_ini, sc.ini Initialization File)))
$(UNIX $(LI $(DMD_CONF) Initialization File))
$(WINDOWS $(LI $(LINK2 #problems, Common Installation Problems)))
$(LI $(LINK2 #differences, Differences between Windows and Linux versions))
$(LI $(LINK2 #interface_files, D Interface Files))
$(LI $(LINK2 #library, Building Libraries))
$(LI $(LINK2 #compiling_dmd, Compiling dmd))
$(LI $(LINK2 #compiling_phobos, Compiling Phobos))
)
$(LNAME2 requirements, Requirements and Downloads)
$(OL
$(LI $(LINK2 http://www.digitalmars.com/d/download.html, Download D Compiler))
$(WINDOWS
$(LI 32 bit Windows (Win32) operating system, such as Windows XP)
$(LI Download
dmc.zip (C and C++ compiler) for Win32
(not required, but it complements dmd for Windows)
)
)
$(LINUX
$(LI 32 bit x86 Linux operating system (will work on 64 bit Linux))
$(LI Gnu C compiler (gcc))
)
$(OSX
$(LI 32 bit x86 Mac OSX operating system)
$(LI Gnu C compiler (gcc))
)
$(FREEBSD
$(LI 32 bit x86 FreeBSD 7.1 operating system)
$(LI Gnu C compiler (gcc))
)
)
$(LNAME2 files, Files)
$(DL
$(DT $(TT $(DMDDIR)$(SEP)src$(SEP)phobos$(SEP))
$(DD D runtime library source)
)
$(DT $(TT $(DMDDIR)$(SEP)src$(SEP)dmd$(SEP))
$(DD D compiler front end source under dual (GPL and Artistic) license)
)
$(DT $(TT $(DMDDIR)$(SEP)html$(SEP)d$(SEP))
$(DD Documentation)
)
$(DT $(TT $(DMDDIR)$(SEP)samples$(SEP)d$(SEP))
$(DD Sample D programs)
)
$(WINDOWS
$(DT $(TT $(DMDDIR)\windows\bin\dmd.exe)
$(DD D compiler executable)
)
$(DT $(TT $(DMDDIR)\windows\bin\$(LINK2 http://www.digitalmars.com/ctg/shell.html, shell.exe))
$(DD Simple command line shell)
)
$(DT $(TT $(DMDDIR)\windows\bin\sc.ini)
$(DD Global compiler settings)
)
$(DT $(TT $(DMDDIR)\windows\lib\$(LIB))
$(DD D runtime library)
)
)
$(LINUX
$(DT $(TT $(DMDDIR)/linux/bin/dmd)
$(DD D compiler executable)
)
$(DT $(TT $(DMDDIR)/linux/bin/$(DUMPOBJ))
$(DD Elf file dumper)
)
$(DT $(TT $(DMDDIR)/linux/bin/$(OBJ2ASM))
$(DD Elf file disassembler)
)
$(DT $(TT $(DMDDIR)/linux/bin/$(SHELL))
$(DD Simple command line shell)
)
$(DT $(TT $(DMDDIR)/linux/bin/$(DMD_CONF))
$(DD Global compiler settings (copy to $(TT /etc/dmd.conf)))
)
$(DT $(TT $(DMDDIR)/linux/lib/$(LIB))
$(DD D runtime library (copy to $(TT /usr/lib/$(LIB))))
)
)
$(FREEBSD
$(DT $(TT $(DMDDIR)/freebsd/bin/dmd)
$(DD D compiler executable)
)
$(DT $(TT $(DMDDIR)/freebsd/bin/$(DUMPOBJ))
$(DD Elf file dumper)
)
$(DT $(TT $(DMDDIR)/freebsd/bin/$(OBJ2ASM))
$(DD Elf file disassembler)
)
$(DT $(TT $(DMDDIR)/freebsd/bin/$(SHELL))
$(DD Simple command line shell)
)
$(DT $(TT $(DMDDIR)/freebsd/bin/$(DMD_CONF))
$(DD Global compiler settings (copy to $(TT /etc/dmd.conf)))
)
$(DT $(TT $(DMDDIR)/freebsd/lib/$(LIB))
$(DD D runtime library (copy to $(TT /usr/lib/$(LIB))))
)
)
$(OSX
$(DT $(TT $(DMDDIR)/osx/bin/dmd)
$(DD D compiler executable)
)
$(DT $(TT $(DMDDIR)/osx/bin/$(DUMPOBJ))
$(DD Mach-O file dumper)
)
$(DT $(TT $(DMDDIR)/osx/bin/$(OBJ2ASM))
$(DD Mach-O file disassembler)
)
$(DT $(TT $(DMDDIR)/osx/bin/$(SHELL))
$(DD Simple command line shell)
)
$(DT $(TT $(DMDDIR)/osx/bin/$(DMD_CONF))
$(DD Global compiler settings (copy to $(TT /etc/dmd.conf)))
)
$(DT $(TT $(DMDDIR)/osx/lib/$(LIB))
$(DD D runtime library (copy to $(TT /usr/lib/$(LIB))))
)
)
)
$(LNAME2 installation, Installation)
$(WINDOWS
$(P Open a console window (for Windows XP this is done by
clicking on [Start][Command Prompt]).
All the tools are command line tools, which means
they are run from a console window.
Switch to the root directory.
Unzip the files in the root directory.
$(TT dmd.zip) will create
a $(TT $(DMDDIR)) directory with all the files in it.
$(TT dmc.zip) will create
a $(TT \dm) directory with all the files in it.
)
$(P A typical session might look like:)
$(CONSOLE
C:\Documents and Settings\Your Name>cd \
C:\>unzip dmd.zip
C:\>unzip dmc.zip
)
)
$(LINUX
$(LI Unzip the archive into your home directory.
It will create
a $(TT ~/dmd) directory with all the files in it.
All the tools are command line tools, which means
they are run from a console window.)
$(LI Copy $(TT $(DMD_CONF)) to $(TT /etc):
$(CONSOLE
cp $(DMDDIR)/linux/bin/$(DMD_CONF) /etc
)
)
$(LI Put $(TT $(DMDDIR)/linux/bin) on your $(B PATH),
or copy the linux executables
to $(TT /usr/local/bin))
$(LI Copy the library to $(TT /usr/lib):
$(CONSOLE
cp $(DMDDIR)/linux/lib/$(LIB) /usr/lib
)
)
)
$(FREEBSD
$(LI Unzip the archive into your home directory.
It will create
a $(TT ~/dmd) directory with all the files in it.
All the tools are command line tools, which means
they are run from a console window.)
$(LI Copy $(TT $(DMD_CONF)) to $(TT /etc):
$(CONSOLE
cp $(DMDDIR)/freebsd/bin/dmd.conf /etc
)
)
$(LI Put $(TT $(DMDDIR)/freebsd/bin) on your $(B PATH),
or copy the FreeBSD executables
to $(TT /usr/local/bin))
$(LI Copy the library to $(TT /usr/lib):
$(CONSOLE
cp $(DMDDIR)/freebsd/lib/$(LIB) /usr/lib
)
)
)
$(OSX
$(LI Put the dmd zip file into your home directory,
and unzip it:
$(CONSOLE
unzip dmd.$(I VERSION).zip
)
where $(I VERSION) is the particular version of the zip file.
)
$(LI It will create
a $(TT ~/$(DMDDIR)) directory with all the files in it.
All the tools are command line tools, which means
they are run from a console window.)
$(LI Verify that this works by creating $(TT hello.d) in your home directory
with these contents:
---
import std.stdio;
void main() {
writeln("hello world!");
}
---
and compile and run it with:
$(CONSOLE
$(DMDDIR)/osx/bin/dmd hello
./hello
)
and it should print:
$(CONSOLE
hello world!
)
)
$(LI To install a global copy:)
$(LI Copy binaries to $(TT /usr/local/bin):
$(CONSOLE
sudo cp $(DMDDIR)/osx/bin/{dmd,$(DUMPOBJ),$(OBJ2ASM),$(SHELL)$(V2 ,rdmd)} /usr/local/bin
sudo cp $(DMDDIR)/osx/bin/dmdx.conf /usr/local/bin/$(DMD_CONF)
)
)
$(LI Copy the library to $(TT /usr/lib):
$(CONSOLE
sudo cp $(DMDDIR)/osx/lib/$(LIB) /usr/lib
)
)
)
$(LINUX
Installing dmd on 64 bit Linux
$(P Since dmd is a 32 bit compiler, the 32 bit gnu libraries must be installed:)
$(CONSOLE
sudo apt-get install gcc-multilib g++-multilib libc6-i386 libc6-dev-i386
)
$(P The $(TT ia32-libs) package has more 32 bit libraries, and may
optionally also be installed:)
$(CONSOLE
sudo apt-get install ia32-libs
)
$(P If you are using the .deb package for one-click install, it may
give you an error about it being only for i386. To force it to install:
)
$(CONSOLE
sudo dpkg -i --force-architecture dmd_X.XXX-0_i386.deb
)
$(P where X.XXX is the version number of the package.
)
)
$(WINDOWS
Example
$(P Run:)
$(CONSOLE
$(DMDDIR)$(SEP)$(OS)$(SEP)bin$(SEP)$(SHELL) all.sh
)
$(P in the $(TT $(DMDDIR)$(SEP)samples$(SEP)d) directory for several small examples.)
)
$(LNAME2 switches, Compiler Arguments and Switches)
$(DL
$(DT $(B dmd) $(I files)... -$(I switches)...
$(DD )
)
$(DT $(I files)...
$(DD
$(TABLE2 File Extensions,
$(TR
$(TH Extension)
$(TH File Type)
)
$(TR
$(TD $(I none))
$(TD D source files)
)
$(TR
$(TD $(B .d))
$(TD D source files)
)
$(TR
$(TD $(B .dd))
$(TD $(LINK2 ddoc.html, Ddoc) source files)
)
$(TR
$(TD $(B .di))
$(TD $(LINK2 #interface_files, D interface files))
)
$(TR
$(TD $(B .$(OBJEXT)))
$(TD Object files to link in)
)
$(TR
$(TD $(B .$(LIBEXT)))
$(TD Object code libraries to search)
)
$(WINDOWS
$(TR
$(TD $(B .exe))
$(TD Output executable file)
)
$(TR
$(TD $(B .def))
$(TD $(LINK2 http://www.digitalmars.com/ctg/ctgDefFiles.html, module definition file))
)
$(TR
$(TD $(B .res))
$(TD resource file)
)
)
)
)
)
$(SWITCH $(B @)$(I cmdfile),
If $(I cmdfile) is an environment variable,
read the compiler arguments and switches from
the value of that variable.
Otherwise, read compiler arguments and switches from
the text file $(I cmdfile)
)
$(SWITCH $(B -c),
compile only, do not link
)
$(SWITCH $(B -cov),
instrument for $(LINK2 code_coverage.html, code coverage analysis)
)
$(SWITCH $(B -D),
generate $(LINK2 ddoc.html, documentation) from source
)
$(SWITCH $(B -Dd)$(I docdir),
write documentation file to $(I docdir) directory
)
$(SWITCH $(B -Df)$(I filename),
write documentation file to $(I filename)
)
$(SWITCH $(B -d),
allow deprecated features
)
$(SWITCH $(B -debug),
compile in $(LINK2 version.html#debug, debug) code
)
$(SWITCH $(B -debug=)$(I level),
compile in $(LINK2 version.html#debug, debug level) <= $(I level)
)
$(SWITCH $(B -debug=)$(I ident),
compile in $(LINK2 version.html#debug, debug identifier) $(I ident)
)
$(SWITCH $(B -debuglib=)$(I libname),
link in $(I libname) as the default library when
compiling for symbolic debugging instead of $(B $(LIB))
)
$(SWITCH $(B -defaultlib=)$(I libname),
link in $(I libname) as the default library when
not compiling for symbolic debugging instead of $(B $(LIB))
)
$(SWITCH $(B -deps=)$(I filename),
write module dependencies as text to $(I filename)
)
$(OSX
$(SWITCH $(B -dylib),
generate dylib library
)
)
$(UNIX
$(SWITCH $(B -fPIC),
generate Position Independent Code (which is used
for building shared libraries).
$(OSX This is always on for OSX.)
)
)
$(SWITCH $(B -g),
$(WINDOWS
add CodeView 4 symbolic debug info with
$(LINK2 abi.html#codeview, D extensions)
for debuggers such as
$(LINK2 http://ddbg.mainia.de/releases.html, Ddbg)
)
$(UNIX
add Dwarf symbolic debug info with
$(LINK2 abi.html#dwarf, D extensions)
for debuggers $(LINUX such as
$(LINK2 http://www.zerobugs.org/, ZeroBUGS))
)
)
$(SWITCH $(B -gc),
$(WINDOWS
add CodeView 4 symbolic debug info in C format
for debuggers such as
$(TT $(DMDDIR)\bin\windbg)
)
$(UNIX
add Dwarf symbolic debug info in C format
for debuggers such as
$(TT gdb)
)
)
$(SWITCH $(B -H),
generate $(LINK2 #interface_files, D interface file)
)
$(SWITCH $(B -Hd)$(I dir),
write D interface file to $(I dir) directory
)
$(SWITCH $(B -Hf)$(I filename),
write D interface file to $(I filename)
)
$(SWITCH $(B --help),
print brief help to console
)
$(SWITCH $(B -inline),
inline expand functions at the discretion of the compiler.
This can improve performance, at the expense of making
it more difficult to use a debugger on it.
)
$(SWITCH $(B -I)$(I path),
where to look for
$(LINK2 module.html#ImportDeclaration, imports).
$(I path) is a ; separated
list of paths. Multiple $(B -I)'s can be used, and the paths
are searched in the same order.
)
$(SWITCH $(B -ignore),
ignore unsupported pragmas
)
$(SWITCH $(B -J)$(I path),
where to look for files for
$(LINK2 expression.html#ImportExpression, $(I ImportExpression))s.
This switch is required in order to use $(I ImportExpression)s.
$(I path) is a ; separated
list of paths. Multiple $(B -J)'s can be used, and the paths
are searched in the same order.
)
$(SWITCH $(B -L)$(I linkerflag),
pass $(I linkerflag) to the
$(WINDOWS $(LINK2 http://www.digitalmars.com/ctg/optlink.html, linker))
$(UNIX linker), for example,
$(WINDOWS $(TT -L/ma/li))$(UNIX $(TT -L-M))
)
$(SWITCH $(B -lib),
generate library file as output instead of object file(s).
All compiled source files, as well as object files and library
files specified on the command line, are inserted into
the output library.
Compiled source modules may be partitioned into several object
modules to improve granularity.
The name of the library is taken from the name of the first
source module to be compiled. This can be overridden with
the $(B -of) switch.
)
$(SWITCH $(B -man),
$(WINDOWS
open default browser on this page
)
$(LINUX
open browser specified by the $(B BROWSER)
environment variable on this page. If $(B BROWSER) is
undefined, $(B x-www-browser) is assumed.
)
$(FREEBSD
open browser specified by the $(B BROWSER)
environment variable on this page. If $(B BROWSER) is
undefined, $(B x-www-browser) is assumed.
)
$(OSX
open browser specified by the $(B BROWSER)
environment variable on this page. If $(B BROWSER) is
undefined, $(B Safari) is assumed.
)
)
$(V2
$(SWITCH $(B -noboundscheck),
turns off all array bounds checking, even for safe functions
)
)
$(WINDOWS
$(SWITCH $(B -nofloat),
Prevents emission of $(B __fltused) reference in
object files, even if floating point code is present.
Useful for library code.
)
)
$(SWITCH $(B -O),
Optimize generated code. For fastest executables, compile
with the $(B -O -release -inline) switches together.
)
$(SWITCH $(B -o-),
Suppress generation of object file. Useful in
conjuction with $(B -D) or $(B -H) flags.
)
$(SWITCH $(B -od)$(I objdir),
$(DD write object files relative to directory $(I objdir)
instead of to the current directory)
)
$(SWITCH $(B -of)$(I filename),
Set output file name to $(I filename) in the output
directory. The output file can be an object file,
executable file, or library file depending on the other
switches.
)
$(SWITCH $(B -op),
normally the path for $(B .d) source files is stripped
off when generating an object file name. $(B -op) will leave
it on.
)
$(SWITCH $(B -profile),
$(LINK2 http://www.digitalmars.com/ctg/trace.html, profile)
the runtime performance
of the generated code
)
$(SWITCH $(B -quiet),
suppress non-essential compiler messages
)
$(SWITCH $(B -release),
$(V1 compile release version, which means not generating
code for contracts, asserts and array bounds checking)
$(V2 compile release version, which means not generating
code for contracts and asserts. Array bounds checking
is not done for system and trusted functions.)
)
$(SWITCH $(B -run) $(I srcfile args...)
compile, link, and run the program $(I srcfile) with the
rest of the
command line, $(I args...), as the arguments to the program.
No .$(OBJEXT) or executable file is left behind.
)
$(COMMENT
$(SWITCH $(B -safe),
Statically checks the modules being compiled to ensure they
conform to the $(LINK2 safed.html, safe memory model).
)
)
$(SWITCH $(B -unittest),
compile in $(LINK2 unittest.html, unittest) code, turns on asserts, and sets the
$(TT unittest) $(LINK2 version.html#PredefinedVersions, version identifier)
)
$(SWITCH $(B -v),
verbose
)
$(V2
$(SWITCH $(B -vtls),
print informational messages identifying variables defaulting
to thread local storage. Handy for migrating to shared model.
)
)
$(SWITCH $(B -version=)$(I level),
compile in $(LINK2 version.html#version, version level) >= $(I level)
)
$(SWITCH $(B -version=)$(I ident),
compile in $(LINK2 version.html#version, version identifier) $(I ident)
)
$(SWITCH $(B -w),
enable $(LINK2 warnings.html, warnings)
)
$(SWITCH $(B -wi),
enable $(LINK2 warnings.html, informational warnings (i.e. compilation
still proceeds normally))
)
)
$(WINDOWS
$(P Empty switches, i.e. "", are ignored.)
)
$(LNAME2 linking, Linking)
$(P Linking is done directly by the $(B dmd) compiler after a successful
compile. To prevent $(B dmd) from running the linker, use the
$(B -c) switch.
)
$(WINDOWS
$(P The programs must be linked with the D runtime library $(B phobos.lib),
followed by the C runtime library $(B snn.lib).
This is done automatically as long as the directories for the
libraries are on the LIB environment variable path. A typical
way to set LIB would be:
)
$(CONSOLE
set LIB=$(DMDDIR)\lib;\dm\lib
)
$(P If the $(B dmd) command is used to both compile and link
to an executable, it will make certain optimizations that are
valid only for Windows executable files. Do not use the resulting
.obj files in a DLL.
To compile modules into .obj files that can be used in an exe or
DLL, compile with $(B -c).
)
$(P Linking is done using the
$(LINK2 http://www.digitalmars.com/ctg/optlink.html, optlink) linker.
)
)
$(UNIX
$(P The actual linking is done by running $(B gcc).
This ensures compatibility with modules compiled with $(B gcc).
)
)
$(LNAME2 environment, Environment Variables)
$(P The D compiler dmd uses the following environment variables:
)
$(DL
$(WINDOWS
$(B DFLAGS)
The value of $(B DFLAGS) is treated as if it were appended to the
command line to $(B dmd.exe).
$(B LIB)
The linker uses $(B LIB) to search for library files. For D, it will
normally be set to:
$(CONSOLE
set LIB=$(DMDDIR)\lib;\dm\lib
)
$(B LINKCMD)
$(B dmd) normally runs the linker by looking for $(B link.exe)
along the $(B PATH). To use a specific linker instead, set the
$(B LINKCMD) environment variable to it. For example:
$(CONSOLE
set LINKCMD=\dmd\windows\bin\link
)
$(B PATH)
If the linker is not found in the same directory as $(B dmd.exe)
is in, the $(B PATH) is searched for it.
$(B Note:) other linkers named
$(B link.exe) will likely not work.
Make sure the Digital Mars $(B link.exe)
is found first in the $(B PATH) before other $(B link.exe)'s,
or use $(B LINKCMD) to specifically identify which linker
to use.
)
$(UNIX
$(B CC)
$(B dmd) normally runs the linker by looking for $(B gcc)
along the $(B PATH). To use a specific linker instead, set the
$(B CC) environment variable to it. For example:
$(CONSOLE
set CC=gcc
)
$(DT $(B BROWSER)
$(DD This sets the browser used to open the manual page with
the $(B -man) switch. It defaults to $(TT x-www-browser).
)
)
$(B DFLAGS)
The value of $(B DFLAGS) is treated as if it were appended to the
command line to $(B dmd).
)
)
$(WINDOWS
$(LNAME2 sc_ini, sc.ini Initialization File)
$(P $(B dmd) will look for the initialization file $(B sc.ini) in the
following sequence of directories:
)
$(OL
$(LI current working directory)
$(LI directory specified by the $(B HOME) environment variable)
$(LI directory $(B dmd.exe) resides in)
)
$(P If found, environment variable
settings in the file will override any existing settings.
This is handy to make $(B dmd) independent of programs with
conflicting use of environment variables.
)
Initialization File Format
$(P Comments are lines that begin with $(TT ;) and are ignored.
)
$(P Environment variables follow the $(TT [Environment]) section
heading, in $(I NAME)=$(I value) pairs.
The $(I NAME)s are treated as upper case.
Comments are lines that start with ;.
For example:
)
$(SCINI
; sc.ini file for dmd
; Names enclosed by %% are searched for in the existing environment
; and inserted. The special name %@P% is replaced with the path
; to this file.
[Environment]
LIB="%@P%\..\lib";\dm\lib
$(V1 DFLAGS="-I%@P%\..\src\phobos")
$(V2 DFLAGS="-I%@P%\..\src\phobos" "-I%@P%\..\src\druntime\import")
LINKCMD="%@P%\..\..\dm\bin"
DDOCFILE=mysettings.ddoc
)
Location Independence of sc.ini
$(P The $(B %@P%) is replaced with the path to $(TT sc.ini).
Thus, if the fully qualified file name $(TT sc.ini) is
$(TT c:$(DMDDIR)\bin\sc.ini), then $(B %@P%) will be replaced with
$(TT c:$(DMDDIR)\bin), and the above $(TT sc.ini) will be
interpreted as:
)
$(SCINI
[Environment]
LIB="c:$(DMDDIR)\bin\..\lib";\dm\lib
$(V1 DFLAGS="-Ic:$(DMDDIR)\bin\..\src\phobos")
$(V2 DFLAGS="-Ic:$(DMDDIR)\bin\..\src\phobos" "-Ic:$(DMDDIR)\bin\..\src\druntime\import")
LINKCMD="c:$(DMDDIR)\bin\..\..\dm\bin"
DDOCFILE=mysettings.ddoc
)
$(P This enables your dmd setup to be moved around without having
to re-edit $(TT sc.ini).
)
)
$(UNIX
$(LNAME2 dmd_conf, dmd.conf Initialization File)
$(P The dmd file $(TT dmd.conf) is the same as $(TT sc.ini)
for Windows, it's just that the file has a different name,
enabling a setup common to both Windows and this system to be created
without having to re-edit the file.)
$(P $(B dmd) will look for the initialization file $(TT dmd.conf) in the
following sequence of directories:)
$(OL
$(LI current working directory)
$(LI directory specified by the $(B HOME) environment variable)
$(LI directory $(B dmd) resides in)
$(LI $(TT /etc/))
)
$(P If found, environment variable
settings in the file will override any existing settings.
This is handy to make $(B dmd) independent of programs with
conflicting use of environment variables.
)
$(P Environment variables follow the $(TT [Environment]) section
heading, in $(I NAME)=$(I value) pairs.
The $(I NAME)s are treated as upper case.
Comments are lines that start with ;.
For example:
)
$(SCINI
; dmd.conf file for dmd
; Names enclosed by %% are searched for in the existing environment
; and inserted. The special name %@P% is replaced with the path
; to this file.
[Environment]
$(V1 DFLAGS=-I%@P%/../src/phobos)
$(V2 DFLAGS=-I%@P%/../src/phobos -I%@P%/../src/druntime/import)
)
)
$(WINDOWS
$(LNAME2 problems, Common Installation Problems)
$(UL
$(LI Using Cygwin's $(B unzip) utility has been known to cause
strange problems.
)
$(LI Running the compiler under Cygwin's command shell has
been also known to cause problems. Try getting it to work
under the regular Windows shell $(B cmd.exe) before trying Cygwin's.
)
$(LI Installing $(B dmd) and $(B dmc) into directory paths with spaces
in them causes problems.
)
)
)
$(LNAME2 differences, Differences between Windows and Linux versions)
$(UL
$(LI String literals are read-only under Linux.
Attempting to write to them
will cause a segment violation.)
)
$(LNAME2 interface_files, D Interface Files)
$(P When an import declaration is processed in a D source file,
the compiler searches for the D source file corresponding to
the import, and processes that source file to extract the
information needed from it. Alternatively, the compiler can
instead look for a corresponding $(I D interface file).
A D interface file contains only what an import of the module
needs, rather than the whole implementation of that module.
)
$(P The advantages of using a D interface file for imports rather
than a D source file are:
)
$(UL
$(LI D interface files are often significantly smaller and much
faster to process than the corresponding D source file.)
$(LI They can be used to hide the source code, for example,
one can ship an object code library along with D interface files
rather than the complete source code.)
)
$(P D interface files can be created by the compiler from a
D source file by using the $(B -H) switch to the compiler.
D interface files have the $(B .di) file extension.
When the compiler resolves an import declaration, it first looks
for a $(B .di) D interface file, then it looks for a D source
file.
)
$(P D interface files bear some analogous similarities to C++
header files. But they are not required in the way that C++
header files are, and they are not part of the D language.
They are a feature of the compiler, and serve only as an optimization
of the build process.
)
$(LNAME2 executable, Building Executables)
$(P $(B dmd) can build an executable much faster if as many of the
source files as possible are put on the command line.)
$(P Another advantage to putting multiple source files on the same
invocation of $(B dmd) is that $(B dmd) will be able to do some level
of cross-module optimizations, such as function inlining across modules.
)
$(LNAME2 library, Building Libraries)
$(P There are three ways to build a library. For example,
given $(TT foo.d) and $(TT bar.d) which are to be compiled, and existing
object file $(TT bar.$(OBJEXT)) and existing library
$(TT def.$(LIBEXT)) which are
all to be combined into a library $(TT foo.$(LIBEXT)):)
$(OL
$(LI Compile modules separately and then run the librarian on them:
$(WINDOWS
$(CONSOLE
dmd -c foo.d
dmd -c bar.d
$(LINK2 http://www.digitalmars.com/ctg/lib.html, lib) -c -p32 foo.lib foo.obj bar.obj abc.obj def.lib
del foo.obj bar.obj
)
)
$(UNIX
$(CONSOLE
dmd -c foo.d
dmd -c bar.d
rm -f foo.a
ar -r foo.a foo.o bar.o abc.o def.a
rm foo.o bar.o
)
)
This option is typical when using a makefile to avoid compiling
modules that have already been compiled.
)
$(LI Compile modules together and then run the librarian on them:
$(WINDOWS
$(CONSOLE
dmd -c foo.d bar.d
$(LINK2 http://www.digitalmars.com/ctg/lib.html, lib) -c -p32 foo.lib foo.obj bar.obj abc.obj def.lib
del foo.obj bar.obj
)
)
$(UNIX
$(CONSOLE
dmd -c foo.d bar.d
rm -f foo.a
ar -r foo.a foo.o bar.o abc.o def.a
rm foo.o bar.o
)
)
)
$(LI Use $(B dmd) to compile and build library in one operation:
$(CONSOLE
dmd -lib foo.d bar.d abc.$(OBJEXT) def.$(LIBEXT)
)
No object files are written to disk, it's all done in memory.
Using $(B -lib) also has the advantage that modules may be compiled
into multiple object files rather than exactly one per module.
This improves granularity of the library without having to break
up the modules.
)
)
$(LNAME2 compiling_dmd, Compiling dmd)
$(P Complete source code is provided to build the compiler.
Follow these steps:)
$(WINDOWS
$(CONSOLE
cd $(DMDDIR)\src\dmd
make -f win32.mak
)
)
$(UNIX
$(CONSOLE
cd ~/$(DMDDIR)/src/dmd
make -f $(OS).mak
)
)
$(LNAME2 compiling_phobos, Compiling Phobos)
$(P Complete source code is provided to build Phobos, the D runtime library.
Follow these steps:)
$(V1
$(WINDOWS
$(CONSOLE
cd $(DMDDIR)\src\phobos
make -f win32.mak DMD=$(DMDDIR)\$(OS)\bin\dmd
)
)
$(UNIX
$(CONSOLE
cd ~/$(DMDDIR)/src/phobos
make -f $(OS).mak DMD=~/$(DMDDIR)/$(OS)/bin/dmd
)
)
)
$(V2
$(WINDOWS
$(CONSOLE
cd $(DMDDIR)\src\druntime
make -f win32.mak DMD=$(DMDDIR)\$(OS)\bin\dmd
cd ..\phobos
make -f win32.mak DMD=$(DMDDIR)\$(OS)\bin\dmd
)
)
$(UNIX
$(CONSOLE
cd ~/$(DMDDIR)/src/druntime
make -f posix.mak DMD=~/$(DMDDIR)/$(OS)/bin/dmd
cd ../phobos
make -f $(OS).mak DMD=~/$(DMDDIR)/$(OS)/bin/dmd
)
)
)
)
Macros:
TITLE=DMD Compiler for $(WINDOWS Windows)$(LINUX Linux)$(OSX OSX)$(FREEBSD FreeBSD)
WIKI=DCompiler
LIB=$(WINDOWS phobos.lib)$(UNIX $(V1 libphobos.a)$(V2 libphobos2.a))
DMD_CONF=$(LINK2 #dmd_conf, dmd.conf)
SWITCH=$(DT $1)$(DD $+)