Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 32 additions & 14 deletions enzyme/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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 built 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()
Expand Down Expand Up @@ -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}")

Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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")

Expand All @@ -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")
Expand All @@ -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")
Expand Down Expand Up @@ -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)
180 changes: 92 additions & 88 deletions enzyme/Enzyme/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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})
Expand Down Expand Up @@ -185,41 +187,43 @@ 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)

add_library(ClangEnzymeFlags INTERFACE)
target_compile_options(ClangEnzymeFlags INTERFACE "-fplugin=$<TARGET_FILE:ClangEnzyme-${LLVM_VERSION_MAJOR}>")

# 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)

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()
Loading