1 # External: Integer Set Library
2 set(ISL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/isl")
3 set(ISL_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/isl")
5 # Determine version of isl
6 if (EXISTS "${ISL_SOURCE_DIR}/GIT_HEAD_ID")
7 # The source comes from a 'make dist' archive
8 file(READ "${ISL_SOURCE_DIR}/GIT_HEAD_ID" ISL_GIT_HEAD_ID)
9 string(STRIP "${ISL_GIT_HEAD_ID}" ISL_GIT_HEAD_ID)
10 elseif (EXISTS "${ISL_SOURCE_DIR}/gitversion.h")
11 # The source directory is preconfigured
12 file(READ "${ISL_SOURCE_DIR}/gitversion.h" GITVERSION_H)
13 string(REGEX REPLACE ".*\\\"([^\\\"]*)\\\".*" "\\1" ISL_GIT_HEAD_ID "${GITVERSION_H}")
16 # TODO: We could look for a .git and get the revision from HEAD
17 set(ISL_GIT_HEAD_ID "UNKNOWN")
20 message(STATUS "ISL version: ${ISL_GIT_HEAD_ID}")
22 # Enable small integer optimization and imath
23 set(USE_GMP_FOR_MP OFF)
24 set(USE_IMATH_FOR_MP ON)
25 set(USE_SMALL_INT_OPT ON)
27 # Determine compiler characteristics
28 include(CheckCSourceCompiles)
30 # Like check_c_source_compiles, but sets the result to either
31 # 0 (error while compiling) or 1 (compiled successfully)
32 # Required for compatibility with autotool's AC_CHECK_DECLS
33 function (check_c_source_compiles_numeric _prog _var)
34 check_c_source_compiles("${_prog}" "${_var}")
36 set("${_var}" 1 PARENT_SCOPE)
38 set("${_var}" 0 PARENT_SCOPE)
42 # Check for the existance of a type
43 function (check_c_type_exists _type _files _variable)
45 foreach (file_name ${_files})
46 set(_includes "${_includes}#include<${file_name}>\n")
48 check_c_source_compiles("
58 check_c_source_compiles("
59 int func(void) __attribute__((__warn_unused_result__));
60 int main() { return 0; }
61 " HAS_ATTRIBUTE_WARN_UNUSED_RESULT)
62 set(GCC_WARN_UNUSED_RESULT)
63 if (HAS_ATTRIBUTE_WARN_UNUSED_RESULT)
64 set(GCC_WARN_UNUSED_RESULT "__attribute__((__warn_unused_result__))")
67 check_c_source_compiles("
68 __attribute__ ((unused)) static void foo(void);
69 int main() { return 0; }
73 check_c_source_compiles_numeric("
75 int main() { (void)ffs(0); return 0; }
78 check_c_source_compiles_numeric("
79 int main() { (void)__builtin_ffs(0); return 0; }
80 " HAVE_DECL___BUILTIN_FFS)
82 check_c_source_compiles_numeric("
84 int main() { (void)_BitScanForward(NULL, 0); return 0; }
85 " HAVE_DECL__BITSCANFORWARD)
87 if (NOT HAVE_DECL_FFS AND
88 NOT HAVE_DECL___BUILTIN_FFS AND
89 NOT HAVE_DECL__BITSCANFORWARD)
90 message(FATAL_ERROR "No ffs implementation found")
94 check_c_source_compiles_numeric("
96 int main() { (void)strcasecmp(\"\", \"\"); return 0; }
97 " HAVE_DECL_STRCASECMP)
99 check_c_source_compiles_numeric("
101 int main() { (void)_stricmp(\"\", \"\"); return 0; }
102 " HAVE_DECL__STRICMP)
104 if (NOT HAVE_DECL_STRCASECMP AND NOT HAVE_DECL__STRICMP)
105 message(FATAL_ERROR "No strcasecmp implementation found")
109 check_c_source_compiles_numeric("
111 int main() { (void)strncasecmp(\"\", \"\", 0); return 0; }
112 " HAVE_DECL_STRNCASECMP)
114 check_c_source_compiles_numeric("
116 int main() { (void)_strnicmp(\"\", \"\", 0); return 0; }
117 " HAVE_DECL__STRNICMP)
119 if (NOT HAVE_DECL_STRNCASECMP AND NOT HAVE_DECL__STRNICMP)
120 message(FATAL_ERROR "No strncasecmp implementation found")
124 check_c_source_compiles_numeric("
126 int main() { snprintf((void*)0, 0, \" \"); return 0; }
127 " HAVE_DECL_SNPRINTF)
129 check_c_source_compiles_numeric("
131 int main() { _snprintf((void*)0, 0, \" \"); return 0; }
132 " HAVE_DECL__SNPRINTF)
134 if (NOT HAVE_DECL_SNPRINTF AND NOT HAVE_DECL__SNPRINTF)
135 message(FATAL_ERROR "No snprintf implementation found")
139 check_c_type_exists(uint8_t "" HAVE_UINT8T)
140 check_c_type_exists(uint8_t "stdint.h" HAVE_STDINT_H)
141 check_c_type_exists(uint8_t "inttypes.h" HAVE_INTTYPES_H)
142 check_c_type_exists(uint8_t "sys/types.h" HAVE_SYS_INTTYPES_H)
144 set(INCLUDE_STDINT_H "")
145 elseif (HAVE_STDINT_H)
146 set(INCLUDE_STDINT_H "#include <stdint.h>")
147 elseif (HAVE_INTTYPES_H)
148 set(INCLUDE_STDINT_H "#include <inttypes.h>")
149 elseif (HAVE_SYS_INTTYPES_H)
150 set(INCLUDE_STDINT_H "#include <sys/inttypes.h>")
152 message(FATAL_ERROR "No stdint.h or compatible found")
155 # Write configure result
156 # configure_file(... COPYONLY) avoids that the time stamp changes if the file is identical
157 file(WRITE "${ISL_BINARY_DIR}/gitversion.h.tmp"
158 "#define GIT_HEAD_ID \"${ISL_GIT_HEAD_ID}\"")
159 configure_file("${ISL_BINARY_DIR}/gitversion.h.tmp"
160 "${ISL_BINARY_DIR}/gitversion.h" COPYONLY)
162 file(WRITE "${ISL_BINARY_DIR}/include/isl/stdint.h.tmp"
163 "${INCLUDE_STDINT_H}\n")
164 configure_file("${ISL_BINARY_DIR}/include/isl/stdint.h.tmp"
165 "${ISL_BINARY_DIR}/include/isl/stdint.h" COPYONLY)
167 configure_file("isl_config.h.cmake" "${ISL_BINARY_DIR}/isl_config.h")
169 include_directories(BEFORE
171 ${ISL_SOURCE_DIR}/imath
172 ${ISL_SOURCE_DIR}/include
176 # ISL files to compile
178 isl/basis_reduction_tab.c
180 isl/isl_affine_hull.c
183 isl/isl_ast_build_expr.c
185 isl/isl_ast_codegen.c
193 isl/isl_convex_hull.c
198 isl/isl_factorization.c
205 isl/isl_id_to_ast_expr.c
207 isl/isl_id_to_pw_aff.c
211 isl/isl_int_sioimath.c
213 isl/isl_local_space.c
217 isl/isl_map_simplify.c
218 isl/isl_map_subtract.c
219 isl/isl_map_to_basic_set.c
233 isl/isl_schedule_band.c
234 isl/isl_schedule_constraints.c
235 isl/isl_schedule_node.c
236 isl/isl_schedule_read.c
237 isl/isl_schedule_tree.c
247 isl/isl_transitive_closure.c
250 isl/isl_val_sioimath.c
255 isl/imath/gmp_compat.c
260 add_polly_library(PollyISL
264 add_executable(polly-isl-test
267 set_target_properties(polly-isl-test PROPERTIES FOLDER "Polly")
269 target_link_libraries(polly-isl-test
273 # ISL requires at least C99 to compile. gcc < 5.0 use -std=gnu89 as default.
274 target_enable_c99(PollyISL)
275 target_enable_c99(polly-isl-test)
277 set(PET_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/pet")
278 set(PPCG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ppcg")
279 set(PPCG_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppcg")
281 # Determine version of ppcg
282 if (EXISTS "${PPCG_SOURCE_DIR}/GIT_HEAD_ID")
283 # The source comes from a 'make dist' archive
284 file(READ "${PPCG_SOURCE_DIR}/GIT_HEAD_ID" PPCG_GIT_HEAD_ID)
285 string(STRIP "${PPCG_GIT_HEAD_ID}" PPCG_GIT_HEAD_ID)
286 elseif (EXISTS "${PPCG_SOURCE_DIR}/gitversion.h")
287 # The source directory is preconfigured
288 file(READ "${PPCG_SOURCE_DIR}/gitversion.h" GITVERSION_H)
289 string(REGEX REPLACE ".*\\\"([^\\\"]*)\\\".*" "\\1" PPCG_GIT_HEAD_ID "${GITVERSION_H}")
292 # TODO: We could look for a .git and get the revision from HEAD
293 set(PPCG_GIT_HEAD_ID "UNKNOWN")
296 message(STATUS "PPCG version: ${PPCG_GIT_HEAD_ID}")
301 ppcg/gpu_array_tile.c
312 include_directories(BEFORE
314 ${PPCG_SOURCE_DIR}/imath
315 ${PPCG_SOURCE_DIR}/include
316 ${PET_SOURCE_DIR}/include
319 add_polly_library(PollyPPCG
323 target_link_libraries(PollyPPCG PollyISL)
325 # Disable warnings for upstream projects.
327 set(DISABLE_WARNING_FLAGS
328 -wd4018 # 'expression' : signed/unsigned mismatch
329 -wd4090 # 'operation' : different 'modifier' qualifiers
330 -wd4200 # nonstandard extension used: zero-sized array in struct/union
331 -wd4201 # nonstandard extension used: nameless struct/union
332 -wd4334 # 'operator': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
334 target_compile_options(PollyISL PRIVATE ${DISABLE_WARNING_FLAGS})
335 target_compile_options(polly-isl-test PRIVATE ${DISABLE_WARNING_FLAGS})
336 target_compile_options(PollyPPCG PRIVATE ${DISABLE_WARNING_FLAGS})
338 set_target_properties(PollyISL polly-isl-test PollyPPCG PROPERTIES
344 # In the Windows API (with some exceptions), the maximum length for a path is
345 # MAX_PATH, which is defined as 260 characters.
346 target_compile_definitions(PollyPPCG PUBLIC "-DPATH_MAX=260")