[cmake] Avoid warnings in feature tests. NFC.
[polly-mirror.git] / lib / External / CMakeLists.txt
blobeafb6be7619adfb71632c6ef718175025228538c
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}")
14 elseif ()
15   # Unknown revision
16   # TODO: We could look for a .git and get the revision from HEAD
17   set(ISL_GIT_HEAD_ID "UNKNOWN")
18 endif ()
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}")
35   if ("${${_var}}")
36     set("${_var}" 1 PARENT_SCOPE)
37   else ()
38     set("${_var}" 0 PARENT_SCOPE)
39   endif ()
40 endfunction ()
42 # Check for the existance of a type
43 function (check_c_type_exists _type _files _variable)
44   set(_includes "")
45   foreach (file_name ${_files})
46      set(_includes "${_includes}#include<${file_name}>\n")
47   endforeach()
48   check_c_source_compiles("
49     ${_includes}
50     ${_type} typeVar;
51     int main() {
52         return 0;
53     }
54     " ${_variable})
55 endfunction ()
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__))")
65 endif ()
67 check_c_source_compiles("
68   __attribute__ ((unused)) static void foo(void);
69   int main() { return 0; }
70   " HAVE___ATTRIBUTE__)
73 check_c_source_compiles_numeric("
74   #include <strings.h>
75   int main() { (void)ffs(0); return 0; }
76   " HAVE_DECL_FFS)
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("
83   #include <intrin.h>
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")
91 endif ()
94 check_c_source_compiles_numeric("
95   #include <strings.h>
96   int main() { (void)strcasecmp(\"\", \"\"); return 0; }
97   " HAVE_DECL_STRCASECMP)
99 check_c_source_compiles_numeric("
100   #include <string.h>
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")
106 endif ()
109 check_c_source_compiles_numeric("
110   #include <strings.h>
111   int main() { (void)strncasecmp(\"\", \"\", 0); return 0; }
112   " HAVE_DECL_STRNCASECMP)
114 check_c_source_compiles_numeric("
115   #include <string.h>
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")
121 endif ()
124 check_c_source_compiles_numeric("
125   #include <stdio.h>
126   int main() { snprintf((void*)0, 0, \" \"); return 0; }
127   " HAVE_DECL_SNPRINTF)
129 check_c_source_compiles_numeric("
130   #include <stdio.h>
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")
136 endif ()
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)
143 if (HAVE_UINT8T)
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>")
151 else ()
152   message(FATAL_ERROR "No stdint.h or compatible found")
153 endif ()
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
170   ${ISL_BINARY_DIR}
171   ${ISL_SOURCE_DIR}/imath
172   ${ISL_SOURCE_DIR}/include
173   ${ISL_SOURCE_DIR}
176 # ISL files to compile
177 set (ISL_FILES
178     isl/basis_reduction_tab.c
179     isl/isl_aff.c
180     isl/isl_affine_hull.c
181     isl/isl_arg.c
182     isl/isl_ast_build.c
183     isl/isl_ast_build_expr.c
184     isl/isl_ast.c
185     isl/isl_ast_codegen.c
186     isl/isl_ast_graft.c
187     isl/isl_band.c
188     isl/isl_bernstein.c
189     isl/isl_blk.c
190     isl/isl_bound.c
191     isl/isl_coalesce.c
192     isl/isl_constraint.c
193     isl/isl_convex_hull.c
194     isl/isl_ctx.c
195     isl/isl_deprecated.c
196     isl/isl_dim_map.c
197     isl/isl_equalities.c
198     isl/isl_factorization.c
199     isl/isl_farkas.c
200     isl/isl_ffs.c
201     isl/isl_flow.c
202     isl/isl_fold.c
203     isl/isl_hash.c
204     isl/isl_id.c
205     isl/isl_id_to_ast_expr.c
206     isl/isl_id_to_id.c
207     isl/isl_id_to_pw_aff.c
208     isl/isl_ilp.c
209     isl/isl_imath.c
210     isl/isl_input.c
211     isl/isl_int_sioimath.c
212     isl/isl_local.c
213     isl/isl_local_space.c
214     isl/isl_lp.c
215     isl/isl_map.c
216     isl/isl_map_list.c
217     isl/isl_map_simplify.c
218     isl/isl_map_subtract.c
219     isl/isl_map_to_basic_set.c
220     isl/isl_mat.c
221     isl/isl_morph.c
222     isl/isl_obj.c
223     isl/isl_options.c
224     isl/isl_output.c
225     isl/isl_point.c
226     isl/isl_polynomial.c
227     isl/isl_printer.c
228     isl/isl_range.c
229     isl/isl_reordering.c
230     isl/isl_sample.c
231     isl/isl_scan.c
232     isl/isl_schedule.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
238     isl/isl_scheduler.c
239     isl/isl_seq.c
240     isl/isl_set_list.c
241     isl/isl_sort.c
242     isl/isl_space.c
243     isl/isl_stream.c
244     isl/isl_tab.c
245     isl/isl_tab_pip.c
246     isl/isl_tarjan.c
247     isl/isl_transitive_closure.c
248     isl/isl_union_map.c
249     isl/isl_val.c
250     isl/isl_val_sioimath.c
251     isl/isl_vec.c
252     isl/isl_version.c
253     isl/isl_vertices.c
254     isl/print.c
255     isl/imath/gmp_compat.c
256     isl/imath/imath.c
257     isl/imath/imrat.c
258     )
260 add_polly_library(PollyISL
261   ${ISL_FILES}
264 add_executable(polly-isl-test
265   isl/isl_test.c
267 set_target_properties(polly-isl-test PROPERTIES FOLDER "Polly")
269 target_link_libraries(polly-isl-test
270   PollyISL
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}")
290 elseif ()
291   # Unknown revision
292   # TODO: We could look for a .git and get the revision from HEAD
293   set(PPCG_GIT_HEAD_ID "UNKNOWN")
294 endif ()
296 message(STATUS "PPCG version: ${PPCG_GIT_HEAD_ID}")
298 set (PPCG_FILES
299      ppcg/cuda.c
300      ppcg/cuda_common.c
301      ppcg/gpu_array_tile.c
302      ppcg/gpu.c
303      ppcg/gpu_group.c
304      ppcg/gpu_print.c
305      ppcg/gpu_tree.c
306      ppcg/ppcg.c
307      ppcg/ppcg_options.c
308      ppcg/schedule.c
309      ppcg/external.c
310      )
312 include_directories(BEFORE
313   ${PPCG_BINARY_DIR}
314   ${PPCG_SOURCE_DIR}/imath
315   ${PPCG_SOURCE_DIR}/include
316   ${PET_SOURCE_DIR}/include
319 add_polly_library(PollyPPCG
320   ${PPCG_FILES}
323 target_link_libraries(PollyPPCG PollyISL)
325 # Disable warnings for upstream projects.
326 if (MSVC)
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?)
333   )
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})
337 else ()
338   set_target_properties(PollyISL polly-isl-test PollyPPCG PROPERTIES
339     COMPILE_FLAGS "-w"
340   )
341 endif ()
343 if(MSVC)
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")
347 endif ()