1include(ExtendPath) 2include(LLVMDistributionSupport) 3include(FindPrefixFromConfig) 4 5# CMAKE_INSTALL_PACKAGEDIR might be absolute, so don't reuse below. 6string(REPLACE "${CMAKE_CFG_INTDIR}" "." llvm_cmake_builddir "${LLVM_LIBRARY_DIR}") 7set(llvm_cmake_builddir "${llvm_cmake_builddir}/cmake/llvm") 8 9# First for users who use an installed LLVM, create the LLVMExports.cmake file. 10set(LLVM_EXPORTS_FILE ${llvm_cmake_builddir}/LLVMExports.cmake) 11get_property(LLVM_EXPORTS GLOBAL PROPERTY LLVM_EXPORTS) 12export(TARGETS ${LLVM_EXPORTS} FILE ${LLVM_EXPORTS_FILE}) 13 14# Then for users who want to link against the LLVM build tree, provide the 15# normal targets and the build tree only targets. 16set(LLVM_BUILDTREEONLY_EXPORTS_FILE ${llvm_cmake_builddir}/LLVMBuildTreeOnlyTargets.cmake) 17get_property(LLVM_EXPORTS_BUILDTREE_ONLY GLOBAL PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY) 18export(TARGETS ${LLVM_EXPORTS_BUILDTREE_ONLY} FILE ${LLVM_BUILDTREEONLY_EXPORTS_FILE}) 19 20get_property(LLVM_AVAILABLE_LIBS GLOBAL PROPERTY LLVM_LIBS) 21 22foreach(lib ${LLVM_AVAILABLE_LIBS}) 23 get_property(llvm_lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${lib}) 24 set(all_llvm_lib_deps 25 "${all_llvm_lib_deps}\nset_property(GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${lib} ${llvm_lib_deps})") 26endforeach(lib) 27 28# CMake requires that all targets expressed as dependencies exist, so we can't 29# have intrinsics_gen in LLVM_COMMON_DEPENDS when it is written out, otherwise 30# projects building out of tree will have CMake errors. This only gets hit when 31# LLVM_ENABLE_MODULES=On. Eventually we should come up with a better solution to 32# this, but there is no easy solution. 33if(intrinsics_gen IN_LIST LLVM_COMMON_DEPENDS) 34 list(REMOVE_ITEM LLVM_COMMON_DEPENDS intrinsics_gen) 35endif() 36if(omp_gen IN_LIST LLVM_COMMON_DEPENDS) 37 list(REMOVE_ITEM LLVM_COMMON_DEPENDS omp_gen) 38endif() 39if(vt_gen IN_LIST LLVM_COMMON_DEPENDS) 40 list(REMOVE_ITEM LLVM_COMMON_DEPENDS vt_gen) 41endif() 42 43# 44# Generate LLVMConfig.cmake for the build tree. 45# 46 47set(LLVM_CONFIG_CODE " 48# LLVM_BUILD_* values available only from LLVM build tree. 49set(LLVM_BUILD_BINARY_DIR \"${LLVM_BINARY_DIR}\") 50set(LLVM_BUILD_LIBRARY_DIR \"${LLVM_LIBRARY_DIR}\") 51set(LLVM_BUILD_MAIN_INCLUDE_DIR \"${LLVM_MAIN_INCLUDE_DIR}\") 52set(LLVM_BUILD_MAIN_SRC_DIR \"${LLVM_MAIN_SRC_DIR}\") 53") 54 55set(LLVM_CONFIG_MAIN_INCLUDE_DIR "${LLVM_MAIN_INCLUDE_DIR}") 56set(LLVM_CONFIG_INCLUDE_DIR "${LLVM_INCLUDE_DIR}") 57set(LLVM_CONFIG_INCLUDE_DIRS 58 "${LLVM_CONFIG_MAIN_INCLUDE_DIR}" 59 "${LLVM_CONFIG_INCLUDE_DIR}" 60 ) 61list(REMOVE_DUPLICATES LLVM_CONFIG_INCLUDE_DIRS) 62 63set(LLVM_CONFIG_LIBRARY_DIR "${LLVM_LIBRARY_DIR}") 64set(LLVM_CONFIG_LIBRARY_DIRS 65 "${LLVM_CONFIG_LIBRARY_DIR}" 66 # FIXME: Should there be other entries here? 67 ) 68list(REMOVE_DUPLICATES LLVM_CONFIG_LIBRARY_DIRS) 69 70set(LLVM_CONFIG_BINARY_DIR "${LLVM_BINARY_DIR}") 71set(LLVM_CONFIG_CMAKE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") 72set(LLVM_CONFIG_TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}") 73 74# Generate a default location for lit 75if (LLVM_BUILD_UTILS) 76 if (CMAKE_HOST_WIN32 AND NOT CYGWIN) 77 set(LLVM_CONFIG_DEFAULT_EXTERNAL_LIT "${LLVM_CONFIG_TOOLS_BINARY_DIR}/llvm-lit.py") 78 else() 79 set(LLVM_CONFIG_DEFAULT_EXTERNAL_LIT "${LLVM_CONFIG_TOOLS_BINARY_DIR}/llvm-lit") 80 endif() 81endif() 82 83if (LLVM_LINK_LLVM_DYLIB) 84 set(LLVM_CONFIG_LINK_LLVM_DYLIB 85 "set(LLVM_LINK_LLVM_DYLIB ${LLVM_LINK_LLVM_DYLIB})") 86endif() 87 88# We need to use the full path to the LLVM Exports file to make sure we get the 89# one from the build tree. This is due to our cmake files being split between 90# this source dir and the binary dir in the build tree configuration and the 91# LLVM_CONFIG_CMAKE_DIR being the source directory. In contrast in the install 92# tree, both the generated LLVMExports.cmake file and the rest of the cmake 93# source files are put in the same cmake directory. 94set(LLVM_CONFIG_EXPORTS "${LLVM_EXPORTS};${LLVM_EXPORTS_BUILDTREE_ONLY}") 95set(LLVM_CONFIG_INCLUDE_EXPORTS "include(\"${LLVM_EXPORTS_FILE}\")") 96set(llvm_config_include_buildtree_only_exports 97"include(\"${LLVM_BUILDTREEONLY_EXPORTS_FILE}\")") 98configure_file( 99 LLVMConfig.cmake.in 100 ${llvm_cmake_builddir}/LLVMConfig.cmake 101 @ONLY) 102set(llvm_config_include_buildtree_only_exports) 103 104# For compatibility with projects that include(LLVMConfig) 105# via CMAKE_MODULE_PATH, place API modules next to it. 106# Copy without source permissions because the source could be read-only, 107# but we need to write into the copied folder. 108# This should be removed in the future. 109file(COPY . 110 DESTINATION ${llvm_cmake_builddir} 111 NO_SOURCE_PERMISSIONS 112 FILES_MATCHING PATTERN *.cmake 113 PATTERN CMakeFiles EXCLUDE 114 PATTERN llvm-driver-template.cpp.in 115 ) 116 117# 118# Generate LLVMConfig.cmake for the install tree. 119# 120 121find_prefix_from_config(LLVM_CONFIG_CODE LLVM_INSTALL_PREFIX "${LLVM_INSTALL_PACKAGE_DIR}") 122 123extend_path(LLVM_CONFIG_MAIN_INCLUDE_DIR "\${LLVM_INSTALL_PREFIX}" "${CMAKE_INSTALL_INCLUDEDIR}") 124# This is the same as the above because the handwritten and generated headers 125# are combined in one directory at install time. 126set(LLVM_CONFIG_INCLUDE_DIR "${LLVM_CONFIG_MAIN_INCLUDE_DIR}") 127set(LLVM_CONFIG_INCLUDE_DIRS 128 "${LLVM_CONFIG_MAIN_INCLUDE_DIR}" 129 "${LLVM_CONFIG_INCLUDE_DIR}" 130 ) 131list(REMOVE_DUPLICATES LLVM_CONFIG_INCLUDE_DIRS) 132 133extend_path(LLVM_CONFIG_LIBRARY_DIR "\${LLVM_INSTALL_PREFIX}" "lib\${LLVM_LIBDIR_SUFFIX}") 134set(LLVM_CONFIG_LIBRARY_DIRS 135 "${LLVM_CONFIG_LIBRARY_DIR}" 136 # FIXME: Should there be other entries here? 137 ) 138list(REMOVE_DUPLICATES LLVM_CONFIG_LIBRARY_DIRS) 139 140set(LLVM_CONFIG_BINARY_DIR "\${LLVM_INSTALL_PREFIX}") 141extend_path(LLVM_CONFIG_CMAKE_DIR "\${LLVM_INSTALL_PREFIX}" "${LLVM_INSTALL_PACKAGE_DIR}") 142extend_path(LLVM_CONFIG_TOOLS_BINARY_DIR "\${LLVM_INSTALL_PREFIX}" "${LLVM_TOOLS_INSTALL_DIR}") 143 144# Generate a default location for lit 145if (LLVM_INSTALL_UTILS AND LLVM_BUILD_UTILS) 146 if (CMAKE_HOST_WIN32 AND NOT CYGWIN) 147 set(LLVM_CONFIG_DEFAULT_EXTERNAL_LIT "${LLVM_CONFIG_TOOLS_BINARY_DIR}/llvm-lit.py") 148 else() 149 set(LLVM_CONFIG_DEFAULT_EXTERNAL_LIT "${LLVM_CONFIG_TOOLS_BINARY_DIR}/llvm-lit") 150 endif() 151endif() 152 153get_config_exports_includes(LLVM LLVM_CONFIG_INCLUDE_EXPORTS) 154set(LLVM_CONFIG_EXPORTS "${LLVM_EXPORTS}") 155configure_file( 156 LLVMConfig.cmake.in 157 ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/LLVMConfig.cmake 158 @ONLY) 159 160# Generate LLVMConfigVersion.cmake for build and install tree. 161configure_file( 162 LLVMConfigVersion.cmake.in 163 ${llvm_cmake_builddir}/LLVMConfigVersion.cmake 164 @ONLY) 165 166if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 167 install_distribution_exports(LLVM) 168 169 install(FILES 170 ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/LLVMConfig.cmake 171 ${llvm_cmake_builddir}/LLVMConfigVersion.cmake 172 LLVM-Config.cmake 173 DESTINATION ${LLVM_INSTALL_PACKAGE_DIR} 174 COMPONENT cmake-exports) 175 176 install(DIRECTORY . 177 DESTINATION ${LLVM_INSTALL_PACKAGE_DIR} 178 COMPONENT cmake-exports 179 FILES_MATCHING PATTERN *.cmake 180 PATTERN LLVMConfig.cmake EXCLUDE 181 PATTERN LLVMConfigExtensions.cmake EXCLUDE 182 PATTERN LLVMConfigVersion.cmake EXCLUDE 183 PATTERN LLVM-Config.cmake EXCLUDE 184 PATTERN GetHostTriple.cmake EXCLUDE 185 PATTERN llvm-driver-template.cpp.in) 186 187 if (NOT LLVM_ENABLE_IDE) 188 # Add a dummy target so this can be used with LLVM_DISTRIBUTION_COMPONENTS 189 add_custom_target(cmake-exports) 190 add_llvm_install_targets(install-cmake-exports 191 COMPONENT cmake-exports) 192 endif() 193endif() 194