]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
build: Add "make lsp" command
authorDavid Goulet <dgoulet@torproject.org>
Wed, 16 Dec 2020 15:01:15 +0000 (10:01 -0500)
committerDavid Goulet <dgoulet@torproject.org>
Thu, 21 Jan 2021 21:06:31 +0000 (16:06 -0500)
Generates the compile_commands.json file using the "bear" application so the
ccls server can be more efficient with our code base.

Closes #40227

Signed-off-by: David Goulet <dgoulet@torproject.org>
.gitignore
Makefile.am
changes/ticket40227 [new file with mode: 0644]
scripts/maint/gen_ccls_file.sh [new file with mode: 0755]

index b7f72617a837468be801759495ef1c790a0bf75a..cb49c098cd7778bd4ef301f4a18b2e00d7b0664e 100644 (file)
@@ -39,6 +39,8 @@ uptime-*.json
 # Core files
 core
 core.*
+# ccls file that can be per directory.
+*.ccls
 
 # /
 /Makefile
@@ -76,6 +78,7 @@ core.*
 /Tor*Bundle.dmg
 /tor-*-win32.exe
 /warning_flags
+/compile_commands.json
 
 /coverage_html/
 /callgraph/
index a868be7362b9470606ce2a4cb21c9abb8b5b46e9..c7bc5142873e7f0d5f03cc2b2806ba0639ef695d 100644 (file)
@@ -470,3 +470,17 @@ show-libs:
 
 show-testing-libs:
        @echo $(TOR_INTERNAL_TESTING_LIBS)
+
+# Note here that we hardcode this -j2 because if the user would pass too many
+# cores, bear actually chockes and dies :S. For this to work, a make clean
+# needs to be done else bear will miss some compile flags.
+lsp:
+       @if test -x "`which bear 2>&1;true`"; then \
+               echo "Generating LSP compile_commands.json. Might take few minutes..."; \
+               $(MAKE) clean 2>&1 >/dev/null; \
+               bear >/dev/null 2>&1 -- $(MAKE) -j2 2>&1 >/dev/null; \
+               echo "Generating .ccls file..."; \
+               ./scripts/maint/gen_ccls_file.sh \
+       else \
+               echo "No bear command found. On debian, apt install bear"; \
+       fi
diff --git a/changes/ticket40227 b/changes/ticket40227
new file mode 100644 (file)
index 0000000..e5efad0
--- /dev/null
@@ -0,0 +1,4 @@
+  o Minor feature (build system):
+    - New "make lsp" command to auto generate the compile_commands.json file
+      used by the ccls server. The "bear" program is needed for this. Closes
+      ticket 40227.
diff --git a/scripts/maint/gen_ccls_file.sh b/scripts/maint/gen_ccls_file.sh
new file mode 100755 (executable)
index 0000000..899e4e9
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+##############################################################################
+# THIS MUST BE CALLED FROM THE ROOT DIRECTORY. IT IS USED BY THE MAKEFILE SO #
+# IN THEORY, YOU SHOULD NEVER CALL THIS.                                     #
+##############################################################################
+
+set -e
+
+CCLS_FILE=".ccls"
+
+# Get all #define *_PRIVATE from our source. We need to list them in our .ccls
+# file and enable them otherwise ccls will not find their definition thinking
+# that they are dead code.
+PRIVATE_DEFS=$(grep -r --include \*.h "_PRIVATE" | grep "#ifdef" | cut -d' ' -f2 | sort | uniq)
+
+echo "clang" > "$CCLS_FILE"
+for p in $PRIVATE_DEFS; do
+  echo "-D$p" >> "$CCLS_FILE"
+done