xref: /llvm-project/llvm/cmake/modules/CMakeLists.txt (revision cace9869775a185793122f845d81a5ff46f15728)
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