TagLib Installation
===================

TagLib uses the CMake build system. As a user, you will most likely want to
build TagLib in release mode and install it into a system-wide location.
This can be done using the following commands:

    cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release .
    make
    sudo make install

In order to build the included examples, use the `BUILD_EXAMPLES` option:

    cmake -DBUILD_EXAMPLES=ON [...]

If you want to build TagLib without ZLib, you can use

    cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release -DWITH_ZLIB=OFF .
    make
    sudo make install

See http://www.cmake.org/cmake/help/runningcmake.html for generic help on
running CMake.

Mac OS X
--------

On Mac OS X, you might want to build a framework that can be easily integrated
into your application. If you set the BUILD_FRAMEWORK option on, it will compile
TagLib as a framework. For example, the following command can be used to build
a framework with Mac OS X 10.10 as the deployment target:

    mkdir build; cd build
    cmake .. -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_TESTING=OFF \
      -DBUILD_FRAMEWORK=ON \
      -DCMAKE_OSX_DEPLOYMENT_TARGET=10.10 \
      -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64"
    make

For a 10.10 static library, use:

    mkdir build; cd build
    cmake .. -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_TESTING=OFF \
      -DBUILD_SHARED_LIBS=OFF \
      -DCMAKE_OSX_DEPLOYMENT_TARGET=10.10 \
      -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64"
    make

After `make`, and `make install`, add `libtag.` to your XCode project, and add
the include folder to the project's User Header Search Paths.

Windows
-------

It's Windows ... Systems vary!
This means you need to adjust things to suit your system, especially paths.

Tested with:
* Microsoft Visual Studio 2010, 2015, 2017
* Microsoft C++ Build Tools 2015, 2017 (standalone packages not requiring Visual Studio)
* GCC by mingw-w64.sf.net v4.6.3 (Strawberry Perl 32b)
* MinGW32-4.8.0

Requirements:
* Tool chain, build environment, whatever ya want to call it ...
     Installed and working.
* CMake program. (Available at: www.cmake.org)
     Installed and working.

Optional:
*  Zlib library.
     Available in some tool chains, not all.
     Search the web, take your choice.

Useful configuration options used with CMake (GUI and/or command line):
  Any of the `ZLIB_` variables may be used at the command line, `ZLIB_ROOT` is only
  available on the command line.

  | option                  | description |
  | ----------------------- | ----------- |
  | `WITH_ZLIB=`            | Whether to build with ZLib |
  | `ZLIB_ROOT=`            | Where to find ZLib's root directory. Assumes parent of: `\include` and `\lib.`|
  | `ZLIB_INCLUDE_DIR=`     | Where to find ZLib's Include directory.|
  | `ZLIB_LIBRARY=`         | Where to find ZLib's Library.
  | `ZLIB_SOURCE=`          | Where to find ZLib's Source Code. Alternative to `ZLIB_INCLUDE_DIR` and `ZLIB_LIBRARY`.
  | `CMAKE_INSTALL_PREFIX=` | Where to install Taglib. |
  | `CMAKE_BUILD_TYPE=`     | Release, Debug, etc ... (Not available in MSVC) |

The easiest way is at the command prompt (Visual C++ command prompt for MSVS users – batch file and/or shortcuts are your friends).

1.  **Build the Makefiles:**

    Replace "GENERATOR" with your needs.
    * For MSVS: `Visual Studio XX YYYY`, e.g. `Visual Studio 14 2015`.

      **Note**: As Visual Studio 2017 supports CMake, you can skip this step and open the taglib
      folder in VS instead.
    * For MinGW: `MinGW Makefiles`

          C:\GitRoot\taglib> cmake -G "GENERATOR"  -DCMAKE_INSTALL_PREFIX=C:\Libraries\taglib

    Or use the CMake GUI:
    1. Open CMake GUI.
    2. Set paths: *Where is the source code* and *Where to build the binaries*.

       In the example, both would be: `C:\GitRoot\taglib`
    3. Tick: Advanced
    4. Select: Configure
    5. Select: Generator
    6. Tick: Use default native compilers
    7. Select: Finish
      Wait until done.
    8. If using ZLib, Scroll down.
    (to the bottom of the list of options ... should go over them all)
       1. Edit: `ZLIB_INCLUDE_DIR`
       2. Edit: `ZLIB_LIBRARY`
    9. Select: Generate

