| This folder contains various custom cmake modules for finding libraries and packages. Details about some of them are listed below. |
| |
| ### [`FindOpenMP.cmake`](./FindOpenMP.cmake) |
| |
| This is modified from [the file included in CMake 3.13 release](https://github.com/Kitware/CMake/blob/05a2ca7f87b9ae73f373e9967fde1ee5210e33af/Modules/FindOpenMP.cmake), with the following changes: |
| |
| + Replace `VERSION_GREATER_EQUAL` with `NOT ... VERSION_LESS` as `VERSION_GREATER_EQUAL` is not supported in CMake 3.5 (our min supported version). |
| |
| + Update the `separate_arguments` commands to not use `NATIVE_COMMAND` which is not supported in CMake 3.5 (our min supported version). |
| |
| + Make it respect the `QUIET` flag so that, when it is set, `try_compile` failures are not reported. |
| |
| + For `AppleClang` compilers, use `-Xpreprocessor` instead of `-Xclang` as the later is not documented. |
| |
| + For `AppleClang` compilers, an extra flag option is tried, which is `-Xpreprocessor -openmp -I${DIR_OF_omp_h}`, where `${DIR_OF_omp_h}` is a obtained using `find_path` on `omp.h` with `brew`'s default include directory as a hint. Without this, the compiler will complain about missing headers as they are not natively included in Apple's LLVM. |
| |
| + For non-GNU compilers, whenever we try a candidate OpenMP flag, first try it with directly linking MKL's `libomp` if it has one. Otherwise, we may end up linking two `libomp`s and end up with this nasty error: |
| |
| ``` |
| OMP: Error #15: Initializing libomp.dylib, but found libiomp5.dylib already |
| initialized. |
| |
| OMP: Hint This means that multiple copies of the OpenMP runtime have been |
| linked into the program. That is dangerous, since it can degrade performance |
| or cause incorrect results. The best thing to do is to ensure that only a |
| single OpenMP runtime is linked into the process, e.g. by avoiding static |
| linking of the OpenMP runtime in any library. As an unsafe, unsupported, |
| undocumented workaround you can set the environment variable |
| KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but |
| that may cause crashes or silently produce incorrect results. For more |
| information, please see http://openmp.llvm.org/ |
| ``` |
| |
| See NOTE [ Linking both MKL and OpenMP ] for details. |