Installing jdupes
-----------------------------------------------------------------------------
To install the program with the default options and flags, just issue the
following commands (note that btrfs support is off by default):

make
su root
make install

This installs all jdupes files under /usr/local by default. You may change this
to a different location by editing the Makefile or specifying a PREFIX on the
command line: make PREFIX=/usr install

On Windows, you need to use MSYS2 with MinGW-w64 installed. Use this guide to
install the build environment:

https://stackoverflow.com/a/30071634/1906641

Running "make" as usual under the MSYS2 mingw32/mingw64 terminal will build a
Windows binary for the bitness of the terminal you're using. The Makefile will
detect a Windows environment and automatically make the needed build changes.

Various build options are available and can be turned on at compile time by
setting CFLAGS_EXTRA or by passing it to 'make':

make CFLAGS_EXTRA=-DYOUR_OPTION
make CFLAGS_EXTRA='-DYOUR_OPTION_ONE -DYOUR_OPTION_TWO'

This is a list of options that can be "turned on" this way:

OMIT_GETOPT_LONG       Do not use getopt_long() C library call
ON_WINDOWS             Modify code to compile with MinGW on Windows
NO_WINDOWS             Disable Windows MinGW special cases (mainly for Cygwin)
USE_JODY_HASH          Use jody_hash instead of xxHash64 (smaller, slower)
NO_ATIME               Disable all access time features
NO_CHUNKSIZE           Disable auto I/O chunk sizing code and -C option
NO_DELETE              Disable deletion -d, -N
NO_EXTFILTER           Disable extended filter -X
NO_HARDLINKS           Disable hard link code -L, -H
NO_JSON                Disable JSON output -j
NO_MTIME               Disable all modify time features
NO_NUMSORT             Disable numerically-correct sort (use "naive" name sort)
NO_PERMS               Disable permission matching -p
NO_SYMLINKS            Disable symbolic link code -l, -s
NO_TRAVCHECK           Disable double-traversal safety code (-U always on)
NO_USER_ORDER          Disable isolation and parameter sort order -I, -O

Certain options can be turned on by setting a variable passed to make instead
of using CFLAGS_EXTRA, i.e. 'make DEBUG=1':

NO_UNICODE             [Windows only] disable all Unicode support
DEBUG                  Turn on algorithm statistic reporting with '-D'
LOUD                   '-@' for low-level debugging; enables DEBUG
ENABLE_DEDUPE          Enable '-B/--dedupe' deduplication features
STATIC_DEDUPE_H        Build dedupe support with included minimal header file
LOW_MEMORY             Build for extremely low-RAM environments (CAUTION!)
BARE_BONES             Build LOW_MEMORY with very aggressive code removal

The LOW_MEMORY option tweaks various knobs in the program to lower total
memory usage. It also disables some features to reduce the size of certain
data structures. The improvements in memory usage are not very large, but if
you're running in a very RAM-limited environment or have a CPU with very small
caches it may be a good choice. This is primarily meant for use in embedded
systems and should not be used unless you know what you are doing.

The BARE_BONES option sets LOW_MEMORY and also enables code removals that are
extremely aggressive, to the point that what some might consider fundamental
capabilities and safety features are completely stripped out, inclduing the
NO_DELETE and NO_TRAVCHECK options. It is intended to reduce the program to
the most basic functionality expected of a simple duplicate finder and may
be suitable for embedded systems with extremely limited storage and memory.
This is an example of the size drop for a normal 64-bit Windows build:

   text    data     bss   total  filename
 128384    6988  167776  303148  jdupes.exe
  74248    6348   29888  110484  jdupes-barebones.exe
-------------------------------
- 54136     640  137888  192664  size reduction (64% smaller)

A test directory is included so that you may familiarize yourself with the way
jdupes operates. You may test the program before installing it by issuing a
command such as "./jdupes testdir" or "./jdupes -r testdir", just to name a
couple of examples. See the README for information on valid options.

A comparison shell script is also included. It will run your natively
installed 'jdupes' or 'jdupes' with the directories and extra options you
specify and compare the run times and output a 'diff' of the two program
outputs. Unless the core algorithm or sort behavior is changed, both programs
should produce identical outputs and the 'diff' output shouldn't appear at
all. To use it, type:

./compare_jdupes.sh [options]

There are some package generators included as make targets:

chrootpackage  Uses chroots under /chroot to build Linux packages
package        Makes auto-detected macOS/Linux/Windows packages

Windows builds do not support dedupe or symbolic links. Dedupe would only work
in ReFS which was removed from all non-enterprise Windows 10 editions, so it
will likely never be supported for Windows builds of jdupes. Symbolic linking
is supported on Windows, but on all versions of Windows before Windows 10 1703
(the "Creators Update"), creating symlinks required administrative escalation.
Symlinks can be dangerous on Windows because most Windows software is symlink-
unaware. Support can be added in the future, but it is not a priority. If you
are interested in seeing symlink support added, leave a +1 comment here:

https://github.com/jbruchon/jdupes/issues/194
