neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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)