xref: /freebsd/contrib/nvi/CMakeLists.txt (revision 4087ffdbce725367566bc3fc60a959292daac99d)
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