unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* 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).