| # This function returns the messages of various POSIX error codes as they are returned by std::error_code. |
| # The purpose of this function is to supply those error messages to llvm-lit using the errc_messages config. |
| # Currently supplied and needed error codes: ENOENT, EISDIR, EINVAL and EACCES. |
| # Messages are semi colon separated. |
| # Keep amount, order and tested error codes in sync with llvm/utils/lit/lit/llvm/config.py. |
| function(get_errc_messages outvar) |
| if(CMAKE_CROSSCOMPILING AND NOT CMAKE_CROSSCOMPILING_EMULATOR AND NOT DEFINED errc_exit_code) |
| set(${outvar} "" PARENT_SCOPE) |
| message(STATUS "Can't get errc messages in cross-compilation mode") |
| return() |
| endif() |
| |
| set(errc_test_code ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/getErrc.cpp) |
| |
| file(WRITE ${errc_test_code} " |
| #include <cerrno> |
| #include <iostream> |
| #include <string> |
| #include <system_error> |
| |
| std::string getMessageFor(int err) { |
| return std::make_error_code(static_cast<std::errc>(err)).message(); |
| } |
| |
| int main() { |
| std::cout << getMessageFor(ENOENT) << ';' << getMessageFor(EISDIR); |
| std::cout << ';' << getMessageFor(EINVAL) << ';' << getMessageFor(EACCES); |
| } |
| ") |
| |
| try_run(errc_exit_code |
| errc_compiled |
| ${CMAKE_BINARY_DIR} |
| ${errc_test_code} |
| RUN_OUTPUT_VARIABLE errc_result |
| COMPILE_OUTPUT_VARIABLE errc_compile_errors) |
| if (errc_compiled AND "${errc_exit_code}" STREQUAL "0") |
| set(${outvar} ${errc_result} PARENT_SCOPE) |
| else() |
| set(${outvar} "" PARENT_SCOPE) |
| message(STATUS "Failed to get errc messages") |
| endif () |
| endfunction() |