diff options
author | Stephen Neuendorffer <stephen.neuendorffer@xilinx.com> | 2020-03-11 22:35:58 -0700 |
---|---|---|
committer | Stephen Neuendorffer <stephen.neuendorffer@xilinx.com> | 2020-03-17 19:43:39 -0700 |
commit | 7ca473a27bd589457d427eee9187d49a88fc9b01 (patch) | |
tree | 81cb98c24c453cd45f111b1354e0cf39b7087b32 /mlir/cmake | |
parent | 7b166d5182356bda7fe09c8473674525292b45a2 (diff) | |
download | llvm-libc-7ca473a27bd589457d427eee9187d49a88fc9b01.tar.gz |
[MLIR] Add support for out of tree external projects using MLIR
LLVM has a documented mechanism for passing configuration information
to an out of tree project using cmake. See
https://llvm.org/docs/CMake.html#embedding-llvm-in-your-project. This
patch adds similar support for MLIR.
Using this requires something like:
cmake_minimum_required(VERSION 3.4.3)
project(SimpleProject)
find_package(MLIR REQUIRED CONFIG)
include_directories(${LLVM_INCLUDE_DIRS})
include_directories(${MLIR_INCLUDE_DIRS})
link_directories(${LLVM_BUILD_LIBRARY_DIR})
add_definitions(${LLVM_DEFINITIONS})
set(CMAKE_MODULE_PATH
${LLVM_CMAKE_DIR}
${MLIR_CMAKE_DIR}
)
include(AddLLVM)
include(TableGen)
include(AddMLIR)
add_executable(test-opt test-opt.cpp)
llvm_update_compile_flags(test-opt)
get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS)
get_property(conversion_libs GLOBAL PROPERTY MLIR_CONVERSION_LIBS)
message(dialects=${dialect_libs})
set(LIBS
${dialect_libs}
${conversion_libs}
MLIRLoopOpsTransforms
MLIRLoopAnalysis
MLIRAnalysis
MLIRDialect
MLIREDSC
MLIROptLib
MLIRParser
MLIRPass
MLIRQuantizerFxpMathConfig
MLIRQuantizerSupport
MLIRQuantizerTransforms
MLIRSPIRV
MLIRSPIRVTestPasses
MLIRSPIRVTransforms
MLIRTransforms
MLIRTransformUtils
MLIRTestDialect
MLIRTestIR
MLIRTestPass
MLIRTestTransforms
MLIRSupport
MLIRIR
MLIROptLib
LLVMSupport
LLVMCore
LLVMAsmParser
)
target_link_libraries(test-opt ${LIBS})
Differential Revision: https://reviews.llvm.org/D76047
Diffstat (limited to 'mlir/cmake')
-rw-r--r-- | mlir/cmake/modules/CMakeLists.txt | 41 | ||||
-rw-r--r-- | mlir/cmake/modules/MLIRConfig.cmake.in | 35 |
2 files changed, 68 insertions, 8 deletions
diff --git a/mlir/cmake/modules/CMakeLists.txt b/mlir/cmake/modules/CMakeLists.txt index 36ae28d78faa..588de5495db6 100644 --- a/mlir/cmake/modules/CMakeLists.txt +++ b/mlir/cmake/modules/CMakeLists.txt @@ -1,7 +1,7 @@ # Generate a list of CMake library targets so that other CMake projects can # link against them. LLVM calls its version of this file LLVMExports.cmake, but # the usual CMake convention seems to be ${Project}Targets.cmake. -set(MLIR_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm) +set(MLIR_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX}/cmake/mlir) set(mlir_cmake_builddir "${CMAKE_BINARY_DIR}/${MLIR_INSTALL_PACKAGE_DIR}") # Keep this in sync with llvm/cmake/CMakeLists.txt! @@ -9,23 +9,41 @@ set(LLVM_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm) set(llvm_cmake_builddir "${LLVM_BINARY_DIR}/${LLVM_INSTALL_PACKAGE_DIR}") get_property(MLIR_EXPORTS GLOBAL PROPERTY MLIR_EXPORTS) -export(TARGETS ${MLIR_EXPORTS} FILE ${mlir_cmake_builddir}/MlirTargets.cmake) +export(TARGETS ${MLIR_EXPORTS} FILE ${mlir_cmake_builddir}/MLIRTargets.cmake) + +get_property(MLIR_ALL_LIBS GLOBAL PROPERTY MLIR_ALL_LIBS) +get_property(MLIR_DIALECT_LIBS GLOBAL PROPERTY MLIR_DIALECT_LIBS) +get_property(MLIR_CONVERSION_LIBS GLOBAL PROPERTY MLIR_CONVERSION_LIBS) # Generate MlirConfig.cmake for the build tree. set(MLIR_CONFIG_CMAKE_DIR "${mlir_cmake_builddir}") set(MLIR_CONFIG_LLVM_CMAKE_DIR "${llvm_cmake_builddir}") -set(MLIR_CONFIG_EXPORTS_FILE "${mlir_cmake_builddir}/MlirTargets.cmake") +set(MLIR_CONFIG_EXPORTS_FILE "\${MLIR_CMAKE_DIR}/MLIRTargets.cmake") set(MLIR_CONFIG_INCLUDE_DIRS "${MLIR_SOURCE_DIR}/include" "${MLIR_BINARY_DIR}/include" ) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/MLIRConfig.cmake.in + ${mlir_cmake_builddir}/MLIRConfig.cmake + @ONLY) set(MLIR_CONFIG_CMAKE_DIR) set(MLIR_CONFIG_LLVM_CMAKE_DIR) set(MLIR_CONFIG_EXPORTS_FILE) +set(MLIR_CONFIG_INCLUDE_DIRS) + +# For compatibility with projects that include(MLIRConfig) +# via CMAKE_MODULE_PATH, place API modules next to it. +# This should be removed in the future. +file(COPY . + DESTINATION ${mlir_cmake_builddir} + FILES_MATCHING PATTERN *.cmake + PATTERN CMakeFiles EXCLUDE + ) -# Generate MlirConfig.cmake for the install tree. +# Generate MLIRConfig.cmake for the install tree. set(MLIR_CONFIG_CODE " -# Compute the installation prefix from this LLVMConfig.cmake file location. +# Compute the installation prefix from this MLIRConfig.cmake file location. get_filename_component(MLIR_INSTALL_PREFIX \"\${CMAKE_CURRENT_LIST_FILE}\" PATH)") # Construct the proper number of get_filename_component(... PATH) # calls to compute the installation prefix. @@ -36,24 +54,31 @@ get_filename_component(MLIR_INSTALL_PREFIX \"\${MLIR_INSTALL_PREFIX}\" PATH)") endforeach(p) set(MLIR_CONFIG_CMAKE_DIR "\${MLIR_INSTALL_PREFIX}/${MLIR_INSTALL_PACKAGE_DIR}") set(MLIR_CONFIG_LLVM_CMAKE_DIR "\${MLIR_INSTALL_PREFIX}/${LLVM_INSTALL_PACKAGE_DIR}") -set(MLIR_CONFIG_EXPORTS_FILE "\${MLIR_CMAKE_DIR}/MlirTargets.cmake") +set(MLIR_CONFIG_EXPORTS_FILE "\${MLIR_CMAKE_DIR}/MLIRTargets.cmake") set(MLIR_CONFIG_INCLUDE_DIRS "\${MLIR_INSTALL_PREFIX}/include" ) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/MLIRConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/MLIRConfig.cmake + @ONLY) set(MLIR_CONFIG_CODE) set(MLIR_CONFIG_CMAKE_DIR) +set(MLIR_CONFIG_LLVM_CMAKE_DIR) set(MLIR_CONFIG_EXPORTS_FILE) +set(MLIR_CONFIG_INCLUDE_DIRS) if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) # Not TOOLCHAIN ONLY, so install the MLIR parts as well # Include the cmake files so other tools can use mlir-tblgen, etc. get_property(mlir_has_exports GLOBAL PROPERTY MLIR_HAS_EXPORTS) if(mlir_has_exports) - install(EXPORT MlirTargets DESTINATION ${MLIR_INSTALL_PACKAGE_DIR} + install(EXPORT MLIRTargets DESTINATION ${MLIR_INSTALL_PACKAGE_DIR} COMPONENT mlir-cmake-exports) endif() - install(FILES #${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/MlirConfig.cmake + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/MLIRConfig.cmake ${CMAKE_CURRENT_SOURCE_DIR}/AddMLIR.cmake DESTINATION ${MLIR_INSTALL_PACKAGE_DIR} COMPONENT mlir-cmake-exports) diff --git a/mlir/cmake/modules/MLIRConfig.cmake.in b/mlir/cmake/modules/MLIRConfig.cmake.in new file mode 100644 index 000000000000..190aa193d1db --- /dev/null +++ b/mlir/cmake/modules/MLIRConfig.cmake.in @@ -0,0 +1,35 @@ +# This file allows users to call find_package(MLIR) and pick up our targets. + +@MLIR_CONFIG_CODE@ + +find_package(LLVM REQUIRED CONFIG + HINTS "@MLIR_CONFIG_LLVM_CMAKE_DIR@") + +set(MLIR_EXPORTED_TARGETS "@MLIR_EXPORTS@") +set(MLIR_CMAKE_DIR "@MLIR_CONFIG_CMAKE_DIR@") +set(MLIR_INCLUDE_DIRS "@MLIR_CONFIG_INCLUDE_DIRS@") +set(MLIR_TABLEGEN_EXE "@MLIR_TABLEGEN_EXE@") + +# For mlir_tablegen() +set(MLIR_INCLUDE_DIR "@MLIR_INCLUDE_DIR@") +set(MLIR_MAIN_SRC_DIR "@MLIR_MAIN_SRC_DIR@") + +set_property(GLOBAL PROPERTY MLIR_ALL_LIBS "@MLIR_ALL_LIBS@") +set_property(GLOBAL PROPERTY MLIR_DIALECT_LIBS "@MLIR_DIALECT_LIBS@") +set_property(GLOBAL PROPERTY MLIR_CONVERSION_LIBS "@MLIR_CONVERSION_LIBS@") + +# Provide all our library targets to users. +include("@MLIR_CONFIG_EXPORTS_FILE@") + +# By creating these targets here, subprojects that depend on MLIR's +# tablegen-generated headers can always depend on these targets whether building +# in-tree with MLIR or not. +if(NOT TARGET mlir-tablegen-targets) + add_custom_target(mlir-tablegen-targets) +endif() +if(NOT TARGET mlir-headers) + add_custom_target(mlir-headers) +endif() +if(NOT TARGET mlir-doc) + add_custom_target(mlir-doc) +endif() |