Skip to content

Building

Joachim Metz edited this page Oct 8, 2017 · 12 revisions

Read first

GitHub will offer you the download options "Source code (zip)" and "Source code (tar.gz)". These are copies of the source, as-is, in the git repository and not suited for distribution. Instead it is highly recommend to use the provided source distribution package, which contains all the necessary dependencies.

Introduction

The libvmdk source code can be build with different compilers:

Or directly packaged with different package managers:

Getting the source

Source distribution package

To retrieve the source distribution package go to the downloads page and download the file named:

libvmdk-alpha-<version>.tar.gz

To extract the source distribution package run:

tar xfv libvmdk-alpha-<version>.tar.gz

This will create the source directory:

libvmdk-<version>

Git

Note that the git repository holds the development version of the source code.

If you are not developing it is recommended that you download a source distribution package instead.

To retrieve the source from the git repository make sure to install:

  • git
  • aclocal
  • autoconf
  • automake
  • autopoint or gettextize
  • libtoolize
  • pkg-config

To download and prepare the source for building run:

git clone https://github.com/libyal/libvmdk.git
cd libvmdk/
./synclibs.sh
./autogen.sh

The source from the git repository will not work without synchronizing the library dependencies "./synclibs.sh" and having the autotools generate the necessary files "./autogen.sh".

Debian/Ubuntu

On Debian based Linux distributions such as Ubuntu install the following packages:

sudo apt install autoconf automake autopoint libtool pkg-config

Mac OS X

On Mac OS X the XCode command line tools no longer provide the autotools you can obtain them e.g. via MacPorts. Install the following packages:

sudo port install autoconf automake gettext libtool pkgconfig

Microsoft Visual Studio

Since Microsoft Visual Studio does not come with a Unix shell or equivalent you'll need to use the Windows PowerShell scripts instead:

git clone https://github.com/libyal/libvmdk.git
cd libvmdk\
.\synclibs.ps1
.\autogen.ps1

Check "appveyor.yml" to make sure there are additional PowerShell scripts you need to run.

Using GNU Compiler Collection (GCC)

Before you build the libvmdk source code using the GNU Compiler Collection (GCC) you'll need to have compilation and build tools installed.

  • On a Linux system make sure you have build-essential (Debian-based) or the Development Tools (RedHat-based) packages installed.
  • On a Mac OS X system make sure you have XCode (with command line tools) or MacPorts (or equivalent) installed.

Also make sure to have the following dependencies including source headers installed:

  • zlib (for DEFLATE compression support) (optional but recommended, can be disabled by --with-zlib=no)

