| # 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() |