CMakeLists.txt (5227B)
1 include(CheckTypeSize) 2 include(CheckSymbolExists) 3 include(CheckFunctionExists) 4 include(CheckIncludeFiles) 5 include(CheckCSourceRuns) 6 include(CheckCSourceCompiles) 7 include(TestBigEndian) 8 9 check_c_source_compiles(" 10 #include <execinfo.h> 11 int main(void) 12 { 13 void *trace[1]; 14 backtrace(trace, 1); 15 return 0; 16 } 17 " HAVE_EXECINFO_BACKTRACE) 18 19 check_c_source_compiles(" 20 int main(void) 21 { 22 int a = 42; 23 __builtin_add_overflow(a, a, &a); 24 __builtin_sub_overflow(a, a, &a); 25 return 0; 26 } 27 " HAVE_BUILTIN_ADD_OVERFLOW) 28 29 check_type_size("int" SIZEOF_INT LANGUAGE C) 30 check_type_size("long" SIZEOF_LONG LANGUAGE C) 31 check_type_size("intmax_t" SIZEOF_INTMAX_T LANGUAGE C) 32 check_type_size("size_t" SIZEOF_SIZE_T LANGUAGE C) 33 check_type_size("void *" SIZEOF_VOID_PTR LANGUAGE C) 34 35 check_symbol_exists(_NSGetEnviron crt_externs.h HAVE__NSGETENVIRON) 36 37 # Headers 38 check_include_files(langinfo.h HAVE_LANGINFO_H) 39 check_include_files(strings.h HAVE_STRINGS_H) 40 check_include_files(sys/utsname.h HAVE_SYS_UTSNAME_H) 41 check_include_files(termios.h HAVE_TERMIOS_H) 42 check_include_files(sys/uio.h HAVE_SYS_UIO_H) 43 check_include_files(sys/sdt.h HAVE_SYS_SDT_H) 44 if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 45 check_include_files(sys/xattr.h HAVE_XATTR) 46 endif() 47 48 # Functions 49 check_function_exists(fseeko HAVE_FSEEKO) 50 check_function_exists(readv HAVE_READV) 51 check_function_exists(readlink HAVE_READLINK) 52 check_function_exists(strnlen HAVE_STRNLEN) 53 check_function_exists(strcasecmp HAVE_STRCASECMP) 54 check_function_exists(strncasecmp HAVE_STRNCASECMP) 55 check_function_exists(strptime HAVE_STRPTIME) 56 57 check_c_source_compiles(" 58 #include <sys/types.h> 59 #include <dirent.h> 60 #include <sys/file.h> 61 int main(void) 62 { 63 DIR *dir = opendir(\"dirname\"); 64 dirfd(dir); 65 flock(10, LOCK_SH); 66 return 0; 67 } 68 " HAVE_DIRFD_AND_FLOCK) 69 70 71 check_c_source_compiles(" 72 #include <pwd.h> 73 int main(void) 74 { 75 getpwent(); 76 getpwuid(0); 77 getpwnam(\"root\"); 78 return 0; 79 } 80 " HAVE_PWD_FUNCS) 81 82 check_c_source_compiles(" 83 #include <intrin.h> 84 85 int main(void) 86 { 87 unsigned long index; 88 unsigned char mask = 0x8000; 89 _BitScanForward64(&index, mask); 90 return 0; 91 } 92 " HAVE_BITSCANFORWARD64) 93 94 if(CMAKE_SYSTEM_NAME STREQUAL "SunOS" OR CMAKE_SYSTEM_NAME STREQUAL "Haiku") 95 check_c_source_compiles(" 96 #include <termios.h> 97 int 98 main(void) 99 { 100 return forkpty(0, NULL, NULL, NULL); 101 } 102 " HAVE_FORKPTY) 103 else() 104 set(HAVE_FORKPTY 1) 105 endif() 106 107 # Symbols 108 check_symbol_exists(FD_CLOEXEC "fcntl.h" HAVE_FD_CLOEXEC) 109 if(HAVE_LANGINFO_H) 110 check_symbol_exists(CODESET "langinfo.h" HAVE_NL_LANGINFO_CODESET) 111 endif() 112 113 check_include_files("endian.h" HAVE_ENDIAN_H) 114 115 set(ENDIAN_INCLUDE_FILE "endian.h") 116 if(NOT HAVE_ENDIAN_H) 117 check_include_files("sys/endian.h" HAVE_SYS_ENDIAN_H) 118 if (HAVE_SYS_ENDIAN_H) 119 set(ENDIAN_INCLUDE_FILE "sys/endian.h") 120 endif() 121 endif() 122 123 set(SI "#include <stdint.h>\n") 124 set(MS "int main(int argc,char**argv)\n{\n uint64_t i=0x0102030405060708ULL;") 125 set(ME "}") 126 check_c_source_compiles(" 127 #define _BSD_SOURCE 1 128 #define _DEFAULT_SOURCE 1 129 ${SI} 130 #include <${ENDIAN_INCLUDE_FILE}> 131 #ifndef be64toh 132 # error No be64toh macros 133 #endif 134 ${MS} 135 uint64_t j = be64toh(i); 136 return (j == 0); // j must not be zero 137 ${ME}" 138 HAVE_BE64TOH_MACROS) 139 if(NOT "${HAVE_BE64TOH_MACROS}") 140 check_function_exists(be64toh HAVE_BE64TOH_FUNC) 141 endif() 142 if("${HAVE_BE64TOH_MACROS}" OR "${HAVE_BE64TOH_FUNC}") 143 set(HAVE_BE64TOH 1) 144 endif() 145 146 test_big_endian(ORDER_BIG_ENDIAN) 147 148 configure_file ( 149 "${PROJECT_SOURCE_DIR}/cmake.config/config.h.in" 150 "${PROJECT_BINARY_DIR}/cmake.config/auto/config.h" 151 ) 152 153 set(VERSION_STRING "${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS} ") 154 155 foreach(BUILD_TYPE Debug Release RelWithDebInfo MinSizeRel) 156 string(TOUPPER ${BUILD_TYPE} BUILD_TYPE_UPPER) 157 set(GEN_CONFIG "$<CONFIG:${BUILD_TYPE}>") 158 159 set(GEN_RHS "${CMAKE_C_FLAGS_${BUILD_TYPE_UPPER}} ") 160 string(APPEND VERSION_STRING "$<${GEN_CONFIG}:${GEN_RHS}>") 161 162 set(GEN_RHS "$<$<BOOL:$<TARGET_PROPERTY:nvim_bin,INTERPROCEDURAL_OPTIMIZATION_${BUILD_TYPE_UPPER}>>:${CMAKE_C_COMPILE_OPTIONS_IPO}>") 163 string(APPEND VERSION_STRING "$<${GEN_CONFIG}:${GEN_RHS}>") 164 endforeach() 165 166 string(APPEND VERSION_STRING " ") 167 168 function(append_target_expression) 169 cmake_parse_arguments(ARG 170 "" 171 "PREFIX;PROPERTY" 172 "" 173 ${ARGN}) 174 175 set(TARGET_EXPRESSION "$<TARGET_PROPERTY:nvim_bin,${ARG_PROPERTY}>") 176 set(TARGET_EXPRESSION "$<REMOVE_DUPLICATES:${TARGET_EXPRESSION}>") 177 set(TARGET_EXPRESSION "${ARG_PREFIX}$<JOIN:${TARGET_EXPRESSION}, ${ARG_PREFIX}>") 178 179 set(VERSION_STRING "${VERSION_STRING} ${TARGET_EXPRESSION} " PARENT_SCOPE) 180 endfunction() 181 append_target_expression(PROPERTY COMPILE_OPTIONS) 182 append_target_expression(PROPERTY LINK_OPTIONS) 183 append_target_expression(PREFIX "-D" PROPERTY COMPILE_DEFINITIONS) 184 append_target_expression(PREFIX "-I" PROPERTY INCLUDE_DIRECTORIES) 185 string(REPLACE ";" " " VERSION_STRING "${VERSION_STRING}") 186 string(REPLACE " " " " VERSION_STRING "${VERSION_STRING}") 187 188 configure_file(versiondef.h.in auto/versiondef.h.gen) 189 190 file(GENERATE 191 OUTPUT "${PROJECT_BINARY_DIR}/cmake.config/auto/versiondef-$<CONFIG>.h" 192 INPUT "${PROJECT_BINARY_DIR}/cmake.config/auto/versiondef.h.gen") 193 194 configure_file ( 195 "${PROJECT_SOURCE_DIR}/cmake.config/pathdef.h.in" 196 "${PROJECT_BINARY_DIR}/cmake.config/auto/pathdef.h" 197 ESCAPE_QUOTES)