namespace tf {

/** @page install Building and Installing

This page describes how to set up %Taskflow in your project. 
We will also go through the building process of unit tests and examples.

@tableofcontents

@section BAISupportedCompilers Supported Compilers

To use %Taskflow, you only need a compiler that supports C++17:

@li GNU C++ Compiler at least v8.4 with -std=c++17
@li Clang C++ Compiler at least v6.0 with -std=c++17
@li Microsoft Visual Studio at least v15.7 (MSVC++ 19.14)
@li AppleClang Xcode Version at least v12.0 with -std=c++17
@li Nvidia CUDA Toolkit and Compiler (nvcc) at least v11.1 with -std=c++17
@li Intel C++ Compiler (nvcc) at least v19.0.1 with -std=c++17
@li Intel DPC++ Clang Compiler at least v13.0.0 with -std=c++17 and SYCL20

%Taskflow works on Linux, Windows, and Mac OS X.

@section BAIIntegrateTaskflowToYourProject Integrate Taskflow to Your Project

%Taskflow is *header-only* and there is no need for installation.
Simply download the source and copy the headers under the directory @c taskflow/
to your project.

@code{.shell-session}
~$ git clone https://github.com/taskflow/taskflow.git
~$ cd taskflow/
~$ cp -r taskflow myproject/include/
@endcode

%Taskflow is written in C++17 and is built on top of 
C++ standardized threading libraries to improve portability.
To compile a %Taskflow program, say <tt>simple.cpp</tt>, you need to tell the compiler
where to find the %Taskflow header files and link it through the system thread library
(usually [POSIX threads](http://man7.org/linux/man-pages/man7/pthreads.7.html) in Linux-like systems).
Take gcc for an example:

@code{.shell-session}
~$ g++ simple.cpp -std=c++17 -I myproject/include/ -O2 -pthread -o simple
@endcode


@section BAIBuildExamplesAndUnitTests Build Examples and Unit Tests

%Taskflow uses CMake to build examples and unit tests. 
We recommend using out-of-source build.

@code{.shell-session}
~$ cd path/to/taskflow
~$ mkdir build
~$ cd build
~$ cmake ../
~$ make                         # compile all examples and unittests
~$ make test

Running tests...
/usr/bin/ctest --force-new-ctest-process
Test project /home/tsung-wei/Code/taskflow/build
        Start   1: passive_vector
  1/254 Test   #1: passive_vector ...................   Passed    0.04 sec
        Start   2: function_traits
  2/254 Test   #2: function_traits ..................   Passed    0.00 sec
        Start   3: object_pool.sequential
  3/254 Test   #3: object_pool.sequential ...........   Passed    0.10 sec
...

100% tests passed, 0 tests failed out of 254

Total Test time (real) =  29.67 sec
@endcode

When the building completes, you can find the executables for examples and tests
under the two folders, @c examples/ and @c unittests/.
You can list a set of available options in the cmake.

@code{.shell-session}
~$ cmake -LA
...
TF_BUILD_EXAMPLES:BOOL=ON       # by default, we compile examples
TF_BUILD_TESTS:BOOL=ON          # by default, we compile tests
TF_BUILD_BENCHMARKS:BOOL=OFF    # by default, we don't compile benchmarks 
TF_BUILD_CUDA:BOOL=OFF          # by default, we don't compile CUDA code
...
... more options
@endcode

Currently, our CMake script supports the following options:

<div align="center">
| CMake Option        | Default   | Usage   |
| :-:                 | :-:       | :-:     |
| TF_BUILD_EXAMPLES   | ON        | enable/disable building examples   |
| TF_BUILD_TESTS      | ON        | enable/disable building unit tests |
| TF_BUILD_BENCHMARKS | OFF       | enable/disable building benchmarks |
| TF_BUILD_CUDA       | OFF       | enable/disable building CUDA code  |
</div>

To enable or disable a specific option, use @c -D in the CMake build. 
For example:

@code{.shell-session}
~$ cmake ../ -DTF_BUILD_EXAMPLES=OFF
@endcode

The above command turns off building %Taskflow examples.

@section BAIBuildCUDACode Build CUDA Examples and Unit Tests

To build CUDA code, including unit tests and examples, 
enable the CMake option @c TF_BUILD_CUDA to @c ON. 
Cmake will automatically detect the existence of @c nvcc 
and use it to compile and link @c .cu code.

@code{.shell-session}
~$ cmake ../ -DTF_BUILD_CUDA=ON
~$ make
@endcode

Please visit the page @subpage CompileTaskflowWithCUDA for details.


@section BAIBuildSanitizers Build Sanitizers

You can build %Taskflow with @em sanitizers to detect a variety of errors,
such as data race, memory leak, undefined behavior, and others.
To enable a sanitizer, add the sanitizer flag to the CMake variable
`CMAKE_CXX_FLAGS`.
The following example enables thread sanitizer in building %Taskflow code
to detect data race:

@code{.shell-session}
# build Taskflow code with thread sanitizer to detect data race
~$ cmake ../ -DCMAKE_CXX_FLAGS="-fsanitize=thread -g"

# build Taskflow code with address sanitizer to detect illegal memory access
~$ cmake ../ -DCMAKE_CXX_FLAGS="-fsanitize=address -g"

# build Taskflow code with ub sanitizer to detect undefined behavior
~$ cmake ../ -DCMAKE_CXX_FLAGS="-fsanitize=undefined -g"
@endcode

Our @CI incorporates 
thread sanitizer ([-fsanitize=thread](https://clang.llvm.org/docs/ThreadSanitizer.html)),
address sanitizer ([-fsanitize=address](https://clang.llvm.org/docs/AddressSanitizer.html)), and
leak sanitizer ([-fsanitize=leak](https://clang.llvm.org/docs/LeakSanitizer.html))
to detect data race, illegal memory address, and memory leak.
To our best knowledge,
%Taskflow is one of the very few parallel programming libraries
that are free from data race.

@attention
Some sanitizers are supported by certain computing architectures.
You can find the information about architecture support of each sanitizer at 
[Clang Documentation](https://clang.llvm.org/docs/index.html) and
[GCC Instrumentation Options](https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html).

@section BAIBuildBenchmarks Build Benchmarks

The %Taskflow project contains a set of benchmarks to evaluate and compare 
the performance of Taskflow with existing parallel programming libraries.
To build the benchmark code,
enable the CMake option @c TF_BUILD_BENCHMARKS to @c ON as follows:

@code{.shell-session}
~$ cmake ../ -DTF_BUILD_BENCHMARKS=ON
~$ make
@endcode

Please visit the page @subpage BenchmarkTaskflow for details.

@section BAIBuildDocumentation Build Documentation

%Taskflow uses @Doxygen and @MCSS to generate this documentation.
The source of documentation is located in the folder @c taskflow/doxygen
and the generated html is output to the folder @c taskflow/docs.
To generate the documentation, you need to first install doxygen:

@code{.shell-session}
# ubuntu as an example
~$ sudo apt-get install doxygen graphviz
@endcode

Once you have doxygen and dot graph generator installed, clone the m.css project and enter
the @c m.css/documentation directory:

@code{.shell-session}
~$ git clone https://github.com/mosra/m.css.git
~$ cd m.css/documentation
@endcode

The script @c doxygen.py requires Python 3.6, depends on 
<a href="http://jinja.pocoo.org/">Jinja2</a> for templating and 
<a href="http://pygments.org/">Pygments</a> for code block highlighting. 
You can install the dependencies via @c pip or your distribution package manager:

@code{.shell-session}
# You may need sudo here
# More details are available at https://mcss.mosra.cz/documentation/doxygen/
~$ pip3 install jinja2 Pygments
@endcode

Next, invoke @c doxygen.py and point it to the @c taskflow/doxygen/conf.py:

@code{.shell-session}
~$ ./doxygen.py path/to/taskflow/doxygen/conf.py
@endcode

You can find the documentation output in @c taskflow/docs.

*/

}








