| # COPYRIGHT (c) 2017 Obsidian Research Corporation. |
| # Licensed under BSD (MIT variant) or GPLv2. See COPYING. |
| |
| function(RDMA_CheckSparse) |
| # Sparse defines __CHECKER__, but only for the 'sparse pass', which has no |
| # way to fail the compiler. |
| CHECK_C_SOURCE_COMPILES(" |
| #if __CHECKER__ |
| #warning \"SPARSE DETECTED\" |
| #endif |
| int main(int argc,const char *argv[]) {return 0;} |
| " |
| HAVE_NO_SPARSE |
| FAIL_REGEX "SPARSE DETECTED") |
| |
| if (HAVE_NO_SPARSE) |
| set(HAVE_SPARSE FALSE PARENT_SCOPE) |
| else() |
| set(HAVE_SPARSE TRUE PARENT_SCOPE) |
| |
| # Replace various glibc headers with our own versions that have embedded sparse annotations. |
| execute_process(COMMAND "${PYTHON_EXECUTABLE}" "${BUILDLIB}/gen-sparse.py" |
| "--out" "${BUILD_INCLUDE}/" |
| "--src" "${PROJECT_SOURCE_DIR}/" |
| "--cc" "${CMAKE_C_COMPILER}" |
| RESULT_VARIABLE retcode) |
| if(NOT "${retcode}" STREQUAL "0") |
| message(FATAL_ERROR "glibc header file patching for sparse failed. Review include/*.rej and fix the rejects, then do " |
| "${BUILDLIB}/gen-sparse.py --out ${BUILD_INCLUDE}/ --src ${PROJECT_SOURCE_DIR}/ --save") |
| endif() |
| |
| # Enable endian analysis in sparse |
| add_definitions("-D__CHECK_ENDIAN__") |
| endif() |
| endfunction() |