2.  **Build the project**
    * MSVS:

          C:\GitRoot\taglib> msbuild all_build.vcxproj /p:Configuration=Release
      OR (Depending on MSVS version or personal choice)

          C:\GitRoot\taglib> devenv all_build.vcxproj /build Release
      OR in the MSVS GUI:
      1. Open MSVS.
      2. Open taglib solution.
      3. Set build type to: Release (look in the tool bars)
      2. Hit F7 to build the solution. (project)
    * MinGW:

          C:\GitRoot\taglib> gmake

      OR (Depending on MinGW install)

          C:\GitRoot\taglib> mingw32-make



3.  **Install the project**

    (Change `install` to `uninstall` to uninstall the project)
    * MSVS:

          C:\GitRoot\taglib> msbuild install.vcxproj
      OR (Depending on MSVC version or personal choice)

          C:\GitRoot\taglib> devenv install.vcxproj

      Or in the MSVS GUI:
        1. Open project.
        2. Open Solution Explorer.
        3. Right Click: INSTALL
        4. Select: Project Only
        5. Select: Build Only INSTALL
    * MinGW:

          C:\GitRoot\taglib> gmake install
      OR (Depending on MinGW install)

          C:\GitRoot\taglib> mingw32-make install


To build a static library, set the following two options with CMake:

    -DBUILD_SHARED_LIBS=OFF -DENABLE_STATIC_RUNTIME=ON

Including `ENABLE_STATIC_RUNTIME=ON` indicates you want TagLib built using the
static runtime library, rather than the DLL form of the runtime.

Unit Tests
----------

If you want to run the test suite to make sure TagLib works properly on your
system, you need to have cppunit installed. To build the tests, include
the option `-DBUILD_TESTING=ON` when running cmake.

The test suite has a custom target in the build system, so you can run
the tests using make:

    make check

Windows MinGW:

* Get cppunit from https://www.freedesktop.org/wiki/Software/cppunit/
* Build it for MinGW:
  - `./autogen.sh`
  - `./configure --disable-shared`
  - `mingw32-make; mingw32-make install DESTDIR=/path/to/install/dir`
* Build TagLib with testing enabled:
  - ```
    cmake -G "MinGW Makefiles" -DBUILD_TESTING=ON -DBUILD_EXAMPLES=ON -DBUILD_SHARED_LIBS=OFF \
    -DCPPUNIT_INCLUDE_DIR=/path/to/cppunit/include \
    -DCPPUNIT_LIBRARIES=/path/to/cppunit/lib/libcppunit.a \
    -DCPPUNIT_INSTALLED_VERSION=1.15.1
    ```
  - `mingw32-make`
  - `mingw32-make check`

Windows MSVS:

* Get cppunit from https://www.freedesktop.org/wiki/Software/cppunit/
* Build it in Visual Studio:
  - Open examples/examples2008.sln, convert all, do not overwrite.
  - Set architecture to x64, build configuration, e.g. Debug DLL.
  - It may fail, but the needed libraries should be available in src\cppunit\DebugDll.
* Build TagLib with testing enabled:
  - ```
    cmake -G "Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON -DBUILD_EXAMPLES=ON
    -DBUILD_SHARED_LIBS=OFF -DENABLE_STATIC_RUNTIME=ON
    -DCPPUNIT_INCLUDE_DIR=\path\to\cppunit\include
    -DCPPUNIT_LIBRARIES=\path\to\cppunit\DebugDll\cppunitd_dll.lib
    -DCPPUNIT_INSTALLED_VERSION=1.15.1
    ```
  - `msbuild all_build.vcxproj /p:Configuration=Debug`
  - `path %path%;\path\to\cppunit\DebugDll`
  - `tests\Debug\test_runner.exe`

macOS:

* Install cppunit using a package manager, e.g. `brew install cppunit`
* Build TagLib with testing enabled:
  - `cmake -DBUILD_TESTS=ON -DBUILD_EXAMPLES=ON -DBUILD_SHARED_LIBS=OFF`
  - `make`
  - `make check`
