1include(CheckIncludeFile) 2include(CheckLibraryExists) 3include(CheckSymbolExists) 4include(CheckFunctionExists) 5include(CheckCSourceCompiles) 6 7# Check for mmap() support, required for HAVE_MPOOL. 8# 9# checks for private fixed mappings, we don't need fixed mappings, 10# so check only wether private mappings work. 11check_include_file(sys/mman.h HAVE_SYS_MMAN_H) 12if(MMAP_FOR_CROSSCOMPILING) 13 set(HAVE_MMAP 1) 14else() 15 check_c_source_compiles( 16 " 17 #include <unistd.h> 18 #include <stdlib.h> 19 #include <sys/mman.h> 20 #ifdef HAVE_SYS_TYPES_H 21 #include <sys/types.h> 22 #endif 23 #ifdef HAVE_SYS_STAT_H 24 #include <sys/stat.h> 25 #endif 26 #include <fcntl.h> 27 #define ERR(e) do { status = e; goto done; } while(0) 28 int main(void) 29 { 30 char *data = NULL, *data2 = MAP_FAILED, *data3 = NULL; 31 size_t i, datasize = 1024; 32 int fd = -1, status = 0; 33 34 /* First, make a file with some known garbage in it. */ 35 data = (char*) malloc(datasize); 36 if(!data) 37 ERR(1); 38 for(i=0;i<datasize;i++) 39 *(data + i) = rand(); 40 umask(0); 41 fd = creat(\"conftest.mmap\", 0600); 42 if(fd < 0) 43 ERR(1); 44 if(write (fd, data, datasize) != datasize) 45 ERR(1); 46 close(fd); 47 fd = open(\"conftest.mmap\", O_RDWR); 48 if (fd < 0) 49 ERR(1); 50 /* Next, try to create a private map of the file. If we can, also make sure that 51 we see the same garbage. */ 52 data2 = mmap(NULL, datasize, PROT_READ | PROT_WRITE, 53 MAP_PRIVATE, fd, 0L); 54 if(data2 == MAP_FAILED) 55 ERR(2); 56 for(i=0;i<datasize;i++) 57 if(*(data + i) != *(data2+ i)) 58 ERR(3); 59 /* Finally, make sure that changes to the mapped area do not 60 percolate back to the file as seen by read(). 61 (This is a bug on some variants of i386 svr4.0.) */ 62 for (i = 0; i < datasize; ++i) 63 *(data2 + i) = *(data2 + i) + 1; 64 data3 = (char*) malloc(datasize); 65 if(!data3) 66 ERR(1); 67 if(read (fd, data3, datasize) != datasize) 68 ERR(1); 69 for(i=0;i<datasize;i++) 70 if(*(data + i) != *(data3 + i)) 71 ERR(3); 72 done: 73 if(fd >= 0) 74 close(fd); 75 if(data3) 76 free(data3); 77 if(data2 != MAP_FAILED) 78 munmap(data2, datasize); 79 if(data) 80 free(data); 81 return status; 82 } 83 " 84 HAVE_MMAP 85 ) 86endif() 87 88# Check the flag name for the ANONYMOUS_MAP feature. 89check_c_source_compiles( 90 " 91 #include <sys/mman.h> 92 int main(void) 93 { 94 mmap((void *)0, 0, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 95 return 0; 96 } 97 " 98 HAVE_MMAP_MAP_ANONYMOUS 99) 100if(HAVE_MMAP_MAP_ANONYMOUS) 101 set(ANONYMOUS_MAP MAP_ANONYMOUS) 102else() 103 check_c_source_compiles( 104 " 105 /* OPENBSD WORKAROUND - DND*/ 106 #include <sys/types.h> 107 /* OPENBSD WORKAROUND - END*/ 108 #include <sys/mman.h> 109 int main(void) 110 { 111 mmap((void *)0, 0, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); 112 return 0; 113 } 114 " 115 HAVE_MMAP_MAP_ANON 116 ) 117 if(HAVE_MMAP_MAP_ANON) 118 set(ANONYMOUS_MAP MAP_ANON) 119 endif() 120endif() 121 122# Check for getting the pagesize. 123check_symbol_exists(getpagesize unistd.h HAVE_GETPAGESIZE) 124check_c_source_compiles( 125 " 126 #include <sys/types.h> 127 #include <unistd.h> 128 int main(void) 129 { 130 int x = sysconf(_SC_PAGESIZE); 131 return 0; 132 } 133 " 134 HAVE_SYSCONF_SC_PAGESIZE 135) 136 137# Check for mempool support 138if(DISABLE_MPOOL) 139 message("****** mempool support disabled (DISABLE_MPOOL enabled)") 140elseif(NOT HAVE_MMAP) 141 message("****** mempool support disabled (mmap() not available or not usable)") 142elseif(NOT HAVE_GETPAGESIZE AND NOT HAVE_SYSCONF_SC_PAGESIZE) 143 message("****** mempool support disabled (pagesize cannot be determined)") 144elseif(NOT HAVE_MMAP_MAP_ANON AND NOT HAVE_MMAP_MAP_ANONYMOUS) 145 message("****** mempool support disabled (anonymous mmap not available)") 146else() 147 set(USE_MPOOL 1) 148endif() 149