aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/CMakeLists.txt')
-rw-r--r--src/nvim/CMakeLists.txt169
1 files changed, 137 insertions, 32 deletions
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index 22cf1f3a3d..3ee4380538 100644
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -47,7 +47,8 @@ include_directories(${GENERATED_INCLUDES_DIR})
file(MAKE_DIRECTORY ${GENERATED_DIR})
file(MAKE_DIRECTORY ${GENERATED_INCLUDES_DIR})
-file(GLOB NEOVIM_SOURCES *.c)
+file(GLOB NVIM_SOURCES *.c)
+file(GLOB NVIM_HEADERS *.h)
foreach(subdir
os
@@ -65,18 +66,19 @@ foreach(subdir
file(MAKE_DIRECTORY ${GENERATED_DIR}/${subdir})
file(MAKE_DIRECTORY ${GENERATED_INCLUDES_DIR}/${subdir})
file(GLOB sources ${subdir}/*.c)
- list(APPEND NEOVIM_SOURCES ${sources})
+ file(GLOB headers ${subdir}/*.h)
+ list(APPEND NVIM_SOURCES ${sources})
+ list(APPEND NVIM_HEADERS ${headers})
endforeach()
-file(GLOB_RECURSE NEOVIM_HEADERS *.h)
file(GLOB UNIT_TEST_FIXTURES ${PROJECT_SOURCE_DIR}/test/unit/fixtures/*.c)
# Sort file lists to ensure generated files are created in the same order from
# build to build.
-list(SORT NEOVIM_SOURCES)
-list(SORT NEOVIM_HEADERS)
+list(SORT NVIM_SOURCES)
+list(SORT NVIM_HEADERS)
-foreach(sfile ${NEOVIM_SOURCES})
+foreach(sfile ${NVIM_SOURCES})
get_filename_component(f ${sfile} NAME)
if(${f} MATCHES "^(regexp_nfa.c)$")
list(APPEND to_remove ${sfile})
@@ -86,7 +88,7 @@ foreach(sfile ${NEOVIM_SOURCES})
endif()
endforeach()
-list(REMOVE_ITEM NEOVIM_SOURCES ${to_remove})
+list(REMOVE_ITEM NVIM_SOURCES ${to_remove})
# Legacy files that do not yet pass -Wconversion.
set(CONV_SOURCES
@@ -152,7 +154,19 @@ separate_arguments(C_FLAGS_ARRAY UNIX_COMMAND ${CMAKE_C_FLAGS})
separate_arguments(C_FLAGS_${build_type}_ARRAY UNIX_COMMAND ${CMAKE_C_FLAGS_${build_type}})
set(gen_cflags ${gen_cflags} ${C_FLAGS_${build_type}_ARRAY} ${C_FLAGS_ARRAY})
-foreach(sfile ${NEOVIM_SOURCES}
+function(get_preproc_output varname iname)
+ if(MSVC)
+ set(${varname} /P /Fi${iname} PARENT_SCOPE)
+ else()
+ set(${varname} -E -o ${iname} PARENT_SCOPE)
+ endif()
+endfunction()
+
+# NVIM_GENERATED_FOR_HEADERS: generated headers to be included in headers
+# NVIM_GENERATED_FOR_SOURCES: generated headers to be included in sources
+# NVIM_GENERATED_SOURCES: generated source files
+# These lists must be mutually exclusive.
+foreach(sfile ${NVIM_SOURCES}
"${PROJECT_SOURCE_DIR}/src/nvim/regexp_nfa.c"
${GENERATED_API_DISPATCH})
get_filename_component(full_d ${sfile} PATH)
@@ -166,26 +180,22 @@ foreach(sfile ${NEOVIM_SOURCES}
set(f "${d}/${f}")
set(r "${d}/${r}")
endif()
- set(gf1 "${GENERATED_DIR}/${r}.c.generated.h")
- set(gf2 "${GENERATED_INCLUDES_DIR}/${r}.h.generated.h")
- set(gf3 "${GENERATED_DIR}/${r}.i")
+ set(gf_c_h "${GENERATED_DIR}/${r}.c.generated.h")
+ set(gf_h_h "${GENERATED_INCLUDES_DIR}/${r}.h.generated.h")
+ set(gf_i "${GENERATED_DIR}/${r}.i")
- if(MSVC)
- set(PREPROC_OUTPUT /P /Fi${gf3})
- else()
- set(PREPROC_OUTPUT -E -o ${gf3})
- endif()
+ get_preproc_output(PREPROC_OUTPUT ${gf_i})
add_custom_command(
- OUTPUT "${gf1}" "${gf2}"
+ OUTPUT "${gf_c_h}" "${gf_h_h}"
COMMAND ${CMAKE_C_COMPILER} ${sfile} ${PREPROC_OUTPUT} ${gen_cflags} ${C_FLAGS_ARRAY}
- COMMAND "${LUA_PRG}" "${HEADER_GENERATOR}" "${sfile}" "${gf1}" "${gf2}" "${gf3}"
+ COMMAND "${LUA_PRG}" "${HEADER_GENERATOR}" "${sfile}" "${gf_c_h}" "${gf_h_h}" "${gf_i}"
DEPENDS "${HEADER_GENERATOR}" "${sfile}"
)
- list(APPEND NEOVIM_GENERATED_SOURCES "${gf1}")
- list(APPEND NEOVIM_GENERATED_SOURCES "${gf2}")
+ list(APPEND NVIM_GENERATED_FOR_SOURCES "${gf_c_h}")
+ list(APPEND NVIM_GENERATED_FOR_HEADERS "${gf_h_h}")
if(${d} MATCHES "^api$" AND NOT ${f} MATCHES "^api/helpers.c$")
- list(APPEND API_HEADERS ${gf2})
+ list(APPEND API_HEADERS ${gf_h_h})
endif()
endforeach()
@@ -210,17 +220,23 @@ add_custom_command(OUTPUT ${GENERATED_API_DISPATCH} ${GENERATED_FUNCS_METADATA}
${CMAKE_CURRENT_LIST_DIR}/api/dispatch_deprecated.lua
)
-list(APPEND NEOVIM_GENERATED_SOURCES
- "${PROJECT_BINARY_DIR}/config/auto/pathdef.c"
- "${GENERATED_API_DISPATCH}"
+list(APPEND NVIM_GENERATED_FOR_HEADERS
"${GENERATED_EX_CMDS_ENUM}"
- "${GENERATED_EX_CMDS_DEFS}"
"${GENERATED_EVENTS_ENUM}"
+)
+
+list(APPEND NVIM_GENERATED_FOR_SOURCES
+ "${GENERATED_API_DISPATCH}"
+ "${GENERATED_EX_CMDS_DEFS}"
"${GENERATED_EVENTS_NAMES_MAP}"
"${GENERATED_OPTIONS}"
"${GENERATED_UNICODE_TABLES}"
)
+list(APPEND NVIM_GENERATED_SOURCES
+ "${PROJECT_BINARY_DIR}/config/auto/pathdef.c"
+)
+
add_custom_command(OUTPUT ${GENERATED_EX_CMDS_ENUM} ${GENERATED_EX_CMDS_DEFS}
COMMAND ${LUA_PRG} ${EX_CMDS_GENERATOR}
${PROJECT_SOURCE_DIR}/src/nvim ${GENERATED_INCLUDES_DIR} ${GENERATED_DIR}
@@ -237,7 +253,7 @@ add_custom_command(OUTPUT ${GENERATED_FUNCS} ${FUNCS_DATA}
${GENERATED_FUNCS_HASH_INPUT} --output-file=${GENERATED_FUNCS}
DEPENDS ${FUNCS_GENERATOR} ${EVAL_DEFS_FILE} ${API_METADATA}
)
-list(APPEND NEOVIM_GENERATED_SOURCES
+list(APPEND NVIM_GENERATED_FOR_SOURCES
"${GENERATED_FUNCS}")
add_custom_command(OUTPUT ${GENERATED_EVENTS_ENUM} ${GENERATED_EVENTS_NAMES_MAP}
@@ -252,6 +268,14 @@ add_custom_command(OUTPUT ${GENERATED_OPTIONS}
DEPENDS ${OPTIONS_GENERATOR} ${OPTIONS_LIST_FILE}
)
+# NVIM_GENERATED_FOR_SOURCES and NVIM_GENERATED_FOR_HEADERS must be mutually exclusive.
+foreach(hfile ${NVIM_GENERATED_FOR_HEADERS})
+ list(FIND NVIM_GENERATED_FOR_SOURCES ${hfile} hfile_idx)
+ if(NOT ${hfile_idx} EQUAL -1)
+ message(FATAL_ERROR "File included in both NVIM_GENERATED_FOR_HEADERS and NVIM_GENERATED_FOR_SOURCES")
+ endif()
+endforeach()
+
# Our dependencies come first.
if (LibIntl_FOUND)
@@ -286,8 +310,8 @@ if(JEMALLOC_FOUND)
list(APPEND NVIM_EXEC_LINK_LIBRARIES ${JEMALLOC_LIBRARIES})
endif()
-add_executable(nvim ${NEOVIM_GENERATED_SOURCES} ${NEOVIM_SOURCES}
- ${NEOVIM_HEADERS})
+add_executable(nvim ${NVIM_GENERATED_FOR_SOURCES} ${NVIM_GENERATED_FOR_HEADERS}
+ ${NVIM_GENERATED_SOURCES} ${NVIM_SOURCES} ${NVIM_HEADERS})
target_link_libraries(nvim ${NVIM_EXEC_LINK_LIBRARIES})
install_helper(TARGETS nvim)
@@ -361,17 +385,98 @@ elseif(CLANG_TSAN)
set_property(TARGET nvim APPEND_STRING PROPERTY LINK_FLAGS "-fsanitize=thread ")
endif()
-add_library(libnvim STATIC EXCLUDE_FROM_ALL ${NEOVIM_GENERATED_SOURCES}
- ${NEOVIM_SOURCES} ${NEOVIM_HEADERS})
+add_library(libnvim STATIC EXCLUDE_FROM_ALL ${NVIM_GENERATED_FOR_SOURCES} ${NVIM_GENERATED_FOR_HEADERS}
+ ${NVIM_GENERATED_SOURCES} ${NVIM_SOURCES} ${NVIM_HEADERS})
target_link_libraries(libnvim ${NVIM_LINK_LIBRARIES})
set_target_properties(libnvim PROPERTIES
POSITION_INDEPENDENT_CODE ON
OUTPUT_NAME nvim)
set_property(TARGET libnvim APPEND_STRING PROPERTY COMPILE_FLAGS " -DMAKE_LIB ")
-add_library(nvim-test MODULE EXCLUDE_FROM_ALL ${NEOVIM_GENERATED_SOURCES}
- ${NEOVIM_SOURCES} ${UNIT_TEST_FIXTURES} ${NEOVIM_HEADERS})
+add_library(nvim-test MODULE EXCLUDE_FROM_ALL ${NVIM_GENERATED_FOR_SOURCES} ${NVIM_GENERATED_FOR_HEADERS}
+ ${NVIM_GENERATED_SOURCES} ${NVIM_SOURCES} ${UNIT_TEST_FIXTURES} ${NVIM_HEADERS})
target_link_libraries(nvim-test ${NVIM_LINK_LIBRARIES})
set_property(TARGET nvim-test APPEND_STRING PROPERTY COMPILE_FLAGS -DUNIT_TESTING)
+set(NO_SINGLE_CHECK_HEADERS
+ buffer
+ charset
+ cursor_shape
+ diff
+ digraph
+ ex_cmds
+ ex_getln
+ file_search
+ fold
+ getchar
+ hardcopy
+ if_cscope
+ if_cscope_defs
+ mark
+ mbyte
+ memfile_defs
+ memline
+ memline_defs
+ menu
+ misc2
+ move
+ msgpack_rpc/server
+ ops
+ option
+ os/shell
+ os_unix
+ os/win_defs
+ popupmnu
+ quickfix
+ regexp
+ regexp_defs
+ screen
+ search
+ sha256
+ sign_defs
+ spell
+ spellfile
+ syntax
+ syntax_defs
+ tag
+ terminal
+ tui/tui
+ ugrid
+ ui
+ ui_bridge
+ undo
+ undo_defs
+ version
+ window
+)
+foreach(hfile ${NVIM_HEADERS})
+ get_filename_component(full_d ${hfile} PATH)
+ file(RELATIVE_PATH d "${PROJECT_SOURCE_DIR}/src/nvim" "${full_d}")
+ if(${d} MATCHES "^[.][.]")
+ file(RELATIVE_PATH d "${GENERATED_DIR}" "${full_d}")
+ endif()
+ get_filename_component(r ${hfile} NAME_WE)
+ if(NOT ${d} EQUAL ".")
+ set(r "${d}/${r}")
+ endif()
+
+ if(NOT ${hfile} MATCHES "[.]c[.]h$")
+ set(tsource "${GENERATED_DIR}/${r}.test-include.c")
+ set(tresult "${GENERATED_DIR}/${r}.test-include.i")
+ string(REPLACE "/" "-" texe "test-incl-${r}")
+ write_file("${tsource}" "#include \"${hfile}\"\nint main(int argc, char **argv) { return 0; }")
+ get_preproc_output(PREPROC_OUTPUT ${tresult})
+ add_executable(
+ ${texe}
+ EXCLUDE_FROM_ALL
+ ${tsource} ${NVIM_HEADERS} ${NVIM_GENERATED_FOR_HEADERS})
+
+ list(FIND NO_SINGLE_CHECK_HEADERS "${r}" hfile_exclude_idx)
+ if(${hfile_exclude_idx} EQUAL -1)
+ list(APPEND HEADER_CHECK_TARGETS ${texe})
+ endif()
+ endif()
+endforeach()
+add_custom_target(check-single-includes DEPENDS ${HEADER_CHECK_TARGETS})
+
add_subdirectory(po)