| # Find nosetests; see shaderc_add_nosetests() from utils.cmake for opting in to |
| # nosetests in a specific directory. |
| find_program(NOSETESTS_EXE NAMES nosetests PATHS $ENV{PYTHON_PACKAGE_PATH}) |
| if (NOT NOSETESTS_EXE) |
| message(STATUS "nosetests was not found - python code will not be tested") |
| endif() |
| |
| # Find asciidoctor; see shaderc_add_asciidoc() from utils.cmake for |
| # adding documents. |
| find_program(ASCIIDOCTOR_EXE NAMES asciidoctor) |
| if (NOT ASCIIDOCTOR_EXE) |
| message(STATUS "asciidoctor was not found - no documentation will be" |
| " generated") |
| endif() |
| |
| # On Windows, CMake by default compiles with the shared CRT. |
| # Ensure that gmock compiles the same, otherwise failures will occur. |
| if(WIN32) |
| # TODO(awoloszyn): Once we support selecting CRT versions, |
| # make sure this matches correctly. |
| set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) |
| endif(WIN32) |
| |
| if (ANDROID) |
| # For android let's preemptively find the correct packages so that |
| # child projects (glslang, googletest) do not fail to find them. |
| find_host_package(PythonInterp) |
| find_host_package(BISON) |
| endif() |
| |
| foreach(PROGRAM echo python) |
| string(TOUPPER ${PROGRAM} PROG_UC) |
| if (ANDROID) |
| find_host_program(${PROG_UC}_EXE ${PROGRAM} REQUIRED) |
| else() |
| find_program(${PROG_UC}_EXE ${PROGRAM} REQUIRED) |
| endif() |
| endforeach(PROGRAM) |
| |
| option(ENABLE_CODE_COVERAGE "Enable collecting code coverage." OFF) |
| if (ENABLE_CODE_COVERAGE) |
| message(STATUS "Shaderc: code coverage report is on.") |
| if (NOT UNIX) |
| message(FATAL_ERROR "Code coverage on non-UNIX system not supported yet.") |
| endif() |
| if (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Debug") |
| message(FATAL_ERROR "Code coverage with non-Debug build can be misleading.") |
| endif() |
| find_program(LCOV_EXE NAMES lcov) |
| if (NOT LCOV_EXE) |
| message(FATAL_ERROR "lcov was not found") |
| endif() |
| find_program(GENHTML_EXE NAMES genhtml) |
| if (NOT GENHTML_EXE) |
| message(FATAL_ERROR "genhtml was not found") |
| endif() |
| |
| set(LCOV_BASE_DIR ${CMAKE_BINARY_DIR}) |
| set(LCOV_INFO_FILE ${LCOV_BASE_DIR}/lcov.info) |
| set(COVERAGE_STAT_HTML_DIR ${LCOV_BASE_DIR}/coverage-report) |
| |
| add_custom_target(clean-coverage |
| # Remove all gcov .gcda files in the directory recursively. |
| COMMAND ${LCOV_EXE} --directory . --zerocounters -q |
| # Remove all lcov .info files. |
| COMMAND ${CMAKE_COMMAND} -E remove ${LCOV_INFO_FILE} |
| # Remove all html report files. |
| COMMAND ${CMAKE_COMMAND} -E remove_directory ${COVERAGE_STAT_HTML_DIR} |
| # TODO(antiagainst): the following two commands are here to remedy the |
| # problem of "reached unexpected end of file" experienced by lcov. |
| # The symptom is that some .gcno files are wrong after code change and |
| # recompiling. We don't know the exact reason yet. Figure it out. |
| # Remove all .gcno files in the directory recursively. |
| COMMAND ${PYTHON_EXECUTABLE} |
| ${shaderc_SOURCE_DIR}/utils/remove-file-by-suffix.py . ".gcno" |
| # .gcno files are not tracked by CMake. So no recompiling is triggered |
| # even if they are missing. Unfortunately, we just removed all of them |
| # in the above. |
| COMMAND ${CMAKE_COMMAND} --build . --target clean |
| WORKING_DIRECTORY ${LCOV_BASE_DIR} |
| COMMENT "Clean coverage files" |
| ) |
| |
| add_custom_target(report-coverage |
| COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} |
| # Run all tests. |
| COMMAND ctest --output-on-failure |
| # Collect coverage data from gcov .gcda files. |
| COMMAND ${LCOV_EXE} --directory . --capture -o ${LCOV_INFO_FILE} |
| # Remove coverage info for system header files. |
| COMMAND ${LCOV_EXE} |
| --remove ${LCOV_INFO_FILE} '/usr/include/*' -o ${LCOV_INFO_FILE} |
| # Remove coverage info for external and third_party code. |
| COMMAND ${LCOV_EXE} |
| --remove ${LCOV_INFO_FILE} '${shaderc_SOURCE_DIR}/ext/*' |
| -o ${LCOV_INFO_FILE} |
| |
| COMMAND ${LCOV_EXE} |
| --remove ${LCOV_INFO_FILE} '${shaderc_SOURCE_DIR}/third_party/*' |
| -o ${LCOV_INFO_FILE} |
| # Remove coverage info for tests. |
| COMMAND ${LCOV_EXE} |
| --remove ${LCOV_INFO_FILE} '*_test.cc' -o ${LCOV_INFO_FILE} |
| # Generate html report file. |
| COMMAND ${GENHTML_EXE} |
| ${LCOV_INFO_FILE} -t "Coverage Report" -o ${COVERAGE_STAT_HTML_DIR} |
| DEPENDS clean-coverage |
| WORKING_DIRECTORY ${LCOV_BASE_DIR} |
| COMMENT "Collect and analyze coverage data" |
| ) |
| endif() |
| |
| option(DISABLE_RTTI "Disable RTTI in builds") |
| if(DISABLE_RTTI) |
| if(UNIX) |
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti") |
| endif(UNIX) |
| endif(DISABLE_RTTI) |
| |
| option(DISABLE_EXCEPTIONS "Disables exceptions in builds") |
| if(DISABLE_EXCEPTIONS) |
| if(UNIX) |
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") |
| endif(UNIX) |
| endif(DISABLE_EXCEPTIONS) |