# Check the result of the Intel OpenCL offline compiler_output # <rant> # The Intel OpenCL offline compiler, ioc64 will return a non-0 exit code # when being invoked with illegal parameters. # # It will by default print a lot of stuff to stdout, even if compilation # does not encounter any errors. # # If there is a _build error_ (not an invocation error), it lets you know # by printing "Build failed!" to stdout. The process exit code will be 0 (!). # # I tried to invoke the compiler with execute_process from here at build time # capturing its output and printing it and failing if there's 'Build failed' in it. # # Unfortunately, the build option argument of ioc64 needs to be in quotes (""), # which is not really possible to be done from CMake, due to a limitation in the # CreateProcess API: http://stackoverflow.com/questions/34905194/cmake-how-to-call-execute-process-with-a-double-quote-in-the-argument-a-k-a-u # # I did not find a way to provide the OpenCL build options to the compiler # without double quotes. # # I don't have it in me to follow the proposal from the stackoverflow answer # (add_custom_command --> call cmake script --> file WRITE a batch script --> execute batch script --> parse output in cmake script) # # Now it parses the output frmo the compiler from a file. # It should normally procduce the compiler error message now, unless the compiler invocation # itself fails (will stay silent) or the compiler has an error that isn't reported # with "Build failed", then the error will be hidden / ignored on rebuilds. # # May a soul luckier than me find a sane way to do OpenCL SPIR compilation # on Windows some day. # # Godspeed. # </rant> # file(READ ${compiler_output} OUT) string(FIND ${OUT} "Build failed!" CONTAINS_BUILD_ERROR) if((CONTAINS_BUILD_ERROR GREATER 0) OR (NOT EXISTS ${spir_output})) message(STATUS "OpenCL SPIR build failed!") if(NOT EXISTS ${spir_output}) message(STATUS "Output file ${spir_output} is missing") endif() message(STATUS "OpenCL SPIR compiler build log:") message(FATAL_ERROR ${OUT}) endif()