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)
(VS 2010 is obsolete and Express doesn't even support x64. The newer versions are fully usable now.)
Line 6: Line 6:
  
 
* Windows 7 x64, of course!
 
* Windows 7 x64, of course!
* [http://microsoft.com/en-us/download/details.aspx?id=17718 .NET Framework 4.0] (prerequisite for Windows SDK)
+
* Install Visual Studio (e.g. [http://www.visualstudio.com/en-us/downloads/download-visual-studio-vs#DownloadFamilies_2 Visual Studio 2013 Express for Windows])
* [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://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://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")
Line 20: Line 19:
 
=== Environment check ===
 
=== 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.
+
After installing the software, you can open a &quot;VS2013 x64 Native Tools Command Prompt&quot;. 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.
  
 
My working directory is <tt>C:\ldcenv</tt>. Every step starts in this directory. Please feel free to adjust this to your needs.
 
My working directory is <tt>C:\ldcenv</tt>. Every step starts in this directory. Please feel free to adjust this to your needs.
Line 36: Line 35:
 
<li>The next command is only required if LLVM 3.4 is used:<br />
 
<li>The next command is only required if LLVM 3.4 is used:<br />
 
<tt>git checkout -t origin/release_34</tt><br />
 
<tt>git checkout -t origin/release_34</tt><br />
<li><tt>cd ..\build-llvm-x64</tt></li>
+
<li><tt>cd ..</tt></li>
<li><p>Type the next command in one line:</p>
+
<li><p>Use a command like this:</p>
<pre>cmake -G &quot;Visual Studio 10 Win64&quot; -DCMAKE_INSTALL_PREFIX=&quot;C:\Program Files\LLVM-x64&quot;  
+
<pre>cmake -G &quot;Visual Studio 12 Win64&quot; -DCMAKE_INSTALL_PREFIX=&quot;C:\Program Files\LLVM-x64&quot; -DCMAKE_CXX_FLAGS="/DWIN32 /D_HAS_EXCEPTIONS=0 /MP /W3 /GR- /GS- /d2Zi+"
 
       -DPYTHON_EXECUTABLE=&quot;C:\Program Files\Python33\python.exe&quot; -DLLVM_TARGETS_TO_BUILD=&quot;X86&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>
+
       -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_APPEND_VC_REV=ON llvm</pre></li>
<li><p><tt>msbuild ALL_BUILD.vcxproj</tt></p></li></ul>
+
</ul>
  
Open a Windows SDK 7.1 Command Prompt as Administrator.
+
Build the INSTALL project in the generated solution.
 
 
* <tt>cd build-llvm-x64</tt>
 
* <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>.
 
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>.
Line 54: Line 50:
 
Simple build instructions for libconfig++ are missing. You can do the following:
 
Simple build instructions for libconfig++ are missing. You can do the following:
  
* Install Visual Studio 2010 (e.g. [http://microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express Visual Studio 2010 Express])
 
 
* Open the libconfig.sln solution
 
* Open the libconfig.sln solution
* Create a profile for Win64 Debug
+
* Create a configuration for Win64 Debug
 
* If you like to create a static library then change the configuration type of project <tt>libconfig++</tt> to 'Static library'.
 
* If you like to create a static library then change the configuration type of project <tt>libconfig++</tt> to 'Static library'.
 
* Build the project <tt>libconfig++</tt>
 
* Build the project <tt>libconfig++</tt>
Line 80: Line 75:
 
<li>Now apply all the patches for LDC (see section 'Required source downloads' above):<br />
 
<li>Now apply all the patches for LDC (see section 'Required source downloads' above):<br />
 
<tt>git apply &lt;patch name&gt;</tt></li>
 
<tt>git apply &lt;patch name&gt;</tt></li>
<li><tt>cd ..\build-ldc2-x64</tt></li>
+
<li><tt>cd ..</tt></li>
 
<li><p>Type the next command in one line:</p>
 
<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\LDC&quot;
+
<pre>cmake -G &quot;Visual Studio 12 Win64&quot; -DCMAKE_INSTALL_PREFIX=&quot;C:\Program Files\LDC&quot; -DCMAKE_CXX_FLAGS="/DWIN32 /D_HAS_EXCEPTIONS=0 /MP /W2 /GR- /GS- /d2Zi+"
 
       -DLLVM_ROOT_DIR=&quot;C:/Program Files/LLVM-x64&quot;
 
       -DLLVM_ROOT_DIR=&quot;C:/Program Files/LLVM-x64&quot;
 
       -DLIBCONFIG++_INCLUDE_DIR=&quot;C:/ldcenv/libconfig-1.4.9/lib&quot;
 
       -DLIBCONFIG++_INCLUDE_DIR=&quot;C:/ldcenv/libconfig-1.4.9/lib&quot;
       -DLIBCONFIG++_LIBRARY=&quot;C:/ldcenv/libconfig-1.4.9/Debug/libconfig++.lib&quot; C:\ldcenv\ldc</pre>
+
       -DLIBCONFIG++_LIBRARY=&quot;C:/ldcenv/libconfig-1.4.9/Debug/libconfig++.lib&quot; ldc</pre>
 
<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>
 
<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><p><tt>msbuild ALL_BUILD.vcxproj</tt></p></li></ul>
+
</ul>
 
 
Open a Windows SDK 7.1 Command Prompt as Administrator.
 
  
* <tt>cd build-llvm-x64</tt>
+
Build the INSTALL project.
* <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>.
 
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>.
Line 99: Line 91:
  
 
* git 1.7.11 requires extra setup because of git-svn. Just use 1.7.10 or 1.8.0.
 
* git 1.7.11 requires extra setup because of git-svn. Just use 1.7.10 or 1.8.0.
* 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 ===
 
=== Known bugs ===

Revision as of 18:57, 28 June 2014

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.

Building LDC

Required software

Required source downloads

Environment check

After installing the software, you can open a "VS2013 x64 Native Tools Command Prompt". Running cmake --version should display the banner from cmake. Running git --version should display the banner from git. Running msbuild /version should display the banner from msbuild. Running <Python install path>\python --version should display the banner from python.

My working directory is C:\ldcenv. Every step starts in this directory. Please feel free to adjust this to your needs.

Build LLVM

To build LLVM from the command line, just execute the following steps:

  • md build-llvm-x64
  • git clone http://llvm.org/git/llvm.git llvm
  • cd llvm
  • The next command is only required if LLVM 3.5 head is used and if you want Win64 SEH support:
    git apply <path to LLVM patch>\win64eh_all_20130901.diff
  • The next command is only required if LLVM 3.4 is used:
    git checkout -t origin/release_34
  • cd ..
  • Use a command like this:

    cmake -G "Visual Studio 12 Win64" -DCMAKE_INSTALL_PREFIX="C:\Program Files\LLVM-x64" -DCMAKE_CXX_FLAGS="/DWIN32 /D_HAS_EXCEPTIONS=0 /MP /W3 /GR- /GS- /d2Zi+" 
          -DPYTHON_EXECUTABLE="C:\Program Files\Python33\python.exe" -DLLVM_TARGETS_TO_BUILD="X86"
          -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_APPEND_VC_REV=ON llvm

Build the INSTALL project in the generated solution.

The 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 -DLLVM_TARGETS_TO_BUILD="X86;ARM".

Build libconfig++

Simple build instructions for libconfig++ are missing. You can do the following:

  • Open the libconfig.sln solution
  • Create a configuration for Win64 Debug
  • If you like to create a static library then change the configuration type of project libconfig++ to 'Static library'.
  • Build the project libconfig++

Alternative you can use a custom CMakeLists.txt:

  • Extract libconfig++ file.
  • Download CMakeLists.txt from this gist and place it into the root folder.
  • Create a build directory: md build_libconfig
  • cd build_libconfig
  • Now create the build files:
  • cmake ..\libconfig-1.4.9
  • Build the library: msbuild ALL_BUILD.vcxproj

Build LDC2

To build LDC2 from the command line, just execute the following steps:

  • md build-ldc2-x64
  • git clone --recursive git://github.com/ldc-developers/ldc.git ldc
  • cd ldc
  • Now apply all the patches for LDC (see section 'Required source downloads' above):
    git apply <patch name>
  • cd ..
  • Type the next command in one line:

    cmake -G "Visual Studio 12 Win64" -DCMAKE_INSTALL_PREFIX="C:\Program Files\LDC" -DCMAKE_CXX_FLAGS="/DWIN32 /D_HAS_EXCEPTIONS=0 /MP /W2 /GR- /GS- /d2Zi+"
          -DLLVM_ROOT_DIR="C:/Program Files/LLVM-x64"
          -DLIBCONFIG++_INCLUDE_DIR="C:/ldcenv/libconfig-1.4.9/lib"
          -DLIBCONFIG++_LIBRARY="C:/ldcenv/libconfig-1.4.9/Debug/libconfig++.lib" ldc

    This assumes that you have a static compiled version of libconfig++.lib. If you use the DLL version then you have to add -DLIBCONFIG_DLL=ON.

Build the INSTALL project.

Check that C:\Program Files\LDC\bin is in your path and type ldc2 -version to check that you can run LDC2.

Troubleshooting

  • git 1.7.11 requires extra setup because of git-svn. Just use 1.7.10 or 1.8.0.

Known bugs

  • 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.
  • Execution of tests with the RUN_TESTS project does not work.

Hacking druntime and phobos

As of version 2.061 (still under development) Druntime and Phobos have support for Win64. The following issues are known:

  • ldc.eh2: Implementation has alpha quality. Only used together with LLVM 3.4.
  • Other missing functions: Most functions related to real type (long double in C) are missing because Visual C++ has dropped support for it (e.g. strtold(), sinl, cosl, ...). Some of them are already implemented (see e.g. std.math) but please be aware that there are still fake implementations present.

If you link your modules you have to specify the libraries phobos-ldc.lib and shell32.lib. Due to a bug in LLVM you have to specifiy the flag /LARGEADDRESSAWARE:NO, too.

Example

The simple D program hello.d

import std.stdio;

int main()
{
    writefln("Hello LDC2");
    return 0;
}

can be compiled and linked with the commands:

ldc2 -c hello.d
link hello2.obj phobos-ldc.lib shell32.lib /LARGEADDRESSAWARE:NO

or simply with: ldc2 hello.d

The resulting hello.exe produces the expected output.



Windows MSVC