diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -919,15 +919,25 @@ foreach(t ${LLVM_TARGETS_TO_BUILD}) set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} ) - list(FIND LLVM_ALL_TARGETS ${t} idx) - list(FIND LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ${t} idy) - # At this point, LLVMBUILDTOOL already checked all the targets passed in - # LLVM_TARGETS_TO_BUILD and LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, so - # this test just makes sure that any experimental targets were passed via + # Make sure that any experimental targets were passed via # LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, not LLVM_TARGETS_TO_BUILD. - if( idx LESS 0 AND idy LESS 0 ) - message(FATAL_ERROR "The target `${t}' is experimental and must be passed " - "via LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.") + # We allow experimental targets that are not in LLVM_ALL_EXPERIMENTAL_TARGETS, + # as long as they are passed via LLVM_EXPERIMENTAL_TARGETS_TO_BUILD. + list(FIND LLVM_ALL_TARGETS ${t} idx_all_targets) + list(FIND LLVM_ALL_EXPERIMENTAL_TARGETS ${t} idx_all_experimental_targets) + list(FIND LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ${t} idx_experimental_to_build) + + if( idx_all_targets LESS 0 AND idx_experimental_to_build LESS 0) + if( idx_all_experimental_targets GREATER_EQUAL 0) + message(FATAL_ERROR "The target `${t}' is experimental and must be passed " + "via LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.") + else() + message(FATAL_ERROR "The target `${t}' is not a default target. It may be " + "experimental, if so it must be passed via " + "LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.\n" + "Default targets: ${LLVM_ALL_TARGETS}\n" + "Known experimental targets: ${LLVM_ALL_EXPERIMENTAL_TARGETS}") + endif() else() set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${t})\n") endif()