If you want to be able to use vmdkmount, make sure that:

  • on a Linux system you have libfuse-dev (Debian-based) or fuse-devel (RedHat-based) installed.
  • on a Mac OS X system, you have OSXFuse (http://osxfuse.github.com/) installed.

To build the libvmdk source code change into the source directory and run the following commands:

./configure
make

You can install the binaries that were build by running:

sudo make install

By default this will install the binaries in /usr/local. If you want to change this to e.g. /usr, add the configuration option --prefix=/usr, e.g.

./configure --prefix=/usr

On Linux make sure libvmdk.so is in the library cache. Normally it suffices to run:

sudo ldconfig

Verbose and debug output

To troubleshoot issues or for low-level format analysis libvmdk supports verbose and debug output.

To enable verbose and debug output support add --enable-verbose-output and --enable-debug-output to configure, e.g.

./configure --enable-verbose-output --enable-debug-output

This will generate vast amounts of debug information on stderr when the tools are run with -v.

Static library

To make a static library add --enable-shared=no to configure, .e.g:

./configure --enable-shared=no

Static executables

Some distributions provide separate packages for static versions of libraries. Make sure you have a static versions of:

  • glibc
  • zlib (for DEFLATE compression support) (optional but recommended, can be disabled by --with-zlib=no)
  • fuse (optional, can be disabled by --with-libfuse=no)

To make static executables add --enable-static-executables=yes to configure, .e.g:

./configure --enable-static-executables=yes

Python-bindings

To compile the Python-bindings you'll need the Python development files.

Make sure that on:

  • a Linux machine, you have python-dev (Debian-based) or python-devel (RedHat-based) installed.
  • a Mac OS X machine, XCode if you're using a different Python source tree see Mac OS X notes below.

Adding --enable-python when running ./configure will enable the Python-bindings to be build.

./configure --enable-python

Cygwin

If you want to use Cygwin to build libvmdk make sure to have the following packages installed:

  • autoconf
  • automake
  • binutils
  • gcc-core
  • gettext
  • libiconv
  • libtool
  • make
  • pkg-config
  • zlib-devel (for DEFLATE compression support) (optional but recommended, can be disabled by --with-zlib=no)

After following the GNU Compiler Collection (GCC) build instructions you should end up with the following DLL:

libvmdk/.libs/cygvmdk-0.dll

And the following executables:

vmdktools/.libs/vmdkinfo.exe
vmdktools/.libs/vmdkmount.exe

Using the DLL

Make sure you use define LIBVMDK_DLL_IMPORT before including <libvmdk.h>.

To be able to use the DLL on other systems than the build system you'll also need to provide:

  • cygwin1.dll

Mac OS X

Universal binary

With XCode you can build a Mac OS X universal binary to run on multiple architectures. The supported architectures and exact command differs per version of Mac OS X.

Mac OS X 10.4

E.g. on Mac OS X 10.4 to build an PPC and Intel 32-bit multi binary, run the following commands:

CFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386" \
LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386" \
./configure --disable-dependency-tracking
make
make install

Mac OS X 10.6

E.g. on Mac OS X 10.6 to build an Intel 32-bit and 64-bit multi binary, run the following commands:

CFLAGS="-isysroot /Developer/SDKs/MacOSX10.6.sdk -arch x86_64 -arch i386" \
LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -arch x86_64 -arch i386" \
./configure --disable-dependency-tracking
make
make install

Mac OS X 10.7

E.g. on Mac OS X 10.7 to build an Intel 32-bit and 64-bit multi binary, run the following commands:

CFLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk -arch x86_64 -arch i386" \
LDFLAGS="-Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk -arch x86_64 -arch i386" \
./configure --disable-dependency-tracking
make
make install

libtoolize

If you find that libtoolize is missing use glibtoolize instead.

Python-bindings

Mac OS X comes with multiple platform specific build Python versions. If you install a different version of Python on Mac OS X make sure that when building and running the Python-bindings you're using the correct version otherwise it will likely result in one of the following errors:

Fatal Python error: Interpreter not initialized (version mismatch?)
Fatal Python error: PyThreadState_Get: no current thread

To build against a specific version you can tell configure where to look:

CFLAGS=-I/Library/Frameworks/Python.framework/Versions/2.7/include/ \
LDFLAGS=-L/Library/Frameworks/Python.framework/Versions/2.7/lib/ \
./configure --enable-python --with-pyprefix

Adding --with-pyprefix tells configure to use Python to determine where to install the Python-bindings.

Sun Solaris

To build libvmdk on Sun Solaris make sure that /usr/ccs/bin and /usr/sfw/bin are defined in the PATH environment variable.

Using Minimalist GNU for Windows (MinGW)

To compile libvmdk using MinGW you'll need:

  • MinGW
  • MinGW build of zlib library and source headers (for DEFLATE compression support) (optional but recommended, can be disabled by --with-zlib=no)

To build use:

mingw32-configure --prefix=/opt/local/i386-mingw32 --enable-winapi=yes
mingw32-make

It is recommended that you use WINAPI support but it is possible to compile libvmdk without it (--enable-winapi=no). The default behavior is that configure will try to auto-detect MinGW and enable WINAPI support.

If mingw32-configure and mingw32-make are not available you can build it with:

./configure --host=i386-mingw32 --prefix=/opt/local/i386-mingw32 --enable-winapi=yes
make

If this does not work try a script similar to the following:

#!/bin/sh
CC=/opt/local/bin/i386-mingw32-gcc
CXX=/opt/local/bin/i386-mingw32-g++
AR=/opt/local/bin/i386-mingw32-ar
OBJDUMP=/opt/local/bin/i386-mingw32-objdump
RANLIB=/opt/local/bin/i386-mingw32-ranlib
STRIP=/opt/local/bin/i386-mingw32-strip
MINGWFLAGS="-mwin32 -mconsole -march=i586 "
CFLAGS="$MINGWFLAGS"
CXXFLAGS="$MINGWFLAGS"

CC=$CC CXX=$CXX AR=$AR OBJDUMP=$OBJDUMP RANLIB=$RANLIB STRIP=$STRIP ./configure --host=i586-mingw32msvc --prefix=/opt/local/i386-mingw32 --enable-winapi=yes
CC=$CC CXX=$CXX AR=$AR OBJDUMP=$OBJDUMP RANLIB=$RANLIB STRIP=$STRIP CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" make

If you get compiler errors like:

#error WINAPI file open function for Windows 2000 or earlier NOT implemented yet

That means WINVER is not set or set to a version predating Windows XP (0x0501) and you'll have to set WINVER manually like:

CFLAGS=-DWINVER=0x0501 ./configure --host=i386-mingw32 --enable-winapi=yes

You should end up with the following DLL:

libvmdk/.libs/libvmdk-1.dll

And the following executables:

vmdktools/.libs/vmdkinfo.exe
vmdktools/.libs/vmdkmount.exe

To install libvmdk and tools in the MinGW build tree use:

sudo make install

Using MSYS-MinGW

MSYS-MinGW provides means to run configure on Windows.

Installing MSYS-MinGW

Download mingw-get from http://www.mingw.org/

Install mingw-get, you'll only need the command line interface.

More information can be found here.

Start a command prompt and change into the MinGW binaries directory:

cmd.exe
cd C:\mingw\bin\

To install the required MinGW and MSYS packages run:

mingw-get install binutils mingw-runtime w32api libgmp libmpc libiconv pthreads gettext libz gcc-core mingw32-make msys

Building with MSYS-MinGW

Start the MSYS shell:

C:\MinGW\msys\1.0\msys.bat

Make sure the MinGW directory is mounted, otherwise run the following command to mount:

mkdir /mingw
mount C:\\MinGW /mingw

Note: make sure to use the the double \ and that /mingw has no trailing /

To build use:

tar xfv libvmdk-alpha-<version>.tar.gz
cd libvmdk-<version>/
CPPFLAGS=-DWINVER=0x0501 ./configure --prefix=/mingw
make

Using the DLL

Make sure you use define LIBVMDK_DLL_IMPORT before including <libvmdk.h>.

To be able to use the DLL on other systems than the build system you'll also need to provide:

  • libgcc_s_dw2-1.dll (or equivalent)

Troubleshooting

While running make I get an error similar to the following:

libclocale_locale.c: In function 'libclocal_local_get_decimal_point':
libclocale_locale.c:357:2: warning implicit declaration of function 'GetLocaleInfoEx' [-Wimplicit-function-declaration]
libclocale_locale.c:358:7: error: 'LOCALE_NAME_USER_DEFAULT' undeclared (first use in this function)
libclocale_locale.c:358:7: note: each undeclared identifier is reported only once for every function it appears in

The version of MinGW does not support a WINAPI version of Vista or later (0x0600) try setting WINVER to 0x0501.

Using Microsoft Visual Studio

Before you build libvmdk using Microsoft Visual Studio you'll need to have it installed. The libvmdk packages comes with Microsoft Visual Studio files for version 2008. Version 2010 is able to convert these files into its newer versions.

The Microsoft Visual Studio express version is sufficient. Note that if you want to build 64-bit version with the express version you'll need at least 2010. Also see the section: Microsoft Visual Studio 2010 express and 64-bit compilation.

Note that if you want to build libvmdk from source checked out of git with Visual Studio make sure the autotools are able to make a distribution package of libvmdk before trying to build it. You can create distribution package by running: "make dist".

To compile libvmdk using Microsoft Visual Studio you'll need:

  • zlib (for DEFLATE compression support)

If you want to be able to use vmdkmount you'll need Dokan library see the corresponding section below. Otherwise ignore or remove the dokan_dll and vmdkmount Visual Studio project files.

Verbose and debug output

To troubleshoot issues or for low-level format analysis libvmdk supports verbose and debug output.

To enable verbose and debug output support edit:

common\config_winapi.h

Add the following definitions:

#define HAVE_VERBOSE_OUTPUT     1
#define HAVE_DEBUG_OUTPUT       1

zlib

Download the latest zlib source distribution package including from the zlib project site: http://www.gzip.org/zlib/. Extract the contents of the zlib source distribution package to the directory containing the libvmdk-<version> directory. Normally the extracted zlib source directory will have a version number e.g. zlib-1.2.8, to remain version independent rename the directory to zlib.

Dokan library

Get the Dokan installation from: http://dokan-dev.net/en/ and install the driver.

Get the source.

svn checkout http://dokan.googlecode.com/svn/trunk/ dokan

The Visual Studio project files expect the source directory to be named dokan and located in the directory containing the libvmdk-<version> directory.

Download dokan.patch.

Apply the patch:

cd dokan
patch -p1 < ../dokan.patch

The Dokan library is now ready to be build from the libvmdk Visual Studio solution file and will be named dokan.dll.

Python-bindings

To compile the pyvmdk Python-bindings you'll need the Python development files which are part of the Python.org windows installer package.

The Microsoft Visual Studio files are configured to look in:

C:\Python2.7\

If you want to have the Python development files in a different location you'll have to change the pyvmdk Microsoft Visual Studio settings.

Note that the VSDebug build of the Python-bindings will fail since the Python development files do not come with python2.7_d.lib.

If you do not intend to build the Python-bindings you can safely ignore build errors regarding: pyvmdk.

Building

Open the file:

msvscpp\libvmdk.sln

Note that the project files contain a Release and VSDebug configuration. The VSDebug builds the binaries with debug information. Note that this is not the same as debug output.

Make sure to check if your build environment defines the correct WINVER for your build. The code uses WINAPI version specific functions based on WINVER. You can define a custom WINVER in the Microsoft Visual Studio C++ project files or in common\config_winapi.h

And build the solution. The build files will be places in:

msvscpp\Release\

Using MSBuild

Another way to build libvmdk with Visual Studio is to use MSBuild via the command line. MSBuild can be installed as part of the Microsoft.NET Framework.

First set-up the Visual Studio variables:

C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat

Next run MSBuild:

msbuild msvscpp\libvmdk.sln /p:Configuration=Release;Platform=Win32

Using the DLL

Make sure you use define LIBVMDK_DLL_IMPORT before including <libvmdk.h>.

To be able to use the DLL on other systems than the build system you'll also need to provide:

  • the Microsoft Visual C++ Run-Time DLL (part of the Visual C++ Redistributable package) libvmdk.dll is dependent on:
  • zlib.dll

These DLLs can be found in the same directory as libvmdk.dll.

64-bit with Microsoft Visual Studio express

To build a 64-bit version of libvmdk with Microsoft Visual Studio express you'll need at least the 2010 version.

Microsoft Visual Studio express 2010 and later

First make sure to enabling 64-bit compilation support on Microsoft Visual Studio. For Visual Studio 2010 express this can be a tedious process, some relevant links:

If you have set up Visual Studio correctly the following should work:

Go to:

Configuration manager -> Active solution platform

Select "<New>"

  • Type or select the new platform: "x64"
  • Copy settings from: "Win32"
  • Create new project platforms: enabled

Additionally for every project change:

Configuration Properties -> General -> Platform Toolset

Into "Windows7.1SDK" or equivalent.

msvscpp-convert script

If you've Python installed on your Visual Studio build machine you can try running msvscpp-convert to convert the Visual Studio 2008 solution files to 2010 format and add the x64 settings for you with the option --extend-with-x64.

msvscpp-convert.py --extend-with-x64 --output-format 2010 msvscpp\libvmdk.sln

This will create a subdirectory named vs2010 which contains the Visual Studio 2010 solution files.

Using Debian package tools (DEB)

To build libvmdk using the Debian package tools make sure you have the following packages installed:

sudo apt-get install build-essential debhelper fakeroot autotools-dev zlib1g-dev libfuse-dev python-all-dev python3-all-dev

If you downloaded the source using git make sure to run ./configure at least once to generate the dpkg packaging files.

To build the Debian packages change into the source directory and run:

cp -rf dpkg debian
dpkg-buildpackage -rfakeroot

This will create the following files in the parent directory:

libvmdk_<version>-1_<arch>.deb
libvmdk-dev_<version>-1_<arch>.deb
libvmdk-python_<version>-1_<arch>.deb
libvmdk-python3_<version>-1_<arch>.deb
libvmdk-tools_<version>-1_<arch>.deb

To install, e.g. the library:

sudo dpkg -i libvmdk_<version>-1_<arch>.deb

Using RedHat package tools (RPM)

To build libvmdk using the RedHat package tools make sure you have the following packages installed:

yum install rpm-build zlib-devel fuse-devel python-devel python3-devel

To build:

mv libvmdk-alpha-<version>.tar.gz libvmdk-<version>.tar.gz
rpmbuild -ta libvmdk-<version>.tar.gz

This will create the following files in the rpmbuild directory:

~/rpmbuild/RPMS/<arch>/libvmdk-<version>-1.<arch>.rpm
~/rpmbuild/RPMS/<arch>/libvmdk-devel-<version>-1.<arch>.rpm
~/rpmbuild/RPMS/<arch>/libvmdk-python-<version>-1.<arch>.rpm
~/rpmbuild/RPMS/<arch>/libvmdk-python3-<version>-1.<arch>.rpm
~/rpmbuild/RPMS/<arch>/libvmdk-tools-<version>-1.<arch>.rpm
~/rpmbuild/SRPMS/libvmdk-<version>-1.src.rpm

To install, e.g. the library:

sudo rpm -ivh libvmdk-<version>-1.<arch>.rpm

Using Mac OS X pkgbuild

pkgbuild can be used to create a Mac OS X package.

The following instructions show how to build libvmdk.pkg and libvmdk.dmg from the command line.

First build libvmdk:

./configure --prefix=/usr --enable-python --with-pyprefix
make

Next install the build files using DESTDIR

make install DESTDIR=$PWD/tmp

This will make sure that library paths in the dylib file is set correctly for distribution. This is not the case when you use:

./configure --prefix=$PWD/tmp --enable-python --with-pyprefix

You can check the library paths in the dylib by running:

otool -LT tmp/usr/lib/libvmdk.1.dylib

After running "make install" the binaries are installed in:

$PWD/tmp/

If you are planning to distribute libvmdk.pkg make sure it contains a copy of LGPL license:

mkdir -p $PWD/tmp/usr/share/doc/libvmdk
cp AUTHORS COPYING NEWS README $PWD/tmp/usr/share/doc/libvmdk

To create the package (directory):

pkgbuild --root $PWD/tmp --identifier com.github.libyal.libvmdk --version <version> --ownership recommended ../libvmdk-<version>.pkg

To create a distributable disk image:

hdiutil create ../libvmdk-<version>.dmg -srcfolder ../libvmdk-<version>.pkg -fs HFS+

Using setup.py

setup.py can be used to create a Python-binding only build.

python setup.py build
sudo python setup.py install

For more details see:

python setup.py --help
Clone this wiki locally