xref: /netbsd-src/external/apache2/llvm/dist/llvm/cmake/modules/GetErrcMessages.cmake (revision 82d56013d7b633d116a93943de88e08335357a7c)
1*82d56013Sjoerg# This function returns the messages of various POSIX error codes as they are returned by std::error_code.
2*82d56013Sjoerg# The purpose of this function is to supply those error messages to llvm-lit using the errc_messages config.
3*82d56013Sjoerg# Currently supplied and needed error codes: ENOENT, EISDIR, EINVAL and EACCES.
4*82d56013Sjoerg# Messages are semi colon separated.
5*82d56013Sjoerg# Keep amount, order and tested error codes in sync with llvm/utils/lit/lit/llvm/config.py.
6*82d56013Sjoergfunction(get_errc_messages outvar)
7*82d56013Sjoerg    if(CMAKE_CROSSCOMPILING AND NOT CMAKE_CROSSCOMPILING_EMULATOR AND NOT DEFINED errc_exit_code)
8*82d56013Sjoerg        set(${outvar} "" PARENT_SCOPE)
9*82d56013Sjoerg        message(STATUS "Can't get errc messages in cross-compilation mode")
10*82d56013Sjoerg        return()
11*82d56013Sjoerg    endif()
12*82d56013Sjoerg
13*82d56013Sjoerg    set(errc_test_code ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/getErrc.cpp)
14*82d56013Sjoerg
15*82d56013Sjoerg    file(WRITE ${errc_test_code} "
16*82d56013Sjoerg        #include <cerrno>
17*82d56013Sjoerg        #include <iostream>
18*82d56013Sjoerg        #include <string>
19*82d56013Sjoerg        #include <system_error>
20*82d56013Sjoerg
21*82d56013Sjoerg        std::string getMessageFor(int err) {
22*82d56013Sjoerg            return std::make_error_code(static_cast<std::errc>(err)).message();
23*82d56013Sjoerg        }
24*82d56013Sjoerg
25*82d56013Sjoerg        int main() {
26*82d56013Sjoerg            std::cout << getMessageFor(ENOENT) << ';' << getMessageFor(EISDIR);
27*82d56013Sjoerg            std::cout << ';' << getMessageFor(EINVAL) << ';' << getMessageFor(EACCES);
28*82d56013Sjoerg        }
29*82d56013Sjoerg    ")
30*82d56013Sjoerg
31*82d56013Sjoerg    try_run(errc_exit_code
32*82d56013Sjoerg            errc_compiled
33*82d56013Sjoerg            ${CMAKE_BINARY_DIR}
34*82d56013Sjoerg            ${errc_test_code}
35*82d56013Sjoerg            RUN_OUTPUT_VARIABLE errc_result
36*82d56013Sjoerg            COMPILE_OUTPUT_VARIABLE errc_compile_errors)
37*82d56013Sjoerg    if (errc_compiled AND "${errc_exit_code}" STREQUAL "0")
38*82d56013Sjoerg        set(${outvar} ${errc_result} PARENT_SCOPE)
39*82d56013Sjoerg    else()
40*82d56013Sjoerg        set(${outvar} "" PARENT_SCOPE)
41*82d56013Sjoerg        message(STATUS "Failed to get errc messages")
42*82d56013Sjoerg    endif ()
43*82d56013Sjoergendfunction()
44