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