aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEiichi NISHINA <github@channel-247.net>2017-02-12 02:10:53 +0900
committerJustin M. Keyes <justinkz@gmail.com>2017-03-27 13:51:05 +0200
commit62774e43564b166d6907c7abc2e3431a65bd5596 (patch)
tree504f43359d07d2a98b5a3da71dbe11e7c4e74aa5
parent7bc37ffb22a84668bba5b2e3589c4c05ad43f7d0 (diff)
downloadrneovim-62774e43564b166d6907c7abc2e3431a65bd5596.tar.gz
rneovim-62774e43564b166d6907c7abc2e3431a65bd5596.tar.bz2
rneovim-62774e43564b166d6907c7abc2e3431a65bd5596.zip
ci: Check that `#include "*.h"` works as a single include
Lesser form of include-what-you-use: at least guarantees that header file did not forget to include something through some other included file. Activate run_single_includes_tests on CI. Fix some IWYU violations. References #5321
-rw-r--r--.ci/common/test.sh4
-rwxr-xr-x.ci/run_tests.sh1
-rw-r--r--Makefile3
-rw-r--r--src/nvim/CMakeLists.txt156
-rw-r--r--src/nvim/eval_defs.h1
-rw-r--r--src/nvim/ex_docmd.c1
-rw-r--r--src/nvim/ex_docmd.h1
-rw-r--r--src/nvim/mark.h2
-rw-r--r--src/nvim/os/fs_defs.h2
-rw-r--r--src/nvim/os/os_defs.h4
-rw-r--r--src/nvim/os/unix_defs.h2
-rw-r--r--src/nvim/os/win_defs.h6
-rw-r--r--src/nvim/strings.h3
13 files changed, 153 insertions, 33 deletions
diff --git a/.ci/common/test.sh b/.ci/common/test.sh
index b28e46a4df..4137472385 100644
--- a/.ci/common/test.sh
+++ b/.ci/common/test.sh
@@ -109,6 +109,10 @@ run_oldtests() {
check_core_dumps
}
+run_single_includes_tests() {
+ ${MAKE_CMD} -C "${BUILD_DIR}" check-single-includes
+}
+
install_nvim() {
${MAKE_CMD} -C "${BUILD_DIR}" install
diff --git a/.ci/run_tests.sh b/.ci/run_tests.sh
index 6347ac15d4..d994db471f 100755
--- a/.ci/run_tests.sh
+++ b/.ci/run_tests.sh
@@ -10,6 +10,7 @@ source "${CI_DIR}/common/test.sh"
check_core_dumps --delete quiet
prepare_build
+run_single_includes_tests
build_nvim
if [ "$CLANG_SANITIZER" != "TSAN" ]; then
diff --git a/Makefile b/Makefile
index fed84582a9..47fb1e5edd 100644
--- a/Makefile
+++ b/Makefile
@@ -134,4 +134,7 @@ clint:
lint: clint testlint
+check-single-includes: build/.ran-cmake
+ +$(BUILD_CMD) -C build check-single-includes
+
.PHONY: test testlint functionaltest unittest lint clint clean distclean nvim libnvim cmake deps install
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index 22cf1f3a3d..8af2dcf5f6 100644
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -48,6 +48,7 @@ file(MAKE_DIRECTORY ${GENERATED_DIR})
file(MAKE_DIRECTORY ${GENERATED_INCLUDES_DIR})
file(GLOB NEOVIM_SOURCES *.c)
+file(GLOB NEOVIM_HEADERS *.h)
foreach(subdir
os
@@ -65,10 +66,11 @@ foreach(subdir
file(MAKE_DIRECTORY ${GENERATED_DIR}/${subdir})
file(MAKE_DIRECTORY ${GENERATED_INCLUDES_DIR}/${subdir})
file(GLOB sources ${subdir}/*.c)
+ file(GLOB headers ${subdir}/*.h)
list(APPEND NEOVIM_SOURCES ${sources})
+ list(APPEND NEOVIM_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
@@ -152,6 +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})
+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()
+
+# NEOVIM_GENERATED_FOR_HEADERS: header files generated to be included in headers
+# NEOVIM_GENERATED_FOR_SOURCES: header files generated to be included in sources
+# NEOVIM_GENERATED_SOURCES: generated source files
+# These lists should be mutually exclusive
+
foreach(sfile ${NEOVIM_SOURCES}
"${PROJECT_SOURCE_DIR}/src/nvim/regexp_nfa.c"
${GENERATED_API_DISPATCH})
@@ -166,26 +181,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 NEOVIM_GENERATED_FOR_SOURCES "${gf_c_h}")
+ list(APPEND NEOVIM_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 +221,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 NEOVIM_GENERATED_FOR_HEADERS
"${GENERATED_EX_CMDS_ENUM}"
- "${GENERATED_EX_CMDS_DEFS}"
"${GENERATED_EVENTS_ENUM}"
+)
+
+list(APPEND NEOVIM_GENERATED_FOR_SOURCES
+ "${GENERATED_API_DISPATCH}"
+ "${GENERATED_EX_CMDS_DEFS}"
"${GENERATED_EVENTS_NAMES_MAP}"
"${GENERATED_OPTIONS}"
"${GENERATED_UNICODE_TABLES}"
)
+list(APPEND NEOVIM_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 +254,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 NEOVIM_GENERATED_FOR_SOURCES
"${GENERATED_FUNCS}")
add_custom_command(OUTPUT ${GENERATED_EVENTS_ENUM} ${GENERATED_EVENTS_NAMES_MAP}
@@ -252,6 +269,15 @@ add_custom_command(OUTPUT ${GENERATED_OPTIONS}
DEPENDS ${OPTIONS_GENERATOR} ${OPTIONS_LIST_FILE}
)
+# Check that NEOVIM_GENERATED_FOR_SOURCES and NEOVIM_GENERATED_FOR_HEADERS are mutually exclusive
+
+foreach(hfile ${NEOVIM_GENERATED_FOR_HEADERS})
+ list(FIND NEOVIM_GENERATED_FOR_SOURCES ${hfile} hfile_idx)
+ if(NOT ${hfile_idx} EQUAL -1)
+ message(FATAL_ERROR "File included in both NEOVIM_GENERATED_FOR_HEADERS and NEOVIM_GENERATED_FOR_SOURCES")
+ endif()
+endforeach()
+
# Our dependencies come first.
if (LibIntl_FOUND)
@@ -286,8 +312,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 ${NEOVIM_GENERATED_FOR_SOURCES} ${NEOVIM_GENERATED_FOR_HEADERS}
+ ${NEOVIM_GENERATED_SOURCES} ${NEOVIM_SOURCES} ${NEOVIM_HEADERS})
target_link_libraries(nvim ${NVIM_EXEC_LINK_LIBRARIES})
install_helper(TARGETS nvim)
@@ -361,17 +387,97 @@ 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 ${NEOVIM_GENERATED_FOR_SOURCES} ${NEOVIM_GENERATED_FOR_HEADERS}
+ ${NEOVIM_GENERATED_SOURCES} ${NEOVIM_SOURCES} ${NEOVIM_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 ${NEOVIM_GENERATED_FOR_SOURCES} ${NEOVIM_GENERATED_FOR_HEADERS}
+ ${NEOVIM_GENERATED_SOURCES} ${NEOVIM_SOURCES} ${UNIT_TEST_FIXTURES} ${NEOVIM_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
+ syntax
+ syntax_defs
+ tag
+ terminal
+ tui/tui
+ ugrid
+ ui
+ ui_bridge
+ undo
+ undo_defs
+ version
+ window
+)
+foreach(hfile ${NEOVIM_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 "${r}-test")
+ 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} ${NEOVIM_HEADERS} ${NEOVIM_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)
diff --git a/src/nvim/eval_defs.h b/src/nvim/eval_defs.h
index 39028fdb11..8f5e1a897d 100644
--- a/src/nvim/eval_defs.h
+++ b/src/nvim/eval_defs.h
@@ -3,6 +3,7 @@
#include <limits.h>
#include <stddef.h>
+#include <stdbool.h>
#include "nvim/hashtab.h"
#include "nvim/lib/queue.h"
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 486baaad47..d1557f9c82 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -67,6 +67,7 @@
#include "nvim/event/rstream.h"
#include "nvim/event/wstream.h"
#include "nvim/shada.h"
+#include "nvim/globals.h"
static int quitmore = 0;
static int ex_pressedreturn = FALSE;
diff --git a/src/nvim/ex_docmd.h b/src/nvim/ex_docmd.h
index 4def4cbbae..cff350de08 100644
--- a/src/nvim/ex_docmd.h
+++ b/src/nvim/ex_docmd.h
@@ -2,6 +2,7 @@
#define NVIM_EX_DOCMD_H
#include "nvim/ex_cmds_defs.h"
+#include "nvim/globals.h"
// flags for do_cmdline()
#define DOCMD_VERBOSE 0x01 // included command in error message
diff --git a/src/nvim/mark.h b/src/nvim/mark.h
index aff6e7273a..efba9708db 100644
--- a/src/nvim/mark.h
+++ b/src/nvim/mark.h
@@ -29,7 +29,7 @@
/// Clear given fmark
#define CLEAR_FMARK(fmarkp_) \
- RESET_FMARK(fmarkp_, ((pos_T) {0, 0, 0}), 0)
+ RESET_FMARK(fmarkp_, ((pos_T) { 0, 0, 0 }), 0)
/// Set given extended mark (regular mark + file name)
#define SET_XFMARK(xfmarkp_, mark_, fnum_, fname_) \
diff --git a/src/nvim/os/fs_defs.h b/src/nvim/os/fs_defs.h
index 0bd9c37750..2277d926b3 100644
--- a/src/nvim/os/fs_defs.h
+++ b/src/nvim/os/fs_defs.h
@@ -14,7 +14,7 @@ typedef struct {
uint64_t device_id; ///< @private The id of the device containing the file
} FileID;
-#define FILE_ID_EMPTY (FileID) {.inode = 0, .device_id = 0}
+#define FILE_ID_EMPTY (FileID) { .inode = 0, .device_id = 0 }
typedef struct {
uv_fs_t request; ///< @private The request to uv for the directory.
diff --git a/src/nvim/os/os_defs.h b/src/nvim/os/os_defs.h
index 14c210c69c..f81785675e 100644
--- a/src/nvim/os/os_defs.h
+++ b/src/nvim/os/os_defs.h
@@ -27,11 +27,11 @@
// Use up to 5 Mbyte for a buffer.
#ifndef DFLT_MAXMEM
-# define DFLT_MAXMEM (5*1024)
+# define DFLT_MAXMEM (5 * 1024)
#endif
// use up to 10 Mbyte for Vim.
#ifndef DFLT_MAXMEMTOT
-# define DFLT_MAXMEMTOT (10*1024)
+# define DFLT_MAXMEMTOT (10 * 1024)
#endif
// Note: Some systems need both string.h and strings.h (Savage). However,
diff --git a/src/nvim/os/unix_defs.h b/src/nvim/os/unix_defs.h
index c98aa88bfa..5c9daca476 100644
--- a/src/nvim/os/unix_defs.h
+++ b/src/nvim/os/unix_defs.h
@@ -8,7 +8,7 @@
// POSIX.1-2008 says that NAME_MAX should be in here
#include <limits.h>
-#define TEMP_DIR_NAMES {"$TMPDIR", "/tmp", ".", "~"}
+#define TEMP_DIR_NAMES { "$TMPDIR", "/tmp", ".", "~" }
#define TEMP_FILE_PATH_MAXLEN 256
#define HAVE_ACL (HAVE_POSIX_ACL || HAVE_SOLARIS_ACL)
diff --git a/src/nvim/os/win_defs.h b/src/nvim/os/win_defs.h
index 8de896c490..827fb2f247 100644
--- a/src/nvim/os/win_defs.h
+++ b/src/nvim/os/win_defs.h
@@ -1,6 +1,10 @@
#ifndef NVIM_OS_WIN_DEFS_H
#define NVIM_OS_WIN_DEFS_H
+#ifndef WIN32
+# error Header must be included only when compiling for Windows.
+#endif
+
// winsock2.h must be first to avoid incompatibilities
// with winsock.h (included by windows.h)
#include <winsock2.h>
@@ -15,7 +19,7 @@
#define NAME_MAX _MAX_PATH
-#define TEMP_DIR_NAMES {"$TMP", "$TEMP", "$USERPROFILE", ""}
+#define TEMP_DIR_NAMES { "$TMP", "$TEMP", "$USERPROFILE", "" }
#define TEMP_FILE_PATH_MAXLEN _MAX_PATH
#define FNAME_ILLEGAL "\"*?><|"
diff --git a/src/nvim/strings.h b/src/nvim/strings.h
index eb8b83c7d0..8aea374b96 100644
--- a/src/nvim/strings.h
+++ b/src/nvim/strings.h
@@ -1,9 +1,8 @@
#ifndef NVIM_STRINGS_H
#define NVIM_STRINGS_H
-#include <stdarg.h>
#include <stdbool.h>
-#include <stddef.h>
+#include <stdarg.h>
#include "nvim/types.h"
#include "nvim/eval_defs.h"