1# Disable warnings for upstream projects. 2if (MSVC) 3 set(DISABLE_WARNING_FLAGS 4 -wd4018 # 'expression' : signed/unsigned mismatch 5 -wd4090 # 'operation' : different 'modifier' qualifiers 6 -wd4200 # nonstandard extension used: zero-sized array in struct/union 7 -wd4201 # nonstandard extension used: nameless struct/union 8 -wd4334 # 'operator': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?) 9 -wd4221 # nonstandard extension used : 'identifier' : cannot be initialized using address of automatic variable 10 ) 11else () 12 set(DISABLE_WARNING_FLAGS "-w") 13endif () 14 15 16# External: Integer Set Library 17if (POLLY_BUNDLED_ISL) 18 set(ISL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/isl") 19 set(ISL_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/isl") 20 21 # Determine version of isl 22 if (EXISTS "${ISL_SOURCE_DIR}/GIT_HEAD_ID") 23 # The source comes from a 'make dist' archive 24 file(READ "${ISL_SOURCE_DIR}/GIT_HEAD_ID" ISL_GIT_HEAD_ID) 25 string(STRIP "${ISL_GIT_HEAD_ID}" ISL_GIT_HEAD_ID) 26 elseif (EXISTS "${ISL_SOURCE_DIR}/gitversion.h") 27 # The source directory is preconfigured 28 file(READ "${ISL_SOURCE_DIR}/gitversion.h" GITVERSION_H) 29 string(REGEX REPLACE ".*\\\"([^\\\"]*)\\\".*" "\\1" ISL_GIT_HEAD_ID "${GITVERSION_H}") 30 elseif () 31 # Unknown revision 32 # TODO: We could look for a .git and get the revision from HEAD 33 set(ISL_GIT_HEAD_ID "UNKNOWN") 34 endif () 35 36 message(STATUS "ISL version: ${ISL_GIT_HEAD_ID}") 37 38 # Enable small integer optimization and imath 39 set(USE_GMP_FOR_MP OFF) 40 set(USE_IMATH_FOR_MP ON) 41 set(USE_SMALL_INT_OPT ON) 42 43 # Determine compiler characteristics 44 include(CheckCSourceCompiles) 45 46 # Like check_c_source_compiles, but sets the result to either 47 # 0 (error while compiling) or 1 (compiled successfully) 48 # Required for compatibility with autotool's AC_CHECK_DECLS 49 function (check_c_source_compiles_numeric _prog _var) 50 check_c_source_compiles("${_prog}" "${_var}") 51 if ("${${_var}}") 52 set("${_var}" 1 PARENT_SCOPE) 53 else () 54 set("${_var}" 0 PARENT_SCOPE) 55 endif () 56 endfunction () 57 58 # Check for the existance of a type 59 function (check_c_type_exists _type _files _variable) 60 set(_includes "") 61 foreach (file_name ${_files}) 62 set(_includes "${_includes}#include<${file_name}>\n") 63 endforeach() 64 check_c_source_compiles(" 65 ${_includes} 66 ${_type} typeVar; 67 int main(void) { 68 return 0; 69 } 70 " ${_variable}) 71 endfunction () 72 73 74 check_c_source_compiles(" 75 int func(void) __attribute__((__warn_unused_result__)); 76 int main(void) { return 0; } 77 " HAS_ATTRIBUTE_WARN_UNUSED_RESULT) 78 set(GCC_WARN_UNUSED_RESULT) 79 if (HAS_ATTRIBUTE_WARN_UNUSED_RESULT) 80 set(GCC_WARN_UNUSED_RESULT "__attribute__((__warn_unused_result__))") 81 endif () 82 83 check_c_source_compiles(" 84 __attribute__ ((unused)) static void foo(void); 85 int main(void) { return 0; } 86 " HAVE___ATTRIBUTE__) 87 88 89 check_c_source_compiles_numeric(" 90 #include <strings.h> 91 int main(void) { (void)ffs(0); return 0; } 92 " HAVE_DECL_FFS) 93 94 check_c_source_compiles_numeric(" 95 int main(void) { (void)__builtin_ffs(0); return 0; } 96 " HAVE_DECL___BUILTIN_FFS) 97 98 check_c_source_compiles_numeric(" 99 #include <intrin.h> 100 int main(void) { (void)_BitScanForward(NULL, 0); return 0; } 101 " HAVE_DECL__BITSCANFORWARD) 102 103 if (NOT HAVE_DECL_FFS AND 104 NOT HAVE_DECL___BUILTIN_FFS AND 105 NOT HAVE_DECL__BITSCANFORWARD) 106 message(FATAL_ERROR "No ffs implementation found") 107 endif () 108 109 110 check_c_source_compiles_numeric(" 111 #include <strings.h> 112 int main(void) { (void)strcasecmp(\"\", \"\"); return 0; } 113 " HAVE_DECL_STRCASECMP) 114 115 check_c_source_compiles_numeric(" 116 #include <string.h> 117 int main(void) { (void)_stricmp(\"\", \"\"); return 0; } 118 " HAVE_DECL__STRICMP) 119 120 if (NOT HAVE_DECL_STRCASECMP AND NOT HAVE_DECL__STRICMP) 121 message(FATAL_ERROR "No strcasecmp implementation found") 122 endif () 123 124 125 check_c_source_compiles_numeric(" 126 #include <strings.h> 127 int main(void) { (void)strncasecmp(\"\", \"\", 0); return 0; } 128 " HAVE_DECL_STRNCASECMP) 129 130 check_c_source_compiles_numeric(" 131 #include <string.h> 132 int main(void) { (void)_strnicmp(\"\", \"\", 0); return 0; } 133 " HAVE_DECL__STRNICMP) 134 135 if (NOT HAVE_DECL_STRNCASECMP AND NOT HAVE_DECL__STRNICMP) 136 message(FATAL_ERROR "No strncasecmp implementation found") 137 endif () 138 139 140 check_c_source_compiles_numeric(" 141 #include <stdio.h> 142 int main(void) { snprintf((void*)0, 0, \" \"); return 0; } 143 " HAVE_DECL_SNPRINTF) 144 145 check_c_source_compiles_numeric(" 146 #include <stdio.h> 147 int main(void) { _snprintf((void*)0, 0, \" \"); return 0; } 148 " HAVE_DECL__SNPRINTF) 149 150 if (NOT HAVE_DECL_SNPRINTF AND NOT HAVE_DECL__SNPRINTF) 151 message(FATAL_ERROR "No snprintf implementation found") 152 endif () 153 154 155 check_c_type_exists(uint8_t "" HAVE_UINT8T) 156 check_c_type_exists(uint8_t "stdint.h" HAVE_STDINT_H) 157 check_c_type_exists(uint8_t "inttypes.h" HAVE_INTTYPES_H) 158 check_c_type_exists(uint8_t "sys/types.h" HAVE_SYS_INTTYPES_H) 159 if (HAVE_UINT8T) 160 set(INCLUDE_STDINT_H "") 161 elseif (HAVE_STDINT_H) 162 set(INCLUDE_STDINT_H "#include <stdint.h>") 163 elseif (HAVE_INTTYPES_H) 164 set(INCLUDE_STDINT_H "#include <inttypes.h>") 165 elseif (HAVE_SYS_INTTYPES_H) 166 set(INCLUDE_STDINT_H "#include <sys/inttypes.h>") 167 else () 168 message(FATAL_ERROR "No stdint.h or compatible found") 169 endif () 170 171 # Write configure result 172 # configure_file(... COPYONLY) avoids that the time stamp changes if the file is identical 173 file(WRITE "${ISL_BINARY_DIR}/gitversion.h.tmp" 174 "#define GIT_HEAD_ID \"${ISL_GIT_HEAD_ID}\"") 175 configure_file("${ISL_BINARY_DIR}/gitversion.h.tmp" 176 "${ISL_BINARY_DIR}/gitversion.h" COPYONLY) 177 178 file(WRITE "${ISL_BINARY_DIR}/include/isl/stdint.h.tmp" 179 "${INCLUDE_STDINT_H}\n") 180 configure_file("${ISL_BINARY_DIR}/include/isl/stdint.h.tmp" 181 "${ISL_BINARY_DIR}/include/isl/stdint.h" COPYONLY) 182 183 configure_file("isl_config.h.cmake" "${ISL_BINARY_DIR}/isl_config.h") 184 configure_file("isl_srcdir.c.cmake" "${ISL_BINARY_DIR}/isl_srcdir.c") 185 186 include_directories(BEFORE 187 ${ISL_BINARY_DIR} 188 ${ISL_SOURCE_DIR}/imath 189 ${ISL_SOURCE_DIR}/include 190 ${ISL_SOURCE_DIR} 191 ) 192 193 # ISL files to compile 194 set (ISL_FILES 195 isl/basis_reduction_tab.c 196 isl/isl_aff.c 197 isl/isl_aff_map.c 198 isl/isl_affine_hull.c 199 isl/isl_arg.c 200 isl/isl_ast_build.c 201 isl/isl_ast_build_expr.c 202 isl/isl_ast.c 203 isl/isl_ast_codegen.c 204 isl/isl_ast_graft.c 205 isl/isl_bernstein.c 206 isl/isl_blk.c 207 isl/isl_bound.c 208 isl/isl_box.c 209 isl/isl_coalesce.c 210 isl/isl_constraint.c 211 isl/isl_convex_hull.c 212 isl/isl_ctx.c 213 isl/isl_deprecated.c 214 isl/isl_dim_map.c 215 isl/isl_equalities.c 216 isl/isl_factorization.c 217 isl/isl_farkas.c 218 isl/isl_ffs.c 219 isl/isl_flow.c 220 isl/isl_fold.c 221 isl/isl_hash.c 222 isl/isl_id.c 223 isl/isl_id_to_ast_expr.c 224 isl/isl_id_to_id.c 225 isl/isl_id_to_pw_aff.c 226 isl/isl_ilp.c 227 isl/isl_imath.c 228 isl/isl_input.c 229 isl/isl_int_sioimath.c 230 isl/isl_local.c 231 isl/isl_local_space.c 232 isl/isl_lp.c 233 isl/isl_map.c 234 isl/isl_map_list.c 235 isl/isl_map_simplify.c 236 isl/isl_map_subtract.c 237 isl/isl_map_to_basic_set.c 238 isl/isl_mat.c 239 isl/isl_morph.c 240 isl/isl_obj.c 241 isl/isl_options.c 242 isl/isl_output.c 243 isl/isl_point.c 244 isl/isl_polynomial.c 245 isl/isl_printer.c 246 isl/isl_range.c 247 isl/isl_reordering.c 248 isl/isl_sample.c 249 isl/isl_scan.c 250 isl/isl_schedule.c 251 isl/isl_schedule_band.c 252 isl/isl_schedule_constraints.c 253 isl/isl_schedule_node.c 254 isl/isl_schedule_read.c 255 isl/isl_schedule_tree.c 256 isl/isl_scheduler.c 257 isl/isl_scheduler_clustering.c 258 isl/isl_scheduler_scc.c 259 isl/isl_seq.c 260 isl/isl_set_list.c 261 isl/isl_set_to_ast_graft_list.c 262 isl/isl_sort.c 263 isl/isl_space.c 264 isl/isl_stride.c 265 isl/isl_stream.c 266 isl/isl_tab.c 267 isl/isl_tab_pip.c 268 isl/isl_tarjan.c 269 isl/isl_transitive_closure.c 270 isl/isl_union_map.c 271 isl/isl_val.c 272 isl/isl_val_sioimath.c 273 isl/isl_vec.c 274 isl/isl_version.c 275 isl/isl_vertices.c 276 isl/print.c 277 isl/set_to_map.c 278 isl/set_from_map.c 279 isl/uset_to_umap.c 280 isl/uset_from_umap.c 281 isl/imath/gmp_compat.c 282 isl/imath/imath.c 283 isl/imath/imrat.c 284 ) 285 286 add_polly_library(PollyISL 287 ${ISL_FILES} 288 ) 289 290 291 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 292 install(DIRECTORY 293 ${ISL_SOURCE_DIR}/include/ 294 ${ISL_BINARY_DIR}/include/ 295 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/polly" 296 FILES_MATCHING 297 PATTERN "*.h" 298 PATTERN "CMakeFiles" EXCLUDE 299 ) 300 endif() 301 302 add_executable(polly-isl-test 303 isl/isl_test.c 304 ) 305 set_target_properties(polly-isl-test PROPERTIES FOLDER "Polly/Tests") 306 307 target_link_libraries(polly-isl-test PRIVATE 308 PollyISL 309 LLVMSupport 310 ) 311 312 # ISL requires at least C99 to compile. gcc < 5.0 use -std=gnu89 as default. 313 set_property(TARGET PollyISL polly-isl-test PROPERTY C_STANDARD 99) 314 315 target_compile_options(PollyISL PRIVATE ${DISABLE_WARNING_FLAGS}) 316 target_compile_options(polly-isl-test PRIVATE ${DISABLE_WARNING_FLAGS}) 317endif (POLLY_BUNDLED_ISL) 318