* Lightning fast build @ 2022-08-19 12:44 Gerd Möllmann 2022-08-19 12:59 ` Alan Mackenzie ` (2 more replies) 0 siblings, 3 replies; 9+ messages in thread From: Gerd Möllmann @ 2022-08-19 12:44 UTC (permalink / raw) To: emacs-devel [-- Attachment #1.1.1.1: Type: text/plain, Size: 455 bytes --] I just noticed that building Emacs master from scratch, i.e. what I do from time to time git clean -xdf \ && ./autogen.sh \ && ./configure --with-native-compilation \ && bear -- make \ && make install went down from around 8 minutes to 4:30, and everything seems to still be working normally. (This is macos 12.5.1, M1 chip.) Kudos to whoever made that happen! [-- Attachment #1.1.1.2: Type: text/html, Size: 867 bytes --] [-- Attachment #1.1.2: OpenPGP public key --] [-- Type: application/pgp-keys, Size: 3211 bytes --] [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 840 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Lightning fast build 2022-08-19 12:44 Lightning fast build Gerd Möllmann @ 2022-08-19 12:59 ` Alan Mackenzie 2022-08-21 2:47 ` Pankaj Jangid 2022-08-21 9:36 ` João Távora 2 siblings, 0 replies; 9+ messages in thread From: Alan Mackenzie @ 2022-08-19 12:59 UTC (permalink / raw) To: Gerd Möllmann; +Cc: emacs-devel Hello, Gerd. On Fri, Aug 19, 2022 at 14:44:51 +0200, Gerd Möllmann wrote: > I just noticed that building Emacs master from scratch, i.e. what I do > from time to time > git clean -xdf \ > && ./autogen.sh \ > && ./configure --with-native-compilation \ > && bear -- make \ > && make install > went down from around 8 minutes to 4:30, and everything seems to still > be working normally. (This is macos 12.5.1, M1 chip.) > Kudos to whoever made that happen! I think that was mainly Lars. I welcome the speed-up, too. -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Lightning fast build 2022-08-19 12:44 Lightning fast build Gerd Möllmann 2022-08-19 12:59 ` Alan Mackenzie @ 2022-08-21 2:47 ` Pankaj Jangid 2022-08-21 9:36 ` João Távora 2 siblings, 0 replies; 9+ messages in thread From: Pankaj Jangid @ 2022-08-21 2:47 UTC (permalink / raw) To: emacs-devel Gerd Möllmann <gerd.moellmann@gmail.com> writes: > > I just noticed that building Emacs master from scratch, i.e. what I do > from time to time > > git clean -xdf \ > && ./autogen.sh \ > && ./configure --with-native-compilation \ > && bear -- make \ > && make install > > went down from around 8 minutes to 4:30, and everything seems to still > be working normally. (This is macos 12.5.1, M1 chip.) > > Kudos to whoever made that happen! Yes. Now it is, real 1m22.072s user 8m44.482s sys 0m48.667s with, git clean -fdx \ && make -j`nproc` \ configure="--prefix=$HOME/.local --with-pgtk CFLAGS='-O0 -g3'" It was more than 2.5m earlier. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Lightning fast build 2022-08-19 12:44 Lightning fast build Gerd Möllmann 2022-08-19 12:59 ` Alan Mackenzie 2022-08-21 2:47 ` Pankaj Jangid @ 2022-08-21 9:36 ` João Távora 2022-08-21 10:24 ` Gerd Möllmann 2022-10-11 4:09 ` Emacs + bear + compile_commands.json + clangd Matt Armstrong 2 siblings, 2 replies; 9+ messages in thread From: João Távora @ 2022-08-21 9:36 UTC (permalink / raw) To: Gerd Möllmann; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 815 bytes --] Hello Gerd. Out of curiosity, and speculation, is your use of 'bear' intended to make a compilation database of Emacs sources for use with a LSP server? If so, how is that going? Last time I tried to do that, the server (clangd, i think) was still very confused in many files. João On Fri, Aug 19, 2022, 13:45 Gerd Möllmann <gerd.moellmann@gmail.com> wrote: > I just noticed that building Emacs master from scratch, i.e. what I do > from time to time > > git clean -xdf \ > && ./autogen.sh \ > && ./configure --with-native-compilation \ > && bear -- make \ > && make install > > went down from around 8 minutes to 4:30, and everything seems to still be > working normally. (This is macos 12.5.1, M1 chip.) > > Kudos to whoever made that happen! > [-- Attachment #2: Type: text/html, Size: 1504 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Lightning fast build 2022-08-21 9:36 ` João Távora @ 2022-08-21 10:24 ` Gerd Möllmann 2022-10-11 4:09 ` Emacs + bear + compile_commands.json + clangd Matt Armstrong 1 sibling, 0 replies; 9+ messages in thread From: Gerd Möllmann @ 2022-08-21 10:24 UTC (permalink / raw) To: João Távora; +Cc: emacs-devel João Távora <joaotavora@gmail.com> writes: > > Hello Gerd. Out of curiosity, and speculation, is your use of 'bear' > intended to make a compilation database of Emacs sources for use with > a LSP server? Yes, exactly. > If so, how is that going? Last time I tried to do that, the server (clangd, i think) was still very confused in many files. I can't complain. I'm using lsp-mode with clangd and bear because that were the first things I tried, and all of them just worked for me. I've also installed llvm14 in the meantime because of reasons and I'm using '(lsp-clients-clangd-executable "/opt/homebrew/opt/llvm/bin/clangd") which says ~/emacs/master/ > /opt/homebrew/opt/llvm/bin/clangd --version Homebrew clangd version 14.0.6 But it also worked for me before with the clangd coming with Xcode, which is version 13 something. In case it matters, another thing I did right from the start is ;; Activate Lsp in all C-like buffers. (add-hook 'c-mode-common-hook 'lsp-deferred) lsp-deferred is an autoloaded Lisp closure in ‘lsp-mode.el’. (lsp-deferred) Entry point that defers server startup until buffer is visible. ‘lsp-deferred’ will wait until the buffer is visible before invoking ‘lsp’. This avoids overloading the server with many files when starting Emacs. All this is on a Mac mini/M1, macOS 12.5.1 with 16G RAM. Others mentioned they had problems with clangd, I believe on GNU/Linux, not sure about that. But as I said, I personally can't complain. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Emacs + bear + compile_commands.json + clangd 2022-08-21 9:36 ` João Távora 2022-08-21 10:24 ` Gerd Möllmann @ 2022-10-11 4:09 ` Matt Armstrong 2022-10-11 5:39 ` Gerd Möllmann 1 sibling, 1 reply; 9+ messages in thread From: Matt Armstrong @ 2022-10-11 4:09 UTC (permalink / raw) To: João Távora, Gerd Möllmann; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 1768 bytes --] João Távora <joaotavora@gmail.com> writes: > Hello Gerd. Out of curiosity, and speculation, is your use of 'bear' > intended to make a compilation database of Emacs sources for use with a LSP > server? > > If so, how is that going? Last time I tried to do that, the server (clangd, > i think) was still very confused in many files. > > João Hey João, I had issues with Emacs source and clangd, especially with header files. The issue is that many of Emacs' C header files are not "self contained" so they can't be compiled alone. Also, `bear` will only generate compile commands for .c files, and clangd uses heuristics to guess a compile command for nearby .h files. It does a reasonable job in some projects, but not Emacs due to the "self contained" issue. Biggest issue: when editing an .h file clangd won't include <config.h> for you. I now do this: ./configure <whatever> bear --force-wrapper -- make -j$CPUS emacs-fixup-compile-commands.py where emacs-fixup-compile-commands.py is attached. Bonus to anyone rewrites it in elisp. ;-) The idea is to find the .c file with the most similar name to each .h file, then form a compile command for the .h by hacking the .c file's command line, adding: -Wno-unused-macros -include config.h ...this way, when clangd "compiles" an Emacs .h file it includes config.h first (which fixes many issues), and won't complain about macros going unused in the file. With this, Emacs + clangd is pretty seamless for me. P.S. I recently had to start passing "--force-wrapper" to bear. Some Emacs builds steps were failing with bear's LD_PRELOAD hack. Maybe the Emacs modules stuff? Or tests? I didn't look into it, but "--force-wrapper" fixed it. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: emacs-fixup-compile-commands.py --] [-- Type: text/x-python, Size: 2448 bytes --] #!/usr/bin/env python3 import copy import json import glob import os import sys def levenshteinDistance(s1, s2): if len(s1) > len(s2): s1, s2 = s2, s1 distances = range(len(s1) + 1) for i2, c2 in enumerate(s2): distances_ = [i2 + 1] for i1, c1 in enumerate(s1): if c1 == c2: distances_.append(distances[i1]) else: distances_.append( 1 + min((distances[i1], distances[i1 + 1], distances_[-1])) ) distances = distances_ return distances[-1] def Read(): with open("compile_commands.json") as file: return json.load(file) def Write(compile_commands): with open("compile_commands.json", "w") as file: json.dump(compile_commands, file, sort_keys=True, indent=2) def Headers(): # return [f for f in os.listdir('src') if f.endswith('.h')] return glob.glob(os.path.join(os.getcwd(), "src/*.h")) def NeedsConfigH(header): """Returns True if header needs config.h to function""" if header.endswith("/config.h"): return False with open(header) as file: return "INLINE_HEADER_BEGIN" in file.read() def FindSimilarCommand(compile_commands, header): header = os.path.join(os.getcwd(), header) bestDistance = sys.maxsize bestCommand = None for command in compile_commands: distance = levenshteinDistance(header, command["file"]) if distance < bestDistance: bestDistance = distance bestCommand = command return bestCommand def AdaptTemplate(command, header): command = copy.deepcopy(command) if "output" in command: del command["output"] src = os.path.relpath(command["file"], command["directory"]) index = command["arguments"].index(src) new_src = os.path.relpath(header, command["directory"]) command["arguments"][index : index + 1] = [ "-Wno-unused-macros", "-include", "config.h", new_src, ] command["file"] = header return command compile_commands = Read() new_compile_commands = copy.copy(compile_commands) for header in Headers(): if NeedsConfigH(header): similar = FindSimilarCommand(compile_commands, header) if similar["file"] == header: continue adapted = AdaptTemplate(similar, header) new_compile_commands.append(adapted) Write(new_compile_commands) ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Emacs + bear + compile_commands.json + clangd 2022-10-11 4:09 ` Emacs + bear + compile_commands.json + clangd Matt Armstrong @ 2022-10-11 5:39 ` Gerd Möllmann 2022-10-11 17:37 ` Matt Armstrong 0 siblings, 1 reply; 9+ messages in thread From: Gerd Möllmann @ 2022-10-11 5:39 UTC (permalink / raw) To: Matt Armstrong; +Cc: João Távora, emacs-devel Matt Armstrong <matt@rfc20.org> writes: > Hey João, I had issues with Emacs source and clangd, especially with > header files. The issue is that many of Emacs' C header files are not > "self contained" so they can't be compiled alone. Also, `bear` will > only generate compile commands for .c files, and clangd uses > heuristics to guess a compile command for nearby .h files. It does a > reasonable job in some projects, but not Emacs due to the "self > contained" issue. Biggest issue: when editing an .h file clangd won't > include <config.h> for you. I'm wondering how you use clangd. Is this lsp-mode or eglot? I'm using lsp-mode ATM, just because I tried it first, and it worked for me. > I now do this: > > ./configure <whatever> > bear --force-wrapper -- make -j$CPUS > emacs-fixup-compile-commands.py > > where emacs-fixup-compile-commands.py is attached. Bonus to anyone > rewrites it in elisp. ;-) I've never had to use --force-wrapper or alter compile_commands.json. My current version is bear 3.0.20, on macOS 12.6. What's your system? P.S. WRT to seamless, I have to add, for macOS: This was true for me with Xcode 13, and is no longer with Xcode 14. Both clangd and lldb crash pretty frequently :-(. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Emacs + bear + compile_commands.json + clangd 2022-10-11 5:39 ` Gerd Möllmann @ 2022-10-11 17:37 ` Matt Armstrong 2022-10-12 4:32 ` Gerd Möllmann 0 siblings, 1 reply; 9+ messages in thread From: Matt Armstrong @ 2022-10-11 17:37 UTC (permalink / raw) To: Gerd Möllmann; +Cc: João Távora, emacs-devel Gerd Möllmann <gerd.moellmann@gmail.com> writes: > Matt Armstrong <matt@rfc20.org> writes: > >> Hey João, I had issues with Emacs source and clangd, especially with >> header files. The issue is that many of Emacs' C header files are not >> "self contained" so they can't be compiled alone. Also, `bear` will >> only generate compile commands for .c files, and clangd uses >> heuristics to guess a compile command for nearby .h files. It does a >> reasonable job in some projects, but not Emacs due to the "self >> contained" issue. Biggest issue: when editing an .h file clangd won't >> include <config.h> for you. > > I'm wondering how you use clangd. Is this lsp-mode or eglot? I'm using > lsp-mode ATM, just because I tried it first, and it worked for me. I use eglot because I tried it first and it worked for me. ;-) I tried eglot first because I like the general design philosophy of integration with core Emacs packages and a more conservative approach to the UI. You barely know when eglot is running! >> I now do this: >> >> ./configure <whatever> >> bear --force-wrapper -- make -j$CPUS >> emacs-fixup-compile-commands.py >> >> where emacs-fixup-compile-commands.py is attached. Bonus to anyone >> rewrites it in elisp. ;-) > > I've never had to use --force-wrapper or alter compile_commands.json. Regarding compile_commands.json, if I use the compile_commands.json generated by bear, with eglot, with clangd version "Debian clangd version 14.0.6-2", it works well for .c files but not .h files. E.g. I open src/buffer.h and I get these errors in flymake (this is a small subset): 26 9 error e-f-b clang [unknown_typename]: In included file: unknown type name 'INLINE_HEADER_BEGIN' 1 0 error e-f-b clang [fatal_too_many_errors]: Too many errors emitted, stopping now 283 4 error e-f-b clang [unknown_typename]: Unknown type name 'INTERVAL' 722 9 warning e-f-b clang [-Wimplicit-function-declaration]: Implicit declaration of function 'PSEUDOVECTORP' is invalid in C99 877 5 warning e-f-b clang [-Wimplicit-function-declaration]: Implicit declaration of function 'NILP' is invalid in C99 1079 26 error e-f-b clang [expr_not_ice]: Expression is not an integer constant expression 1256 7 error e-f-b clang [unknown_typename]: Unknown type name 'INTERVAL' 1573 14 warning e-f-b clang [-Wint-conversion]: Incompatible integer to pointer conversion initializing 'Lisp_Object' (aka 'struct Lisp_X *') with an expression of type 'int' 1573 21 warning e-f-b clang [-Wimplicit-function-declaration]: Implicit declaration of function 'CHAR_TABLE_REF' is invalid in C99 I always assumed that this was becuase clangd didn't know how to compile src/buffer.h and is unable to figure it out: $ grep -F buffer.h compile_commands.json <nothing printed> After I run my emacs-fixup-compile-commands.py I have this in compile_commands.json: { "arguments": [ "/usr/bin/gcc", [...blah blah blah you get the point...] "-Wno-unused-macros", "-Wno-unused-function", "-include", "config.h", "buffer.h" ], "directory": "/home/matt/git/emacs-noverlay/src", "file": "/home/matt/git/emacs-noverlay/src/buffer.h" }, and clangd works fine. Given all this I have no idea how your experience with clangd could different, but I'm not a clangd expert 🤔. > My current version is bear 3.0.20, on macOS 12.6. What's your system? bear 3.0.20 on Debian/Bullseye (testing) My issue may have been related to building with Address Sanitizer, which I think also (might) play games with LD_PRELOAD. I tried --force-wrapper and it worked for me. ;-) > P.S. > > WRT to seamless, I have to add, for macOS: This was true for me with > Xcode 13, and is no longer with Xcode 14. Both clangd and lldb crash > pretty frequently :-(. Maybe using the clangd from homebrew would work better for you? ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Emacs + bear + compile_commands.json + clangd 2022-10-11 17:37 ` Matt Armstrong @ 2022-10-12 4:32 ` Gerd Möllmann 0 siblings, 0 replies; 9+ messages in thread From: Gerd Möllmann @ 2022-10-12 4:32 UTC (permalink / raw) To: Matt Armstrong; +Cc: João Távora, emacs-devel Matt Armstrong <matt@rfc20.org> writes: >> I've never had to use --force-wrapper or alter compile_commands.json. > > Regarding compile_commands.json, if I use the compile_commands.json > generated by bear, with eglot, with clangd version "Debian clangd > version 14.0.6-2", it works well for .c files but not .h files. > > E.g. I open src/buffer.h and I get these errors in flymake (this is a > small subset): > > 26 9 error e-f-b clang [unknown_typename]: In included file: unknown type name 'INLINE_HEADER_BEGIN' > 1 0 error e-f-b clang [fatal_too_many_errors]: Too many errors emitted, stopping now > 283 4 error e-f-b clang [unknown_typename]: Unknown type name 'INTERVAL' > 722 9 warning e-f-b clang [-Wimplicit-function-declaration]: Implicit declaration of function 'PSEUDOVECTORP' is invalid in C99 > 877 5 warning e-f-b clang [-Wimplicit-function-declaration]: Implicit declaration of function 'NILP' is invalid in C99 > 1079 26 error e-f-b clang [expr_not_ice]: Expression is not an integer constant expression > 1256 7 error e-f-b clang [unknown_typename]: Unknown type name 'INTERVAL' > 1573 14 warning e-f-b clang [-Wint-conversion]: Incompatible integer to pointer conversion initializing 'Lisp_Object' (aka 'struct Lisp_X *') with an expression of type 'int' > 1573 21 warning e-f-b clang [-Wimplicit-function-declaration]: Implicit declaration of function 'CHAR_TABLE_REF' is invalid in C99 > > I always assumed that this was becuase clangd didn't know how to compile > src/buffer.h and is unable to figure it out: > > Given all this I have no idea how your experience with clangd could > different, but I'm not a clangd expert 🤔. I'm not an expert for anything, but I don't see such errors here. Strange. >> My current version is bear 3.0.20, on macOS 12.6. What's your system? > > bear 3.0.20 on Debian/Bullseye (testing) Thanks. > > My issue may have been related to building with Address Sanitizer, which > I think also (might) play games with LD_PRELOAD. I tried > --force-wrapper and it worked for me. ;-) :-). And BTW, I'm also using ASAN here, almost all the time, and don't see this either. This is with the system compiler, which is Apple clang version 14.0.0 (clang-1400.0.29.102). Maybe I'll try the lldb from LLVM 15 a try at some point. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2022-10-12 4:32 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-08-19 12:44 Lightning fast build Gerd Möllmann 2022-08-19 12:59 ` Alan Mackenzie 2022-08-21 2:47 ` Pankaj Jangid 2022-08-21 9:36 ` João Távora 2022-08-21 10:24 ` Gerd Möllmann 2022-10-11 4:09 ` Emacs + bear + compile_commands.json + clangd Matt Armstrong 2022-10-11 5:39 ` Gerd Möllmann 2022-10-11 17:37 ` Matt Armstrong 2022-10-12 4:32 ` Gerd Möllmann
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).