Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 1 | # Check if this is a in tree build. |
| 2 | if (NOT DEFINED LLVM_MAIN_SRC_DIR) |
| 3 | project(Polly) |
Louis Dionne | afa1afd | 2020-04-22 15:15:05 | [diff] [blame] | 4 | cmake_minimum_required(VERSION 3.13.4) |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 5 | |
| 6 | # Where is LLVM installed? |
Philip Pfaffe | d99c406 | 2017-07-11 11:24:25 | [diff] [blame] | 7 | find_package(LLVM CONFIG REQUIRED) |
| 8 | set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LLVM_CMAKE_DIR}) |
| 9 | include(HandleLLVMOptions) |
| 10 | include(AddLLVM) |
| 11 | |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 12 | # Add the llvm header path. |
Philip Pfaffe | d99c406 | 2017-07-11 11:24:25 | [diff] [blame] | 13 | include_directories(${LLVM_INCLUDE_DIRS}) |
Michael Kruse | 84bf8a3 | 2015-09-11 20:47:14 | [diff] [blame] | 14 | |
Michael Kruse | 05cf9c2 | 2016-08-25 12:36:15 | [diff] [blame] | 15 | # Sources available, too? |
Philip Pfaffe | d99c406 | 2017-07-11 11:24:25 | [diff] [blame] | 16 | if (LLVM_BUILD_MAIN_SRC_DIR) |
| 17 | set(LLVM_SOURCE_ROOT ${LLVM_BUILD_MAIN_SRC_DIR} CACHE PATH |
| 18 | "Path to LLVM source tree") |
| 19 | else() |
| 20 | execute_process(COMMAND "${LLVM_TOOLS_BINARY_DIR}/llvm-config" --src-root |
| 21 | OUTPUT_VARIABLE MAIN_SRC_DIR |
| 22 | OUTPUT_STRIP_TRAILING_WHITESPACE) |
| 23 | set(LLVM_SOURCE_ROOT ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree") |
| 24 | endif() |
Michael Kruse | 05cf9c2 | 2016-08-25 12:36:15 | [diff] [blame] | 25 | |
| 26 | # Enable unit tests if available. |
Philip Pfaffe | 54df93d | 2017-07-11 11:37:35 | [diff] [blame] | 27 | set(POLLY_GTEST_AVAIL 0) |
Michael Kruse | 05cf9c2 | 2016-08-25 12:36:15 | [diff] [blame] | 28 | set(UNITTEST_DIR ${LLVM_SOURCE_ROOT}/utils/unittest) |
| 29 | if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h) |
Michał Górny | c8b629a | 2020-08-05 08:15:41 | [diff] [blame] | 30 | if (NOT TARGET gtest) |
| 31 | add_subdirectory(${UNITTEST_DIR} utils/unittest) |
Philip Pfaffe | d99c406 | 2017-07-11 11:24:25 | [diff] [blame] | 32 | endif() |
Michał Górny | c8b629a | 2020-08-05 08:15:41 | [diff] [blame] | 33 | set(POLLY_GTEST_AVAIL 1) |
Michael Kruse | 05cf9c2 | 2016-08-25 12:36:15 | [diff] [blame] | 34 | endif() |
| 35 | |
Rainer Orth | 26d659b | 2020-08-27 08:59:51 | [diff] [blame] | 36 | if (LLVM_ENABLE_PIC) |
| 37 | # Make sure the isl c files are built as fPIC if possible |
| 38 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") |
| 39 | endif () |
Michael Kruse | abf05b1 | 2017-04-22 23:02:53 | [diff] [blame] | 40 | |
| 41 | # Set directory for polly-isl-test. |
| 42 | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") |
Michael Kruse | 05cf9c2 | 2016-08-25 12:36:15 | [diff] [blame] | 43 | else () |
| 44 | set(LLVM_SOURCE_ROOT "${LLVM_MAIN_SRC_DIR}") |
| 45 | set(POLLY_GTEST_AVAIL 1) |
| 46 | endif () |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 47 | |
| 48 | set(POLLY_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) |
| 49 | set(POLLY_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) |
| 50 | |
John Ericson | e68215c | 2022-01-03 21:09:33 | [diff] [blame^] | 51 | if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) |
| 52 | set(LLVM_COMMON_CMAKE_UTILS ${POLLY_SOURCE_DIR}/../cmake) |
| 53 | endif() |
| 54 | |
| 55 | # Make sure that our source directory is on the current cmake module path so that |
| 56 | # we can include cmake files from this directory. |
| 57 | list(INSERT CMAKE_MODULE_PATH 0 |
| 58 | "${POLLY_SOURCE_DIR}/cmake" |
| 59 | "${LLVM_COMMON_CMAKE_UTILS}/Modules" |
Tobias Grosser | bc822eb | 2012-10-21 15:51:49 | [diff] [blame] | 60 | ) |
| 61 | |
| 62 | include("polly_macros") |
| 63 | |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 64 | # Add appropriate flags for GCC |
| 65 | if (CMAKE_COMPILER_IS_GNUCXX) |
| 66 | # FIXME: Turn off exceptions, RTTI: |
| 67 | # -fno-exceptions -fno-rtti |
| 68 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-common -Woverloaded-virtual -Wno-long-long -Wall -W -Wno-unused-parameter -Wwrite-strings -fno-exceptions -fno-rtti") |
Michael Kruse | 441357d | 2015-07-21 12:22:36 | [diff] [blame] | 69 | elseif (MSVC) |
| 70 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHs-c-") |
| 71 | add_definitions("-D_HAS_EXCEPTIONS=0") |
| 72 | else () |
| 73 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti") |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 74 | endif () |
| 75 | |
Rafael Espindola | fa0841c | 2014-02-22 13:28:31 | [diff] [blame] | 76 | SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) |
| 77 | |
Tobias Grosser | 6217e18 | 2012-08-03 12:50:07 | [diff] [blame] | 78 | option(POLLY_ENABLE_GPGPU_CODEGEN "Enable GPGPU code generation feature" OFF) |
Philip Pfaffe | 4d24093 | 2018-06-07 21:10:49 | [diff] [blame] | 79 | set(GPU_CODEGEN FALSE) |
Tobias Grosser | 6217e18 | 2012-08-03 12:50:07 | [diff] [blame] | 80 | if (POLLY_ENABLE_GPGPU_CODEGEN) |
Siddharth Bhat | 17f0196 | 2017-05-07 21:03:46 | [diff] [blame] | 81 | # Do not require CUDA/OpenCL, as GPU code generation test cases can be run |
| 82 | # without a CUDA/OpenCL library. |
Philip Pfaffe | 4d24093 | 2018-06-07 21:10:49 | [diff] [blame] | 83 | if ("NVPTX" IN_LIST LLVM_TARGETS_TO_BUILD) |
| 84 | FIND_PACKAGE(CUDA) |
| 85 | FIND_PACKAGE(OpenCL) |
| 86 | set(GPU_CODEGEN TRUE) |
| 87 | else() |
| 88 | message(WARNING "The LLVM NVPTX target is required for GPU code generation") |
| 89 | endif() |
Tobias Grosser | 6217e18 | 2012-08-03 12:50:07 | [diff] [blame] | 90 | endif(POLLY_ENABLE_GPGPU_CODEGEN) |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 91 | |
Tobias Grosser | e938517 | 2016-07-14 10:22:19 | [diff] [blame] | 92 | |
Tobias Grosser | 88aeaf6 | 2012-06-06 12:16:10 | [diff] [blame] | 93 | # Support GPGPU code generation if the library is available. |
Philip Pfaffe | 182807a | 2017-06-06 19:20:48 | [diff] [blame] | 94 | if (CUDA_FOUND) |
Siddharth Bhat | 17f0196 | 2017-05-07 21:03:46 | [diff] [blame] | 95 | add_definitions(-DHAS_LIBCUDART) |
Philip Pfaffe | 182807a | 2017-06-06 19:20:48 | [diff] [blame] | 96 | INCLUDE_DIRECTORIES( ${CUDA_INCLUDE_DIRS} ) |
| 97 | endif(CUDA_FOUND) |
Siddharth Bhat | 17f0196 | 2017-05-07 21:03:46 | [diff] [blame] | 98 | if (OpenCL_FOUND) |
| 99 | add_definitions(-DHAS_LIBOPENCL) |
| 100 | INCLUDE_DIRECTORIES( ${OpenCL_INCLUDE_DIR} ) |
| 101 | endif(OpenCL_FOUND) |
Tobias Grosser | 88aeaf6 | 2012-06-06 12:16:10 | [diff] [blame] | 102 | |
Michael Kruse | 6469380 | 2017-02-27 17:54:25 | [diff] [blame] | 103 | option(POLLY_BUNDLED_ISL "Use the bundled version of libisl included in Polly" ON) |
| 104 | if (NOT POLLY_BUNDLED_ISL) |
| 105 | find_package(ISL MODULE REQUIRED) |
| 106 | message(STATUS "Using external libisl ${ISL_VERSION} in: ${ISL_PREFIX}") |
| 107 | set(ISL_TARGET ISL) |
| 108 | else() |
| 109 | set(ISL_INCLUDE_DIRS |
| 110 | ${CMAKE_CURRENT_BINARY_DIR}/lib/External/isl/include |
| 111 | ${CMAKE_CURRENT_SOURCE_DIR}/lib/External/isl/include |
| 112 | ) |
| 113 | set(ISL_TARGET PollyISL) |
| 114 | endif() |
| 115 | |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 116 | include_directories( |
Johannes Doerfert | 3455818 | 2014-05-28 16:54:42 | [diff] [blame] | 117 | BEFORE |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 118 | ${CMAKE_CURRENT_SOURCE_DIR}/include |
Michael Kruse | 6469380 | 2017-02-27 17:54:25 | [diff] [blame] | 119 | ${ISL_INCLUDE_DIRS} |
Tobias Grosser | e938517 | 2016-07-14 10:22:19 | [diff] [blame] | 120 | ${CMAKE_CURRENT_SOURCE_DIR}/lib/External/pet/include |
Tobias Grosser | a56f8f8 | 2016-07-15 07:50:36 | [diff] [blame] | 121 | ${CMAKE_CURRENT_SOURCE_DIR}/lib/External |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 122 | ${CMAKE_CURRENT_BINARY_DIR}/include |
| 123 | ) |
| 124 | |
Eugene Zelenko | 2487cb2 | 2016-06-21 18:14:01 | [diff] [blame] | 125 | if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) |
| 126 | install(DIRECTORY include/ |
| 127 | DESTINATION include |
| 128 | FILES_MATCHING |
| 129 | PATTERN "*.h" |
Eugene Zelenko | 2487cb2 | 2016-06-21 18:14:01 | [diff] [blame] | 130 | ) |
Tobias Grosser | 7103688 | 2013-01-19 14:17:52 | [diff] [blame] | 131 | |
Eugene Zelenko | 2487cb2 | 2016-06-21 18:14:01 | [diff] [blame] | 132 | install(DIRECTORY ${POLLY_BINARY_DIR}/include/ |
| 133 | DESTINATION include |
| 134 | FILES_MATCHING |
| 135 | PATTERN "*.h" |
| 136 | PATTERN "CMakeFiles" EXCLUDE |
Eugene Zelenko | 2487cb2 | 2016-06-21 18:14:01 | [diff] [blame] | 137 | ) |
| 138 | endif() |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 139 | |
| 140 | add_definitions( -D_GNU_SOURCE ) |
| 141 | |
Tobias Grosser | b6948c1 | 2016-02-04 07:16:36 | [diff] [blame] | 142 | add_subdirectory(docs) |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 143 | add_subdirectory(lib) |
| 144 | add_subdirectory(test) |
Michael Kruse | 05cf9c2 | 2016-08-25 12:36:15 | [diff] [blame] | 145 | if (POLLY_GTEST_AVAIL) |
| 146 | add_subdirectory(unittests) |
| 147 | endif () |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 148 | add_subdirectory(tools) |
Michael Kruse | a9520b9 | 2017-03-09 17:58:20 | [diff] [blame] | 149 | add_subdirectory(cmake) |
Tobias Grosser | 7580537 | 2011-04-29 06:27:02 | [diff] [blame] | 150 | # TODO: docs. |
| 151 | |
| 152 | |
| 153 | configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/include/polly/Config/config.h.cmake |
| 154 | ${POLLY_BINARY_DIR}/include/polly/Config/config.h ) |
| 155 | |
Tobias Grosser | c38af88 | 2013-02-14 16:19:16 | [diff] [blame] | 156 | # Add target to check formatting of polly files |
Michael Kruse | 05cf9c2 | 2016-08-25 12:36:15 | [diff] [blame] | 157 | file( GLOB_RECURSE files *.h lib/*.cpp lib/*.c tools/*.cpp tools/*.c tools/*.h unittests/*.cpp) |
Philip Pfaffe | bbb8671 | 2017-05-15 13:20:26 | [diff] [blame] | 158 | file( GLOB_RECURSE external lib/External/*.h lib/External/*.c lib/External/*.cpp isl_config.h) |
Michael Kruse | 49c2122 | 2017-02-05 15:26:56 | [diff] [blame] | 159 | list( REMOVE_ITEM files ${external}) |
Michael Kruse | 69f3788 | 2015-09-14 16:59:50 | [diff] [blame] | 160 | |
| 161 | set(check_format_depends) |
| 162 | set(update_format_depends) |
| 163 | set(i 0) |
| 164 | foreach (file IN LISTS files) |
| 165 | add_custom_command(OUTPUT polly-check-format${i} |
Tobias Grosser | 5da48f3 | 2015-10-15 12:18:37 | [diff] [blame] | 166 | COMMAND clang-format -sort-includes -style=llvm ${file} | diff -u ${file} - |
Michael Kruse | 69f3788 | 2015-09-14 16:59:50 | [diff] [blame] | 167 | VERBATIM |
| 168 | COMMENT "Checking format of ${file}..." |
| 169 | ) |
| 170 | list(APPEND check_format_depends "polly-check-format${i}") |
| 171 | |
| 172 | add_custom_command(OUTPUT polly-update-format${i} |
Tobias Grosser | 5da48f3 | 2015-10-15 12:18:37 | [diff] [blame] | 173 | COMMAND clang-format -sort-includes -i -style=llvm ${file} |
Michael Kruse | 69f3788 | 2015-09-14 16:59:50 | [diff] [blame] | 174 | VERBATIM |
| 175 | COMMENT "Updating format of ${file}..." |
| 176 | ) |
| 177 | list(APPEND update_format_depends "polly-update-format${i}") |
| 178 | |
| 179 | math(EXPR i ${i}+1) |
| 180 | endforeach () |
| 181 | |
| 182 | add_custom_target(polly-check-format DEPENDS ${check_format_depends}) |
Michael Kruse | 6362f5a | 2015-07-21 12:40:01 | [diff] [blame] | 183 | set_target_properties(polly-check-format PROPERTIES FOLDER "Polly") |
Michael Kruse | 69f3788 | 2015-09-14 16:59:50 | [diff] [blame] | 184 | |
| 185 | add_custom_target(polly-update-format DEPENDS ${update_format_depends}) |
Michael Kruse | 6362f5a | 2015-07-21 12:40:01 | [diff] [blame] | 186 | set_target_properties(polly-update-format PROPERTIES FOLDER "Polly") |
Sebastian Pop | a8fb724 | 2014-03-13 20:24:48 | [diff] [blame] | 187 | |