Auto detect PyYAML and disable generator based tests if not available. (#7449)

Fixes #7448
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 36b05b6..d4240cc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -322,10 +322,19 @@
   else()
     find_package(Python3 COMPONENTS Interpreter Development.Module REQUIRED)
   endif()
-elseif(IREE_BUILD_COMPILER)
+elseif(IREE_BUILD_COMPILER OR IREE_BUILD_TESTS)
   find_package(Python3 COMPONENTS Interpreter REQUIRED)
 endif()
 
+# Extended Python environment checks.
+if(Python3_FOUND)
+  iree_detect_pyyaml()
+endif()
+
+if(IREE_BUILD_TESTS AND NOT IREE_PYYAML_FOUND)
+  message(WARNING "IREE's regression test suite requires PyYAML to run all tests. It is not installed, so some tests will be disabled.")
+endif()
+
 #-------------------------------------------------------------------------------
 # Check if git submodules have been initialized.
 # This will only run if python3 is available.
@@ -515,7 +524,7 @@
 add_subdirectory(iree/tools)
 
 if(IREE_BUILD_TRACY)
-  if(NOT LINUX)
+  if(NOT CMAKE_SYSTEM_NAME MATCHES "Linux")
     message(WARNING "Building Tracy (IREE_BUILD_TRACY) on non-Linux is unsupported and may fail below.")
   endif()
   add_subdirectory(build_tools/third_party/tracy ${CMAKE_CURRENT_BINARY_DIR}/tracy)
diff --git a/build_tools/cmake/iree_python.cmake b/build_tools/cmake/iree_python.cmake
index 447ab91..221fc22 100644
--- a/build_tools/cmake/iree_python.cmake
+++ b/build_tools/cmake/iree_python.cmake
@@ -7,6 +7,29 @@
 include(CMakeParseArguments)
 
 ###############################################################################
+# Package detection
+###############################################################################
+
+# Checks whether the PyYAML package is available. Sets IREE_PYYAML_FOUND to
+# ON if so.
+function(iree_detect_pyyaml)
+  execute_process(
+      COMMAND ${Python3_EXECUTABLE} -c "import yaml"
+      RESULT_VARIABLE EXIT_CODE
+      OUTPUT_QUIET
+      ERROR_QUIET
+  )
+  if(EXIT_CODE)
+    message(STATUS "Looking for PyYAML - not found (some features may not be available: install with 'python -m pip install PyYAML' or equiv for your system)")
+    set(IREE_PYYAML_FOUND OFF PARENT_SCOPE)
+  else()
+    message(STATUS "Looking for PyYAML - found")
+    set(IREE_PYYAML_FOUND ON PARENT_SCOPE)
+  endif()
+endfunction()
+
+
+###############################################################################
 # Main user rules
 ###############################################################################
 
diff --git a/build_tools/cmake/iree_trace_runner_test.cmake b/build_tools/cmake/iree_trace_runner_test.cmake
index 2e34645..b214a35 100644
--- a/build_tools/cmake/iree_trace_runner_test.cmake
+++ b/build_tools/cmake/iree_trace_runner_test.cmake
@@ -148,6 +148,13 @@
     return()
   endif()
 
+  # Traces are YAML files and we assume that PyYAML is required. See the
+  # warning that is emitted in aggregate in the main CMakeLists.txt if this
+  # is not true.
+  if(NOT IREE_PYYAML_FOUND)
+    return()
+  endif()
+
   cmake_parse_arguments(
     _RULE
     ""
@@ -183,7 +190,7 @@
 
   iree_package_name(_PACKAGE_NAME)
   set(_NAME "${_PACKAGE_NAME}_${_RULE_NAME}")
-  
+
   set(_SRC "${CMAKE_CURRENT_BINARY_DIR}/${_RULE_NAME}.mlir")
 
   set(_GENERATOR_OUTPUT "${_SRC}")
diff --git a/llvm-external-projects/iree-compiler-api/CMakeLists.txt b/llvm-external-projects/iree-compiler-api/CMakeLists.txt
index 45d26c6..749e4c7 100644
--- a/llvm-external-projects/iree-compiler-api/CMakeLists.txt
+++ b/llvm-external-projects/iree-compiler-api/CMakeLists.txt
@@ -52,13 +52,12 @@
 endif()
 
 message(STATUS "iree-compiler-api Directories:
-  IREE_COMPILER_API_SOURCE_DIR = ${IREE_COMPILER_API_SOURCE_DIR}
-  IREE_COMPILER_API_BINARY_DIR = ${IREE_COMPILER_API_BINARY_DIR}
-  IREE_SOURCE_DIR = ${IREE_SOURCE_DIR}
-  IREE_BINARY_DIR = ${IREE_BINARY_DIR}
-  LLVM_MAIN_SRC_DIR = ${LLVM_MAIN_SRC_DIR}
-  LLVM_MAIN_BINARY_DIR = ${LLVM_MAIN_BINARY_DIR}
-")
+     IREE_COMPILER_API_SOURCE_DIR = ${IREE_COMPILER_API_SOURCE_DIR}
+     IREE_COMPILER_API_BINARY_DIR = ${IREE_COMPILER_API_BINARY_DIR}
+     IREE_SOURCE_DIR = ${IREE_SOURCE_DIR}
+     IREE_BINARY_DIR = ${IREE_BINARY_DIR}
+     LLVM_MAIN_SRC_DIR = ${LLVM_MAIN_SRC_DIR}
+     LLVM_MAIN_BINARY_DIR = ${LLVM_MAIN_BINARY_DIR}")
 
 # LLVM dependent project directories.
 set(LLD_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../lld)