xref: /llvm-project/polly/cmake/CMakeLists.txt (revision 17f747b30433f2bc305f1081d357d91beb3c9896)
1# Keep this in sync with llvm/cmake/CMakeLists.txt!
2
3include(GNUInstallPackageDir)
4include(ExtendPath)
5include(FindPrefixFromConfig)
6
7set(POLLY_INSTALL_PACKAGE_DIR "${CMAKE_INSTALL_PACKAGEDIR}/polly" CACHE STRING
8  "Path for CMake subdirectory for Polly (defaults to '${CMAKE_INSTALL_PACKAGEDIR}/polly')")
9# CMAKE_INSTALL_PACKAGEDIR might be absolute, so don't reuse below.
10set(polly_cmake_builddir "${POLLY_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/cmake/polly")
11
12set(LLVM_INSTALL_PACKAGE_DIR "${CMAKE_INSTALL_PACKAGEDIR}/llvm" CACHE STRING
13  "Path for CMake subdirectory for LLVM (defaults to '${CMAKE_INSTALL_PACKAGEDIR}/llvm')")
14# CMAKE_INSTALL_PACKAGEDIR might be absolute, so don't reuse below.
15string(REPLACE "${CMAKE_CFG_INTDIR}" "." llvm_cmake_builddir "${LLVM_LIBRARY_DIR}")
16set(llvm_cmake_builddir "${llvm_cmake_builddir}/cmake/llvm")
17
18if (CMAKE_CONFIGURATION_TYPES)
19  set(POLLY_EXPORTS_FILE_NAME "PollyExports-$<LOWER_CASE:$<CONFIG>>.cmake")
20else()
21  # avoid conflicts in the build-tree when changing configuration
22  set(POLLY_EXPORTS_FILE_NAME "PollyExports-all.cmake")
23endif()
24
25set(POLLY_CONFIG_EXPORTED_TARGETS Polly ${ISL_TARGET})
26if (NOT (WIN32 OR CYGWIN) AND LLVM_ENABLE_PIC)
27  # LLVMPolly is a dummy target on Win or if PIC code is disabled.
28  list(APPEND POLLY_CONFIG_EXPORTED_TARGETS LLVMPolly)
29endif()
30
31# Get the target type for every exported target
32foreach(tgt IN LISTS POLLY_CONFIG_EXPORTED_TARGETS)
33  get_target_property(tgt_type ${tgt} TYPE)
34  string(REPLACE "_LIBRARY" "" tgt_type ${tgt_type})
35  set(POLLY_CONFIG_TARGET_${tgt}_TYPE ${tgt_type})
36endforeach()
37
38# generate the import code for bundled/undbundled libisl versions
39if (NOT POLLY_BUNDLED_ISL)
40  get_property(incl TARGET ISL PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
41  get_property(lib TARGET ISL PROPERTY INTERFACE_LINK_LIBRARIES)
42  get_property(opt TARGET ISL PROPERTY INTERFACE_COMPILE_OPTIONS)
43  set(ISL_CONFIG_CODE "
44add_library(ISL INTERFACE IMPORTED)
45set_property(TARGET ISL APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${incl})
46set_property(TARGET ISL APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${lib})
47set_property(TARGET ISL APPEND PROPERTY INTERFACE_COMPILE_OPTIONS ${opt})")
48else()
49  set(ISL_CONFIG_CODE "
50if (NOT TARGET PollyISL)
51  add_library(PollyISL ${POLLY_CONFIG_TARGET_PollyISL_TYPE} IMPORTED)
52endif()")
53endif()
54
55# Generate PollyConfig.cmake for the build tree.
56set(POLLY_CONFIG_CODE "")
57set(POLLY_CONFIG_LLVM_CMAKE_DIR "${llvm_cmake_builddir}")
58set(POLLY_CONFIG_CMAKE_DIR "${polly_cmake_builddir}")
59set(POLLY_CONFIG_INCLUDE_DIRS
60  ${POLLY_SOURCE_DIR}/include
61  ${ISL_INCLUDE_DIRS}
62  ${POLLY_BINARY_DIR}/include
63  )
64set(POLLY_CONFIG_LIBRARY_DIRS "${POLLY_BINARY_DIR}/lib")
65
66# set locations for imported targets
67foreach(tgt IN LISTS POLLY_CONFIG_EXPORTED_TARGETS)
68  get_target_property(tgt_type ${tgt} TYPE)
69  if (NOT tgt_type STREQUAL "INTERFACE_LIBRARY")
70    set(POLLY_EXPORTS
71      "set_target_properties(${tgt} PROPERTIES
72              IMPORTED_LOCATION$<$<NOT:$<CONFIG:>>:_$<UPPER_CASE:$<CONFIG>>> $<TARGET_FILE:${tgt}>)
73${POLLY_EXPORTS}")
74  endif()
75endforeach(tgt)
76
77# PollyConfig holds the target definitions and general settings, PollyExports
78# the imported locations
79configure_file(
80  ${CMAKE_CURRENT_SOURCE_DIR}/PollyConfig.cmake.in
81  ${polly_cmake_builddir}/PollyConfig.cmake
82  @ONLY)
83configure_file(
84  ${CMAKE_CURRENT_SOURCE_DIR}/PollyConfigVersion.cmake.in
85  ${polly_cmake_builddir}/PollyConfigVersion.cmake
86  @ONLY)
87
88file(GENERATE
89  OUTPUT ${polly_cmake_builddir}/${POLLY_EXPORTS_FILE_NAME}
90  CONTENT "${POLLY_EXPORTS}")
91
92
93# Generate PollyConfig.cmake for the install tree.
94unset(POLLY_EXPORTS)
95find_prefix_from_config(POLLY_CONFIG_CODE POLLY_INSTALL_PREFIX "${POLLY_INSTALL_PACKAGE_DIR}")
96extend_path(POLLY_CONFIG_LLVM_CMAKE_DIR "\${POLLY_INSTALL_PREFIX}" "${LLVM_INSTALL_PACKAGE_DIR}")
97extend_path(POLLY_CONFIG_CMAKE_DIR "\${POLLY_INSTALL_PREFIX}" "${POLLY_INSTALL_PACKAGE_DIR}")
98extend_path(POLLY_CONFIG_LIBRARY_DIRS "\${POLLY_INSTALL_PREFIX}" "lib${LLVM_LIBDIR_SUFFIX}")
99extend_path(base_includedir "\${POLLY_INSTALL_PREFIX}" "${CMAKE_INSTALL_INCLUDEDIR}")
100if (POLLY_BUNDLED_ISL)
101  set(POLLY_CONFIG_INCLUDE_DIRS
102    "${base_includedir}"
103    "${base_includedir}/polly"
104    )
105else()
106  set(POLLY_CONFIG_INCLUDE_DIRS
107    "${base_includedir}"
108    ${ISL_INCLUDE_DIRS}
109    )
110endif()
111
112# Set locations for imported targets. The path is constructed to be relative to
113# the config file.
114#
115# Include the config code of PollyConfig.cmake to define POLLY_INSTALL_PREFIX
116# anew in case the export file is included alone rather than from that file.
117set(POLLY_EXPORTS
118"${POLLY_CONFIG_CODE}
119
120")
121foreach(tgt IN LISTS POLLY_CONFIG_EXPORTED_TARGETS)
122  get_target_property(tgt_type ${tgt} TYPE)
123  if (tgt_type STREQUAL "EXECUTABLE")
124    set(tgt_prefix "${CMAKE_INSTALL_BINDIR}")
125  else()
126    set(tgt_prefix "${CMAKE_INSTALL_LIBDIR}")
127  endif()
128
129  extend_path(tgt_path "\${POLLY_INSTALL_PREFIX}" "${tgt_prefix}/$<TARGET_FILE_NAME:${tgt}>")
130
131  if (NOT tgt_type STREQUAL "INTERFACE_LIBRARY")
132    set(POLLY_EXPORTS
133"set_target_properties(${tgt} PROPERTIES
134        IMPORTED_LOCATION$<$<NOT:$<CONFIG:>>:_$<UPPER_CASE:$<CONFIG>>> \"${tgt_path}\")
135${POLLY_EXPORTS}")
136  endif()
137endforeach(tgt)
138
139configure_file(
140  ${CMAKE_CURRENT_SOURCE_DIR}/PollyConfig.cmake.in
141  ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PollyConfig.cmake
142  @ONLY)
143configure_file(
144  ${CMAKE_CURRENT_SOURCE_DIR}/PollyConfigVersion.cmake.in
145  ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PollyConfigVersion.cmake
146  @ONLY)
147file(GENERATE OUTPUT
148  ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${POLLY_EXPORTS_FILE_NAME}
149  CONTENT "${POLLY_EXPORTS}")
150
151if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
152  install(
153    FILES
154    "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PollyConfig.cmake"
155    "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/PollyConfigVersion.cmake"
156    "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${POLLY_EXPORTS_FILE_NAME}"
157    DESTINATION "${POLLY_INSTALL_PACKAGE_DIR}")
158endif ()
159