diff --git a/enzyme/CMakeLists.txt b/enzyme/CMakeLists.txt index 2ba42e969ce8..85ad069a6020 100644 --- a/enzyme/CMakeLists.txt +++ b/enzyme/CMakeLists.txt @@ -31,6 +31,7 @@ endif() set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +option(ENZYME_ENABLE_PLUGINS "Enable Clang/LLD/Opt plugins" ON) option(ENZYME_CLANG "Build enzyme clang plugin" ON) option(ENZYME_FLANG "Build enzyme flang symlink" OFF) option(ENZYME_MLIR "Build enzyme mlir plugin" OFF) @@ -70,17 +71,29 @@ message("CMAKE_PREFIX_PATH " ${CMAKE_PREFIX_PATH}) find_package(LLVM REQUIRED CONFIG) +if (NOT LLVM_ENABLE_PLUGINS) + message("LLVM_ENABLE_PLUGINS OFF") + message("Setting ENZYME_ENABLE_PLUGINS OFF") + set(ENZYME_ENABLE_PLUGINS OFF) +endif() + +if ((NOT ENZYME_EXTERNAL_SHARED_LIB) AND (NOT ENZYME_ENABLE_PLUGINS)) + message("ENZYME_EXTERNAL_SHARED_LIB OFF") + message("ENZYME_ENABLE_PLUGINS OFF") + message(SEND_ERROR "You have selected a build without creating the Enzyme plugin, nor Enzyme as a shared library -- and nothing will be built.") +endif() + if (NOT DEFINED LLVM_EXTERNAL_LIT) if(LLVM_DIR MATCHES ".*/cmake/llvm/?$") message("found llvm match ${CMAKE_MATCH_1} dir ${LLVM_DIR}") - if (EXISTS ${LLVM_DIR}/../../../bin/llvm-lit) - set(LLVM_EXTERNAL_LIT ${LLVM_DIR}/../../../bin/llvm-lit) + if (EXISTS ${LLVM_DIR}/../../../bin/llvm-lit) + set(LLVM_EXTERNAL_LIT ${LLVM_DIR}/../../../bin/llvm-lit) else() set(LLVM_EXTERNAL_LIT lit) endif() else() - if (EXISTS ${LLVM_DIR}/bin/llvm-lit) - set(LLVM_EXTERNAL_LIT ${LLVM_DIR}/bin/llvm-lit) + if (EXISTS ${LLVM_DIR}/bin/llvm-lit) + set(LLVM_EXTERNAL_LIT ${LLVM_DIR}/bin/llvm-lit) else() set(LLVM_EXTERNAL_LIT lit) endif() @@ -194,7 +207,7 @@ if (${Clang_FOUND}) add_definitions(${CLANG_DEFINITIONS}) endif() else() - set(Clang_FOUND 0) + set(Clang_FOUND 0) endif() message("found Clang ${Clang_FOUND}") @@ -210,7 +223,7 @@ if (DEFINED MLIR_DIR) include(AddMLIR) endif() else() - set(MLIR_FOUND 0) + set(MLIR_FOUND 0) endif() message("found MLIR ${MLIR_FOUND}") # include(AddClang) @@ -273,15 +286,16 @@ include_directories("${CMAKE_CURRENT_BINARY_DIR}/include") add_subdirectory(tools) add_subdirectory(Enzyme) add_subdirectory(BCLoad) -add_subdirectory(test) +if (ENZYME_ENABLE_PLUGINS) + add_subdirectory(test) +endif() # The benchmarks data are not in git-exported source archives to minimize size. # Only add the benchmarks if the directory exists. -if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/benchmarks") +if (ENZYME_ENABLE_PLUGINS AND (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/benchmarks")) add_subdirectory(benchmarks) endif() - # Make relative paths absolute (needed later on) foreach(p LIB BIN INCLUDE CMAKE) set(var INSTALL_${p}_DIR) @@ -290,6 +304,7 @@ if(NOT IS_ABSOLUTE "${${var}}") endif() endforeach() +if (ENZYME_ENABLE_PLUGINS) export(TARGETS LLVMEnzyme-${LLVM_VERSION_MAJOR} FILE "${PROJECT_BINARY_DIR}/EnzymeTargets.cmake") @@ -298,6 +313,7 @@ export(TARGETS ClangEnzyme-${LLVM_VERSION_MAJOR} APPEND FILE "${PROJECT_BINARY_DIR}/EnzymeTargets.cmake") export(TARGETS ClangEnzymeFlags APPEND FILE "${PROJECT_BINARY_DIR}/EnzymeTargets.cmake") +endif() file(GLOB_RECURSE ENZYME_INCLUDES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(bundled_includes "${CMAKE_CURRENT_BINARY_DIR}/Enzyme/Clang/bundled_includes.h") @@ -323,8 +339,10 @@ if (${ENZYME_FLANG} AND ${Clang_FOUND}) ) endif() +if (ENZYME_ENABLE_PLUGINS) export(TARGETS LLDEnzyme-${LLVM_VERSION_MAJOR} APPEND FILE "${PROJECT_BINARY_DIR}/EnzymeTargets.cmake") +endif() export(TARGETS LLDEnzymeFlags APPEND FILE "${PROJECT_BINARY_DIR}/EnzymeTargets.cmake") @@ -355,19 +373,19 @@ endif() set(CONF_INCLUDE_DIRS lib) configure_file(cmake/EnzymeConfig.cmake.in "${PROJECT_BINARY_DIR}/EnzymeConfig.cmake" @ONLY) - + set(CONF_INCLUDE_DIRS lib) configure_file(cmake/EnzymeConfig.cmake.in "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/EnzymeConfig.cmake" @ONLY) configure_file(cmake/EnzymeConfigVersion.cmake.in "${PROJECT_BINARY_DIR}/EnzymeConfigVersion.cmake" @ONLY) - + install(FILES "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/EnzymeConfig.cmake" "${PROJECT_BINARY_DIR}/EnzymeConfigVersion.cmake" DESTINATION "${INSTALL_CMAKE_DIR}" COMPONENT dev) - -install(EXPORT EnzymeTargets - DESTINATION "${INSTALL_CMAKE_DIR}" + +install(EXPORT EnzymeTargets + DESTINATION "${INSTALL_CMAKE_DIR}" COMPONENT dev) diff --git a/enzyme/Enzyme/CMakeLists.txt b/enzyme/Enzyme/CMakeLists.txt index 7e75716ec5f2..19df16f31233 100644 --- a/enzyme/Enzyme/CMakeLists.txt +++ b/enzyme/Enzyme/CMakeLists.txt @@ -50,73 +50,75 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) list(APPEND ENZYME_SRC TypeAnalysis/TypeTree.cpp TypeAnalysis/TypeAnalysis.cpp TypeAnalysis/TypeAnalysisPrinter.cpp TypeAnalysis/RustDebugInfo.cpp) -# on windows `PLUGIN_TOOL` doesn't link against LLVM.dll -if ((WIN32 OR CYGWIN) AND LLVM_LINK_LLVM_DYLIB) - add_llvm_library( LLVMEnzyme-${LLVM_VERSION_MAJOR} - ${ENZYME_SRC} - PARTIAL_SOURCES_INTENDED - MODULE - DEPENDS - intrinsics_gen - LINK_COMPONENTS - LLVM - ) -if (${Clang_FOUND}) - add_llvm_library( ClangEnzyme-${LLVM_VERSION_MAJOR} - ${ENZYME_SRC} Clang/EnzymeClang.cpp - Clang/EnzymePassLoader.cpp - PARTIAL_SOURCES_INTENDED - MODULE - DEPENDS - intrinsics_gen - LINK_COMPONENTS - LLVM - ) -target_compile_definitions(ClangEnzyme-${LLVM_VERSION_MAJOR} PUBLIC ENZYME_RUNPASS) -endif() - add_llvm_library( LLDEnzyme-${LLVM_VERSION_MAJOR} - ${ENZYME_SRC} Clang/EnzymePassLoader.cpp - PARTIAL_SOURCES_INTENDED - MODULE - DEPENDS - intrinsics_gen - LINK_COMPONENTS - LLVM - ) -target_compile_definitions(LLDEnzyme-${LLVM_VERSION_MAJOR} PUBLIC ENZYME_RUNPASS) -else() - add_llvm_library( LLVMEnzyme-${LLVM_VERSION_MAJOR} - ${ENZYME_SRC} - PARTIAL_SOURCES_INTENDED - MODULE - DEPENDS - intrinsics_gen - PLUGIN_TOOL - opt - ) -if (${Clang_FOUND}) - add_llvm_library( ClangEnzyme-${LLVM_VERSION_MAJOR} - ${ENZYME_SRC} Clang/EnzymeClang.cpp - Clang/EnzymePassLoader.cpp - PARTIAL_SOURCES_INTENDED - MODULE - DEPENDS - intrinsics_gen - PLUGIN_TOOL - clang - ) -target_compile_definitions(ClangEnzyme-${LLVM_VERSION_MAJOR} PUBLIC ENZYME_RUNPASS) -endif() - add_llvm_library( LLDEnzyme-${LLVM_VERSION_MAJOR} - ${ENZYME_SRC} Clang/EnzymePassLoader.cpp - PARTIAL_SOURCES_INTENDED - MODULE - DEPENDS - intrinsics_gen - PLUGIN_TOOL - opt - ) -target_compile_definitions(LLDEnzyme-${LLVM_VERSION_MAJOR} PUBLIC ENZYME_RUNPASS) +if (ENZYME_ENABLE_PLUGINS) + # on windows `PLUGIN_TOOL` doesn't link against LLVM.dll + if ((WIN32 OR CYGWIN) AND LLVM_LINK_LLVM_DYLIB) + add_llvm_library( LLVMEnzyme-${LLVM_VERSION_MAJOR} + ${ENZYME_SRC} + PARTIAL_SOURCES_INTENDED + MODULE + DEPENDS + intrinsics_gen + LINK_COMPONENTS + LLVM + ) + if (${Clang_FOUND}) + add_llvm_library( ClangEnzyme-${LLVM_VERSION_MAJOR} + ${ENZYME_SRC} Clang/EnzymeClang.cpp + Clang/EnzymePassLoader.cpp + PARTIAL_SOURCES_INTENDED + MODULE + DEPENDS + intrinsics_gen + LINK_COMPONENTS + LLVM + ) + target_compile_definitions(ClangEnzyme-${LLVM_VERSION_MAJOR} PUBLIC ENZYME_RUNPASS) + endif() + add_llvm_library( LLDEnzyme-${LLVM_VERSION_MAJOR} + ${ENZYME_SRC} Clang/EnzymePassLoader.cpp + PARTIAL_SOURCES_INTENDED + MODULE + DEPENDS + intrinsics_gen + LINK_COMPONENTS + LLVM + ) + target_compile_definitions(LLDEnzyme-${LLVM_VERSION_MAJOR} PUBLIC ENZYME_RUNPASS) + else() + add_llvm_library( LLVMEnzyme-${LLVM_VERSION_MAJOR} + ${ENZYME_SRC} + PARTIAL_SOURCES_INTENDED + MODULE + DEPENDS + intrinsics_gen + PLUGIN_TOOL + opt + ) + if (${Clang_FOUND}) + add_llvm_library( ClangEnzyme-${LLVM_VERSION_MAJOR} + ${ENZYME_SRC} Clang/EnzymeClang.cpp + Clang/EnzymePassLoader.cpp + PARTIAL_SOURCES_INTENDED + MODULE + DEPENDS + intrinsics_gen + PLUGIN_TOOL + clang + ) + target_compile_definitions(ClangEnzyme-${LLVM_VERSION_MAJOR} PUBLIC ENZYME_RUNPASS) + endif() + add_llvm_library( LLDEnzyme-${LLVM_VERSION_MAJOR} + ${ENZYME_SRC} Clang/EnzymePassLoader.cpp + PARTIAL_SOURCES_INTENDED + MODULE + DEPENDS + intrinsics_gen + PLUGIN_TOOL + opt + ) + target_compile_definitions(LLDEnzyme-${LLVM_VERSION_MAJOR} PUBLIC ENZYME_RUNPASS) + endif() endif() if (${ENZYME_STATIC_LIB}) @@ -185,8 +187,8 @@ target_link_options(LLDEnzymePrintFlags INTERFACE "SHELL: -Wl,-mllvm -Wl,-enzyme add_library(LLDEnzymeNoStrictAliasingFlags INTERFACE) target_link_options(LLDEnzymeNoStrictAliasingFlags INTERFACE "SHELL: -Wl,-mllvm -Wl,-enzyme-strict-aliasing=0") -# this custom target exists to prevent CMake from incorrectly assuming that -# targets that link depend on LLDEnzyme-XX can be built at the same time or +# this custom target exists to prevent CMake from incorrectly assuming that +# targets that link depend on LLDEnzyme-XX can be built at the same time or # before LLDEnzyme-XX has finished. add_custom_target(LLDEnzymeDummy "" DEPENDS LLDEnzyme-${LLVM_VERSION_MAJOR}) add_dependencies(LLDEnzymeFlags LLDEnzymeDummy) @@ -194,8 +196,8 @@ add_dependencies(LLDEnzymeFlags LLDEnzymeDummy) add_library(ClangEnzymeFlags INTERFACE) target_compile_options(ClangEnzymeFlags INTERFACE "-fplugin=$") -# this custom target exists to prevent CMake from incorrectly assuming that -# targets that link depend on ClangEnzyme-XX can be built at the same time or +# this custom target exists to prevent CMake from incorrectly assuming that +# targets that link depend on ClangEnzyme-XX can be built at the same time or # before ClangEnzyme-XX has finished. add_custom_target(ClangEnzymeDummy "" DEPENDS ClangEnzyme-${LLVM_VERSION_MAJOR}) add_dependencies(ClangEnzymeFlags ClangEnzymeDummy) @@ -203,23 +205,25 @@ add_dependencies(ClangEnzymeFlags ClangEnzymeDummy) install(TARGETS LLDEnzymeFlags EXPORT EnzymeTargets) install(TARGETS ClangEnzymeFlags EXPORT EnzymeTargets) -install(TARGETS LLVMEnzyme-${LLVM_VERSION_MAJOR} - EXPORT EnzymeTargets - LIBRARY DESTINATION lib COMPONENT shlib - COMPONENT dev) +if (ENZYME_ENABLE_PLUGINS) + install(TARGETS LLVMEnzyme-${LLVM_VERSION_MAJOR} + EXPORT EnzymeTargets + LIBRARY DESTINATION lib COMPONENT shlib + COMPONENT dev) -if (${Clang_FOUND}) -install(TARGETS ClangEnzyme-${LLVM_VERSION_MAJOR} - EXPORT EnzymeTargets - LIBRARY DESTINATION lib COMPONENT shlib - COMPONENT dev) - install(DIRECTORY "${PROJECT_SOURCE_DIR}/include/enzyme" DESTINATION "include") -endif() -install(TARGETS LLDEnzyme-${LLVM_VERSION_MAJOR} - EXPORT EnzymeTargets - LIBRARY DESTINATION lib COMPONENT shlib - COMPONENT dev) + if (${Clang_FOUND}) + install(TARGETS ClangEnzyme-${LLVM_VERSION_MAJOR} + EXPORT EnzymeTargets + LIBRARY DESTINATION lib COMPONENT shlib + COMPONENT dev) + install(DIRECTORY "${PROJECT_SOURCE_DIR}/include/enzyme" DESTINATION "include") + endif() + install(TARGETS LLDEnzyme-${LLVM_VERSION_MAJOR} + EXPORT EnzymeTargets + LIBRARY DESTINATION lib COMPONENT shlib + COMPONENT dev) + endif() -if (ENZYME_MLIR) - add_subdirectory(MLIR) + if (ENZYME_MLIR) + add_subdirectory(MLIR) endif()