[CMake] Introduce POLLY_BUNDLED_JSONCPP.
[polly-mirror.git] / CMakeLists.txt
blob57b544213dca3c7a19be166e08d84f81ad5b4205
1 # Check if this is a in tree build.
2 if (NOT DEFINED LLVM_MAIN_SRC_DIR)
3   project(Polly)
4   cmake_minimum_required(VERSION 3.4.3)
6   # Where is LLVM installed?
7   set(LLVM_INSTALL_ROOT "" CACHE PATH "Root of LLVM install.")
8   # Check if the LLVM_INSTALL_ROOT valid.
9   if( NOT EXISTS ${LLVM_INSTALL_ROOT}/include/llvm )
10     message(FATAL_ERROR "LLVM_INSTALL_ROOT (${LLVM_INSTALL_ROOT}) is not a valid LLVM installation.")
11   endif(NOT EXISTS ${LLVM_INSTALL_ROOT}/include/llvm)
12   # FileCheck, not and llvm-lit are not install by default, warn the user to copy them.
13   if( NOT EXISTS ${LLVM_INSTALL_ROOT}/bin/FileCheck
14       OR NOT EXISTS ${LLVM_INSTALL_ROOT}/bin/not
15       OR NOT EXISTS ${LLVM_INSTALL_ROOT}/bin/llvm-lit )
16     message(WARNING "'FileCheck', 'not' and 'llvm-lit' are required by running regress tests, "
17                     "but they are not installed! Please copy them to "
18                     "${LLVM_INSTALL_ROOT}/bin.")
19   endif()
20   # Add the llvm header path.
21   include_directories(${LLVM_INSTALL_ROOT}/include/)
23   # Get LLVM's own libraries.
24   execute_process(COMMAND "${LLVM_INSTALL_ROOT}/bin/llvm-config" --libs
25                   OUTPUT_VARIABLE LLVM_LIBS
26                   OUTPUT_STRIP_TRAILING_WHITESPACE)
28   # Get the system librarys that will link into LLVM.
29   execute_process(COMMAND "${LLVM_INSTALL_ROOT}/bin/llvm-config" --system-libs
30                   OUTPUT_VARIABLE LLVM_SYSTEM_LIBS
31                   OUTPUT_STRIP_TRAILING_WHITESPACE)
32   message(STATUS "System libs required by LLVM: ${LLVM_SYSTEM_LIBS}")
34   # Determine where LLVM stores its libraries.
35   execute_process(COMMAND "${LLVM_INSTALL_ROOT}/bin/llvm-config" --libdir
36                   OUTPUT_VARIABLE LLVM_LIBRARY_DIR
37                   OUTPUT_STRIP_TRAILING_WHITESPACE)
38   link_directories("${LLVM_LIBRARY_DIR}")
40   # Now set the header paths.
41   execute_process(COMMAND "${LLVM_INSTALL_ROOT}/bin/llvm-config" --includedir
42                   OUTPUT_VARIABLE LLVM_INCLUDE_DIR
43                   OUTPUT_STRIP_TRAILING_WHITESPACE)
44   include_directories( ${LLVM_INCLUDE_DIR} )
46   # Get the TARGET_TRIPLE
47   execute_process(COMMAND "${LLVM_INSTALL_ROOT}/bin/llvm-config" --host-target
48                   OUTPUT_VARIABLE TARGET_TRIPLE
49                   OUTPUT_STRIP_TRAILING_WHITESPACE)
51   # And then set the cxx flags.
52   execute_process(COMMAND "${LLVM_INSTALL_ROOT}/bin/llvm-config" --cxxflags
53                   OUTPUT_VARIABLE LLVM_CXX_FLAGS
54                   OUTPUT_STRIP_TRAILING_WHITESPACE)
55   set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${LLVM_CXX_FLAGS})
57   # Check LLVM_ENABLE_ASSERTIONS
58   execute_process(COMMAND "${LLVM_INSTALL_ROOT}/bin/llvm-config" --assertion-mode
59                   OUTPUT_VARIABLE LLVM_ENABLE_ASSERTIONS
60                   OUTPUT_STRIP_TRAILING_WHITESPACE)
61   # Copied from LLVM's HandleLLVMOptions.cmake
62   if( LLVM_ENABLE_ASSERTIONS )
63     # MSVC doesn't like _DEBUG on release builds. See PR 4379.
64     if( NOT MSVC )
65       add_definitions( -D_DEBUG )
66     endif()
67     # On non-Debug builds cmake automatically defines NDEBUG, so we
68     # explicitly undefine it:
69     if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
70       add_definitions( -UNDEBUG )
71       # Also remove /D NDEBUG to avoid MSVC warnings about conflicting defines.
72       foreach (flags_var_to_scrub
73           CMAKE_CXX_FLAGS_RELEASE
74           CMAKE_CXX_FLAGS_RELWITHDEBINFO
75           CMAKE_CXX_FLAGS_MINSIZEREL
76           CMAKE_C_FLAGS_RELEASE
77           CMAKE_C_FLAGS_RELWITHDEBINFO
78           CMAKE_C_FLAGS_MINSIZEREL)
79         string (REGEX REPLACE "(^| )[/-]D *NDEBUG($| )" " "
80           "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
81       endforeach()
82     endif()
83   endif()
85   # Sources available, too?
86   execute_process(COMMAND "${LLVM_INSTALL_ROOT}/bin/llvm-config" --src-root
87                   OUTPUT_VARIABLE MAIN_SRC_DIR
88                   OUTPUT_STRIP_TRAILING_WHITESPACE)
89   set(LLVM_SOURCE_ROOT ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
91   # Enable unit tests if available.
92   set(UNITTEST_DIR ${LLVM_SOURCE_ROOT}/utils/unittest)
93   if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h)
94     add_library(gtest
95       ${UNITTEST_DIR}/googletest/src/gtest-all.cc
96       ${UNITTEST_DIR}/googlemock/src/gmock-all.cc
97     )
98     target_include_directories(gtest
99       PUBLIC
100       "${UNITTEST_DIR}/googletest/include"
101       "${UNITTEST_DIR}/googlemock/include"
103       PRIVATE
104       "${UNITTEST_DIR}/googletest"
105       "${UNITTEST_DIR}/googlemock"
106     )
107     target_link_libraries(gtest -lpthread)
109     add_library(gtest_main ${UNITTEST_DIR}/UnitTestMain/TestMain.cpp)
110     target_link_libraries(gtest_main gtest)
112     set(POLLY_GTEST_AVAIL 1)
113   endif()
115   # Make sure the isl c files are built as fPIC
116   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
118   # Set directory for polly-isl-test.
119   set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
120 else ()
121   set(LLVM_SOURCE_ROOT "${LLVM_MAIN_SRC_DIR}")
122   set(POLLY_GTEST_AVAIL 1)
123 endif ()
125 set(POLLY_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
126 set(POLLY_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
128 # Add path for custom modules
129 set(CMAKE_MODULE_PATH
130   ${CMAKE_MODULE_PATH}
131   "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
132   )
134 include("polly_macros")
136 # Add appropriate flags for GCC
137 if (CMAKE_COMPILER_IS_GNUCXX)
138   # FIXME: Turn off exceptions, RTTI:
139   # -fno-exceptions -fno-rtti
140   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")
141 elseif (MSVC)
142   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHs-c-")
143   add_definitions("-D_HAS_EXCEPTIONS=0")
144 else ()
145   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti")
146 endif ()
148 # Add path for custom modules
149 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${POLLY_SOURCE_DIR}/cmake")
151 SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
153 option(POLLY_ENABLE_GPGPU_CODEGEN "Enable GPGPU code generation feature" OFF)
154 if (POLLY_ENABLE_GPGPU_CODEGEN)
155   # Do not require CUDA, as GPU code generation test cases can be run without
156   # a cuda library.
157   FIND_PACKAGE(CUDA)
158   set(GPU_CODEGEN TRUE)
159 else(POLLY_ENABLE_GPGPU_CODEGEN)
160   set(GPU_CODEGEN FALSE)
161 endif(POLLY_ENABLE_GPGPU_CODEGEN)
164 # Support GPGPU code generation if the library is available.
165 if (CUDALIB_FOUND)
166   INCLUDE_DIRECTORIES( ${CUDALIB_INCLUDE_DIR} )
167 endif(CUDALIB_FOUND)
169 option(POLLY_BUNDLED_ISL "Use the bundled version of libisl included in Polly" ON)
170 if (NOT POLLY_BUNDLED_ISL)
171   find_package(ISL MODULE REQUIRED)
172   message(STATUS "Using external libisl ${ISL_VERSION} in: ${ISL_PREFIX}")
173   set(ISL_TARGET ISL)
174 else()
175   set(ISL_INCLUDE_DIRS
176     ${CMAKE_CURRENT_BINARY_DIR}/lib/External/isl/include
177     ${CMAKE_CURRENT_SOURCE_DIR}/lib/External/isl/include
178   )
179   set(ISL_TARGET PollyISL)
180 endif()
182 option(POLLY_BUNDLED_JSONCPP "Use the bundled version of jsoncpp included in Polly" ON)
183 if (POLLY_BUNDLED_JSONCPP)
184   set(JSONCPP_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/lib/External/JSON/include")
185   set(JSONCPP_LIBRARIES)
186   set(POLLY_JSON_FILES
187     External/JSON/json_reader.cpp
188     External/JSON/json_value.cpp
189     External/JSON/json_writer.cpp
190   )
191 else ()
192   find_package(Jsoncpp REQUIRED)
193   set(POLLY_JSON_FILES)
194 endif ()
196 include_directories(
197   BEFORE
198   ${CMAKE_CURRENT_SOURCE_DIR}/include
199   ${ISL_INCLUDE_DIRS}
200   ${JSONCPP_INCLUDE_DIRS}
201   ${CMAKE_CURRENT_SOURCE_DIR}/lib/External/pet/include
202   ${CMAKE_CURRENT_SOURCE_DIR}/lib/External
203   ${CMAKE_CURRENT_BINARY_DIR}/include
204   )
206 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
207   install(DIRECTORY include/
208     DESTINATION include
209     FILES_MATCHING
210     PATTERN "*.h"
211     PATTERN ".svn" EXCLUDE
212     )
214   install(DIRECTORY ${POLLY_BINARY_DIR}/include/
215     DESTINATION include
216     FILES_MATCHING
217     PATTERN "*.h"
218     PATTERN "CMakeFiles" EXCLUDE
219     PATTERN ".svn" EXCLUDE
220     )
221 endif()
223 add_definitions( -D_GNU_SOURCE )
225 add_subdirectory(docs)
226 add_subdirectory(lib)
227 add_subdirectory(test)
228 if (POLLY_GTEST_AVAIL)
229   add_subdirectory(unittests)
230 endif ()
231 add_subdirectory(tools)
232 add_subdirectory(cmake)
233 # TODO: docs.
236 configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/include/polly/Config/config.h.cmake
237                 ${POLLY_BINARY_DIR}/include/polly/Config/config.h )
239 # Add target to check formatting of polly files
240 file( GLOB_RECURSE files *.h lib/*.cpp lib/*.c tools/*.cpp tools/*.c tools/*.h unittests/*.cpp)
241 file( GLOB_RECURSE external lib/External/*.h lib/External/*.c lib/External/*.cpp)
242 list( REMOVE_ITEM files ${external})
244 set(check_format_depends)
245 set(update_format_depends)
246 set(i 0)
247 foreach (file IN LISTS files)
248   add_custom_command(OUTPUT polly-check-format${i}
249     COMMAND clang-format -sort-includes -style=llvm ${file} | diff -u ${file} -
250     VERBATIM
251     COMMENT "Checking format of ${file}..."
252   )
253   list(APPEND check_format_depends "polly-check-format${i}")
255   add_custom_command(OUTPUT polly-update-format${i}
256     COMMAND clang-format -sort-includes -i -style=llvm ${file}
257     VERBATIM
258     COMMENT "Updating format of ${file}..."
259   )
260   list(APPEND update_format_depends "polly-update-format${i}")
262   math(EXPR i ${i}+1)
263 endforeach ()
265 add_custom_target(polly-check-format DEPENDS ${check_format_depends})
266 set_target_properties(polly-check-format PROPERTIES FOLDER "Polly")
268 add_custom_target(polly-update-format DEPENDS ${update_format_depends})
269 set_target_properties(polly-update-format PROPERTIES FOLDER "Polly")