Difference between revisions of "Building and hacking LDC on Windows using MSVC"

From D Wiki
Jump to: navigation, search
m (Added CMakeLists.txt for libconfig)
m (Running the druntime/Phobos unit tests and druntime standalone tests)
 
(136 intermediate revisions by 7 users not shown)
Line 1: Line 1:
LDC on Windows is work in progress. This page documents how to compile LDC2 on Windows 7 x64. It also provides hints on druntime and phobos.
+
Windows MSVC x86/x64 are first class targets for LDC. This page documents how to build, test and hack LDC2 on Windows.
  
== Building LDC ==
+
== LDC binaries ==
  
=== Required software ===
+
If you just want to download the very latest LDC binaries, head over to the [https://github.com/ldc-developers/ldc/releases/tag/CI GitHub CI release].
  
* Windows 7 x64, of course!
+
== Advice ==
* [http://microsoft.com/en-us/download/details.aspx?id=17718 .NET Framework 4.0] (prerequisite for Windows SDK)
+
It is hard for us to keep these wiki pages up-to-date. If you run into trouble, have a look at the build scripts for our [http://wiki.dlang.org/LDC_contributor%27s_guide#Continuous_Integration Continuous Integration] platforms: the Azure Pipelines scripts for [https://github.com/ldc-developers/ldc/blob/master/.azure-pipelines/posix.yml Ubuntu Linux and macOS] and [https://github.com/ldc-developers/ldc/blob/master/.azure-pipelines/windows.yml Windows] are always up-to-date with the latest build setup.
* [http://microsoft.com/en-us/download/details.aspx?id=8279 Windows 7.1 SDK]
 
* [http://python.org/download/ Python 2.7.x or Python 3.3.x] (I use 3.3.0)
 
* [http://git-scm.com/download/win git 1.8.x] (I use 1.8.0.msysgit.0 installed with option "Run Git from the Windows Command Prompt")
 
* [http://cmake.org/cmake/resources/software.html CMake 2.8.x] (I use 2.8.12.1 installed with option "Add cmake to the system PATH for all users")
 
* a tool to extract .tgz files, e.g. [http://7-zip.org/ 7-Zip]
 
  
=== Required source downloads ===
+
== Building LDC ==
  
* [http://hyperrealm.com/libconfig/ libconfig++] (Just use latest release 1.4.9.)
+
=== Required software ===
* [http://redstar.de/ldc/win64eh_all_20140414.diff Patch adding Win64 SEH to LLVM 3.5] or from the [http://reviews.llvm.org/D3418 LLVM review] (Based on code by Charles Davis)
 
* Patches for LDC: (currently none)
 
=== Environment check ===
 
  
After installing the software, you can open a Windows SDK 7.1 Command Prompt. You should see that you are targeting &quot;Windows 7 x64 Debug&quot;. If not please execute the command <tt>setenv /x64 /Debug</tt>. Running <tt>cmake --version</tt> should display the banner from cmake. Running <tt>git --version</tt> should display the banner from git. Running <tt>msbuild /version</tt> should display the banner from msbuild. Running <tt>&lt;Python install path&gt;\python --version</tt> should display the banner from python.
+
* Windows, of course!
 +
* [https://www.visualstudio.com/downloads/ Visual Studio or stand-alone Build Tools] &ge; 2017. Make sure to install the Visual C++ toolchain.
 +
* A [https://github.com/ldc-developers/ldc/releases/ D compiler] (the <tt>ltsmaster</tt> git branch does not need a D compiler to build). DMD as host compiler isn't supported on Windows, make sure to use LDC.
 +
* A recent [https://git-scm.com/download/win git] installation
 +
* [https://www.python.org/downloads/ Python] (I use [https://github.com/winpython/winpython/releases Winpython])
 +
* [https://github.com/Kitware/CMake/releases CMake &ge; 3.8]
 +
* [https://github.com/ninja-build/ninja/releases Ninja], a neat little and fast build system
 +
* For running the testsuite: GNU make ([https://dl.dropboxusercontent.com/s/4y36f5ydgrk4p5g/make-4.2.1.7z?dl=0 prebuilt v4.2.1])
  
My working directory is <tt>C:\ldcenv</tt>. Every step starts in this directory. Please feel free to adjust this to your needs.
+
=== Shell environment ===
  
=== Build LLVM ===
+
I use a little batch file to set up my LDC build environment. It's located in the root of my LDC environment: <tt>C:\LDC\shell.cmd</tt>.
 +
It sets up the <tt>PATH</tt> environment variable (I've installed the portable tools into <tt>C:\LDC\Tools</tt>) and then spawns a new <tt>x64 Native Tools Command Prompt for VS 2019</tt> with a below-normal process priority, so that my system stays responsive while building.
 +
I use a shortcut on my desktop to this batch file. Please adjust it to your needs (and note that <tt>%~dp0</tt> is the directory containing the script, i.e., <tt>C:\LDC\</tt>).
  
To build LLVM from the command line, just execute the following steps:
+
<pre>
 
+
@echo off
<ul>
+
set PATH=%~dp0LDC-x64\bin;%~dp0LLVM-x64\bin;%~dp0Tools\Ninja 1.10.2;%~dp0Tools\make-4.2.1;C:\Program Files\Git\usr\bin;C:\Program Files\Git\bin;%~dp0Tools\cmake-3.19.4-win64-x64\bin;%~dp0Tools\Winpython64-3.7.4.0Zero\python-3.7.4.amd64;%PATH%
<li><tt>md build-llvm-x64</tt></li>
+
:: set D host compiler
<li><tt>git clone http://llvm.org/git/llvm.git llvm</tt></li>
+
set DMD=%~dp0ldc2-1.24.0-windows-multilib\bin\ldmd2.exe
<li><tt>cd llvm</tt></li>
+
:: set a few environment variables for dmd-testsuite
<li>The next command is only required if LLVM 3.5 head is used and if you want Win64 SEH support:<br />
+
set OS=windows
<tt>git apply &lt;path to LLVM patch&gt;\win64eh_all_20130901.diff</tt></li>
+
set MODEL=64
<li>The next command is only required if LLVM 3.4 is used:<br />
+
if not exist "%TERM%" set TERM=msys
<tt>git checkout -t origin/release_34</tt><br />
+
start /belownormal cmd.exe /k "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\VsDevCmd.bat" -arch=x64
<li><tt>cd ..\build-llvm-x64</tt></li>
+
</pre>
<li><p>Type the next command in one line:</p>
 
<pre>cmake -G &quot;Visual Studio 10 Win64&quot; -DCMAKE_INSTALL_PREFIX=&quot;C:\Program Files\LLVM-x64&quot;
 
      -DPYTHON_EXECUTABLE=&quot;C:\Program Files\Python33\python.exe&quot; -DLLVM_TARGETS_TO_BUILD=&quot;X86&quot;
 
      -DLLVM_INCLUDE_TESTS=OFF C:\ldcenv\llvm</pre></li>
 
<li><p><tt>msbuild ALL_BUILD.vcxproj</tt></p></li></ul>
 
  
Open a Windows SDK 7.1 Command Prompt as Administrator.
+
Use <tt>-arch=x86</tt> in the last line and <tt>set MODEL=32</tt> if you want to build a 32-bit LDC.
  
* <tt>cd build-llvm-x64</tt>
+
Open a shell by executing the batch file.
* <tt>msbuild INSTALL.vcxproj</tt>
 
  
The [http://llvm.org/docs/CMake.html#id10 LLVM page on CMake] documents other variables you can change. The most common is to add more targets. E.g. to build a target for ARM you change the targets to build to <tt>-DLLVM_TARGETS_TO_BUILD=&quot;X86;ARM&quot;</tt>.
+
* Running <code>cl</code> should display the banner from the MS compiler.
 +
* Running <code>link /version</code> should display the banner from the MS linker.
 +
* Running <code>git --version</code> should display the banner from git.
 +
* Running <code>python --version</code> should display the banner from Python.
 +
* Running <code>cmake --version</code> should display the banner from CMake.
 +
* Running <code>ninja --version</code> should display the Ninja version.
 +
* For the tests:
 +
** Running <code>make --version</code> should display the banner from GNU make.
 +
** Starting a bash shell via <code>bash</code> and then invoking <code>link /version</code> should still display the MS linker banner. If it doesn't, make sure that git's <tt>usr\bin</tt> directory is listed before its <tt>bin</tt> directory in <tt>PATH</tt>.
  
=== Build libconfig++ ===
+
=== Building LLVM ===
  
Simple build instructions for libconfig++ are missing. You can do the following:
+
Building LLVM takes quite a while, so you may want to download a prebuilt version from [https://github.com/ldc-developers/llvm-project/releases here]. We use these prebuilt packages for CI and the official release packages. Just extract the archive into <tt>C:\LDC\LLVM-x64</tt> and then skip this section. In case you encounter errors wrt. unsupported command-line options or linking errors when building LDC, you probably use a different MSVC/clang toolchain version and will need to build LLVM yourself.
  
* Install Visual Studio 2010 (e.g. [http://microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express Visual Studio 2010 Express])
+
<ul>
* Open the libconfig.sln solution
+
<li>Download an LLVM source tarball (<tt>llvm-x.y.z.src.tar.xz</tt>). We maintain an [https://github.com/ldc-developers/llvm-project/releases LLVM fork] with minimal modifications; [http://releases.llvm.org/download.html vanilla LLVM] can be used as well.</li>
* Create a profile for Win64 Debug
+
<li>Extract it into <tt>C:\LDC</tt> (e.g., with [http://www.7-zip.org/ 7-Zip]), so that you end up with the source tree in e.g. <tt>C:\LDC\llvm-11.0.1.src</tt>.</li>
* If you like to create a static library then change the configuration type of project <tt>libconfig++</tt> to 'Static library'.
+
<li><code>cd C:\LDC</code></li>
* Build the project <tt>libconfig++</tt>
+
<li>Create a build directory: <code>md build-llvm-x64</code></li>
 
+
<li>Change into it: <code>cd build-llvm-x64</code></li>
Alternative you can use a custom <tt>CMakeLists.txt</tt>:
+
<li><p>Use a command like this (in one line) to create the Ninja build files:</p>
 +
<pre>cmake -G Ninja ..\llvm-11.0.1.src
 +
      -DCMAKE_INSTALL_PREFIX=&quot;C:\LDC\LLVM-x64&quot;
 +
      -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLLVM_USE_CRT_RELWITHDEBINFO=MT
 +
      -DLLVM_ENABLE_ASSERTIONS=ON
 +
      -DLLVM_TARGETS_TO_BUILD=AArch64;ARM;Mips;MSP430;NVPTX;PowerPC;RISCV;WebAssembly;X86
 +
      -DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-pc-windows-msvc
 +
      -DCOMPILER_RT_INCLUDE_TESTS=OFF
 +
      -DLLVM_INCLUDE_TESTS=OFF</pre>
 +
<p>Use <code>-DCMAKE_BUILD_TYPE=Debug</code> to build a debug version (and probably use <code>-DLLVM_USE_CRT_DEBUG=MTd</code> then). The [http://llvm.org/docs/CMake.html#llvm-specific-variables LLVM page on CMake] documents other variables you can change. For a 32-bit build, use <code>-DLLVM_DEFAULT_TARGET_TRIPLE=i686-pc-windows-msvc</code>.</p></li>
 +
<li>Build LLVM: <code>ninja</code></li>
 +
<li>Install it (to <tt>C:\LDC\LLVM-x64</tt>): <code>ninja install</code></li>
 +
<li>Note that you'll need to keep the <tt>C:\LDC\build-llvm-x64</tt> directory in order to keep the LLVM debuginfos (.pdb files) available.</li>
 +
</ul>
  
* Extract libconfig++ file.
+
=== Building LDC ===
* Download CMakeLists.txt from [https://gist.github.com/redstar/d5694a6301c40ceb0720 this gist] and place it into the root folder.
 
* Create a build directory: <tt>md build_libconfig</tt>
 
* <tt>cd build_libconfig</tt>
 
* Now create the build files:
 
* <tt>cmake ..\libconfig-1.4.9</tt>
 
* Build the library: <tt>msbuild ALL_BUILD.vcxproj</tt>
 
 
 
=== Build LDC2 ===
 
 
 
To build LDC2 from the command line, just execute the following steps:
 
  
 
<ul>
 
<ul>
<li><tt>md build-ldc2-x64</tt></li>
+
<li><code>cd C:\LDC</code></li>
<li><tt>git clone --recursive git://github.com/ldc-developers/ldc.git ldc</tt></li>
+
<li><code>git clone --recursive https://github.com/ldc-developers/ldc.git</code></li>
<li><tt>cd ldc</tt></li>
+
<li><code>md build-ldc-x64</code></li>
<li>Now apply all the patches for LDC (see section 'Required source downloads' above):<br />
+
<li><code>cd build-ldc-x64</code></li>
<tt>git apply &lt;patch name&gt;</tt></li>
+
<li><p>Use a command like this (in one line) to create the Ninja build files:</p>
<li><tt>cd ..\build-ldc2-x64</tt></li>
+
<pre>cmake -G Ninja ..\ldc
<li><p>Type the next command in one line:</p>
+
      -DCMAKE_INSTALL_PREFIX=&quot;C:\LDC\LDC-x64&quot;
<pre>cmake -G &quot;Visual Studio 10 Win64&quot; -DCMAKE_INSTALL_PREFIX=&quot;C:\Program Files\LDC&quot;
+
      -DCMAKE_BUILD_TYPE=RelWithDebInfo
       -DLLVM_ROOT_DIR=&quot;C:/Program Files/LLVM-x64&quot;
+
       -DLLVM_ROOT_DIR=&quot;C:/LDC/LLVM-x64&quot;</pre>
      -DLIBCONFIG++_INCLUDE_DIR=&quot;C:/ldcenv/libconfig-1.4.9/lib&quot;
+
<p>You can specify the D host compiler explicitly by adding <code>-DD_COMPILER=c:\path\to\ldmd2.exe</code>.</p>
      -DLIBCONFIG++_LIBRARY=&quot;C:/ldcenv/libconfig-1.4.9/Debug/libconfig++.lib&quot; C:\ldcenv\ldc</pre>
+
</li>
<p>This assumes that you have a static compiled version of <tt>libconfig++.lib</tt>. If you use the DLL version then you have to add <tt>-DLIBCONFIG_DLL=ON</tt>.</p></li>
+
<li>Build LDC and the default libraries: <code>ninja</code>. The binaries end up in <tt>C:\LDC\build-ldc-x64\bin</tt>.</li>
<li><p><tt>msbuild ALL_BUILD.vcxproj</tt></p></li></ul>
+
<li>If you want to install it (to <tt>C:\LDC\LDC-x64</tt>): <code>ninja install</code></li>
 +
</ul>
  
Open a Windows SDK 7.1 Command Prompt as Administrator.
+
== Tests ==
  
* <tt>cd build-llvm-x64</tt>
+
For troubleshooting, be sure to examine the file <tt>C:\LDC\build-ldc-x64\Testing\Temporary\LastTest.log</tt> after a <tt>ctest</tt> invocation.
* <tt>msbuild INSTALL.vcxproj</tt>
 
  
Check that <tt>C:\Program Files\LDC\bin</tt> is in your path and type <tt>ldc2 -version</tt> to check that you can run <tt>LDC2</tt>.
+
=== Running the LDC D unit tests ===
  
=== Troubleshooting ===
+
* <code>cd C:\LDC\build-ldc-x64</code>
 +
* <code>ctest --output-on-failure -R ldc2-unittest</code>
  
* git 1.7.11 requires extra setup because of git-svn. Just use 1.7.10 or 1.8.0.
+
=== Running the LIT (LLVM Integrated Tester) tests ===
* Using Visual Studio 2012: You do not need to install the Windows SDK. Just open the &quot;VS2012 x64 Native Tools Command Prompt&quot;. The CMake generator for VS 2012 is named <tt>Visual Studio 11 Win64</tt>.
 
  
=== Known bugs ===
+
You'll need to have [https://pypi.python.org/pypi/lit lit] installed for Python:
 +
* Upgrade [https://pip.pypa.io/ pip]: <code>python -m pip install -U pip</code>
 +
* Install lit: <code>python -m pip install lit</code>
 +
* Make sure it works: <code>python -c "import lit.main; lit.main.main();" --version .</code>
 +
To run the tests from your build dir you can do:
 +
* <code>cd C:\LDC\build-ldc-x64</code>
 +
* <code>ctest -V -R lit-tests</code>
 +
or you can go to the tests folder inside your build dir, and run the runlit.py script:
 +
* <code>cd C:\LDC\build-ldc-x64\tests</code>
 +
* <code>python runlit.py -v .</code>
 +
The second way is convenient for running individual tests:
 +
* <code>python runlit.py -v codegen/align.d</code>
  
* Structured Exception Handling is only available for LLVM 3.5 head with the patch above applied. Support has still alpha quality and is known to crash your application under certain circumstances.
+
=== Running the druntime/Phobos unit tests and druntime integration tests ===
* Execution of tests with the <tt>RUN_TESTS</tt> project does not work.
 
  
== Hacking druntime and phobos ==
+
* Make sure the 64/32-bit <tt>libcurl.dll</tt> (bundled with LDC) can be found in a PATH directory. Verify by running <code>where libcurl.dll</code>.
 +
* <code>cd C:\LDC\build-ldc-x64</code>
 +
* Build the unit tests: <code>ninja all-test-runners</code>
 +
* Run the tests, excluding LDC unit tests, LIT tests and dmd-testsuite: <code>ctest --output-on-failure -E &quot;dmd-testsuite|lit-tests|ldc2-unittest&quot;</code>
  
As of version 2.061 (still under development) Druntime and Phobos have support for Win64. The following issues are known:
+
=== Running the dmd-testsuite tests ===
  
* <tt>ldc.eh2</tt>: Implementation has alpha quality. Only used together with LLVM 3.4.
+
* If you haven't already, set the <tt>OS</tt> and <tt>MODEL</tt> environment variables:
* Other missing functions: Most functions related to <tt>real</tt> type (<tt>long double</tt> in C) are missing because Visual C++ has dropped support for it (e.g. <tt>strtold()</tt>, <tt>sinl</tt>, <tt>cosl</tt>, ...). Some of them are already implemented (see e.g. <tt>std.math</tt>) but please be aware that there are still fake implementations present.
+
** <code>set OS=windows</code> (since v1.17, previously <code>win{32,64}</code>)
 +
** <code>set MODEL={32,64}</code>
 +
* <code>cd C:\LDC\build-ldc-x64</code>
 +
* <code>ctest -V -R dmd-testsuite</code>
 +
** Debug only: <code>ctest -V -R "build-run-dmd-testsuite|dmd-testsuite-debug"</code>
 +
** Release only: <code>ctest -V -R dmd-testsuite -E -debug</code>
  
If you link your modules you have to specify the libraries <tt>phobos-ldc.lib</tt> and <tt>shell32.lib</tt>. Due to a bug in LLVM you have to specifiy the flag <tt>/LARGEADDRESSAWARE:NO</tt>, too.
+
== Developing/debugging LDC/LLVM with Visual Studio ==
  
== Example ==
+
Be sure to use Rainer's great [http://rainers.github.io/visuald/visuald/StartPage.html Visual D] plugin for VS.
 
 
The simple D program <tt>hello.d</tt>
 
 
 
<source lang="d">import std.stdio;
 
 
 
int main()
 
{
 
    writefln("Hello LDC2");
 
    return 0;
 
}</source>
 
can be compiled and linked with the commands:
 
 
 
<pre>
 
ldc2 -c hello.d
 
link hello2.obj phobos-ldc.lib shell32.lib /LARGEADDRESSAWARE:NO
 
</pre>
 
  
or simply with: <tt>ldc2 hello.d</tt>
+
* <code>cd C:\LDC</code>
 +
* <code>md vs-ldc-x64</code>
 +
* <code>cd vs-ldc-x64</code>
 +
* Use the CMake command from the Build LDC section, but use the VS generator instead of Ninja this time: <code>cmake -G "Visual Studio 15 Win64" ...</code>
  
The resulting <tt>hello.exe</tt> produces the expected output.
+
This creates the VS 2017 solution <tt>C:\LDC\vs-ldc-x64\ldc.sln</tt>.
 +
A Visual Studio solution for LLVM can be created the same way.
  
 +
I don't recommend building LDC/LLVM with VS directly; I only use VS for development/debugging and build in the shell with Ninja.
  
  

Latest revision as of 04:47, 8 February 2021

Windows MSVC x86/x64 are first class targets for LDC. This page documents how to build, test and hack LDC2 on Windows.

LDC binaries

If you just want to download the very latest LDC binaries, head over to the GitHub CI release.

Advice

It is hard for us to keep these wiki pages up-to-date. If you run into trouble, have a look at the build scripts for our Continuous Integration platforms: the Azure Pipelines scripts for Ubuntu Linux and macOS and Windows are always up-to-date with the latest build setup.

Building LDC

Required software

Shell environment

I use a little batch file to set up my LDC build environment. It's located in the root of my LDC environment: C:\LDC\shell.cmd. It sets up the PATH environment variable (I've installed the portable tools into C:\LDC\Tools) and then spawns a new x64 Native Tools Command Prompt for VS 2019 with a below-normal process priority, so that my system stays responsive while building. I use a shortcut on my desktop to this batch file. Please adjust it to your needs (and note that %~dp0 is the directory containing the script, i.e., C:\LDC\).

@echo off
set PATH=%~dp0LDC-x64\bin;%~dp0LLVM-x64\bin;%~dp0Tools\Ninja 1.10.2;%~dp0Tools\make-4.2.1;C:\Program Files\Git\usr\bin;C:\Program Files\Git\bin;%~dp0Tools\cmake-3.19.4-win64-x64\bin;%~dp0Tools\Winpython64-3.7.4.0Zero\python-3.7.4.amd64;%PATH%
:: set D host compiler
set DMD=%~dp0ldc2-1.24.0-windows-multilib\bin\ldmd2.exe
:: set a few environment variables for dmd-testsuite
set OS=windows
set MODEL=64
if not exist "%TERM%" set TERM=msys
start /belownormal cmd.exe /k "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\VsDevCmd.bat" -arch=x64

Use -arch=x86 in the last line and set MODEL=32 if you want to build a 32-bit LDC.

Open a shell by executing the batch file.

  • Running cl should display the banner from the MS compiler.
  • Running link /version should display the banner from the MS linker.
  • Running git --version should display the banner from git.
  • Running python --version should display the banner from Python.
  • Running cmake --version should display the banner from CMake.
  • Running ninja --version should display the Ninja version.
  • For the tests:
    • Running make --version should display the banner from GNU make.
    • Starting a bash shell via bash and then invoking link /version should still display the MS linker banner. If it doesn't, make sure that git's usr\bin directory is listed before its bin directory in PATH.

Building LLVM

Building LLVM takes quite a while, so you may want to download a prebuilt version from here. We use these prebuilt packages for CI and the official release packages. Just extract the archive into C:\LDC\LLVM-x64 and then skip this section. In case you encounter errors wrt. unsupported command-line options or linking errors when building LDC, you probably use a different MSVC/clang toolchain version and will need to build LLVM yourself.

  • Download an LLVM source tarball (llvm-x.y.z.src.tar.xz). We maintain an LLVM fork with minimal modifications; vanilla LLVM can be used as well.
  • Extract it into C:\LDC (e.g., with 7-Zip), so that you end up with the source tree in e.g. C:\LDC\llvm-11.0.1.src.
  • cd C:\LDC
  • Create a build directory: md build-llvm-x64
  • Change into it: cd build-llvm-x64
  • Use a command like this (in one line) to create the Ninja build files:

    cmake -G Ninja ..\llvm-11.0.1.src
          -DCMAKE_INSTALL_PREFIX="C:\LDC\LLVM-x64"
          -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLLVM_USE_CRT_RELWITHDEBINFO=MT
          -DLLVM_ENABLE_ASSERTIONS=ON
          -DLLVM_TARGETS_TO_BUILD=AArch64;ARM;Mips;MSP430;NVPTX;PowerPC;RISCV;WebAssembly;X86
          -DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-pc-windows-msvc
          -DCOMPILER_RT_INCLUDE_TESTS=OFF
          -DLLVM_INCLUDE_TESTS=OFF

    Use -DCMAKE_BUILD_TYPE=Debug to build a debug version (and probably use -DLLVM_USE_CRT_DEBUG=MTd then). The LLVM page on CMake documents other variables you can change. For a 32-bit build, use -DLLVM_DEFAULT_TARGET_TRIPLE=i686-pc-windows-msvc.

  • Build LLVM: ninja
  • Install it (to C:\LDC\LLVM-x64): ninja install
  • Note that you'll need to keep the C:\LDC\build-llvm-x64 directory in order to keep the LLVM debuginfos (.pdb files) available.

Building LDC

  • cd C:\LDC
  • git clone --recursive https://github.com/ldc-developers/ldc.git
  • md build-ldc-x64
  • cd build-ldc-x64
  • Use a command like this (in one line) to create the Ninja build files:

    cmake -G Ninja ..\ldc
          -DCMAKE_INSTALL_PREFIX="C:\LDC\LDC-x64"
          -DCMAKE_BUILD_TYPE=RelWithDebInfo
          -DLLVM_ROOT_DIR="C:/LDC/LLVM-x64"

    You can specify the D host compiler explicitly by adding -DD_COMPILER=c:\path\to\ldmd2.exe.

  • Build LDC and the default libraries: ninja. The binaries end up in C:\LDC\build-ldc-x64\bin.
  • If you want to install it (to C:\LDC\LDC-x64): ninja install

Tests

For troubleshooting, be sure to examine the file C:\LDC\build-ldc-x64\Testing\Temporary\LastTest.log after a ctest invocation.

Running the LDC D unit tests

  • cd C:\LDC\build-ldc-x64
  • ctest --output-on-failure -R ldc2-unittest

Running the LIT (LLVM Integrated Tester) tests

You'll need to have lit installed for Python:

  • Upgrade pip: python -m pip install -U pip
  • Install lit: python -m pip install lit
  • Make sure it works: python -c "import lit.main; lit.main.main();" --version .

To run the tests from your build dir you can do:

  • cd C:\LDC\build-ldc-x64
  • ctest -V -R lit-tests

or you can go to the tests folder inside your build dir, and run the runlit.py script:

  • cd C:\LDC\build-ldc-x64\tests
  • python runlit.py -v .

The second way is convenient for running individual tests:

  • python runlit.py -v codegen/align.d

Running the druntime/Phobos unit tests and druntime integration tests

  • Make sure the 64/32-bit libcurl.dll (bundled with LDC) can be found in a PATH directory. Verify by running where libcurl.dll.
  • cd C:\LDC\build-ldc-x64
  • Build the unit tests: ninja all-test-runners
  • Run the tests, excluding LDC unit tests, LIT tests and dmd-testsuite: ctest --output-on-failure -E "dmd-testsuite|lit-tests|ldc2-unittest"

Running the dmd-testsuite tests

  • If you haven't already, set the OS and MODEL environment variables:
    • set OS=windows (since v1.17, previously win{32,64})
    • set MODEL={32,64}
  • cd C:\LDC\build-ldc-x64
  • ctest -V -R dmd-testsuite
    • Debug only: ctest -V -R "build-run-dmd-testsuite|dmd-testsuite-debug"
    • Release only: ctest -V -R dmd-testsuite -E -debug

Developing/debugging LDC/LLVM with Visual Studio

Be sure to use Rainer's great Visual D plugin for VS.

  • cd C:\LDC
  • md vs-ldc-x64
  • cd vs-ldc-x64
  • Use the CMake command from the Build LDC section, but use the VS generator instead of Ninja this time: cmake -G "Visual Studio 15 Win64" ...

This creates the VS 2017 solution C:\LDC\vs-ldc-x64\ldc.sln. A Visual Studio solution for LLVM can be created the same way.

I don't recommend building LDC/LLVM with VS directly; I only use VS for development/debugging and build in the shell with Ninja.



Windows MSVC