all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: joaotavora@gmail.com (João Távora)
To: Noam Postavsky <npostavs@users.sourceforge.net>
Cc: Lele Gaifax <lele@metapensiero.it>,
	Emacs developers <emacs-devel@gnu.org>,
	Mark Oteiza <mvoteiza@udel.edu>,
	Stefan Monnier <monnier@iro.umontreal.ca>,
	Eli Zaretskii <eliz@gnu.org>, Leo Liu <sdl.web@gmail.com>
Subject: Re: New Flymake rewrite in emacs-26
Date: Wed, 11 Oct 2017 01:07:19 +0100	[thread overview]
Message-ID: <87a80y8s3s.fsf@gmail.com> (raw)
In-Reply-To: <CAM-tV-_9vV-XBiwwT-mdEmgnA2w=HbBtCJp0OJGwBsr0EWrHjw@mail.gmail.com> (Noam Postavsky's message of "Tue, 10 Oct 2017 13:20:33 -0400")

Noam Postavsky <npostavs@users.sourceforge.net> writes:

> I've also hardly ever used flymake, so this may be nonsense, but maybe
> you could run 'make --just-print foo.o' to get the exact shell
> commands for compiling foo.c. This would bypass any need to know
> details of compilation beyond figuring out the target name from the
> source.

Thanks for the idea. Certainly not nonsense, but also not a silver
bullet, since Makefiles can invoke gcc in arbitrary ways that fool a
guesser. Still, it’s probably decent in a fair amount of cases, and I’m
giving it a go to see if it works with Emacs sources and perhaps some
other GNU projects. I attach my flag-guessing function at the end.

First, my idea is to cache the result of these flags contingent on the
Makefile’s location and mtime. This, I think, is doable. Then I use a
regexp to extract the gcc invocation from the output.

The regexp is very poor but does the job. For the src/fringe.c file the
regexp is

   "gcc[[:space:]]+\\(\\(?:-.*\\)*\\)/path/to/fringe.c"

This indeed matches Make’s output and gets me something like this for
the match group 1

   -c -Demacs -I. -I. -I../lib -I../lib -isystem /usr/include/freetype2
    -isystem /usr/include/alsa -pthread -isystem /usr/include/librsvg-2.0
    -isystem /usr/include/gdk-pixbuf-2.0 -isystem /usr/include/libpng16
    -isystem /usr/include/cairo -isystem /usr/include/glib-2.0 -isystem
    /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem
    /usr/include/pixman-1 -isystem /usr/include/freetype2 -isystem
    /usr/include/libpng16 -isystem /usr/include/libpng16 -isystem
    /usr/include/libxml2 -isystem /usr/include/dbus-1.0 -isystem
    /usr/lib/x86_64-linux-gnu/dbus-1.0/include -pthread -isystem
    /usr/include/glib-2.0 -isystem
    /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem
    /usr/include/glib-2.0 -isystem
    /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem
    /usr/include/freetype2 -isystem /usr/include/freetype2 -isystem
    /usr/include/freetype2 -MMD -MF
    deps//home/capitaomorte/Source/Emacs/emacs-26/src/fringe.d -MP -isystem
    /usr/include/p11-kit-1 -fno-common -W -Wabi -Waddress
    [... elided many many -W flags]
    -Wno-type-limits -Wno-unused-parameter -Wno-format-nonliteral -g3 -O2

Unfortunately, not all flags make sense for flymake, like the -M family
of flags. Ideally, i’d need a way to parse this big string of flags back
into, say, an alist, and cherry pick the -I, -D, and -W flags from that
set. But I’m afraid split-string will insufficiently deal with escaped
spaces in the output.

Any ideas?

João

PS: My WIP follows

(defvar-local flymake--gcc-cached-flags nil)

(defun flymake-gcc-guess-gcc-flags (&optional trash-cache)
  (interactive "P")
  (unless (executable-find "make")
    (error "Cannot find a suitable make"))
  (when trash-cache
    (setq flymake--gcc-cached-flags nil))
  (catch 'retval
    (when-let* ((makefile-dir
                 (locate-dominating-file default-directory "Makefile"))
                (makefile (expand-file-name "Makefile" makefile-dir))
                (mtime (file-attribute-modification-time
                        (file-attributes makefile))))
      (cond
       ((equal (list makefile mtime)
               (cdr flymake--gcc-cached-flags))
        (when (called-interactively-p 'interactive)
          (message "cached hit for flags for this buffer: %s"
                   (car flymake--gcc-cached-flags)))
        (throw 'retval (car flymake--gcc-cached-flags)))
       (t
        (when-let*
            ((blob (shell-command-to-string
                    (format "make -B -C %s -f %s --just-print %s.o"
                            makefile-dir
                            makefile
                            (file-name-sans-extension (buffer-file-name)))))
             (match (string-match
                     (format "gcc[[:space:]]+\\(\\(?:-.*\\)*\\)%s"
                             (buffer-file-name))
                     blob))
             (flags (split-string (match-string 1 blob) nil t "[[:space:]]")))
          (setq flymake--gcc-cached-flags (list flags makefile mtime))
          (when (called-interactively-p 'interactive)
            (message "cached miss for flags for this buffer: %s" flags))
          (throw 'retval flags))))
      (when (called-interactively-p 'interactive)
        (message "Couldn’t guess flags for this buffer :-(")))))





  reply	other threads:[~2017-10-11  0:07 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-03 14:05 New Flymake rewrite in emacs-26 João Távora
2017-10-03 15:00 ` Eli Zaretskii
2017-10-04 11:58   ` Lele Gaifax
2017-10-04 13:41     ` Lele Gaifax
2017-10-04 16:08       ` João Távora
2017-10-04 16:42         ` Lele Gaifax
2017-10-04 18:11           ` Lele Gaifax
2017-10-05  2:21             ` João Távora
2017-10-05 11:42               ` Lele Gaifax
2017-10-05 23:32                 ` Noam Postavsky
2017-10-06 13:16                   ` João Távora
2017-10-06 13:24                     ` Noam Postavsky
2017-10-06 15:48                       ` João Távora
2017-10-07  7:37                 ` Lele Gaifax
2017-10-07 16:08                   ` João Távora
2017-10-10 12:25   ` João Távora
2017-10-10 14:18     ` Eli Zaretskii
2017-10-10 15:09       ` João Távora
2017-10-10 15:53         ` Eli Zaretskii
2017-10-10 16:25           ` João Távora
2017-10-10 16:40             ` Eli Zaretskii
2017-10-10 17:03               ` João Távora
2017-10-10 17:20                 ` Noam Postavsky
2017-10-11  0:07                   ` João Távora [this message]
2017-10-11  0:59                     ` Noam Postavsky
2017-10-11 10:39                       ` Eli Zaretskii
2017-10-11 12:16                         ` Noam Postavsky
2017-10-11 12:25                           ` João Távora
2017-10-11 10:24                     ` Eli Zaretskii
2017-10-11 12:01                       ` João Távora
2017-10-11 12:13                         ` Eli Zaretskii
2017-10-11 13:41                         ` João Távora
2017-10-11 17:49                           ` Romanos Skiadas
2017-10-11 18:39                             ` guillaume papin
2017-10-12 13:17                               ` João Távora
2017-10-11 20:25                           ` Stefan Monnier
2017-10-12 13:10                             ` João Távora
2017-10-12 13:43                               ` Stefan Monnier
2017-10-12 13:56                                 ` João Távora
2017-10-11 13:11                     ` Mark Oteiza
2017-10-10 17:23                 ` Eli Zaretskii
2017-10-11 11:11             ` Lele Gaifax

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87a80y8s3s.fsf@gmail.com \
    --to=joaotavora@gmail.com \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=lele@metapensiero.it \
    --cc=monnier@iro.umontreal.ca \
    --cc=mvoteiza@udel.edu \
    --cc=npostavs@users.sourceforge.net \
    --cc=sdl.web@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.