1| Travis | AppVeyor | GitLab| Codecov| Repology| Chat | 2|:-------------:|:-------------:|:-----:|:------:|:-------:|:----:| 3| [![Build Status](https://travis-ci.org/Exiv2/exiv2.svg?branch=0.27-maintenance)](https://travis-ci.org/Exiv2/exiv2) | [![Build status](https://ci.appveyor.com/api/projects/status/d6vxf2n0cp3v88al/branch/0.27-maintenance?svg=true)](https://ci.appveyor.com/project/piponazo/exiv2-wutfp/branch/0.27-maintenance) | [![pipeline status](https://gitlab.com/D4N/exiv2/badges/0.27-maintenance/pipeline.svg)](https://gitlab.com/D4N/exiv2/commits/0.27-maintenance) | [![codecov](https://codecov.io/gh/Exiv2/exiv2/branch/0.27-maintenance/graph/badge.svg)](https://codecov.io/gh/Exiv2/exiv2) | [![Packaging status](https://repology.org/badge/tiny-repos/exiv2.svg)](https://repology.org/metapackage/exiv2/versions) | [![#exiv2-chat on matrix.org](matrix-standard-vector-logo-xs.png)](https://matrix.to/#/#exiv2-chat:matrix.org) | 4 5<div id="1"> 6# Welcome to Exiv2 7 8Exiv2 is a C++ library and a command-line utility to read, 9write, delete and modify Exif, IPTC, XMP and ICC image metadata. 10 11| Exiv2 Resource | Location | 12|:---------- |:------ | 13| Releases and Documentation<br>Prereleases:<br>Project Resources<br>License (GPLv2)<br>CMake Downloads | [https://exiv2.org](https://exiv2.org)<br>[https://pre-release.exiv2.org](https://pre-release.exiv2.org)<br>[https://github.com/Exiv2/exiv2](https://github.com/Exiv2/exiv2)<br>[COPYING](COPYING)<br>[https://cmake.org/download/](https://cmake.org/download/) | 14| README.md<br>README-CONAN.md<br>README-SAMPLES.md | User Manual. _This document_<br>Conan User Manual _[click here](README-CONAN.md)_<br>Sample Code Manual. _[click here](README-SAMPLES.md)_ | 15 16The file ReadMe.txt in a build bundle describes how to install the library on the platform. ReadMe.txt also documents how to compile and link code on the platform. 17 18<div id="TOC"> 19### TABLE OF CONTENTS 20![Exiv2](exiv2.png) 21 221. [Welcome to Exiv2](#1) 232. [Building, Installing, Using and Uninstalling Exiv2](#2) 24 1. [Build, Install, Use and Uninstall Exiv2 on a UNIX-like system](#2-1) 25 2. [Build and Install Exiv2 with Visual Studio](#2-2) 26 3. [Build Options](#2-3) 27 4. [Dependencies](#2-4) 28 5. [Building and linking your code with Exiv2](#2-5) 29 6. [Consuming Exiv2 with CMake](#2-6) 30 7. [Using pkg-config to compile and link your code with Exiv2](#2-7) 31 8. [Localisation](#2-8) 32 9. [Building Exiv2 Documentation](#2-9) 33 10. [Building Exiv2 Packages](#2-10) 34 11. [Debugging Exiv2](#2-11) 35 12. [Building Exiv2 with Clang and other build chains](#2-12) 36 13. [Building Exiv2 with ccache](#2-13) 37 14. [Thread Safety](#2-14) 38 15. [Library Initialisation and Cleanup](#2-15) 39 16. [Cross Platform Build and Test on Linux for MinGW](#2-16) 40 17. [Building with C++11 and other compilers](#2-17) 41 18. [Static and Shared Libraries](#2-18) 42 19. [Support for bmff files (CR3, HEIF, HEIC, and AVIF)](#2-19) 433. [License and Support](#3) 44 1. [License](#3-1) 45 2. [Support](#3-2) 464. [Test Suit](#4) 47 1. [Running tests on a UNIX-like system](#4-1) 48 2. [Running tests on Visual Studio builds](#4-2) 49 3. [Unit tests](#4-3) 50 4. [Python tests](#4-4) 51 5. [Test Summary](#4-5) 525. [Platform Notes](#5) 53 1. [Linux](#5-1) 54 2. [macOS](#5-2) 55 3. [MinGW/msys2](#5-3) 56 4. [Cygwin](#5-4) 57 5. [Visual Studio](#5-5) 58 6. [Unix](#5-6) 59 60[TOC](#TOC) 61<div id="2"> 62## 2 Building, Installing, Using and Uninstalling Exiv2 63 64You need [CMake](https://cmake.org/download/) to configure the Exiv2 project and the GCC or Clang compiler and associated tool chain. 65 66<div id="2-1"> 67### 2.1 Build, Install, Use Exiv2 on a UNIX-like system 68 69```bash 70$ cd ~/gnu/github/exiv2 # location of the project code 71$ mkdir build && cd build 72$ cmake .. -DCMAKE_BUILD_TYPE=Release 73$ cmake --build . 74$ make tests 75$ sudo make install 76``` 77 78This will install the library into the "standard locations". The library will be installed in `/usr/local/lib`, executables (including the exiv2 command-line program) in `/usr/local/bin/` and header files in `/usr/local/include/exiv2` 79 80cmake generates files in the build directory. cmake generates the project/solution/makefiles required to build the exiv2 library and sample applications. cmake also creates the files exv\_conf.h and exiv2lib\_export which contain compiler directives about the build options you have chosen and the availability of libraries on your machine. 81 82#### Using the exiv2 command-line program 83 84To execute the exiv2 command line program, you should update your path to search /usr/local/bin/ 85 86```bash 87$ export PATH="/usr/local/bin:$PATH" 88``` 89 90You will also need to locate libexiv2 at run time: 91 92```bash 93$ export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" # Linux, Cygwin, MinGW/msys2 94$ export DYLD_LIBRARY_PATH="/usr/local/lib:$DYLD_LIBRARY_PATH" # macOS 95``` 96 97#### Uninstall 98 99I don't know why anybody would uninstall Exiv2. 100 101```bash 102$ cd ~/gnu/github/exiv2 # location of the project code 103$ cd build 104$ sudo make uninstall 105``` 106 107These commands will remove the exiv2 executables, library, header files and man page from the standard locations. 108 109[TOC](#TOC) 110<div id="2-2"> 111### 2.2 Build and Install Exiv2 with Visual Studio 112 113We recommend that you use conan to download the Exiv2 external dependencies on Windows. On other platforms (maxOS, Ubuntu and others), you should use the platform package manger. These are discussed: [Platform Notes](#5) The options to configure and compile the project using Visual Studio are similar to UNIX like systems. 114See [README-CONAN](README-CONAN.md) for more information about Conan. 115 116When you build, you may install with the following command. 117 118```cmd 119> cmake --build . --target install 120``` 121This will create and copy the exiv2 build artefacts to C:\Program Files (x86)\exiv2\. You should modify your path to include C:\Program Files (x86)\exiv2\bin. 122 123[TOC](#TOC) 124<div id="2-3"> 125### 2.3 Build options 126 127There are two groups of CMake options. There are many options defined by CMake. Here are some particularly useful options: 128 129| Options | Purpose (_default_) | 130|:------------- |:------------- | 131| CMAKE\_INSTALL\_PREFIX<br/>CMAKE\_BUILD\_TYPE<br/>BUILD\_SHARED\_LIBS | Where to install on your computer _**(/usr/local)**_<br/>Type of build _**(Release)**_ See: [Debugging Exiv2](#2-11) <br/>Build exiv2lib as shared or static _**(On)**_ | 132 133Options defined by <exiv2>/CMakeLists.txt include: 134 135```bash 136576 rmills@rmillsmm:~/gnu/github/exiv2/exiv2 $ grep ^option CMakeLists.txt 137option( BUILD_SHARED_LIBS "Build exiv2lib as a shared library" ON ) 138option( EXIV2_ENABLE_XMP "Build with XMP metadata support" ON ) 139option( EXIV2_ENABLE_EXTERNAL_XMP "Use external version of XMP" OFF ) 140option( EXIV2_ENABLE_PNG "Build with png support (requires libz)" ON ) 141... 142option( EXIV2_ENABLE_BMFF "Build with BMFF support" OFF) 143577 rmills@rmillsmm:~/gnu/github/exiv2/exiv2 $ 144``` 145 146Options are defined on the CMake command-line: 147 148```bash 149$ cmake -DBUILD_SHARED_LIBS=On -DEXIV2_ENABLE_NLS=Off 150``` 151 152It is planned to set the default -DEXIV2\_ENABLE\_BMFF=On for Exiv2 v1.00. BMFF support is disabled by default in v0.27. 153 154 155[TOC](#TOC) 156<div id="2-4"> 157### 2.4 Dependencies 158 159The following Exiv2 features require external libraries: 160 161| Feature | Package | Default | To change default | Availability | 162|:-------------------------- |:-------- |:--------:| :---------------------------- |:----------- | 163| PNG image support | zlib | ON | -DEXIV2\_ENABLE\_PNG=Off | [http://zlib.net/](http://zlib.net/) | 164| XMP support | expat | ON | -DEXIV2\_ENABLE\_XMP=Off | [http://expat.sourceforge.net](http://expat.sourceforge.net)/<br/>Use _**Expat 2.2.6**_ and later | 165| Natural language system | gettext | OFF | -DEXIV2\_ENABLE\_NLS=On | [http://www.gnu.org/software/gettext/](http://www.gnu.org/software/gettext/) | 166| Character set conversion | libiconv | | Disabled for Visual Studio.<br>Linked when installed on UNIX like platforms. | [https://www.gnu.org/software/libiconv/](https://www.gnu.org/software/libiconv/) | 167| Unit test framework | gtest | OFF | -DEXIV2\_BUILD\_UNIT\_TESTS=On | [https://github.com/google/googletest/archive/](https://github.com/google/googletest/archive/release-1.8.0.tar.gz)<br/>Use _**release-1.8.0.tar.gz**_ | 168 169On UNIX systems, you may install the dependencies using the distribution's package management system. Install the 170development package of a dependency to install the header files and libraries required to build Exiv2. The script 171`ci/install_dependencies.sh` is used to setup CI images on which we build and test Exiv2 on many platforms when we modify code. You may find that helpful in setting up your platform dependencies. 172 173Natural language system is discussed in more detail here: [Localisation](#2-8) 174 175Notes about different platforms are included here: [Platform Notes](#5) 176 177You may choose to install dependences with conan. This is supported on all platforms and is especially useful for users of Visual Studio. 178See [README-CONAN](README-CONAN.md) for more information. 179 180### Libiconv 181 182The library libiconv is used to perform character set encoding in the tags Exif.Photo.UserComment, Exif.GPSInfo.GPSProcessingMethod and Exif.GPSInfo.GPSAreaInformation. This is documented in the exiv2 man page. 183 184CMake will detect libiconv of all UNIX like systems including Linux, macOS, UNIX, Cygwin64 and MinGW/msys2. If you have installed libiconv on your machine, Exiv2 will link and use it. 185 186The library libiconv is a GNU library and we do not recommend using libiconv with Exiv2 when building with Visual Studio. 187 188Exiv2 includes the file cmake/FindIconv.cmake which contains a guard to prevent CMake from finding libiconv when you build with Visual Studio. This was added because of issues reported when Visual Studio attempted to link libconv libraries installed by Cygwin, or MinGW or gnuwin32. [https://github.com/Exiv2/exiv2/issues/1250](https://github.com/Exiv2/exiv2/issues/1250) 189 190There are build instructions about Visual Studio in libiconv-1.16/INSTALL.window require you to install Cygwin. There is an article here about building libiconv with Visual Studio. [https://www.codeproject.com/Articles/302012/How-to-Build-libiconv-with-Microsoft-Visual-Studio](https://www.codeproject.com/Articles/302012/How-to-Build-libiconv-with-Microsoft-Visual-Studio). 191 192If you wish to use libiconv with Visual Studio you will have to build libiconv and remove the "guard" in cmake/FindIconv.cmake. Team Exiv2 will not provide support concerning libiconv and Visual Studio. 193 194[TOC](#TOC) 195<div id="2-5"> 196### 2.5 Building and linking your code with Exiv2 197 198There are detailed platform notes about compiling and linking in `releasenotes/{platform}/ReadMe.txt` 199 200where `platform: { CYGWIN | Darwin | Linux | MinGW | msvc | Unix }` 201 202In general you need to do the following: 203 2041) Application code should be written in C++98 and include exiv2 headers: 205 206```cpp 207#include <exiv2/exiv2.hpp> 208``` 209 2102) Compile your C++ code with the directive: **`-I/usr/local/include`** 211 2123) Link your code with libexiv2 using the linker options: **`-lexiv2`** and **`-L/usr/local/lib`** 213 214The following is a typical command to build and link with libexiv2: 215 216```bash 217$ g++ -std=c++98 myprog.cpp -o myprog -I/usr/local/include -L/usr/local/lib -lexiv2 218``` 219 220[TOC](#TOC) 221<div id="2-6"> 222### 2.6 Consuming Exiv2 with CMake 223 224When exiv2 is installed, the files required to consume Exiv2 are installed in `${CMAKE_INSTALL_PREFIX}/lib/cmake/exiv2` 225 226You can build samples/exifprint.cpp as follows: 227 228```bash 229$ cd <exiv2dir> 230$ mkdir exifprint 231$ cd exifprint 232$ cat - > CMakeLists.txt <<EOF 233cmake_minimum_required(VERSION 3.8) 234project(exifprint VERSION 0.0.1 LANGUAGES CXX) 235 236set(CMAKE_CXX_STANDARD 98) 237set(CMAKE_CXX_EXTENSIONS OFF) 238 239find_package(exiv2 REQUIRED CONFIG NAMES exiv2) # search ${CMAKE_INSTALL_PREFIX}/lib/cmake/exiv2/ 240add_executable(exifprint ../samples/exifprint.cpp) # compile this 241target_link_libraries(exifprint exiv2lib) # link exiv2lib 242EOF 243$ cmake . # generate the makefile 244$ make # build the code 245$ ./exifprint # test your executable 246Usage: bin/exifprint [ path | --version | --version-test ] 247$ 248``` 249 250[TOC](#TOC) 251<div id="2-7"> 252### 2.7 Using pkg-config to compile and link your code with Exiv2 253 254When exiv2 is installed, the file exiv2.pc used by pkg-config is installed in `${CMAKE_INSTALL_PREFIX}/lib/pkgconfig` You will need to set the following in your environment: 255 256```bash 257$ export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH" 258``` 259 260To compile and link using exiv2.pc, you usually add the following to your Makefile. 261 262```bash 263PKGCONFIG=pkg-config 264CPPFLAGS := `pkg-config exiv2 --cflags` 265LDFLAGS := `pkg-config exiv2 --libs` 266``` 267 268If you are not using make, you can use pkg-config as follows: 269 270```bash 271g++ -std=c++98 myprogram.cpp -o myprogram $(pkg-config exiv2 --libs --cflags) 272``` 273 274[TOC](#TOC) 275<div id="2-8"> 276### 2.8 Localisation 277 278Localisation is supported on a UNIX-like platform: Linux, macOS, Cygwin and MinGW/msys2. Localisation is not supported for Visual Studio builds. 279 280Crowdin have provided Exiv2 with a free open-source license to use their services. The Exiv2 localisation project is located at [https://crowdin.com/project/exiv2](https://crowdin.com/project/exiv2). You will also need to register to have a free user account on Crowdin. The Crowdin setup is discussed here: [https://github.com/Exiv2/exiv2/issues/1510](https://github.com/Exiv2/exiv2/issues/1510). It is recommended that you coordinate with Leonardo before contributing localisation changes on Crowdin. You can contact Leonardo by via GitHub. 281 282To build localisation support, use the CMake option `-DEXIV2_ENABLE_NLS=On`. You must install the `gettext` package with your package manager or from source. The `gettext` package is available from [http://www.gnu.org/software/gettext/](http://www.gnu.org/software/gettext/) and includes the library `libintl` and utilities to build localisation files. If CMake produces error messages which mention libintl or gettext, you should verify that the package `gettext` has been correctly built and installed. 283 284You must install the build to test localisation. This ensures that the localisation message files can be found at run-time. You cannot test localisation in the directory `build\bin`. 285 2861) Running exiv2 in another language 287 288```bash 289$ env LANG=fr_FR exiv2 # env LANGUAGE=fr_FR exiv2 on Linux! 290exiv2: Une action doit être spécifié 291exiv2: Au moins un fichier est nécessaire 292Utilisation : exiv2 [ options ] [ action ] fichier ... 293 294Manipulation des métadonnées EXIF issues des images. 295$ 296``` 297 2982) Adding additional languages to exiv2 299 300To support a new language which we'll designate 'xy' for this discussion: 301 3022.1) Generate a po file from the po template: 303 304```bash 305$ cd <exiv2dir> 306$ mkdir -p po/xy 307$ msginit --input=po/exiv2.pot --locale=xy --output=po/xy.po 308``` 3092.2) Edit/Translate the strings in po/xy.po 310 311I edited the following: 312 313```bash 314#: src/exiv2.cpp:237 315msgid "Manipulate the Exif metadata of images.\n" 316msgstr "" 317``` 318to: 319 320```bash 321#: src/exiv2.cpp:237 322msgid "Manipulate the Exif metadata of images.\n" 323msgstr "Manipulate image metadata.\n" 324``` 325 3262.3) Generate the messages file: 327 328```bash 329$ mkdir -p po/xy/LC_MESSAGES 330$ msgfmt --output-file=po/xy/LC_MESSAGES/exiv2.mo po/xy.po 331``` 332 3332.4) Install and test your messages: 334 335You have to install your messages to test them. It's not possible to test a messages file by executing build/bin/exiv2. 336 337```bash 338$ sudo mkdir -p /usr/local/share/locale/xy/LC_MESSAGES 339$ sudo cp -R po/xy/LC_MESSAGES/exiv2.mo /usr/local/share/locale/xy/LC_MESSAGES 340$ env LANG=xy exiv2 # env LANGUAGE=xy on Linux! 341exiv2: An action must be specified 342exiv2: At least one file is required 343Usage: exiv2 [ options ] [ action ] file ... 344 345Manipulate image metadata. <--------- Edited message! 346$ 347``` 348 3492.5) Submitting your new language file for inclusion in future versions of Exiv2: 350 351You may submit a PR which contains po/xy.po AND a modification to po/CMakeLists.txt 352 353Or, open a new issue on https://github.com/exiv2/exiv2 and attach the file xy.po.zip which can be created as follows: 354 355``` 356$ zip xy.po.zip po/xy.po 357 adding: po/xy.po (deflated 78%) 358ls -l xy.po.zip 359-rw-r--r--+ 1 rmills staff 130417 25 Jun 10:15 xy.po.zip 360$ 361``` 362 363[TOC](#TOC) 364<div id="2-9"> 365### 2.9 Building Exiv2 Documentation 366 367Building documentation requires installing special tools. You will probably prefer to 368read the documentation on-line from the project website: https://exiv2.org 369 370To build documentation, use the CMake option **`-DEXIV2_BUILD_DOC=On`**. 371Additionally, you will require an additional build step to actually build the documentation. 372 373```bash 374$ cmake ..options.. -DEXIV2_BUILD_DOC=On 375$ make doc 376``` 377 378To build the documentation, you must install the following products: 379 380| Product | Availability | 381|:------------ |:------------ | 382| doxygen<br/>graphviz<br/>python<br/>xsltproc<br/>md5sum | [http://www.doxygen.org/](http://www.doxygen.org/)<br/>[http://www.graphviz.org/](http://www.graphviz.org/)<br/>[http://www.python.org/](http://www.python.org/)<br/>[http://xmlsoft.org/XSLT/](http://xmlsoft.org/XSLT/)<br/>[http://www.microbrew.org/tools/md5sha1sum/](http://www.microbrew.org/tools/md5sha1sum/) | 383 384[TOC](#TOC) 385<div id="2-10"> 386### 2.10 Building Exiv2 Packages 387 388To enable the building of Exiv2 packages, use the CMake option `-DEXIV2_TEAM_PACKAGING=On`. 389 390You should not build Exiv2 Packages. This feature is intended for use by Team Exiv2 to create Platform and Source Packages on the buildserver. 391 392There are two types of Exiv2 packages which are generated by cpack from the cmake command-line. 393 3941) Platform Package (header files, binary library and samples. Some documentation and release notes) 395 396Create and build exiv2 for your platform. 397 398```bash 399$ git clone https://github.com/exiv2/exiv2 400$ mkdir -p exiv2/build 401$ cd exiv2/build 402$ cmake .. -G "Unix Makefiles" -DEXIV2_TEAM_PACKAGING=On 403... 404-- Build files have been written to: .../build 405$ cmake --build . --config Release 406... 407[100%] Built target addmoddel 408$ make package 409... 410CPack: - package: /path/to/exiv2/build/exiv2-0.27.1-Linux.tar.gz generated. 411``` 412 4132) Source Package 414 415```bash 416$ make package_source 417Run CPack packaging tool for source... 418... 419CPack: - package: /path/to/exiv2/build/exiv2-0.27.1-Source.tar.gz generated. 420``` 421 422You may prefer to run `$ cmake --build . --config Release --target package_source` 423 424 425[TOC](#TOC) 426<div id="2-11"> 427### 2.11 Debugging Exiv2 428 4291) Generating and installing a debug library 430 431In general to generate a debug library, you should use the option *cmake* option `-DCMAKE_RELEASE_TYPE=Debug` and build in the usual way. 432 433```bash 434$ cd <exiv2dir> 435$ mkdir build 436$ cd build 437$ cmake .. -G "Unix Makefiles" "-DCMAKE_BUILD_TYPE=Debug" 438$ make 439 440``` 441 442You must install the library to ensure that your code is linked to the debug library. 443 444You can check that you have generated a debug build with the command: 445 446```bash 447$ exiv2 -vVg debug 448exiv2 0.27.1 449debug=1 450$ 451``` 452 453[TOC](#TOC) 454 4552) About preprocessor symbols `NDEBUG` and `EXIV2_DEBUG_MESSAGES` 456 457Exiv2 respects the symbol `NDEBUG` which is set only for Release builds. There are sequences of code which are defined within: 458 459```cpp 460#ifdef EXIV2_DEBUG_MESSAGES 461.... 462#endif 463``` 464 465Those blocks of code are not compiled unless you define `EXIV2_DEBUG_MESSAGES`. They are provided for additional debugging information. For example, if you are interested in additional output from webpimage.cpp, you can update your build as follows: 466 467```bash 468$ cd <exiv2dir> 469$ touch src/webpimage.cpp 470$ make CXXFLAGS=-DEXIV2_DEBUG_MESSAGES 471$ bin/exiv2 ... 472-- or -- 473$ sudo make install 474$ exiv2 ... 475``` 476 477If you are debugging library code, it is recommended that you use the exiv2 command-line program as your test harness as Team Exiv2 is very familiar with this tool and able to give support. 478 479[TOC](#TOC) 480 4813) Starting the debugger 482 483This is platform specific. On Linux: 484 485```bash 486$ gdb exiv2 487``` 488 489[TOC](#TOC) 490 4914) Using Debugger IDEs such as Xcode, CLion, Visual Studio, Eclipse or QtCreator 492 493I have used all those IDEs to debug the Exiv2 library and applications. All of them work. You may find it takes initial effort, however I assure you that they all work well. 494 495I work on macOS and use Xcode to develop Exiv2. For a couple of years, Team Exiv2 had free 496open-source licences from JetBrains for CLion. I really liked CLion as it is cross platform 497and runs on Windows, Mac and Linux. It has excellent integration with CMake and will automatically 498add **`-DCMAKE_BUILD_TYPE=Debug`** to the cmake command. It keeps build types in separate directories 499such as **`<exiv2dir>/cmake-build-debug`**. 500 501[TOC](#TOC) 502 5035) cmake --build . options **`--config Release|Debug`** and **`--target install`** 504 505Visual Studio and Xcode can build debug or release builds without using the option **`-DCMAKE_BUILD_TYPE`** because the generated project files can build multiple types. The option **`--config Debug`** can be specified on the cmake command-line to specify the build type. Alternatively, if you prefer to build in the IDE, the UI provides options to select the configuration and target. 506 507With the Unix Makefile generator, the targets can be listed: 508 509```bash 510$ make help 511The following are some of the valid targets for this Makefile: 512... all (the default if no target is provided) 513... clean 514... depend 515... install/local 516......... 517``` 518 519[TOC](#TOC) 520<div id="2-12"> 521### 2.12 Building Exiv2 with **clang** and other build chains 522 5231) On Linux 524 525```bash 526$ cd <exiv2dir> 527$ rm -rf build ; mkdir build ; cd build 528$ cmake .. -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) 529$ cmake --build . 530``` 531 532**_OR_** 533 534```bash 535$ export CC=$(which clang) 536$ export CXX=$(which clang++) 537$ cd <exiv2dir> 538$ rm -rf build ; mkdir build ; cd build 539$ cmake .. 540$ cmake --build . 541``` 542 5432) On macOS 544 545Apple provide clang with Xcode. GCC has not been supported by Apple since 2013. The _"normal unix build"_ uses Clang. 546 5473) On Cygwin, MinGW/msys2, Windows (using clang-cl) and Visual Studio. 548 549I have been unable to get clang to work on any of those platforms. 550 551[TOC](#TOC) 552<div id="2-13"> 553### 2.13 Building Exiv2 with ccache 554 555To speed up compilation, the utility ccache can be installed to cache the output of the compiler. This greatly speeds up the build when you frequently built code that has not been modified. 556 557Installing and using ccache (and other similar utilities), is platform dependent. On Ubuntu: 558 559```bash 560$ sudo apt install --yes ccache 561``` 562 563To build with ccache, use the cmake option **-DBUILD\_WITH\_CCACHE=On** 564 565```bash 566$ cd <exiv2dir> 567$ mkdir build ; cd build ; cd build 568$ cmake .. -G "Unix Makefiles" -DBUILD_WITH_CCACHE=On 569$ make 570# Build again to appreciate the performance gain 571$ make clean 572$ make 573``` 574 575Due to the way in which ccache is installed in Fedora (and other Linux distros), ccache effectively replaces the compiler. A default build or **-DBUILD\_WITH\_CCACHE=Off** is not effective and the environment variable CCACHE_DISABLE is required to disable ccache. [https://github.com/Exiv2/exiv2/issues/361](https://github.com/Exiv2/exiv2/issues/361) 576 577[TOC](#TOC) 578<div id="2-14"> 579### 2.14 Thread Safety 580 581Exiv2 heavily relies on standard C++ containers. Static or global variables are used read-only, with the exception of the XMP namespace registration function (see below). Thus Exiv2 is thread safe in the same sense as C++ containers: 582Different instances of the same class can safely be used concurrently in multiple threads. 583 584In order to use the same instance of a class concurrently in multiple threads the application must serialize all write access to the object. 585 586The level of thread safety within Exiv2 varies depending on the type of metadata: The Exif and IPTC code is reentrant. The XMP code uses the Adobe XMP toolkit (XMP SDK), which according to its documentation is thread-safe. It actually uses mutexes to serialize critical sections. However, the XMP SDK initialisation function is not mutex protected, thus Exiv2::XmpParser::initialize is not thread-safe. In addition, Exiv2::XmpProperties::registerNs writes to a static class variable, and is also not thread-safe. 587 588Therefore, multi-threaded applications need to ensure that these two XMP functions are serialized, e.g., by calling them from an initialization section which is run before any threads are started. All exiv2 sample applications begin with: 589 590```cpp 591#include <exiv2/exiv2.hpp> 592int main(int argc, const char* argv[]) 593{ 594 Exiv2::XmpParser::initialize(); 595 ::atexit(Exiv2::XmpParser::terminate); 596#ifdef EXV_ENABLE_BMFF 597 Exiv2::enableBMFF(true); 598#endif 599 ... 600} 601``` 602The use of the _**thread unsafe function**_ Exiv2::enableBMFF(true) is discussed in [2.19 Support for bmff files](#2-19) 603 604[TOC](#TOC) 605<div id="2-15"> 606### 2.15 Library Initialisation and Cleanup 607 608As discussed in the section on Thread Safety, Exiv2 classes for Exif and IPTC metadata are fully reentrant and require no initialisation or cleanup. 609 610Adobe's XMPsdk is generally thread-safe, however it has to be initialized and terminated before and after starting any threads to access XMP metadata. The Exiv2 library will initialize this if necessary, however it does not terminate the XMPsdk. 611 612The exiv2 command-line program and sample applications call the following at the outset: 613 614```cpp 615 Exiv2::XmpParser::initialize(); 616 ::atexit(Exiv2::XmpParser::terminate); 617#ifdef EXV_ENABLE_BMFF 618 Exiv2::enableBMFF(true); 619#endif 620``` 621 622[TOC](#TOC) 623<div id="2-16"> 624### 2.16 Cross Platform Build and Test on Linux for MinGW 625 626You can cross compile Exiv2 on Linux for MinGW. We have used the following method on **Fedora** and believe this is also possible on Ubuntu and other distros. Detailed instructions are provided here for **Fedora**. 627 628### Cross Build and Test On Fedora 629 630####1 Install the cross platform build tools 631 632```bash 633$ sudo dnf install mingw64-gcc-c++ mingw64-filesystem mingw64-expat mingw64-zlib cmake make 634``` 635 636####2 Install Dependancies 637 638You will need to install x86_64 libraries to support the options you wish to use. By default, you will need libz and expat. Your `dnf` command above has installed them for you. If you wish to use features such as `webready` you should install openssl and libcurl as follows: 639 640```bash 641[rmills@rmillsmm-fedora 0.27-maintenance]$ sudo yum install libcurl.x86_64 openssl.x86_64 642Last metadata expiration check: 0:00:18 ago on Fri 10 Apr 2020 10:50:30 AM BST. 643Dependencies resolved. 644========================= 645Package Architecture Version Repository Size 646========================= 647Installing: 648... 649``` 650 651####3 Get the code and build 652 653```bash 654$ git clone://github.com/exiv2/exiv2 --branch 0.27-maintenance exiv2 655$ cd exiv2 656$ mkdir build_mingw_fedora 657$ mingw64-cmake .. 658$ make 659``` 660 661Note, you may wish to choose to build with optional features and/or build static libraries. To do this, request appropriately on the mingw64-cmake command: 662 663```bash 664$ mingw64-cmake .. -DEXIV2_TEAM_EXTRA_WARNINGS=On \ 665 -DEXIV2_ENABLE_VIDEO=On \ 666 -DEXIV2_ENABLE_WEBREADY=On \ 667 -DEXIV2_ENABLE_WIN_UNICODE=On \ 668 -DBUILD_SHARED_LIBS=Off 669``` 670The options available for cross-compiling are the same as provided for all builds. See: [Build Options](#2-3) 671 672 673####4 Copy "system dlls" in the bin directory 674 675These DLLs are required to execute the cross-platform build in the bin from Windows 676 677```bash 678for i in libexpat-1.dll libgcc_s_seh-1.dll libstdc++-6.dll libwinpthread-1.dll zlib1.dll ; do 679 cp -v /usr/x86_64-w64-mingw32/sys-root/mingw/bin/$i bin 680done 681``` 682 683####5 Executing exiv2 in wine 684 685You may wish to use wine to execute exiv2 from the command prompt. To do this: 686 687```bash 688[rmills@rmillsmm-fedora build_mingw_fedora]$ wine cmd 689Microsoft Windows 6.1.7601 690 691Z:\Home\gnu\github\exiv2\0.27-maintenance\build_mingw_fedora>bin\exiv2 692exiv2: An action must be specified 693exiv2: At least one file is required 694Usage: exiv2 [ options ] [ action ] file ... 695 696Manipulate the Exif metadata of images. 697 698Z:\Home\gnu\github\exiv2\0.27-maintenance\build_mingw_fedora> 699``` 700 701If you have not installed wine, Fedora will offer to install it for you. 702 703####6 Running the test suite 704 705On a default wine installation, you are in the MSDOS/cmd.exe prompt. You cannot execute the exiv2 test suite in this environment as you require python3 and MSYS/bash to run the suite. 706 707You should mount the your Fedora exiv2/ directory on a Windows machine on which you have installed MinGW/msys2. You will need python3 and make. 708 709My build machines is a MacMini with VMs for Windows, Fedora and other platforms. On Fedora, I build in a Mac directory which is shared to all VMs. 710 711```bash 712[rmills@rmillsmm-fedora 0.27-maintenance]$ pwd 713/media/psf/Home/gnu/github/exiv2/0.27-maintenance 714[rmills@rmillsmm-fedora 0.27-maintenance]$ ls -l build_mingw_fedora/bin/exiv2.exe 715-rwxrwxr-x. 1 rmills rmills 754944 Apr 10 07:44 build_mingw_fedora/bin/exiv2.exe 716[rmills@rmillsmm-fedora 0.27-maintenance]$ 717``` 718 719On MinGW/msys2, I can directly access the share: 720 721```bash 722$ cd //Mac/Home/gnu/github/exiv2/0.27/maintenance/build_mingw_fedora 723$ export EXIV2_BINDIR=$pwd/bin 724$ cd ../test 725$ make tests 726``` 727 728You will find that 3 tests fail at the end of the test suite. It is safe to ignore those minor exceptions. 729 730[TOC](#TOC) 731<div id="2-17"> 732### 2.17 Building with C++11 and other compilers 733 734Exiv2 uses the default compiler for your system. Exiv2 v0.27 was written to the C++ 1998 standard and uses auto\_ptr. The C++11 and C++14 compilers will issue deprecation warnings about auto\_ptr. As _auto\_ptr support has been removed from C++17, you cannot build Exiv2 v0.27 with C++17 or later compilers._ Exiv2 v1.00 and later do not use auto\_ptr and will build with all modern C++ Standard Compilers. 735 736To build with C++11: 737 738```bash 739$ cd <exiv2dir> 740$ mkdir build ; cd build 741$ cmake .. -DCMAKE_CXX_STANDARD=11 -DCMAKE_CXX_FLAGS=-Wno-deprecated 742$ make 743``` 744 745The option -DCMAKE\_CXX\_STANDARD=11 specifies the C++ Language Standard. Possible values are 98, 11 or 14. 746 747The option -DCMAKE\_CXX\_FLAGS=-Wno-deprecated suppresses warnings from C++11 concerning auto\_ptr. The compiler will issue deprecation warnings about video, eps and ssh code in Exiv2 v0.27. This is intentional. These features of Exiv2 will not be available in Exiv2 v1.00. 748 749**Caution:** Visual Studio users should not use -DCMAKE\_CXX\_FLAGS=-Wno-deprecated. 750 751[TOC](#TOC) 752<div id="2-18"> 753### 2.18 Static and Shared Libraries 754 755You can build either static or shared libraries. Both can be linked with either static or shared run-time libraries. You specify the shared/static with the option `-BUILD_SHARED_LIBS=On|Off` You specify the run-time with the option `-DEXIV2_ENABLE_DYNAMIC_RUNTIME=On|Off`. The default for both options default is On. So you build shared and use the shared libraries which are `.dll` on Windows (msvc, Cygwin and MinGW/msys), `.dylib` on macOS and `.so` on Linux and UNIX. 756 757CMake creates your build artefacts in the directories `bin` and `lib`. The `bin` directory contains your executables and .dlls. The `lib` directory contains your static libraries. When you install exiv2, the build artefacts are copied to your system's prefix directory which by default is `/usr/local/`. If you wish to test and use your build without installing, you will have to set you PATH appropriately. Linux/Unix users should also set `LD_LIBRARY_PATH` and macOS users should set `DYLD_LIBRARY_PATH`. 758 759The default build is SHARED/DYNAMIC and this arrangement treats all executables and shared libraries in a uniform manner. 760 761**Caution:** _The following discussion only applies if you are linking to a static version of the exiv2 library._ You may get the following error from CMake: 762 763```bash 764CMake Error at src/CMakeLists.txt:30 (add_library): 765Target "my-app-or-library" links to target "Iconv::Iconv" but the target was 766not found. Perhaps a find_package() call is missing for an IMPORTED 767target, or an ALIAS target is missing? 768``` 769 770Be aware that the warning concerning `src/CMakeLists.txt:30 (add_library)` refers to your file src/CMakeLists.txt. Although exiv2 has statically linked `Iconv()`, your code also needs to link. You achieve that in your src/CMakeLists.txt with the code: 771 772```cmake 773find_package(Iconv) 774if( ICONV_FOUND ) 775 target_link_libraries( my-app-or-library PRIVATE Iconv::Iconv ) 776endif() 777``` 778 779This is discussed: [https://github.com/Exiv2/exiv2/issues/1230](https://github.com/Exiv2/exiv2/issues/1230) 780 781[TOC](#TOC) 782<div id="2-19"> 783### 2.19 Support for bmff files (CR3, HEIF, HEIC, and AVIF) 784 785**Attention is drawn to the possibility that bmff support may be the subject of patent rights. _Exiv2 shall not be held responsible for identifying any or all such patent rights. Exiv2 shall not be held responsible for the legal consequences of the use of this code_.** 786 787Access to the bmff code is guarded in two ways. Firstly, you have to build the library with the cmake option: `-DEXIV2_ENABLE_BMFF=On`. Secondly, the application must enable bmff support at run-time by calling the following function. 788 789```cpp 790EXIV2API bool enableBMFF(bool enable); 791``` 792 793The return value from `enableBMFF()` is true if the library has been build with bmff support (cmake option -DEXIV2_ANABLE_BMFF=On). 794 795Applications may wish to provide a preference setting to enable bmff support and thereby place the responsibility for the use of this code with the user of the application. 796 797[TOC](#TOC) 798<div id="3"> 799## 3 License and Support 800 801All project resources are accessible from the project website. 802 https://github.com/Exiv2/exiv2 803 804<div id="3-1"> 805### 3.1 License 806 807Copyright (C) 2004-2021 Exiv2 authors. 808You should have received a copy of the file [COPYING](COPYING) which details the GPLv2 license. 809 810Exiv2 is free software; you can redistribute it and/or modify 811it under the terms of the GNU General Public License as published by 812the Free Software Foundation; either version 2 of the License, or 813(at your option) any later version. 814 815Exiv2 program is distributed in the hope that it will be useful, 816but WITHOUT ANY WARRANTY; without even the implied warranty of 817MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 818GNU General Public License for more details. 819 820You should have received a copy of the GNU General Public License along 821with this program; if not, write to the Free Software Foundation, Inc., 82251 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 823 824 825[TOC](#TOC) 826<div id="3-2"> 827### 3.2 Support 828 829For new bug reports, feature requests and support: Please open an issue in Github. [https://github.com/exiv2/exiv2](https://github.com/exiv2/exiv2) 830 831[TOC](#TOC) 832<div id="4"> 833## 4 Running the test suite 834 835#### Different kinds of tests: 836 837| Description | Language | Location | Command<br>_(in build directory)_ | CMake Option to Build | 838|:-- |:-- |:-- |:-- |:-- | 839| Run all tests | | | $ make tests | | 840| Run all tests | | **Visual Studio Users** | > cmake --build . --target tests | | 841| Bash tests | python | tests/bash\_tests | $ make bash_tests | -DEXIV2\_BUILD\_SAMPLES=On | 842| Python tests | python | tests | $ make python_tests | -DEXIV2\_BUILD\_SAMPLES=On | 843| Unit tests | C++ | unitTests | $ make unit_test | -DEXIV2\_BUILD\_UNIT\_TESTS=On | 844| Version test | C++ | src/version.cpp | $ make version_test | Always in library | 845 846The term _**bash scripts**_ is historical. The implementation of the tests in this collection originally required bash. These 847scripts have been rewritten in python. Visual Studio Users will appreciate the python implementation as it avoids the 848installation of mingw/cygwin and special PATH settings. 849 850#### Environment Variables used by the test suite: 851 852If you build the code in the directory \<exiv2dir\>build, tests will run using the default values of Environment Variables. 853 854| Variable | Default | Platforms | Purpose | 855|:-- |:-- |:-- |:-- | 856| EXIV2_BINDIR | **\<exiv2dir\>/build/bin** | All Platforms | Path of built binaries (exiv2.exe) | 857| EXIV2_PORT | **12762**<br>**12671**<br>**12760** | Cygwin<br>MinGW/msys2<br>Other Platforms | Test TCP/IP Port | 858| EXIV2_HTTP | **http://localhost** | All Platforms | Test http server | 859| EXIV2_ECHO | _**not set**_ | All Platforms | For debugging bash scripts | 860| VALGRIND | _**not set**_ | All Platforms | For debugging bash scripts | 861| VERBOSE | _**not set**_ | All Platforms | Causes make to report its actions | 862| PATH<br>DYLD\_LIBRARY\_PATH<br>LD\_LIBRARY\_PATH | $EXIV2\_BINDIR/../lib | Windows<br>macOS<br>Other platforms | Path of dynamic libraries | 863 864The Variable EXIV2\_PORT or EXIV2\_HTTP can be set to None to skip http tests. The http server is started with the command `python3 -m http.server $port`. On Windows, you will need to run this manually _**once**_ to authorise the firewall to permit python to use the port. 865 866[TOC](#TOC) 867<div id="4-1"> 868### 4.1 Running tests on a UNIX-like system 869 870You can run tests directly from the build: 871 872```bash 873$ cmake .. -G "Unix Makefiles" -DEXIV2_BUILD_UNIT_TESTS=On 874$ make 875... lots of output ... 876$ make tests 877... lots of output ... 878$ 879``` 880 881You can run individual tests in the `test` directory. **Caution:** If you build in a directory other than \<exiv2dir\>/build, you must set EXIV2\_BINDIR to run tests from the `test` directory. 882 883```bash 884$ cd <exiv2dir>/build 885$ make bash_tests 886addmoddel_test (testcases.TestCases) ... ok 887.... 888Ran 176 tests in 9.526s 889OK (skipped=6) 890 891$ make python_tests 892... lots of output ... 893test_run (tiff_test.test_tiff_test_program.TestTiffTestProg) ... ok 894---------------------------------------------------------------------- 895Ran 176 tests in 9.526s 896OK (skipped=6) 897$ 898``` 899 900[TOC](#TOC) 901<div id="4-2"> 902### 4.2 Running tests on Visual Studio builds from cmd.exe 903 904**Caution:** _The python3 interpreter must be on the PATH, build for DOS, and called python3.exe. I copied the python.exe program: 905 906```cmd 907> copy c:\Python37\python.exe c:\Python37\python3.exe 908> set "PATH=c:\Python37;%PATH% 909``` 910 911You can execute the test suite as described for UNIX-like systems. 912The main difference is that you must use cmake to initiate the test 913as make is not a system utility on Windows. 914 915```bash 916> cd <exiv2dir>/build 917> cmake --build . --target tests 918> cmake --build . --target python_tests 919``` 920 921##### Running tests from cmd.exe 922 923You can build with Visual Studio using Conan. The is described in detail in [README-CONAN.md](README-CONAN.md) 924 925As a summary, the procedure is: 926 927``` 928c:\...\exiv2>mkdir build 929c:\...\exiv2>cd build 930c:\...\exiv2\build>conan install .. --build missing --profile msvc2019Release 931c:\...\exiv2\build>cmake .. -DEXIV2_BUILD_UNIT_TESTS=On -G "Visual Studio 16 2019" 932c:\...\exiv2\build>cmake --build . --config Release 933... lots of output from compiler and linker ... 934c:\...\exiv2\build> 935``` 936 937If you wish to use an environment variables, use set: 938 939``` 940set VERBOSE=1 941cmake --build . --config Release --target tests 942set VERBOSE= 943``` 944 945[TOC](#TOC) 946<div id="4-3"> 947### 4.3 Unit tests 948 949The code for the unit tests is in `<exiv2dir>/unitTests`. To include unit tests in the build, use the *cmake* option `-DEXIV2_BUILD_UNIT_TESTS=On`. 950 951There is a discussion on the web about installing GTest: [https://github.com/Exiv2/exiv2/issues/575](https://github.com/Exiv2/exiv2/issues/575) 952 953```bash 954$ pushd /tmp 955$ curl -LO https://github.com/google/googletest/archive/release-1.8.0.tar.gz 956$ tar xzf release-1.8.0.tar.gz 957$ mkdir -p googletest-release-1.8.0/build 958$ pushd googletest-release-1.8.0/build 959$ cmake .. ; make ; make install 960$ popd 961$ popd 962``` 963 964[TOC](#TOC) 965<div id="4-4"> 966### 4.4 Python tests 967 968You can run the python tests from the build directory: 969 970```bash 971$ cd <exiv2dir>/build 972$ make python_tests 973``` 974 975If you wish to run in verbose mode: 976 977```bash 978$ cd <exiv2dir>/build 979$ make python_tests VERBOSE=1 980``` 981 982The python tests are stored in the directory tests and you can run them all with the command: 983 984```bash 985$ cd <exiv2dir>/tests 986$ export LD_LIBRARY_PATH="$PWD/../build/lib:$LD_LIBRARY_PATH" 987$ python3 runner.py 988``` 989 990You can run them individually with the commands such as: 991 992```bash 993$ cd <exiv2dir>/tests 994$ python3 runner.py --verbose bugfixes/redmine/test_issue_841.py # or $(find . -name "*841*.py") 995``` 996 997You may wish to get a brief summary of failures with commands such as: 998 999```bash 1000$ cd <exiv2dir>/build 1001$ make python_tests 2>&1 | grep FAIL 1002``` 1003 1004[TOC](#TOC) 1005<div id="4-5"> 1006### 4.5 Test Summary 1007 1008| *Tests* | Unix Style Platforms _(bash)_ | Visual Studio _(cmd.exe)_ | 1009|:-- |:--- |:-- | 1010| | $ cd \<exiv2dir\>/build | \> cd \<exiv2dir\>/build | 1011| tests | $ make tests | \> cmake --build . --config Release --target tests | 1012| bash_tests | $ make bash_tests | \> cmake --build . --config Release --target bash_tests | 1013| python_tests | $ make python_tests | \> cmake --build . --config Release --target python_tests | 1014| unit_test | $ make unit_test | \> cmake --build . --config Release --target unit_test | 1015| version_test | $ make version_test | \> cmake --build . --config Release --target version_test | 1016 1017The name **bash_tests** is historical. They are implemented in python. 1018 1019[TOC](#TOC) 1020<div id="5"> 1021## 5 Platform Notes 1022 1023There are many ways to set up and configure your platform. The following notes are provided as a guide. 1024 1025<div id="5-1"> 1026### 5.1 Linux 1027 1028Update your system and install the build tools and dependencies (zlib, expat, gtest and others) 1029 1030```bash 1031$ sudo apt --yes update 1032$ sudo apt install --yes build-essential git clang ccache python3 libxml2-utils cmake python3 libexpat1-dev libz-dev zlib1g-dev libssh-dev libcurl4-openssl-dev libgtest-dev google-mock 1033``` 1034 1035For users of other platforms, the script <exiv2dir>/ci/install_dependencies.sh has code used to configure many platforms. The code in that file is a useful guide to configuring your platform. 1036 1037Get the code from GitHub and build 1038 1039```bash 1040$ mkdir -p ~/gnu/github/exiv2 1041$ cd ~/gnu/github/exiv2 1042$ git clone https://github.com/exiv2/exiv2 1043$ cd exiv2 1044$ mkdir build ; cd build ; 1045$ cmake .. -G "Unix Makefiles" 1046$ make 1047``` 1048 1049[TOC](#TOC) 1050<div id="5-2"> 1051### 5.2 macOS 1052 1053You will need to install Xcode and the Xcode command-line tools to build on macOS. 1054 1055You should build and install libexpat and zlib. You may use brew, macports, build from source, or use conan. 1056 1057I recommend that you build and install CMake from source. 1058 1059[TOC](#TOC) 1060<div id="5-3"> 1061### 5.3 MinGW/msys2 1062 1063Please note that the platform MinGW/msys2 32 is obsolete and superceded by MinGW/msys2 64. 1064 1065#### MinGW/msys2 64 bit 1066Install: [https://repo.msys2.org/distrib/x86\_64/msys2-x86\_64-20200903.exe](https://repo.msys2.org/distrib/x86_64/msys2-x86_64-20200903.exe) 1067 1068The file `appveyor_mingw_cygwin.yml` has instructions to configure the AppVeyor CI to configures itself to build Exiv2 on MinGW/msys2 and Cygwin/64. 1069 1070I use the following batch file to start the MinGW/msys2 64 bit bash shell from the Dos Command Prompt (cmd.exe) 1071 1072```bat 1073@echo off 1074setlocal 1075set "PATH=c:\msys64\mingw64\bin;c:\msys64\usr\bin;c:\msys64\usr\local\bin;" 1076set "PS1=\! MSYS \u@\h:\w \$ " 1077set "HOME=c:\msys64\home\rmills" 1078if NOT EXIST %HOME% mkdir %HOME% 1079cd %HOME% 1080color 1f 1081c:\msys64\usr\bin\bash.exe -norc 1082endlocal 1083 1084``` 1085 1086#### Install MinGW Dependencies 1087 1088Install tools and dependencies: 1089 1090```bash 1091for i in base-devel git coreutils dos2unix tar diffutils make \ 1092 mingw-w64-x86_64-toolchain mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb \ 1093 mingw-w64-x86_64-cmake mingw-w64-x86_64-gettext mingw-w64-x86_64-python3 \ 1094 mingw-w64-x86_64-libexpat mingw-w64-x86_64-libiconv mingw-w64-x86_64-zlib \ 1095 mingw-w64-x86_64-gtest 1096do (echo y | pacman -S $i) ; done 1097``` 1098 1099#### Download exiv2 from github and build 1100 1101```bash 1102$ mkdir -p ~/gnu/github/exiv2 1103$ cd ~/gnu/github/exiv2 1104$ git clone https://github.com/exiv2/exiv2 1105$ cd exiv2 1106$ mkdir build ; cd build ; 1107$ cmake .. -G "Unix Makefiles" # or "MSYS Makefiles" 1108$ make 1109``` 1110 1111#### MinGW and Regex 1112 1113The exiv2 command-line program provides an option **`--grep`** to filter output. The implementation requires the header file **`<regex.h>`** and supporting library to be available during the build. When not available, the option **`--grep`** degrades to a substring match. Because there are several versions of **`<regex.h>`** available on the MinGW platform, detection of regex is always disabled on this platform and uses substring match. The following command reveals if regex is included in your build: 1114 1115```bash 1116$ exiv2 -vVg regex 1117exiv2 0.27.1 1118have_regex=1 1119$ 1120``` 1121 1122[TOC](#TOC) 1123<div id="5-4"> 1124### 5.4 Cygwin/64 1125 1126Please note that the platform Cygwin/32 is obsolete and superceded by Cygwin/64. 1127 1128Download: [https://cygwin.com/install.html](https://cygwin.com/install.html) and run setup-x86_64.exe. I install into c:\\cygwin64 1129 1130You need: 1131make, cmake, curl, gcc, gettext-devel pkg-config, dos2unix, tar, zlib-devel, libexpat1-devel, git, libxml2-devel python3-interpreter, libiconv, libxml2-utils, libncurses, libxml2-devel libxslt-devel python38 python38-pip python38-libxml2 1132 1133The file `appveyor_mingw_cygwin.yml` has instructions to configure the AppVeyor CI to configures itself to build Exiv2 on MinGW/msys2 and Cygwin/64. 1134 1135To build unit tests, you should install googletest-release-1.8.0 as discussed [4.3 Unit tests](#4-3) 1136 1137I use the following batch file "cygwin64.bat" to start the Cygwin/64 bash shell from the Dos Command Prompt (cmd.exe). 1138 1139```bat 1140@echo off 1141setlocal 1142set "PATH=c:\cygwin64\usr\local\bin;c:\cygwin64\bin;c:\cygwin64\usr\bin;c:\cygwin64\usr\sbin;" 1143if NOT EXIST %HOME% mkdir %HOME% 1144set "HOME=c:\cygwin64\home\rmills" 1145cd %HOME% 1146set "PS1=\! CYGWIN64:\u@\h:\w \$ " 1147bash.exe -norc 1148endlocal 1149``` 1150 1151[TOC](#TOC) 1152<div id="5-5"> 1153### 5.5 Visual Studio 1154 1155We recommend that you use Conan to build Exiv2 using Visual Studio. Exiv2 v0.27 can be built with Visual Studio versions 2008 and later. We actively support and build with Visual Studio 2015, 2017 and 2019. 1156 1157As well as Visual Studio, you will need to install CMake, Python3, and Conan. 1158 11591) Binary installers for CMake on Windows are availably from [https://cmake.org/download/](https://cmake.org/download/).<br/> 11602) Binary installers for Python3 are available from [python.org](https://python.org)<br/> 11613) Conan can be installed using python/pip. Details in [README-CONAN.md](README-CONAN.md) 1162 1163 1164``` 1165..>copy c:\Python37\python.exe c:\Python37\python3.exe 1166``` 1167 1168The python3 interpreter must be on your PATH. 1169 1170[TOC](#TOC) 1171<div id="5-6"> 1172### 5.6 Unix 1173 1174Exiv2 can be built on many Unix and Linux distros. With v0.27.2, we are starting to actively support the Unix Distributions NetBSD and FreeBSD. For v0.27.3, I have added support for Solaris 11.4 1175 1176We do not have CI support for these platforms on GitHub. However, I regularly build and test them on my MacMini Buildserver. The device is private and not on the internet. 1177 1178I have provided notes here based on my experience with these platforms. Feedback is welcome. I am willing to support Exiv2 on other commercial Unix distributions such as AIX, HP-UX and OSF/1 if you provide with an ssh account for your platform. I will require super-user privileges to install software. 1179 1180For all platforms you will need the following components to build: 1181 11821. gcc or clang 11832. cmake 11843. bash 11854. sudo 11865. gettext 1187 1188To run the test suite, you need: 1189 11901. python3 11912. chksum 11923. dos2unix 11934. xmllint 1194 1195#### NetBSD 1196 1197You can build exiv2 from source using the methods described for linux. I built and installed exiv2 using "Pure CMake" and didn't require conan. 1198 1199You will want to use the package manager `pkgsrc` to build/install the build and test components listed above. 1200 1201I entered links into the file system 1202 1203``` 1204# ln -s /usr/pkg/bin/python37 /usr/local/bin/python3 1205# ln -s /usr/pkg/bin/bash /bin/bash` 1206``` 1207 1208It's important to ensure that `LD_LIBRARY_PATH` includes `/usr/local/lib` and `/usr/pkg/lib`. 1209 1210It's important to ensure that `PATH` includes `/usr/local/bin`, `/usr/pkg/bin` and `/usr/pkg/sbin`. 1211 1212#### FreeBSD 1213 1214Clang is pre-installed as ``/usr/bin/{cc|c++}` as well as libz and expat. FreeBSD uses pkg as the package manager which I used to install cmake and git. 1215 1216```bash 1217$ su root 1218Password: 1219# pkg install cmake 1220# pkg install git 1221# pkg install bash 1222# pkg install python 1223``` 1224 1225**Caution**: _The package manager *pkg* is no longer working on FreeBSD 12.0. I will move to 12.1 for future work. Others have reported this issue on 12.1. Broken package manager is very bad news. There are other package managers (such as ports), however installing and getting it to work is formidable._ 1226 1227``` 1228634 rmills@rmillsmm-freebsd:~/gnu/github/exiv2/0.27-maintenance/build $ sudo pkg install libxml2 1229Updating FreeBSD repository catalogue... 1230pkg: repository meta /var/db/pkg/FreeBSD.meta has wrong version 2 1231pkg: Repository FreeBSD load error: meta cannot be loaded No error: 0 1232Fetching meta.txz: 100% 916 B 0.9kB/s 00:01 1233pkg: repository meta /var/db/pkg/FreeBSD.meta has wrong version 2 1234repository FreeBSD has no meta file, using default settings 1235Fetching packagesite.txz: 100% 6 MiB 340.2kB/s 00:19 1236pkg: repository meta /var/db/pkg/FreeBSD.meta has wrong version 2 1237pkg: Repository FreeBSD load error: meta cannot be loaded No error: 0 1238Unable to open created repository FreeBSD 1239Unable to update repository FreeBSD 1240Error updating repositories! 1241635 rmills@rmillsmm-freebsd:~/gnu/github/exiv2/0.27-maintenance/build $ 1242``` 1243 1244#### Solaris 1245 1246Solaris uses the package manager pkg. To get a list of packages: 1247 1248```bash 1249$ pkg list 1250``` 1251 1252To install a package: 1253 1254```bash 1255$ sudo pkg install developer/gcc-7 1256``` 1257 1258 1259[TOC](#TOC) 1260 1261Written by Robin Mills<br>robin@clanmills.com<br>Updated: 2021-08-10 1262 1263