1110d525eSBaptiste Daroussincmake_minimum_required(VERSION 3.9) 2110d525eSBaptiste Daroussin 3110d525eSBaptiste Daroussinget_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) 4110d525eSBaptiste Daroussinif(is_multi_config) 5110d525eSBaptiste Daroussin set(CMAKE_CONFIGURATION_TYPES Debug Release CACHE STRING 6110d525eSBaptiste Daroussin "Semicolon separated list of supported configuration types") 7110d525eSBaptiste Daroussin mark_as_advanced(CMAKE_CONFIGURATION_TYPES) 8110d525eSBaptiste Daroussinelseif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_C_FLAGS) 9110d525eSBaptiste Daroussin message(WARNING "No CMAKE_BUILD_TYPE is selected") 10110d525eSBaptiste Daroussinendif() 11110d525eSBaptiste Daroussin 12110d525eSBaptiste Daroussinproject(nvi2 C) 13110d525eSBaptiste Daroussin 14110d525eSBaptiste Daroussininclude(CheckIncludeFiles) 15110d525eSBaptiste Daroussininclude(CheckFunctionExists) 166680e5a5SBaptiste Daroussininclude(CheckSymbolExists) 17755cc40cSBaptiste Daroussininclude(CheckStructHasMember) 18110d525eSBaptiste Daroussininclude(CheckCSourceCompiles) 196680e5a5SBaptiste Daroussininclude(CheckCCompilerFlag) 20110d525eSBaptiste Daroussin 21110d525eSBaptiste Daroussinmark_as_advanced(CMAKE_INSTALL_PREFIX) 22110d525eSBaptiste Daroussin 23110d525eSBaptiste Daroussinoption(USE_WIDECHAR "Enable wide character support" ON) 24110d525eSBaptiste Daroussinoption(USE_ICONV "Enable iconv support" ON) 25110d525eSBaptiste Daroussin 266680e5a5SBaptiste Daroussincheck_c_compiler_flag(-fcolor-diagnostics USE_FCOLOR_DIAGNOSTICS) 276680e5a5SBaptiste Daroussinif(USE_FCOLOR_DIAGNOSTICS) 28110d525eSBaptiste Daroussin add_compile_options(-fcolor-diagnostics) 296680e5a5SBaptiste Daroussinendif() 306680e5a5SBaptiste Daroussin 31110d525eSBaptiste Daroussinadd_compile_options($<$<CONFIG:Debug>:-Wall>) 32110d525eSBaptiste Daroussinadd_compile_options($<$<CONFIG:Debug>:-Wno-parentheses>) 33110d525eSBaptiste Daroussinadd_compile_options($<$<CONFIG:Debug>:-Wno-uninitialized>) 34110d525eSBaptiste Daroussinadd_compile_options($<$<CONFIG:Debug>:-Wmissing-prototypes>) 356680e5a5SBaptiste Daroussinif (NOT APPLE) 36110d525eSBaptiste Daroussin add_compile_options($<$<CONFIG:Debug>:-Wsystem-headers>) 376680e5a5SBaptiste Daroussinendif() 38110d525eSBaptiste Daroussinadd_compile_options($<$<CONFIG:Release>:-Wuninitialized>) 39110d525eSBaptiste Daroussinadd_compile_options($<$<CONFIG:Release>:-Wno-dangling-else>) 40110d525eSBaptiste Daroussinadd_compile_options(-Wstack-protector -fstack-protector) 41110d525eSBaptiste Daroussinadd_compile_options(-Wstrict-aliasing -fstrict-aliasing) 42110d525eSBaptiste Daroussin 43110d525eSBaptiste Daroussininclude_directories(${CMAKE_CURRENT_BINARY_DIR}) 44110d525eSBaptiste Daroussin 45110d525eSBaptiste Daroussinset(MAIN_PROTOS 46110d525eSBaptiste Daroussin cl/extern.h common/extern.h ex/extern.h vi/extern.h 47110d525eSBaptiste Daroussin common/options_def.h ex/ex_def.h ex/version.h) 48110d525eSBaptiste Daroussin 49110d525eSBaptiste Daroussinset(CL_SRCS 50110d525eSBaptiste Daroussin cl/cl_funcs.c cl/cl_main.c cl/cl_read.c cl/cl_screen.c cl/cl_term.c) 51110d525eSBaptiste Daroussin 52110d525eSBaptiste Daroussinset(COMMON_SRCS 53110d525eSBaptiste Daroussin common/conv.c common/cut.c common/delete.c common/encoding.c common/exf.c 54110d525eSBaptiste Daroussin common/key.c common/line.c common/log.c common/main.c common/mark.c 55110d525eSBaptiste Daroussin common/msg.c common/options.c common/options_f.c common/put.c 56110d525eSBaptiste Daroussin common/recover.c common/screen.c common/search.c common/seq.c 57110d525eSBaptiste Daroussin common/util.c) 58110d525eSBaptiste Daroussin 59110d525eSBaptiste Daroussinset(EX_SRCS 60110d525eSBaptiste Daroussin ex/ex.c ex/ex_abbrev.c ex/ex_append.c ex/ex_args.c ex/ex_argv.c ex/ex_at.c 61110d525eSBaptiste Daroussin ex/ex_bang.c ex/ex_cd.c ex/ex_cmd.c ex/ex_cscope.c ex/ex_delete.c 62110d525eSBaptiste Daroussin ex/ex_display.c ex/ex_edit.c ex/ex_equal.c ex/ex_file.c ex/ex_filter.c 63110d525eSBaptiste Daroussin ex/ex_global.c ex/ex_init.c ex/ex_join.c ex/ex_map.c ex/ex_mark.c 64110d525eSBaptiste Daroussin ex/ex_mkexrc.c ex/ex_move.c ex/ex_open.c ex/ex_preserve.c ex/ex_print.c 65110d525eSBaptiste Daroussin ex/ex_put.c ex/ex_quit.c ex/ex_read.c ex/ex_screen.c ex/ex_script.c 66110d525eSBaptiste Daroussin ex/ex_set.c ex/ex_shell.c ex/ex_shift.c ex/ex_source.c ex/ex_stop.c 67110d525eSBaptiste Daroussin ex/ex_subst.c ex/ex_tag.c ex/ex_txt.c ex/ex_undo.c ex/ex_usage.c 68110d525eSBaptiste Daroussin ex/ex_util.c ex/ex_version.c ex/ex_visual.c ex/ex_write.c ex/ex_yank.c 69110d525eSBaptiste Daroussin ex/ex_z.c) 70110d525eSBaptiste Daroussin 71110d525eSBaptiste Daroussinset(VI_SRCS 72110d525eSBaptiste Daroussin vi/getc.c vi/v_at.c vi/v_ch.c vi/v_cmd.c vi/v_delete.c vi/v_ex.c 73110d525eSBaptiste Daroussin vi/v_increment.c vi/v_init.c vi/v_itxt.c vi/v_left.c vi/v_mark.c 74110d525eSBaptiste Daroussin vi/v_match.c vi/v_paragraph.c vi/v_put.c vi/v_redraw.c vi/v_replace.c 75110d525eSBaptiste Daroussin vi/v_right.c vi/v_screen.c vi/v_scroll.c vi/v_search.c vi/v_section.c 76110d525eSBaptiste Daroussin vi/v_sentence.c vi/v_status.c vi/v_txt.c vi/v_ulcase.c vi/v_undo.c 77110d525eSBaptiste Daroussin vi/v_util.c vi/v_word.c vi/v_xchar.c vi/v_yank.c vi/v_z.c vi/v_zexit.c 78110d525eSBaptiste Daroussin vi/vi.c vi/vs_line.c vi/vs_msg.c vi/vs_refresh.c vi/vs_relative.c 79110d525eSBaptiste Daroussin vi/vs_smap.c vi/vs_split.c) 80110d525eSBaptiste Daroussin 81110d525eSBaptiste Daroussinset(REGEX_SRCS 82110d525eSBaptiste Daroussin regex/regcomp.c regex/regerror.c regex/regexec.c regex/regfree.c) 83110d525eSBaptiste Daroussin 84110d525eSBaptiste Daroussin# commands to generate the public headers 85110d525eSBaptiste Daroussinset(extract_protos sed -n 's/^ \\* PUBLIC: \\\(.*\\\)/\\1/p') 86110d525eSBaptiste Daroussinset(extract_version sed -n 87110d525eSBaptiste Daroussin 's/^.*version \\\([^\)]*\)\\\).*/\#define VI_VERSION \\\"\\1\\\"/p') 88110d525eSBaptiste Daroussin 89110d525eSBaptiste Daroussinadd_custom_command(OUTPUT cl/extern.h 90110d525eSBaptiste Daroussin COMMAND ${extract_protos} ${CL_SRCS} > cl/extern.h 91110d525eSBaptiste Daroussin WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 92110d525eSBaptiste Daroussin DEPENDS ${CL_SRCS}) 93110d525eSBaptiste Daroussinadd_custom_command(OUTPUT common/extern.h 94110d525eSBaptiste Daroussin COMMAND ${extract_protos} ${COMMON_SRCS} > common/extern.h 95110d525eSBaptiste Daroussin WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 96110d525eSBaptiste Daroussin DEPENDS ${COMMON_SRCS}) 97110d525eSBaptiste Daroussinadd_custom_command(OUTPUT ex/extern.h 98110d525eSBaptiste Daroussin COMMAND ${extract_protos} ${EX_SRCS} > ex/extern.h 99110d525eSBaptiste Daroussin WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 100110d525eSBaptiste Daroussin DEPENDS ${EX_SRCS}) 101110d525eSBaptiste Daroussinadd_custom_command(OUTPUT vi/extern.h 102110d525eSBaptiste Daroussin COMMAND ${extract_protos} ${VI_SRCS} > vi/extern.h 103110d525eSBaptiste Daroussin WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 104110d525eSBaptiste Daroussin DEPENDS ${VI_SRCS}) 105110d525eSBaptiste Daroussinadd_custom_command(OUTPUT common/options_def.h 106110d525eSBaptiste Daroussin COMMAND awk -f common/options.awk 107110d525eSBaptiste Daroussin common/options.c > common/options_def.h 108110d525eSBaptiste Daroussin WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 109110d525eSBaptiste Daroussin DEPENDS common/options.c) 110110d525eSBaptiste Daroussinadd_custom_command(OUTPUT ex/ex_def.h 111110d525eSBaptiste Daroussin COMMAND awk -f ex/ex.awk ex/ex_cmd.c > ex/ex_def.h 112110d525eSBaptiste Daroussin WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 113110d525eSBaptiste Daroussin DEPENDS ex/ex_cmd.c) 114110d525eSBaptiste Daroussinadd_custom_command(OUTPUT ex/version.h 115110d525eSBaptiste Daroussin COMMAND ${extract_version} README > ex/version.h 116110d525eSBaptiste Daroussin WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 117110d525eSBaptiste Daroussin DEPENDS README) 118110d525eSBaptiste Daroussin 119110d525eSBaptiste Daroussinadd_executable(nvi) 120110d525eSBaptiste Daroussintarget_sources(nvi PRIVATE ${MAIN_PROTOS} ${CL_SRCS} ${COMMON_SRCS} 121110d525eSBaptiste Daroussin ${EX_SRCS} ${VI_SRCS}) 122110d525eSBaptiste Daroussintarget_compile_definitions(nvi PRIVATE $<$<CONFIG:Debug>:DEBUG> 123110d525eSBaptiste Daroussin $<$<CONFIG:Debug>:COMLOG>) 124110d525eSBaptiste Daroussin 125110d525eSBaptiste Daroussincheck_function_exists(openpty UTIL_IN_LIBC) 126110d525eSBaptiste Daroussinif(NOT UTIL_IN_LIBC) 127110d525eSBaptiste Daroussin find_library(UTIL_LIBRARY util) 128110d525eSBaptiste Daroussin target_link_libraries(nvi PRIVATE ${UTIL_LIBRARY}) 129110d525eSBaptiste Daroussinendif() 130110d525eSBaptiste Daroussin 131110d525eSBaptiste Daroussincheck_function_exists(__b64_ntop RESOLV_IN_LIBC) 132110d525eSBaptiste Daroussinif(NOT RESOLV_IN_LIBC) 133110d525eSBaptiste Daroussin find_library(RESOLV_LIBRARY resolv) 134110d525eSBaptiste Daroussin target_link_libraries(nvi PRIVATE ${RESOLV_LIBRARY}) 135110d525eSBaptiste Daroussinendif() 136110d525eSBaptiste Daroussin 1376680e5a5SBaptiste Daroussincheck_symbol_exists(asprintf "stdio.h" ASPRINTF_IN_STDIO_H) 1386680e5a5SBaptiste Daroussinif(NOT ASPRINTF_IN_STDIO_H) 1396680e5a5SBaptiste Daroussin target_compile_definitions(nvi PRIVATE _GNU_SOURCE) 1406680e5a5SBaptiste Daroussinendif() 1416680e5a5SBaptiste Daroussin 142110d525eSBaptiste Daroussinif(USE_WIDECHAR) 143110d525eSBaptiste Daroussin find_library(CURSES_LIBRARY NAMES ncursesw cursesw curses HINTS /usr/lib) 144755cc40cSBaptiste Daroussin find_library(TERMINFO_LIBRARY NAMES tinfow terminfo HINTS /usr/lib) 145110d525eSBaptiste Daroussin 146110d525eSBaptiste Daroussin # link to the wchar_t awared BSD libregex.a 147110d525eSBaptiste Daroussin add_library(regex STATIC) 148110d525eSBaptiste Daroussin target_sources(regex PRIVATE ${REGEX_SRCS}) 149110d525eSBaptiste Daroussin target_include_directories(regex PUBLIC regex) 150110d525eSBaptiste Daroussin target_compile_definitions(regex PUBLIC __REGEX_PRIVATE) 151*0fcececbSBaptiste Daroussin # The macro _XOPEN_SOURCE_EXTENDED is needed to get the waddnwstr() 152*0fcececbSBaptiste Daroussin # definition on at least FreeBSD and recent macOS. 153*0fcececbSBaptiste Daroussin target_compile_definitions(nvi PRIVATE _XOPEN_SOURCE_EXTENDED) 154110d525eSBaptiste Daroussin target_link_libraries(nvi PRIVATE regex) 155110d525eSBaptiste Daroussinelse() 156110d525eSBaptiste Daroussin find_library(CURSES_LIBRARY NAMES ncurses curses HINTS /usr/lib) 157755cc40cSBaptiste Daroussin find_library(TERMINFO_LIBRARY NAMES tinfo terminfo HINTS /usr/lib) 158110d525eSBaptiste Daroussin target_compile_options(nvi PRIVATE -Wno-pointer-sign) 159110d525eSBaptiste Daroussinendif() 160110d525eSBaptiste Daroussin 1616680e5a5SBaptiste Daroussintarget_link_libraries(nvi PRIVATE ${CURSES_LIBRARY}) 1626680e5a5SBaptiste Daroussinif(TERMINFO_LIBRARY) 1636680e5a5SBaptiste Daroussin target_link_libraries(nvi PRIVATE ${TERMINFO_LIBRARY}) 1646680e5a5SBaptiste Daroussinendif() 165110d525eSBaptiste Daroussin 166110d525eSBaptiste Daroussinif(USE_ICONV) 167755cc40cSBaptiste Daroussin check_function_exists(iconv ICONV_IN_LIBC) 168110d525eSBaptiste Daroussin if(NOT ICONV_IN_LIBC) 169110d525eSBaptiste Daroussin find_path(ICONV_INCLUDE_DIR iconv.h) 170110d525eSBaptiste Daroussin find_library(ICONV_LIBRARY iconv) 171110d525eSBaptiste Daroussin endif() 172110d525eSBaptiste Daroussin 173110d525eSBaptiste Daroussin # detect the prototype of iconv(3) 174110d525eSBaptiste Daroussin set(CMAKE_C_FLAGS_BACKUP "${CMAKE_C_FLAGS}") 175110d525eSBaptiste Daroussin set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") 176110d525eSBaptiste Daroussin set(CMAKE_REQUIRED_INCLUDES "${ICONV_INCLUDE_DIR}") 177110d525eSBaptiste Daroussin set(CMAKE_REQUIRED_LIBRARIES "${ICONV_LIBRARY}") 178110d525eSBaptiste Daroussin check_c_source_compiles(" 179110d525eSBaptiste Daroussin #include <iconv.h> 180110d525eSBaptiste Daroussin int main() { 181110d525eSBaptiste Daroussin iconv_t conv = 0; 182110d525eSBaptiste Daroussin char* in = 0; 183110d525eSBaptiste Daroussin size_t ilen = 0; 184110d525eSBaptiste Daroussin char* out = 0; 185110d525eSBaptiste Daroussin size_t olen = 0; 186110d525eSBaptiste Daroussin iconv(conv, &in, &ilen, &out, &olen); 187110d525eSBaptiste Daroussin return 0; 188110d525eSBaptiste Daroussin } 189110d525eSBaptiste Daroussin " ICONV_TRADITIONAL) 190110d525eSBaptiste Daroussin set(CMAKE_REQUIRED_INCLUDES) 191110d525eSBaptiste Daroussin set(CMAKE_REQUIRED_LIBRARIES) 192110d525eSBaptiste Daroussin set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS_BACKUP}") 193110d525eSBaptiste Daroussin 194110d525eSBaptiste Daroussin target_include_directories(nvi PRIVATE ${ICONV_INCLUDE_DIR}) 195110d525eSBaptiste Daroussin target_link_libraries(nvi PRIVATE ${ICONV_LIBRARY}) 196110d525eSBaptiste Daroussinendif() 197110d525eSBaptiste Daroussin 198755cc40cSBaptiste Daroussincheck_function_exists(getprogname GETPROGNAME_IN_LIBC) 199755cc40cSBaptiste Daroussincheck_function_exists(strlcpy STRLCPY_IN_LIBC) 200755cc40cSBaptiste Daroussinif(NOT GETPROGNAME_IN_LIBC OR NOT STRLCPY_IN_LIBC) 201755cc40cSBaptiste Daroussin find_package(PkgConfig REQUIRED) 202755cc40cSBaptiste Daroussin pkg_check_modules(LIBBSD libbsd-overlay) 203755cc40cSBaptiste Daroussin add_definitions(${LIBBSD_CFLAGS}) 204755cc40cSBaptiste Daroussin target_link_libraries(nvi PRIVATE ${LIBBSD_LIBRARIES}) 205755cc40cSBaptiste Daroussinendif() 206755cc40cSBaptiste Daroussin 207755cc40cSBaptiste Daroussincheck_function_exists(dbopen DBOPEN_IN_LIBC) 208755cc40cSBaptiste Daroussinif(NOT DBOPEN_IN_LIBC) 209755cc40cSBaptiste Daroussin target_link_libraries(nvi PRIVATE db1) 210755cc40cSBaptiste Daroussinendif() 2116680e5a5SBaptiste Daroussinif (APPLE) 2126680e5a5SBaptiste Daroussin # Avoid using an incompatible db.h installed to /usr/local (since this is 2136680e5a5SBaptiste Daroussin # part of the default search path on macOS) 2146680e5a5SBaptiste Daroussin set(DB_H_GUESS "${CMAKE_OSX_SYSROOT}/usr/include/db.h") 2156680e5a5SBaptiste Daroussin if (NOT EXISTS ${DB_H_GUESS}) 2166680e5a5SBaptiste Daroussin message(FATAL_ERROR "Could not find db.h at the expected path (${DB_H_GUESS}).") 2176680e5a5SBaptiste Daroussin endif() 2186680e5a5SBaptiste Daroussin add_definitions("-DDB_H_ABS_PATH=<${DB_H_GUESS}>") 2196680e5a5SBaptiste Daroussinelse() 2206680e5a5SBaptiste Daroussin find_path(DB_INCLUDE_DIR db.h PATH_SUFFIXES db1) 2216680e5a5SBaptiste Daroussin target_include_directories(nvi PRIVATE ${DB_INCLUDE_DIR}) 2226680e5a5SBaptiste Daroussinendif() 223755cc40cSBaptiste Daroussin 224110d525eSBaptiste Daroussincheck_include_files(libutil.h HAVE_LIBUTIL_H) 225110d525eSBaptiste Daroussincheck_include_files(ncurses.h HAVE_NCURSES_H) 226755cc40cSBaptiste Daroussincheck_include_files(ncursesw/ncurses.h HAVE_NCURSESW_NCURSES_H) 227755cc40cSBaptiste Daroussincheck_include_files(pty.h HAVE_PTY_H) 228110d525eSBaptiste Daroussincheck_include_files(term.h HAVE_TERM_H) 229755cc40cSBaptiste Daroussincheck_struct_has_member("struct dirent" d_namlen dirent.h HAVE_DIRENT_D_NAMLEN LANGUAGE C) 2306680e5a5SBaptiste Daroussincheck_struct_has_member("struct stat" st_mtimespec 2316680e5a5SBaptiste Daroussin "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIMESPEC LANGUAGE C) 2326680e5a5SBaptiste Daroussincheck_struct_has_member("struct stat" st_mtim 2336680e5a5SBaptiste Daroussin "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM LANGUAGE C) 234110d525eSBaptiste Daroussin 235110d525eSBaptiste Daroussinconfigure_file(files/config.h.in config.h) 236110d525eSBaptiste Daroussin 237110d525eSBaptiste Daroussinset(vi_cv_path_preserve /var/tmp/vi.recover/) 238110d525eSBaptiste Daroussinif(APPLE) 239110d525eSBaptiste Daroussin set(vi_cv_path_msgcat /usr/local/share/vi/catalog/) 240110d525eSBaptiste Daroussinelse() 241110d525eSBaptiste Daroussin set(vi_cv_path_msgcat /usr/share/vi/catalog/) 242110d525eSBaptiste Daroussinendif() 243110d525eSBaptiste Daroussin 244110d525eSBaptiste Daroussinconfigure_file(files/pathnames.h.in pathnames.h) 245110d525eSBaptiste Daroussinconfigure_file(files/recover.in recover @ONLY) 246