unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
@ 2023-04-10 23:09 Dmitry Gutov
  2023-04-11  6:10 ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Dmitry Gutov @ 2023-04-10 23:09 UTC (permalink / raw)
  To: 62762

The log excerpt is at the end.

Could someone fix that, so that I don't have to 'make bootstrap' every 
other time after a 'git pull'?

make[3]: Entering directory '/home/dgutov/vc/emacs-master/lisp'
   ELC      org/ox.elc
Warning (emacs): Org version mismatch.  Org loading aborted.
This warning usually appears when a built-in Org version is loaded
prior to the more recent Org version.

Version mismatch is commonly encountered in the following situations:

1. Emacs is loaded using literate Org config and more recent Org
    version is loaded inside the file loaded by ‘org-babel-load-file’.
    ‘org-babel-load-file’ triggers the built-in Org version clashing
    the newer Org version attempt to be loaded later.

    It is recommended to move the Org loading code before the
    ‘org-babel-load-file’ call.

2. New Org version is loaded manually by setting ‘load-path’, but some
    other package depending on Org is loaded before the ‘load-path’ is
    configured.
    This "other package" is triggering built-in Org version, again
    causing the version mismatch.

    It is recommended to set ‘load-path’ as early in the config as
    possible.

3. New Org version is loaded using straight.el package manager and
    other package depending on Org is loaded before straight triggers
    loading of the newer Org version.

    It is recommended to put

     (straight-use-package 'org)

    early in the config.  Ideally, right after the straight.el
    bootstrap.  Moving ‘use-package’ :straight declaration may not be
    sufficient if the corresponding ‘use-package’ statement is
    deferring the loading.

In toplevel form:
org/ox.el:79:2: Error: Org version mismatch.  Make sure that correct 
‘load-path’ is set early in init.el





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-10 23:09 bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code Dmitry Gutov
@ 2023-04-11  6:10 ` Eli Zaretskii
  2023-04-11  7:18   ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-11  6:10 UTC (permalink / raw)
  To: Dmitry Gutov, Ihor Radchenko, Bastien; +Cc: 62762

> Date: Tue, 11 Apr 2023 02:09:45 +0300
> From: Dmitry Gutov <dmitry@gutov.dev>
> 
> Could someone fix that, so that I don't have to 'make bootstrap' every 
> other time after a 'git pull'?

First, you don't need to "make bootstrap" in this case.  It is enough
to say "touch lisp/org/*.el".

And second, I tried to install a solution to that on the master
branch, but it is not perfect, to say the least: depending on which
*.el files in lisp/org/ were updated by the same pull/merge that
brought the new org-version.el (which is the source of the trouble),
the solution I installed may or may not work.

So a better solution is probably to "touch" all the *.el files in
lisp/org/ (or just some of them, if we can identify them) when
org-version.el is updated.  Patches welcome, or I will get to that
eventually.

Or maybe Org folks (CC'ed) could suggest a better fix.  I understand
the reasons for this behavior in Org, but none of the reasons
described in org-version.el are relevant to Emacs development, when a
new version of Org is merged.  Maybe the abort could be augmented not
to produce such a drastic effect?





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-11  6:10 ` Eli Zaretskii
@ 2023-04-11  7:18   ` Ihor Radchenko
  2023-04-11  8:03     ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-11  7:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Bastien, Dmitry Gutov, 62762

Eli Zaretskii <eliz@gnu.org> writes:

> Or maybe Org folks (CC'ed) could suggest a better fix.  I understand
> the reasons for this behavior in Org, but none of the reasons
> described in org-version.el are relevant to Emacs development, when a
> new version of Org is merged.  Maybe the abort could be augmented not
> to produce such a drastic effect?

The fact the Org error is triggered means that Emacs does not re-compile
.el files that refer to macros that have been changed.
See https://orgmode.org/list/jwvsfkv5s7l.fsf-monnier+emacs@gnu.org

Macros not being updated, as one may expect, may break the code using
old macro expansions. So, I cannot say that Org is wrong complaining
about mismatch here. In fact, we already made the check less strict to
work around the same issue on ELPA. See
https://list.orgmode.org/orgmode/87r10ey8ov.fsf@localhost/ and
https://list.orgmode.org/orgmode/87pmfijrvw.fsf@localhost/

Maybe make bootstrap is justified then?

Of course, ideally, Emacs should provide a way to handle macro dependencies.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-11  7:18   ` Ihor Radchenko
@ 2023-04-11  8:03     ` Eli Zaretskii
  2023-04-11 18:35       ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-11  8:03 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, 62762

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: Dmitry Gutov <dmitry@gutov.dev>, Bastien <bzg@gnu.org>,
>  62762@debbugs.gnu.org
> Date: Tue, 11 Apr 2023 07:18:18 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > Or maybe Org folks (CC'ed) could suggest a better fix.  I understand
> > the reasons for this behavior in Org, but none of the reasons
> > described in org-version.el are relevant to Emacs development, when a
> > new version of Org is merged.  Maybe the abort could be augmented not
> > to produce such a drastic effect?
> 
> The fact the Org error is triggered means that Emacs does not re-compile
> .el files that refer to macros that have been changed.

You know this is not really possible in Emacs.

> Macros not being updated, as one may expect, may break the code using
> old macro expansions. So, I cannot say that Org is wrong complaining
> about mismatch here. In fact, we already made the check less strict to
> work around the same issue on ELPA. See
> https://list.orgmode.org/orgmode/87r10ey8ov.fsf@localhost/ and
> https://list.orgmode.org/orgmode/87pmfijrvw.fsf@localhost/

How is this different from any other Lisp file in Emacs?  We have
quite a few that define macros used elsewhere, and we rely on
byte-compilation during the build to tell us when the old definitions
get in the way.  We don't forcefully abort the build, just because
problems _might_ exist.  And people who want to make sure their builds
are 110% perfect always bootstrap to begin with.  Building a tarball
also requires a bootstrap, so the chance of these issues slipping
through cracks are minuscule to say the least.

Anyway, any other words of wisdom?  Like which org/*.el files actually
need to be recompiled in this case?  Or are you saying all of them
need to be recompiled?

I also am not sure I understand the logic of this test: AFAIU it only
tests the version string, not the actual macros that might have been
changed.  Are you saying that Org bumps its version string each time
_any_ Org macro is modified?

Also, how about the alternative of including the version string in
every Org Lisp file that needs to be recompiled when the version
changes (or the macros change)?  Then recompilation will happen
automatically, and this problem will go away.  Does this make sense?

> Maybe make bootstrap is justified then?

No, it isn't.  Not unless files outside of lisp/org/ will start
importing org-version.el.

> Of course, ideally, Emacs should provide a way to handle macro dependencies.

Ideally, this would be a much nicer world, indeed.  But humanity was
expelled from the Garden of Eden long ago, so here we are.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-11  8:03     ` Eli Zaretskii
@ 2023-04-11 18:35       ` Ihor Radchenko
  2023-04-11 18:51         ` Eli Zaretskii
  2023-04-22 14:30         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-11 18:35 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, dmitry, 62762

Eli Zaretskii <eliz@gnu.org> writes:

>> The fact the Org error is triggered means that Emacs does not re-compile
>> .el files that refer to macros that have been changed.
>
> You know this is not really possible in Emacs.

I don't. Say, why not to store hash of the macro sources in the byte
code and verifying the hash when re-compilation is requested? Though I
am not that much familiar with Emacs source compilation.

>> Macros not being updated, as one may expect, may break the code using
>> old macro expansions. So, I cannot say that Org is wrong complaining
>> about mismatch here. In fact, we already made the check less strict to
>> work around the same issue on ELPA. See
>> https://list.orgmode.org/orgmode/87r10ey8ov.fsf@localhost/ and
>> https://list.orgmode.org/orgmode/87pmfijrvw.fsf@localhost/
>
> How is this different from any other Lisp file in Emacs?  We have
> quite a few that define macros used elsewhere, and we rely on
> byte-compilation during the build to tell us when the old definitions
> get in the way.  We don't forcefully abort the build, just because
> problems _might_ exist.  And people who want to make sure their builds
> are 110% perfect always bootstrap to begin with.  Building a tarball
> also requires a bootstrap, so the chance of these issues slipping
> through cracks are minuscule to say the least.

Sure, in the context of Emacs compilation. The code in question is
mostly aiming at newer Org installed on top of built-in Org. We are
consistently getting issues related to incorrect macro expansion and
mixing different Org versions.

> Anyway, any other words of wisdom?  Like which org/*.el files actually
> need to be recompiled in this case?  Or are you saying all of them
> need to be recompiled?

All of them, because org-assert-version expands into
 (unless (equal "version string" (org-release)) ...)
at compile time. "Version string" contains the return value of
(org-release) for the time the .elc file is compiled.

Note that the reported issue will only happen when Org version string
changes between the builds.

What we might do to work around the problem is detecting Emacs compilation
and disable the check. Is there a way to detect that Emacs source is
being compiled from Elisp?

> I also am not sure I understand the logic of this test: AFAIU it only
> tests the version string, not the actual macros that might have been
> changed.  Are you saying that Org bumps its version string each time
> _any_ Org macro is modified?

No. We originally tested by commit hash. Version string check is a
trade-off between the problem with ELPA builds (see the links in my
previous message) and the need to detect mixed installation problems.

> Also, how about the alternative of including the version string in
> every Org Lisp file that needs to be recompiled when the version
> changes (or the macros change)?  Then recompilation will happen
> automatically, and this problem will go away.  Does this make sense?

No. We will not be able to maintain this manually.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-11 18:35       ` Ihor Radchenko
@ 2023-04-11 18:51         ` Eli Zaretskii
  2023-04-11 18:59           ` Ihor Radchenko
  2023-04-22 14:30         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-11 18:51 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, 62762

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: dmitry@gutov.dev, bzg@gnu.org, 62762@debbugs.gnu.org
> Date: Tue, 11 Apr 2023 18:35:51 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> The fact the Org error is triggered means that Emacs does not re-compile
> >> .el files that refer to macros that have been changed.
> >
> > You know this is not really possible in Emacs.
> 
> I don't. Say, why not to store hash of the macro sources in the byte
> code and verifying the hash when re-compilation is requested? Though I
> am not that much familiar with Emacs source compilation.

We need to do this the "make" way.  That is, we need to be able to
produce dependencies that Make can understand, e.g. similarly to how
the *.d files in src/.deps are produced by GCC.  This is in principle
possible, but we need changes in the byte compiler and in 'load', and
probably more.

> Note that the reported issue will only happen when Org version string
> changes between the builds.

Which happened twice during the last week or two, AFAIR.  Moreover, it
happens on almost every branch, and if someone builds several branches
routinely (I do), the annoyance happens several times in a row.

> What we might do to work around the problem is detecting Emacs compilation
> and disable the check. Is there a way to detect that Emacs source is
> being compiled from Elisp?

Not sure I understand: the byte compiler is a Lisp program, so every
compilation is "from Lisp", no?  Or what am I missing?

> > Also, how about the alternative of including the version string in
> > every Org Lisp file that needs to be recompiled when the version
> > changes (or the macros change)?  Then recompilation will happen
> > automatically, and this problem will go away.  Does this make sense?
> 
> No. We will not be able to maintain this manually.

I guess it means we are on our own, sigh...





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-11 18:51         ` Eli Zaretskii
@ 2023-04-11 18:59           ` Ihor Radchenko
  2023-04-11 19:28             ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-11 18:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, dmitry, 62762

Eli Zaretskii <eliz@gnu.org> writes:

>> Note that the reported issue will only happen when Org version string
>> changes between the builds.
>
> Which happened twice during the last week or two, AFAIR.  Moreover, it
> happens on almost every branch, and if someone builds several branches
> routinely (I do), the annoyance happens several times in a row.

Fair point.

>> What we might do to work around the problem is detecting Emacs compilation
>> and disable the check. Is there a way to detect that Emacs source is
>> being compiled from Elisp?
>
> Not sure I understand: the byte compiler is a Lisp program, so every
> compilation is "from Lisp", no?  Or what am I missing?

I mean, can we detect when the compiler is invoked from "make" in Emacs
source?

>> > Also, how about the alternative of including the version string in
>> > every Org Lisp file that needs to be recompiled when the version
>> > changes (or the macros change)?  Then recompilation will happen
>> > automatically, and this problem will go away.  Does this make sense?
>> 
>> No. We will not be able to maintain this manually.
>
> I guess it means we are on our own, sigh...

You are not. In the worst case, we may add some flag into Org sources
that are inside Emacs tree. Something like `org-version-built-in-p' that
will be set to t only in the Emacs' version of Org.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-11 18:59           ` Ihor Radchenko
@ 2023-04-11 19:28             ` Eli Zaretskii
  2023-04-11 19:37               ` Eli Zaretskii
  2023-04-12  9:03               ` Ihor Radchenko
  0 siblings, 2 replies; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-11 19:28 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, 62762

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: dmitry@gutov.dev, bzg@gnu.org, 62762@debbugs.gnu.org
> Date: Tue, 11 Apr 2023 18:59:17 +0000
> 
> >> What we might do to work around the problem is detecting Emacs compilation
> >> and disable the check. Is there a way to detect that Emacs source is
> >> being compiled from Elisp?
> >
> > Not sure I understand: the byte compiler is a Lisp program, so every
> > compilation is "from Lisp", no?  Or what am I missing?
> 
> I mean, can we detect when the compiler is invoked from "make" in Emacs
> source?

I guess we ccoul define some environment variable in Lisp/Makefile?

> > I guess it means we are on our own, sigh...
> 
> You are not. In the worst case, we may add some flag into Org sources
> that are inside Emacs tree. Something like `org-version-built-in-p' that
> will be set to t only in the Emacs' version of Org.

And what will that mean when org-version.el bumps its version?





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-11 19:28             ` Eli Zaretskii
@ 2023-04-11 19:37               ` Eli Zaretskii
  2023-04-12  9:03               ` Ihor Radchenko
  1 sibling, 0 replies; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-11 19:37 UTC (permalink / raw)
  To: yantar92; +Cc: bzg, dmitry, 62762

> Cc: bzg@gnu.org, dmitry@gutov.dev, 62762@debbugs.gnu.org
> Date: Tue, 11 Apr 2023 22:28:14 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > I mean, can we detect when the compiler is invoked from "make" in Emacs
> > source?
> 
> I guess we ccoul define some environment variable in Lisp/Makefile?
             ^^^^^
That was supposed to be "could", sorry.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-11 19:28             ` Eli Zaretskii
  2023-04-11 19:37               ` Eli Zaretskii
@ 2023-04-12  9:03               ` Ihor Radchenko
  2023-04-12  9:21                 ` Eli Zaretskii
  1 sibling, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-12  9:03 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, dmitry, 62762

Eli Zaretskii <eliz@gnu.org> writes:

>> I mean, can we detect when the compiler is invoked from "make" in Emacs
>> source?
>
> I guess we ccoul define some environment variable in Lisp/Makefile?

That should be fine.

>> > I guess it means we are on our own, sigh...
>> 
>> You are not. In the worst case, we may add some flag into Org sources
>> that are inside Emacs tree. Something like `org-version-built-in-p' that
>> will be set to t only in the Emacs' version of Org.
>
> And what will that mean when org-version.el bumps its version?

My idea is to change `org-assert-version' in such a way that the check
is completely bypassed when `org-version-built-in-p' is non-nil (of when
some environment variable is set). As I said, `org-assert-version' is
not aiming for built-in Org compilation. Just for Org package
installation.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-12  9:03               ` Ihor Radchenko
@ 2023-04-12  9:21                 ` Eli Zaretskii
  2023-04-13  8:34                   ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-12  9:21 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, 62762

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: dmitry@gutov.dev, bzg@gnu.org, 62762@debbugs.gnu.org
> Date: Wed, 12 Apr 2023 09:03:48 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> You are not. In the worst case, we may add some flag into Org sources
> >> that are inside Emacs tree. Something like `org-version-built-in-p' that
> >> will be set to t only in the Emacs' version of Org.
> >
> > And what will that mean when org-version.el bumps its version?
> 
> My idea is to change `org-assert-version' in such a way that the check
> is completely bypassed when `org-version-built-in-p' is non-nil (of when
> some environment variable is set). As I said, `org-assert-version' is
> not aiming for built-in Org compilation. Just for Org package
> installation.

I think this will be a good change from my POV, thank you.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-12  9:21                 ` Eli Zaretskii
@ 2023-04-13  8:34                   ` Ihor Radchenko
  2023-04-13  8:37                     ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-13  8:34 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, dmitry, 62762

Eli Zaretskii <eliz@gnu.org> writes:

>> My idea is to change `org-assert-version' in such a way that the check
>> is completely bypassed when `org-version-built-in-p' is non-nil (of when
>> some environment variable is set). As I said, `org-assert-version' is
>> not aiming for built-in Org compilation. Just for Org package
>> installation.
>
> I think this will be a good change from my POV, thank you.

So, will you prefer env variable or Elisp variable?
Environment variable is potentially more useful as it might also be used
by other code, not just by Org.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-13  8:34                   ` Ihor Radchenko
@ 2023-04-13  8:37                     ` Eli Zaretskii
  2023-04-13 14:20                       ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-13  8:37 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, 62762

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: dmitry@gutov.dev, bzg@gnu.org, 62762@debbugs.gnu.org
> Date: Thu, 13 Apr 2023 08:34:19 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> My idea is to change `org-assert-version' in such a way that the check
> >> is completely bypassed when `org-version-built-in-p' is non-nil (of when
> >> some environment variable is set). As I said, `org-assert-version' is
> >> not aiming for built-in Org compilation. Just for Org package
> >> installation.
> >
> > I think this will be a good change from my POV, thank you.
> 
> So, will you prefer env variable or Elisp variable?
> Environment variable is potentially more useful as it might also be used
> by other code, not just by Org.

I think ELisp variable is better, since environment variables are
inherited by sub-processes in ways that are hard to control.

Thanks.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-13  8:37                     ` Eli Zaretskii
@ 2023-04-13 14:20                       ` Ihor Radchenko
  2023-04-13 14:55                         ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-13 14:20 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, dmitry, 62762

[-- Attachment #1: Type: text/plain, Size: 262 bytes --]

Eli Zaretskii <eliz@gnu.org> writes:

> I think ELisp variable is better, since environment variables are
> inherited by sub-processes in ways that are hard to control.

See the attached.
On Emacs side, `org--built-in-p' will need to be set during compilation.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-org-assert-version-Skip-version-check-when-Org-is-a-.patch --]
[-- Type: text/x-patch, Size: 1545 bytes --]

From 89140b0d747aa127e7b06ed927c09286215e4824 Mon Sep 17 00:00:00 2001
Message-Id: <89140b0d747aa127e7b06ed927c09286215e4824.1681395507.git.yantar92@posteo.net>
From: Ihor Radchenko <yantar92@posteo.net>
Date: Thu, 13 Apr 2023 16:18:15 +0200
Subject: [PATCH] org-assert-version: Skip version check when Org is a part of
 Emacs

* lisp/org-macs.el (org--built-in-p): New constant indicating if Org
source is a part of Emacs source tree.
(org-assert-version): Skip check when Org is built-in.
---
 lisp/org-macs.el | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/lisp/org-macs.el b/lisp/org-macs.el
index ad1d3cf14..b4a5d82c8 100644
--- a/lisp/org-macs.el
+++ b/lisp/org-macs.el
@@ -36,6 +36,9 @@ (require 'format-spec)
 
 ;;; Org version verification.
 
+(defconst org--built-in-p nil
+  "When non-nil, assume that Org is a part of Emacs source.
+See Emacs bug #62762.")
 (defmacro org-assert-version ()
   "Assert compile time and runtime version match."
   ;; We intentionally use a more permissive `org-release' instead of
@@ -45,7 +48,7 @@ (defmacro org-assert-version ()
   ;; `org-assert-version' calls would fail using strict
   ;; `org-git-version' check because the generated Org version strings
   ;; will not match.
-  `(unless (equal (org-release) ,(org-release))
+  `(unless (or org--built-in-p (equal (org-release) ,(org-release)))
      (warn "Org version mismatch.  Org loading aborted.
 This warning usually appears when a built-in Org version is loaded
 prior to the more recent Org version.
-- 
2.40.0


[-- Attachment #3: Type: text/plain, Size: 224 bytes --]


-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>

^ permalink raw reply related	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-13 14:20                       ` Ihor Radchenko
@ 2023-04-13 14:55                         ` Eli Zaretskii
  2023-04-13 15:05                           ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-13 14:55 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, 62762

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: dmitry@gutov.dev, bzg@gnu.org, 62762@debbugs.gnu.org
> Date: Thu, 13 Apr 2023 14:20:05 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > I think ELisp variable is better, since environment variables are
> > inherited by sub-processes in ways that are hard to control.
> 
> See the attached.
> On Emacs side, `org--built-in-p' will need to be set during compilation.

LGTM, will soon incorporate this in our build system.

Thanks!





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-13 14:55                         ` Eli Zaretskii
@ 2023-04-13 15:05                           ` Ihor Radchenko
  2023-04-15 10:48                             ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-13 15:05 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, dmitry, 62762

Eli Zaretskii <eliz@gnu.org> writes:

>> See the attached.
>> On Emacs side, `org--built-in-p' will need to be set during compilation.
>
> LGTM, will soon incorporate this in our build system.

Once you confirm that my patch + your build system update fixes the
problem, I will push to Org bugfix and bump a minor bugfix release.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-13 15:05                           ` Ihor Radchenko
@ 2023-04-15 10:48                             ` Eli Zaretskii
  2023-04-15 11:36                               ` Ihor Radchenko
  2023-04-21 11:44                               ` Eli Zaretskii
  0 siblings, 2 replies; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-15 10:48 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, 62762

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: dmitry@gutov.dev, bzg@gnu.org, 62762@debbugs.gnu.org
> Date: Thu, 13 Apr 2023 15:05:21 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> See the attached.
> >> On Emacs side, `org--built-in-p' will need to be set during compilation.
> >
> > LGTM, will soon incorporate this in our build system.
> 
> Once you confirm that my patch + your build system update fixes the
> problem, I will push to Org bugfix and bump a minor bugfix release.

I've now installed the change on master.

I wonder why org--built-in-p is a defconst, though: shouldn't it be a
defvar instead?





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-15 10:48                             ` Eli Zaretskii
@ 2023-04-15 11:36                               ` Ihor Radchenko
  2023-04-15 11:40                                 ` Eli Zaretskii
  2023-04-21 11:44                               ` Eli Zaretskii
  1 sibling, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-15 11:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, dmitry, 62762

Eli Zaretskii <eliz@gnu.org> writes:

> I wonder why org--built-in-p is a defconst, though: shouldn't it be a
> defvar instead?

I wanted to make it clear that users must not set this variable.
If you think that it is excessive, I can use defvar instead.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-15 11:36                               ` Ihor Radchenko
@ 2023-04-15 11:40                                 ` Eli Zaretskii
  2023-04-15 11:57                                   ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-15 11:40 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, 62762

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: dmitry@gutov.dev, bzg@gnu.org, 62762@debbugs.gnu.org
> Date: Sat, 15 Apr 2023 11:36:40 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > I wonder why org--built-in-p is a defconst, though: shouldn't it be a
> > defvar instead?
> 
> I wanted to make it clear that users must not set this variable.
> If you think that it is excessive, I can use defvar instead.

It's up to you, I don't mind.  (But if you decide to go with defconst,
maybe add a comment there explaining that this is the intent.)





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-15 11:40                                 ` Eli Zaretskii
@ 2023-04-15 11:57                                   ` Ihor Radchenko
  2023-04-15 12:08                                     ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-15 11:57 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, dmitry, 62762

Eli Zaretskii <eliz@gnu.org> writes:

> It's up to you, I don't mind.  (But if you decide to go with defconst,
> maybe add a comment there explaining that this is the intent.)

I updated the docstring.
https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?h=bugfix&id=07508fb09

The commit is now included into the new bugfix release.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-15 11:57                                   ` Ihor Radchenko
@ 2023-04-15 12:08                                     ` Eli Zaretskii
  0 siblings, 0 replies; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-15 12:08 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, 62762

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: dmitry@gutov.dev, bzg@gnu.org, 62762@debbugs.gnu.org
> Date: Sat, 15 Apr 2023 11:57:57 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > It's up to you, I don't mind.  (But if you decide to go with defconst,
> > maybe add a comment there explaining that this is the intent.)
> 
> I updated the docstring.
> https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?h=bugfix&id=07508fb09
> 
> The commit is now included into the new bugfix release.

Thanks.  The change I made in Emacs is only on master, FYI.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-15 10:48                             ` Eli Zaretskii
  2023-04-15 11:36                               ` Ihor Radchenko
@ 2023-04-21 11:44                               ` Eli Zaretskii
  2023-04-21 15:28                                 ` Ihor Radchenko
  1 sibling, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-21 11:44 UTC (permalink / raw)
  To: yantar92, bzg; +Cc: dmitry, 62762

> Cc: bzg@gnu.org, dmitry@gutov.dev, 62762@debbugs.gnu.org
> Date: Sat, 15 Apr 2023 13:48:46 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > From: Ihor Radchenko <yantar92@posteo.net>
> > Cc: dmitry@gutov.dev, bzg@gnu.org, 62762@debbugs.gnu.org
> > Date: Thu, 13 Apr 2023 15:05:21 +0000
> > 
> > Eli Zaretskii <eliz@gnu.org> writes:
> > 
> > >> See the attached.
> > >> On Emacs side, `org--built-in-p' will need to be set during compilation.
> > >
> > > LGTM, will soon incorporate this in our build system.
> > 
> > Once you confirm that my patch + your build system update fixes the
> > problem, I will push to Org bugfix and bump a minor bugfix release.
> 
> I've now installed the change on master.
> 
> I wonder why org--built-in-p is a defconst, though: shouldn't it be a
> defvar instead?

This doesn't seem to work as expected here?  Here's what I get with
the latest update from master:

  '../src/emacs.exe' -batch --no-site-file --no-site-lisp --eval "(setq load-prefer-newer t byte-compile-warnings 'all)"  --eval "(setq org--built-in-p t)"  -f batch-byte-compile org/org-element.el
  Warning (emacs): Org version mismatch.  Org loading aborted.
  This warning usually appears when a built-in Org version is loaded prior to the more recent Org version.

  Version mismatch is commonly encountered in the following situations:

This seems to indicate that the compilation is aborted even though the
command line sets org--built-in-p non-nil.  What went wrong here?





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-21 11:44                               ` Eli Zaretskii
@ 2023-04-21 15:28                                 ` Ihor Radchenko
  2023-04-22  9:49                                   ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-21 15:28 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, dmitry, 62762

Eli Zaretskii <eliz@gnu.org> writes:

> This doesn't seem to work as expected here?  Here's what I get with
> the latest update from master:
>
>   '../src/emacs.exe' -batch --no-site-file --no-site-lisp --eval "(setq load-prefer-newer t byte-compile-warnings 'all)"  --eval "(setq org--built-in-p t)"  -f batch-byte-compile org/org-element.el
>   Warning (emacs): Org version mismatch.  Org loading aborted.
>   This warning usually appears when a built-in Org version is loaded prior to the more recent Org version.
>
>   Version mismatch is commonly encountered in the following situations:
>
> This seems to indicate that the compilation is aborted even though the
> command line sets org--built-in-p non-nil.  What went wrong here?

I see nothing wrong in the new version of the `org-assert-version'
macro. The only explanation I can come up with is that
`org-assert-version' from an older Org version somehow got mixed in.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-21 15:28                                 ` Ihor Radchenko
@ 2023-04-22  9:49                                   ` Eli Zaretskii
  2023-04-22 12:39                                     ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-22  9:49 UTC (permalink / raw)
  To: Ihor Radchenko, Stefan Monnier; +Cc: bzg, dmitry, 62762

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: bzg@gnu.org, dmitry@gutov.dev, 62762@debbugs.gnu.org
> Date: Fri, 21 Apr 2023 15:28:02 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > This doesn't seem to work as expected here?  Here's what I get with
> > the latest update from master:
> >
> >   '../src/emacs.exe' -batch --no-site-file --no-site-lisp --eval "(setq load-prefer-newer t byte-compile-warnings 'all)"  --eval "(setq org--built-in-p t)"  -f batch-byte-compile org/org-element.el
> >   Warning (emacs): Org version mismatch.  Org loading aborted.
> >   This warning usually appears when a built-in Org version is loaded prior to the more recent Org version.
> >
> >   Version mismatch is commonly encountered in the following situations:
> >
> > This seems to indicate that the compilation is aborted even though the
> > command line sets org--built-in-p non-nil.  What went wrong here?
> 
> I see nothing wrong in the new version of the `org-assert-version'
> macro. The only explanation I can come up with is that
> `org-assert-version' from an older Org version somehow got mixed in.

I think it's the defconst thingy.  E.g., with foo.el which says

  (defconst my-foo nil)

I cannot override the value from the command line:

  emacs -Q -batch --eval "(setq my-foo t)" -l foo.el --eval "(message \"%s\" my-foo)"
   => nil

But if I replace defconst with defvar, it yields t, as I'd expect.

So I think org--built-in-p should be a defvar, not defconst.  Or maybe
you can teach me how to override a defconst?  Stefan, any ideas?





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-22  9:49                                   ` Eli Zaretskii
@ 2023-04-22 12:39                                     ` Ihor Radchenko
  2023-04-22 12:48                                       ` Eli Zaretskii
  2023-04-22 14:32                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-22 12:39 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, dmitry, 62762, Stefan Monnier

Eli Zaretskii <eliz@gnu.org> writes:

> I think it's the defconst thingy.  E.g., with foo.el which says
>
>   (defconst my-foo nil)
>
> I cannot override the value from the command line:
>
>   emacs -Q -batch --eval "(setq my-foo t)" -l foo.el --eval "(message \"%s\" my-foo)"
>    => nil
>
> But if I replace defconst with defvar, it yields t, as I'd expect.
>
> So I think org--built-in-p should be a defvar, not defconst.  Or maybe
> you can teach me how to override a defconst?  Stefan, any ideas?

Well. I think I missed that `defconst', unlike `defvar', overrides the
existing variable value. Switching to `defvar' is ok. (Or, it might be
something like (eval-after-load 'org-macs ...), but I see no reason to
prefer it over switching to defvar).

I think it will be best to install the change in Emacs and then back-port
it to Org. Will it be ok?

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-22 12:39                                     ` Ihor Radchenko
@ 2023-04-22 12:48                                       ` Eli Zaretskii
  2023-04-22 14:32                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-22 12:48 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, 62762, monnier

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: Stefan Monnier <monnier@iro.umontreal.ca>, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org
> Date: Sat, 22 Apr 2023 12:39:42 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > So I think org--built-in-p should be a defvar, not defconst.  Or maybe
> > you can teach me how to override a defconst?  Stefan, any ideas?
> 
> Well. I think I missed that `defconst', unlike `defvar', overrides the
> existing variable value. Switching to `defvar' is ok. (Or, it might be
> something like (eval-after-load 'org-macs ...), but I see no reason to
> prefer it over switching to defvar).
> 
> I think it will be best to install the change in Emacs and then back-port
> it to Org. Will it be ok?

Sure, fine.

Thanks.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-11 18:35       ` Ihor Radchenko
  2023-04-11 18:51         ` Eli Zaretskii
@ 2023-04-22 14:30         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-04-22 14:59           ` Eli Zaretskii
  2023-04-23  9:21           ` Ihor Radchenko
  1 sibling, 2 replies; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-04-22 14:30 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, Eli Zaretskii, 62762

> I don't.  Say, why not to store hash of the macro sources in the byte
> code and verifying the hash when re-compilation is requested?  Though I
> am not that much familiar with Emacs source compilation.

In theory it's possible.  Nobody has worked on it :-)
Note that it's not just macros but defsubsts as well.

> Sure, in the context of Emacs compilation. The code in question is
> mostly aiming at newer Org installed on top of built-in Org. We are
> consistently getting issues related to incorrect macro expansion and
> mixing different Org versions.

Someone™ *really* needs to sit down and fix the underlying problem in
`package.el`.  The current "solution" in `package.el` *should* work (it
should reload the new `org-macs.el` on top of the old one, which
I think should avoid all the problems seen in practice for Org), so it
seems we just have a plain bug in the implementation of our "solution".
[ Which is good: it should be simple to fix, compared to trying to come
  up with another solution.  ]

>> Anyway, any other words of wisdom?  Like which org/*.el files actually
>> need to be recompiled in this case?  Or are you saying all of them
>> need to be recompiled?

[ BTW, `rm lisp/org/*.elc` is a better solution since it avoids changing
  timestamps on all those .el files.  ]

> What we might do to work around the problem is detecting Emacs compilation
> and disable the check.  Is there a way to detect that Emacs source is
> being compiled from Elisp?

This sounds like adding more brittle hacks on top of brittle hacks.

>> I also am not sure I understand the logic of this test: AFAIU it only
>> tests the version string, not the actual macros that might have been
>> changed.  Are you saying that Org bumps its version string each time
>> _any_ Org macro is modified?
>
> No. We originally tested by commit hash. Version string check is a
> trade-off between the problem with ELPA builds (see the links in my
> previous message) and the need to detect mixed installation problems.

BTW, have you tried to use a test along the lines of: look through
`load-history` to see if we loaded org-* files from a different directory
than the one in which `load-file-name` resides?
[ We may need to adjust the test to account for the `package.el`
  "solution" which will result in the above test detecting a mixed
  version situation even though it "should" work correctly.  ]


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-22 12:39                                     ` Ihor Radchenko
  2023-04-22 12:48                                       ` Eli Zaretskii
@ 2023-04-22 14:32                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-04-23  8:55                                         ` Ihor Radchenko
  1 sibling, 1 reply; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-04-22 14:32 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, Eli Zaretskii, 62762

Ihor Radchenko [2023-04-22 12:39:42] wrote:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>> I think it's the defconst thingy.  E.g., with foo.el which says
>>
>>   (defconst my-foo nil)
>>
>> I cannot override the value from the command line:
>>
>>   emacs -Q -batch --eval "(setq my-foo t)" -l foo.el --eval "(message \"%s\" my-foo)"
>>    => nil
>>
>> But if I replace defconst with defvar, it yields t, as I'd expect.
>>
>> So I think org--built-in-p should be a defvar, not defconst.  Or maybe
>> you can teach me how to override a defconst?  Stefan, any ideas?
>
> Well. I think I missed that `defconst', unlike `defvar', overrides the
> existing variable value. Switching to `defvar' is ok. (Or, it might be
> something like (eval-after-load 'org-macs ...), but I see no reason to
> prefer it over switching to defvar).
>
> I think it will be best to install the change in Emacs and then back-port
> it to Org. Will it be ok?

While you're there: could you rename that var?
I think it should be called `org--inhibit-version-check` (no "-p" since
it's a var and not a predicate, and more importantly no ill-defined
notion of "built-in").


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-22 14:30         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-04-22 14:59           ` Eli Zaretskii
  2023-04-23  9:21           ` Ihor Radchenko
  1 sibling, 0 replies; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-22 14:59 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: bzg, dmitry, yantar92, 62762

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Eli Zaretskii <eliz@gnu.org>,  bzg@gnu.org,  dmitry@gutov.dev,
>   62762@debbugs.gnu.org
> Date: Sat, 22 Apr 2023 10:30:01 -0400
> 
> [ BTW, `rm lisp/org/*.elc` is a better solution since it avoids changing
>   timestamps on all those .el files.  ]

With current VCSs, the time stamp of versioned files is more or less
random anyway.  So it isn't worth it trying too hard to keep those
random time stamps.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-22 14:32                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-04-23  8:55                                         ` Ihor Radchenko
  2023-04-24 11:21                                           ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-23  8:55 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: bzg, dmitry, Eli Zaretskii, 62762

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> I think it will be best to install the change in Emacs and then back-port
>> it to Org. Will it be ok?
>
> While you're there: could you rename that var?
> I think it should be called `org--inhibit-version-check` (no "-p" since
> it's a var and not a predicate, and more importantly no ill-defined
> notion of "built-in").

I have nothing against renaming. Feel free to do it together with
changing to `defvar'.

Let me know when you install the change on Emacs side. 

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-22 14:30         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-04-22 14:59           ` Eli Zaretskii
@ 2023-04-23  9:21           ` Ihor Radchenko
  2023-05-01  1:48             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-23  9:21 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: bzg, dmitry, Eli Zaretskii, 62762

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> I don't.  Say, why not to store hash of the macro sources in the byte
>> code and verifying the hash when re-compilation is requested?  Though I
>> am not that much familiar with Emacs source compilation.
>
> In theory it's possible.  Nobody has worked on it :-)
> Note that it's not just macros but defsubsts as well.

... and other define-inlines.

>> Sure, in the context of Emacs compilation. The code in question is
>> mostly aiming at newer Org installed on top of built-in Org. We are
>> consistently getting issues related to incorrect macro expansion and
>> mixing different Org versions.
>
> Someone™ *really* needs to sit down and fix the underlying problem in
> `package.el`.  The current "solution" in `package.el` *should* work (it
> should reload the new `org-macs.el` on top of the old one, which
> I think should avoid all the problems seen in practice for Org), so it
> seems we just have a plain bug in the implementation of our "solution".
> [ Which is good: it should be simple to fix, compared to trying to come
>   up with another solution.  ]

AFAIK, the current re-loading approach in package.el does help.
But not all the Org users are using that new Emacs versions.
And not all the Org users are using package.el.

>> What we might do to work around the problem is detecting Emacs compilation
>> and disable the check.  Is there a way to detect that Emacs source is
>> being compiled from Elisp?
>
> This sounds like adding more brittle hacks on top of brittle hacks.

Sure. But I really have no better ideas, especially considering backward
compatibility requirements down to Emacs 26.

>> No. We originally tested by commit hash. Version string check is a
>> trade-off between the problem with ELPA builds (see the links in my
>> previous message) and the need to detect mixed installation problems.
>
> BTW, have you tried to use a test along the lines of: look through
> `load-history` to see if we loaded org-* files from a different directory
> than the one in which `load-file-name` resides?

Yup. Several problems here:
1. Not all the org-* files are a part of Org.
2. This will completely block the possibility for users to provide custom
   versions of Org libraries, when they need to.
3. We actually have `org-version' that is using this approach to
   indicate problems without blocking staff, but it still misses many
   cases.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-23  8:55                                         ` Ihor Radchenko
@ 2023-04-24 11:21                                           ` Eli Zaretskii
  2023-04-24 12:29                                             ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-04-24 11:21 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, 62762, monnier

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: Eli Zaretskii <eliz@gnu.org>, bzg@gnu.org, dmitry@gutov.dev,
>  62762@debbugs.gnu.org
> Date: Sun, 23 Apr 2023 08:55:45 +0000
> 
> Stefan Monnier <monnier@iro.umontreal.ca> writes:
> 
> >> I think it will be best to install the change in Emacs and then back-port
> >> it to Org. Will it be ok?
> >
> > While you're there: could you rename that var?
> > I think it should be called `org--inhibit-version-check` (no "-p" since
> > it's a var and not a predicate, and more importantly no ill-defined
> > notion of "built-in").
> 
> I have nothing against renaming. Feel free to do it together with
> changing to `defvar'.
> 
> Let me know when you install the change on Emacs side. 

Done.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-24 11:21                                           ` Eli Zaretskii
@ 2023-04-24 12:29                                             ` Ihor Radchenko
  2023-11-24 17:43                                               ` Dmitry Gutov
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-04-24 12:29 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, dmitry, Kyle Meyer, 62762, monnier

Eli Zaretskii <eliz@gnu.org> writes:

>> Let me know when you install the change on Emacs side. 
>
> Done.

Thanks!
Backported: https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=8eb209984
Kyle, let me know if I did anything wrong.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-23  9:21           ` Ihor Radchenko
@ 2023-05-01  1:48             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-01 10:25               ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-01  1:48 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, Eli Zaretskii, 62762

>> BTW, have you tried to use a test along the lines of: look through
>> `load-history` to see if we loaded org-* files from a different directory
>> than the one in which `load-file-name` resides?
>
> Yup. Several problems here:
> 1. Not all the org-* files are a part of Org.

Ah right, we can't just match "org-*", indeed.

Maybe if we can identify a "first org-*.el file" (i.e. a file which
*any* use of some part of Org mode would necessarily load pretty early
on), then we can reduce this check to:

- check if that "first org-*.el file" is already loaded.
- if no, load it
- if yes, compare the output of `locate-file` to what is found in
  `load-history`, and in case it doesn't match (because of a new
  directory in `load-path`), signal an error (or maybe force a reload
  instead?).

We could even provide a new `require-with-shadow-check` function that
does just that.


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-01  1:48             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-05-01 10:25               ` Ihor Radchenko
  2023-05-01 16:49                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-05-01 10:25 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: bzg, dmitry, Eli Zaretskii, 62762

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> Maybe if we can identify a "first org-*.el file" (i.e. a file which
> *any* use of some part of Org mode would necessarily load pretty early
> on), then we can reduce this check to:

Such file is org-macs.el

> - check if that "first org-*.el file" is already loaded.
> - if no, load it
> - if yes, compare the output of `locate-file` to what is found in
>   `load-history`, and in case it doesn't match (because of a new
>   directory in `load-path`), signal an error (or maybe force a reload
>   instead?).
>
> We could even provide a new `require-with-shadow-check` function that
> does just that.

May you provide an approximate code for that function?

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-01 10:25               ` Ihor Radchenko
@ 2023-05-01 16:49                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-02 11:26                   ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-01 16:49 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, Eli Zaretskii, 62762

> May you provide an approximate code for that function?

Something like (guaranteed 100% untested):

    (defun my-require-with-shadow-check (feature &optional reload)
      (if (not (featurep feature))
          (require feature)
        (let ((file (locate-file (symbol-name feature)
                                 load-path (get-load-suffixes))))
          (if (assoc file load-history)
              ;; The desired file is already loaded, we're clear!
              nil
            ;; The feature is already provided, but from some other file
            ;; than expected.  Presumably because `load-path` has been
            ;; changed since the file was loaded.  This is likely a sign
            ;; that we're loading a mix of files from different versions.
            ;; That can spell trouble.
            (if reload
                ;; Try and fix the situation by force-reloading the file
                ;; This may fix the problem but only if that file doesn't
                ;; `require` any other affected file, or if it also
                ;; uses `my-require-with-shadow-check` to similarly reload
                ;; any other affected file.
                (load file nil t t)
              ;; We could try and find the "other/older" file in `load-history`
              ;; to provide better feedback to the user.
              (error "Mixed versions!!"))))))


-- Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-01 16:49                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-05-02 11:26                   ` Ihor Radchenko
  2023-05-02 13:12                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-05-02 11:26 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: bzg, dmitry, Eli Zaretskii, 62762

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> May you provide an approximate code for that function?
>
> Something like (guaranteed 100% untested):
>
>     (defun my-require-with-shadow-check (feature &optional reload)

Thanks!
This looks interesting, if we replace all the requires in Org with
`my-require-with-shadow-check'.

Although, AFAIU, it does not address the problem with stale .elc files
kept from the previous Org version in the same folder (AFAIR, it is what
often happens in ELPA builds).

And we somehow need to make sure that `my-require-with-shadow-check' is
available for all its users. Just like with `org-assert-version', older
Org may not provide the function and compilation/loading can fail with
"Symbol function is void".

Your idea with providing built-in `require-with-shadow-check` will
partially solve the latter problem. At least, on the latest Emacs.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-02 11:26                   ` Ihor Radchenko
@ 2023-05-02 13:12                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-03 10:30                       ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-02 13:12 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: bzg, dmitry, Eli Zaretskii, 62762

>>> May you provide an approximate code for that function?
>>
>> Something like (guaranteed 100% untested):
>>
>>     (defun my-require-with-shadow-check (feature &optional reload)
>
> Thanks!
> This looks interesting, if we replace all the requires in Org with
> `my-require-with-shadow-check'.

If we make it signal an error, then I think we only need it for the
requires that load "the one first file" (which you suggest could be
`org-macs.el`).

> Although, AFAIU, it does not address the problem with stale .elc files
> kept from the previous Org version in the same folder (AFAIR, it is what
> often happens in ELPA builds).

I don't understand what you mean here: when `package.el` compiles the
files of the Org package, that package has just been untarred into
a fresh new directory, so there should never be any stale `.elc` files
in there.

Stale `.elc` files can happen for "in place builds", such as when doing
`git pull; make` in Emacs's source directory, but we just disabled
the mixed-version check for that case...

> And we somehow need to make sure that `my-require-with-shadow-check' is
> available for all its users.

Ah, the fun of bootstrapping :-)


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-02 13:12                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-05-03 10:30                       ` Ihor Radchenko
  2023-05-03 21:37                         ` Alan Mackenzie
  2023-05-04 15:31                         ` Max Nikulin
  0 siblings, 2 replies; 110+ messages in thread
From: Ihor Radchenko @ 2023-05-03 10:30 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: bzg, dmitry, Eli Zaretskii, 62762, Max Nikulin

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> This looks interesting, if we replace all the requires in Org with
>> `my-require-with-shadow-check'.
>
> If we make it signal an error, then I think we only need it for the
> requires that load "the one first file" (which you suggest could be
> `org-macs.el`).

This might work.

Max, do you see any obvious downsides in Stefan's idea about consulting
`load-history' vs. `load-path'?

>> Although, AFAIU, it does not address the problem with stale .elc files
>> kept from the previous Org version in the same folder (AFAIR, it is what
>> often happens in ELPA builds).
>
> I don't understand what you mean here: when `package.el` compiles the
> files of the Org package, that package has just been untarred into
> a fresh new directory, so there should never be any stale `.elc` files
> in there.

I am referring to https://orgmode.org/list/jwvsfkv5s7l.fsf-monnier+emacs@gnu.org

>> And we somehow need to make sure that `my-require-with-shadow-check' is
>> available for all its users.
>
> Ah, the fun of bootstrapping :-)

I guess that the cleanest way could be putting
`require-with-shadow-check' into a new file. Then, we have no chance of
this file being loaded by old Org version.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-03 10:30                       ` Ihor Radchenko
@ 2023-05-03 21:37                         ` Alan Mackenzie
  2023-05-04  5:35                           ` Eli Zaretskii
  2023-05-04 15:31                         ` Max Nikulin
  1 sibling, 1 reply; 110+ messages in thread
From: Alan Mackenzie @ 2023-05-03 21:37 UTC (permalink / raw)
  To: Ihor Radchenko
  Cc: 62762, bzg, dmitry, Stefan Monnier, Eli Zaretskii, Max Nikulin

Hello, Ihor.

It occurs to me that perhaps the CC Mode solution to the original
problem might be useful.  It was written by my predecessor at CC Mode,
Martin Stjernholm.  In ~20 years of using it, I've never had problems
with using incorrect versions of macros, or anything like that.

To quote part of the commentary from lisp/progmodes/cc-bytecomp.el:

;; This file is used to ensure that the CC Mode files are correctly
;; compiled regardless the environment (e.g. if an older CC Mode with
;; outdated macros are loaded during compilation).  It also provides
;; features to defeat the compiler warnings for selected symbols.

It works by pushing the correct directories onto load-path at the start
of each compilation, and popping them off again at the end.

Feel free to consider using this approach!

-- 
Alan Mackenzie (Nuremberg, Germany).



On Wed, May 03, 2023 at 10:30:55 +0000, Ihor Radchenko wrote:
> Stefan Monnier <monnier@iro.umontreal.ca> writes:

> >> This looks interesting, if we replace all the requires in Org with
> >> `my-require-with-shadow-check'.
> >
> > If we make it signal an error, then I think we only need it for the
> > requires that load "the one first file" (which you suggest could be
> > `org-macs.el`).

> This might work.

> Max, do you see any obvious downsides in Stefan's idea about consulting
> `load-history' vs. `load-path'?

> >> Although, AFAIU, it does not address the problem with stale .elc files
> >> kept from the previous Org version in the same folder (AFAIR, it is what
> >> often happens in ELPA builds).
> >
> > I don't understand what you mean here: when `package.el` compiles the
> > files of the Org package, that package has just been untarred into
> > a fresh new directory, so there should never be any stale `.elc` files
> > in there.

> I am referring to https://orgmode.org/list/jwvsfkv5s7l.fsf-monnier+emacs@gnu.org

> >> And we somehow need to make sure that `my-require-with-shadow-check' is
> >> available for all its users.
> >
> > Ah, the fun of bootstrapping :-)

> I guess that the cleanest way could be putting
> `require-with-shadow-check' into a new file. Then, we have no chance of
> this file being loaded by old Org version.

> -- 
> Ihor Radchenko // yantar92,
> Org mode contributor,
> Learn more about Org mode at <https://orgmode.org/>.
> Support Org development at <https://liberapay.com/org-mode>,
> or support my work at <https://liberapay.com/yantar92>







^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-03 21:37                         ` Alan Mackenzie
@ 2023-05-04  5:35                           ` Eli Zaretskii
  2023-05-04 14:02                             ` Alan Mackenzie
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-04  5:35 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: yantar92, 62762, bzg, dmitry, monnier, manikulin

> Date: Wed, 3 May 2023 21:37:11 +0000
> Cc: Stefan Monnier <monnier@iro.umontreal.ca>, bzg@gnu.org, dmitry@gutov.dev,
>   Eli Zaretskii <eliz@gnu.org>, 62762@debbugs.gnu.org,
>   Max Nikulin <manikulin@gmail.com>
> From: Alan Mackenzie <acm@muc.de>
> 
> It occurs to me that perhaps the CC Mode solution to the original
> problem might be useful.  It was written by my predecessor at CC Mode,
> Martin Stjernholm.  In ~20 years of using it, I've never had problems
> with using incorrect versions of macros, or anything like that.

No, the situation with CC Mode solution is far from ideal.  It's the
reason that we have had the dependencies below in lisp/Makefile.in for
the past 15 years:

  # https://debbugs.gnu.org/1004
  # CC Mode uses a compile time macro system which causes a compile time
  # dependency in cc-*.elc files on the macros in other cc-*.el and the
  # version string in cc-defs.el.
  $(lisp)/progmodes/cc-align.elc\
   $(lisp)/progmodes/cc-cmds.elc $(lisp)/progmodes/cc-compat.elc\
   $(lisp)/progmodes/cc-engine.elc $(lisp)/progmodes/cc-fonts.elc\
   $(lisp)/progmodes/cc-langs.elc $(lisp)/progmodes/cc-menus.elc\
   $(lisp)/progmodes/cc-mode.elc $(lisp)/progmodes/cc-styles.elc\
   $(lisp)/progmodes/cc-vars.elc: \
     $(lisp)/progmodes/cc-bytecomp.elc $(lisp)/progmodes/cc-defs.elc

  $(lisp)/progmodes/cc-align.elc $(lisp)/progmodes/cc-cmds.elc: \
     $(lisp)/progmodes/cc-vars.elc $(lisp)/progmodes/cc-engine.elc

  $(lisp)/progmodes/cc-compat.elc: \
     $(lisp)/progmodes/cc-vars.elc $(lisp)/progmodes/cc-styles.elc \
     $(lisp)/progmodes/cc-engine.elc

  $(lisp)/progmodes/cc-defs.elc: $(lisp)/progmodes/cc-bytecomp.elc

  $(lisp)/progmodes/cc-engine.elc: $(lisp)/progmodes/cc-langs.elc \
     $(lisp)/progmodes/cc-vars.elc

  $(lisp)/progmodes/cc-fonts.elc: $(lisp)/progmodes/cc-langs.elc \
     $(lisp)/progmodes/cc-vars.elc $(lisp)/progmodes/cc-engine.elc

  $(lisp)/progmodes/cc-langs.elc: $(lisp)/progmodes/cc-vars.elc

  $(lisp)/progmodes/cc-mode.elc: $(lisp)/progmodes/cc-langs.elc \
     $(lisp)/progmodes/cc-vars.elc $(lisp)/progmodes/cc-engine.elc \
     $(lisp)/progmodes/cc-styles.elc $(lisp)/progmodes/cc-cmds.elc \
     $(lisp)/progmodes/cc-align.elc $(lisp)/progmodes/cc-menus.elc

  $(lisp)/progmodes/cc-styles.elc: $(lisp)/progmodes/cc-vars.elc \
     $(lisp)/progmodes/cc-align.elc

Each time some of the cc-*.el files change we recompile all of them.
The difference between this and Org is that Org has many more files,
so spelling out their dependencies is impractical (that was the first
possible solution I thought about when I tried to solve the Org
issue).





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-04  5:35                           ` Eli Zaretskii
@ 2023-05-04 14:02                             ` Alan Mackenzie
  2023-05-04 14:10                               ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Alan Mackenzie @ 2023-05-04 14:02 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, manikulin

Hello, Eli.

On Thu, May 04, 2023 at 08:35:55 +0300, Eli Zaretskii wrote:
> > Date: Wed, 3 May 2023 21:37:11 +0000
> > Cc: Stefan Monnier <monnier@iro.umontreal.ca>, bzg@gnu.org, dmitry@gutov.dev,
> >   Eli Zaretskii <eliz@gnu.org>, 62762@debbugs.gnu.org,
> >   Max Nikulin <manikulin@gmail.com>
> > From: Alan Mackenzie <acm@muc.de>
> > 
> > It occurs to me that perhaps the CC Mode solution to the original
> > problem might be useful.  It was written by my predecessor at CC Mode,
> > Martin Stjernholm.  In ~20 years of using it, I've never had problems
> > with using incorrect versions of macros, or anything like that.

> No, the situation with CC Mode solution is far from ideal.  It's the
> reason that we have had the dependencies below in lisp/Makefile.in for
> the past 15 years:

The dependencies in Lisp/Makefile are there because there are actual
dependencies between the CC Mode source files.  I think this is
orthogonal to the problems in upstream CC Mode which Martin Stjernholm
solved (or, at least, worked around) with cc-bytecomp.el.  They were to
do with getting versions of macro files mixed up.  If I've understood
Ihor correctly (about which I'm far from sure), org was suffering the
same problem as CC Mode was ~20 years ago, and that is the reason for
the version check in org's build system.

Unfortunately, org's fix for its upstream problem leaks downstream into
Emacs and causes build failure, or at the very least _has_ caused such
failure.  My last post was suggesting that the mechanism in
cc-bytecomp.el might be able to take the place of that version check,
causing less aggravation for those building Emacs.

>   # https://debbugs.gnu.org/1004
>   # CC Mode uses a compile time macro system which causes a compile time
>   # dependency in cc-*.elc files on the macros in other cc-*.el and the
>   # version string in cc-defs.el.

[ .... ]

> Each time some of the cc-*.el files change we recompile all of them.
> The difference between this and Org is that Org has many more files,
> so spelling out their dependencies is impractical (that was the first
> possible solution I thought about when I tried to solve the Org
> issue).

There are other subprojects in Emacs with several/many source files,
such as gnus, cedet, and calc.  How do they manage to stay coherent
without special mechanisms?

-- 
Alan Mackenzie (Nuremberg, Germany).





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-04 14:02                             ` Alan Mackenzie
@ 2023-05-04 14:10                               ` Eli Zaretskii
  0 siblings, 0 replies; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-04 14:10 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: yantar92, 62762, bzg, dmitry, monnier, manikulin

> Date: Thu, 4 May 2023 14:02:37 +0000
> Cc: yantar92@posteo.net, monnier@iro.umontreal.ca, bzg@gnu.org,
>   dmitry@gutov.dev, 62762@debbugs.gnu.org, manikulin@gmail.com
> From: Alan Mackenzie <acm@muc.de>
> 
> > No, the situation with CC Mode solution is far from ideal.  It's the
> > reason that we have had the dependencies below in lisp/Makefile.in for
> > the past 15 years:
> 
> The dependencies in Lisp/Makefile are there because there are actual
> dependencies between the CC Mode source files.

The same is true for Org.  The reason for the dependency is
immaterial; the result is the same.

> > Each time some of the cc-*.el files change we recompile all of them.
> > The difference between this and Org is that Org has many more files,
> > so spelling out their dependencies is impractical (that was the first
> > possible solution I thought about when I tried to solve the Org
> > issue).
> 
> There are other subprojects in Emacs with several/many source files,
> such as gnus, cedet, and calc.  How do they manage to stay coherent
> without special mechanisms?

The "secret" is not to use macros, or use them as little as possible.
Stale expanded macros from *.elc files cause breakage.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-03 10:30                       ` Ihor Radchenko
  2023-05-03 21:37                         ` Alan Mackenzie
@ 2023-05-04 15:31                         ` Max Nikulin
  2023-05-04 21:53                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-04 15:31 UTC (permalink / raw)
  To: Ihor Radchenko, Stefan Monnier
  Cc: bzg, dmitry, Eli Zaretskii, 62762, Alan Mackenzie

On 03/05/2023 17:30, Ihor Radchenko wrote:
> Stefan Monnier writes:
> 
>>> This looks interesting, if we replace all the requires in Org with
>>> `my-require-with-shadow-check'.
...
> Max, do you see any obvious downsides in Stefan's idea about consulting
> `load-history' vs. `load-path'?

First of all, I think, incremental builds are broken in Emacs. 
`org-assert-version' is just the most apparent manifestation.

gcc supports generation of dependency files as a side effect of 
preprocessing for decades, see
- (info "(make) Automatic-Prerequisites")
 
https://www.gnu.org/software/make/manual/html_node/Automatic-Prerequisites.html
- https://gcc.gnu.org/news/dependencies.html
   Dependency Generation Improvements. 22 January 2001
- https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html#index-MF

The idea is that clean build does not require dependency map. For a 
rebuild, .d files are included into Makefile, so make is able to 
determine proper order of compilation.

Perhaps a similar trick may be done in elisp by advicing e.g. `load'.

Instead of dependency tracking Makefile in Emacs uses much more limited 
approach with the main-first target. That is why incremental build may 
easily result in mixed-version compilation. Imprinted Org version just 
detects such case.

By the way, generated dependency map might help to properly reload a 
package update without restarting of Emacs.

It seems, despite "make" in the bug title, it has been decided to 
dedicate this issue to plumbing of `org-assert-version'.

Inspecting `load-history' might be tried, however such approach may 
cause other issues.

I have heard that some users complain concerning Emacs startup time. 
Likely a hashmap will be required in addition to the `load-history' list 
to avoid performance degradation. I am unsure if the following idea have 
some benefits: check shadowing when `load-path' is modified, not for 
each file loaded from the newly added directory.

I am unsure that path comparison is able to detect a problem when a user 
reloads Org after git pull and compiling new version. Files with new 
functions and macros are loaded from the same directory.

In respect to incremental builds, `org-assert-version' is a disaster. 
Any update requires full recompiling. It is a reason why I always 
considered it as a kludge. Unfortunately I do not have a better idea.

We need a tool that clearly informs users that they have issues with 
their configuration files, multiple versions of a package are available 
and it causes mixed version loading with inconsistent function 
definitions or, even worse, mixed version compiling with obsolete macro 
definitions. Emacs restart with fixed loading does not help in the 
latter case.

Before introducing of `org-assert-version', errors were obscure: 
undefined functions or incompatible arguments (for internal functions). 
Unfortunately `org-assert-version' have caused another stream of complains.

The issue is not limited to package.el or replacing built-in package. 
Various ways to load packages are used, so a couple of versions may 
appear in load-path even for non built-in package.

The tool should detect version mismatch during loading, reloading, and 
compiling of an update.

I think, both aspects must be addressed:
- Improving dependency handling during incremental builds
- Informing users about issues with loading of multi-file packages.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-04 15:31                         ` Max Nikulin
@ 2023-05-04 21:53                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-05  4:18                             ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-04 21:53 UTC (permalink / raw)
  To: Max Nikulin
  Cc: Ihor Radchenko, 62762, bzg, dmitry, Alan Mackenzie, Eli Zaretskii

> First of all, I think, incremental builds are broken in Emacs.

Indeed, but in practice they usually work fine.  So in the absence of
a better solution, we stay with this hack and tell people to try
`make bootstrap` when there's a problem.

Also, the use of `load-prefer-newer` in lisp/Makefile eliminates most of
the brokenness we used to have in our incremental builds.

> `org-assert-version' is just the most apparent manifestation.

AFAIK `org-assert-version` tries to solve a different problem.  Indeed,
we recently introduced `org--inhibit-version-check` specifically so as
not to use `org-assert-version` for Emacs's broken incremental builds
(i.e. we decided we preferred that brokenness there).

> gcc supports generation of dependency files as a side effect of
> preprocessing for decades, see
[...]
> Perhaps a similar trick may be done in elisp by advicing e.g. `load'.

I encourage people to try that out, yes.
Having been there (many years ago), I can already warn them that an
important problem will be the presence of cyclic dependencies.

> Instead of dependency tracking Makefile in Emacs uses much more limited
> approach with the main-first target.

Hmm... no, `main-first` doesn't have much to do with dependencies (and
things like deciding when to *re*compile a file), it's concerned with
compile-time performance (typically for the first compilation, when the
`.d` dependencies wouldn't be available yet).

> That is why incremental build may easily result in mixed-version
> compilation.

Actually, now that we set `load-prefer-newer`, it is rarely a problem.
[ Of course, it can still be a problem, but only in cases such as when
  a macro is changed such that the old expansion is not compatible with
  code using the new definitions.  This happens (e.g. when we changed
  structs to use `record` instead of `vector`), but not fairly rarely.  ]

> By the way, generated dependency map might help to properly reload a package
> update without restarting of Emacs.

BTW, I was reminded recently that `load-history` keeps track of
`require`s so we already have most of that info at hand.

> I have heard that some users complain concerning Emacs startup time. Likely
> a hashmap will be required in addition to the `load-history' list to avoid
> performance degradation. I am unsure if the following idea have some
> benefits: check shadowing when `load-path' is modified, not for each file
> loaded from the newly added directory.

The idea was to check the shadowing only for one specific file, so as to
try and keep the added cost in check.  Checking shadowings when
`load-path` is modified is harder (because `load-history` doesn't
remember which name was used to load a file, so it could be confused and
think a file like `lisp/progmodes/compile.el` shadows a previously
loaded `lisp/cedet/srecode/compile.el`) and could be more costly
(because it has to check for "all" files).

> I am unsure that path comparison is able to detect a problem when a user
> reloads Org after git pull and compiling new version.

[ AFAICT, there are different situations with related yet different
  problems that manifest slightly differently and that may be solved
  differently as well, so please be specific when you mention
  problematic scenarios.  ]

If you mean `git pull; make` in Emacs's source code, then AFAIK this
should almost never be a problem (thanks to `load-prefer-newer`), and if
it is, it's a general problem that's not specific to Org, and "we"
changed `org-assert-version` so as not to bother trying to solve
this case.

If you mean `git pull; make` in Org's source repository, then I must
admit that I don't have much experience with it, but make Org's make
file could set `load-prefer-newer` (or use some hack to autogenerate
`.d` dependency files :-).

`my-require-with-shadow-check` is instead aimed at the case where the
users try to load a mix of two different Org versions in the same Emacs
sessions, either because of things like:
- they're byte-compiling Org-2 in an Emacs that has Org-1 already loaded.
- they inadvertently end up loading part of Org-1 early in their init
  file before they set their `load-path` to point to Org-2.

I understand Org people have had lots of problems with mixed-versions in
the past, but I personally don't know which circumstances have been more
often at the source of those problems, so maybe my suggestion addresses
a problem that's not very important, indeed.

I my own experience `git pull; make` in Emacs's source code has
virtually never caused me trouble with Org files, and it's never cause
any trouble in my checkout of Org's source code either, which is why
I'm suggesting something like `my-require-with-shadow-check`, which
targets other scenarios.

> In respect to incremental builds, `org-assert-version' is a disaster.
> Any update requires full recompiling.

Indeed, I used to disable it locally (before `org--inhibit-version-check`).

> It is a reason why I always considered it as a kludge.  Unfortunately
> I do not have a better idea.

Maybe a clear set of examples of the kinds of problems that
`org-assert-version` aims to catch would be a good start.
For me it's still not really clear.

> The issue is not limited to package.el or replacing built-in package.
> Various ways to load packages are used, so a couple of versions may
> appear in load-path even for non built-in package.

So far I haven't seen enough of the diversity of situations are (source
of) problems to have a clear idea of what a good solution should look
like, admittedly.

`my-require-with-shadow-check` is only based on my intuition that it
might catch the most common issues where two different Org versions are
used in the same Emacs session, which seems to cover most of the
problems (except for those due to `git pull; make`, which seem to be
qualitatively of a different kind).


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-04 21:53                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-05-05  4:18                             ` Max Nikulin
  2023-05-05  5:27                               ` Max Nikulin
  2023-05-05 14:29                               ` bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 110+ messages in thread
From: Max Nikulin @ 2023-05-05  4:18 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Ihor Radchenko, 62762, bzg, dmitry, Alan Mackenzie, Eli Zaretskii

On 05/05/2023 04:53, Stefan Monnier wrote:
>> First of all, I think, incremental builds are broken in Emacs.
> 
> Indeed, but in practice they usually work fine.
...
> Also, the use of `load-prefer-newer` in lisp/Makefile eliminates most of
> the brokenness we used to have in our incremental builds.

`load-prefer-newer' is a kludge as well. E.g. Python people migrated 
from comparison of timestamps to inscribing of .py file hash into byte 
compiled .pyc files. So if the hash in .pyc does not match .py content 
then .pyc file is recompiled or just ignored.

By the way, `load-prefer-newer' make things even worse in the case of 
`org-assert-version' when full dependency tree is not available. I have 
tried to add dependency for all lisp/org/*.elc files on 
lisp/org/org-macs.elc and lisp/org/org-version.el, but it is not enough. 
During recompilation `require' prefers .elc files (.el files not 
changed, so they are older) with inscribed stale `org-version' causing 
compilation error. If .el files were loaded, recompiling would be 
slower, but with up to date macro definitions. So in general, due to 
`load-prefer-newer' the chance to get stale macro during incremental 
build is higher than .el files are preferred. I admit, it is not common 
case when definition of a macro depends on another macro loaded from 
another file.

I am unsure if it is possible to express in make that all lisp/org/*.elc 
files must be removed on change of 
lisp/org/{org-version.el,org-macs.el}. It might alleviate the issue till 
implementation of properly dependency tracking.

>> `org-assert-version' is just the most apparent manifestation.
> 
> AFAIK `org-assert-version` tries to solve a different problem.

Of course `org-assert-version' was introduced to solve another problem, 
but it highlighted issues with dependency handling during incremental 
builds.

> Indeed,
> we recently introduced `org--inhibit-version-check` specifically so as
> not to use `org-assert-version` for Emacs's broken incremental builds
> (i.e. we decided we preferred that brokenness there).

`org--inhibit-version-check' is even uglier kludge that partially 
deactivated `org-assert-version' and just hides the issue with 
dependencies for incremental builds.

>> gcc supports generation of dependency files as a side effect of
>> preprocessing for decades, see
> [...]
>> Perhaps a similar trick may be done in elisp by advicing e.g. `load'.

Another idea: while single file is compiled per emacs invocation 
`load-history' may be compared before and after byte compilation.

> I can already warn them that an
> important problem will be the presence of cyclic dependencies.

In the C and C++ world the solution for cyclic dependencies is forward 
declarations. Some kind of such approach I see in Org as well. 
lisp/org/ol.el and lisp/org/org-element.el are mutually dependent. 
org-element.el requires 'ol, while the latter just declares functions 
from 'org-element.

When dependency files are generated, it is possible to create a report 
on cyclic dependency and to disentangle them.

>> Instead of dependency tracking Makefile in Emacs uses much more limited
>> approach with the main-first target.
> 
> Hmm... no, `main-first` doesn't have much to do with dependencies (and
> things like deciding when to *re*compile a file), it's concerned with
> compile-time performance (typically for the first compilation, when the
> `.d` dependencies wouldn't be available yet).

My impression is that main-first defines order of compilation. In this 
sense it servers for the same purpose as dependencies.

>> By the way, generated dependency map might help to properly reload a package
>> update without restarting of Emacs.
> 
> BTW, I was reminded recently that `load-history` keeps track of
> `require`s so we already have most of that info at hand.

I agree that heuristics based on `load-history' mostly works, but I 
suspect corner cases might exist. I have not inspected `org-reload' 
closely and what Emacs core offers instead.

> The idea was to check the shadowing only for one specific file, so as to
> try and keep the added cost in check.

That specific file must be checked for each file loaded from the updated 
directory. So hash O(1) should be better than scanning the list.

>> I am unsure that path comparison is able to detect a problem when a user
>> reloads Org after git pull and compiling new version.
> 
> If you mean `git pull; make` in Emacs's source code,

I mean reloading of updated Org from a clone of the org-mode repository 
to emacs installed as a system package (or as an independent custom 
built). A recent case where origin of the problem remained obscure:

Colin Baxter to emacs-orgmode. Why am I being told to use "straight.el"? 
Fri, 21 Apr 2023 10:42:27 +0100. 
https://list.orgmode.org/87ildpbmgs.fsf@yandex.com

Notice that mixed version loading may happen without changing of 
`load-path'. New org is loaded from the same directory.

> If you mean `git pull; make` in Org's source repository, then I must
> admit that I don't have much experience with it, but make Org's make
> file could set `load-prefer-newer`

Not enough, see beginning of the message.

> `my-require-with-shadow-check` is instead aimed at the case where the
> users try to load a mix of two different Org versions in the same Emacs
> sessions, either because of things like:
> - they're byte-compiling Org-2 in an Emacs that has Org-1 already loaded.

Does in help in the following case?
1. Base Org part is loaded on opening of some .org file.
2. Org in that directory is updated and recompiled.
3. New Org feature is loaded (autoloaded or by explicit call of e.g.
    (require ob-shell))

> I my own experience `git pull; make` in Emacs's source code has
> virtually never caused me trouble with Org files,

I recall issues after introducing of `org-encode-time' and finally Ihor 
replaced original macro to a less efficient function. However I am not 
sure what was the real reason:
- Some issue with conditional macro definition and native compilation
- Incomplete incremental rebuilds
- Macro was not properly defined so it was disappearing from byte 
compiled code.
However "undefined" complains might be similar to what I saw for 
`org-assert-version'.

>> In respect to incremental builds, `org-assert-version' is a disaster.
>> Any update requires full recompiling.
> 
> Indeed, I used to disable it locally (before `org--inhibit-version-check`).

By disaster I mean increased build time. `org--inhibit-version-check' 
allows mixed version compilation for macros unrelated to 
`org-assert-version', it is another disaster.

> Maybe a clear set of examples of the kinds of problems that
> `org-assert-version` aims to catch would be a good start.
> For me it's still not really clear.

- You are almost certainly going to ignore package.el issues in released 
Emacs versions including 28.
- Besides package.el there are other package managers. I have heard of 
weird issues with straight.el and org, but I have no links describing 
details.
- Some users just clone org-mode repository and add that directory to 
`load-path'. Directory remains the same after updates.
- Users tend to load some part of org before adding new version to 
load-path: explicit require, through dependencies, unsure if org file as 
startup screen may cause it as well
- User wish to update Org without restarting of Emacs. Recompiling may 
be called from Emacs (e.g. package.el) or by make or other scripts.

The goals:
- prevent mixed version compiling
- prevent mixed version loading
- error message should be clear for users explaining what actions they 
should perform for recovery from broken state.

I have not isolated an issue in Emacs-28 with package.el and difference 
with emacs binary is running from source tree or from install tree 
(.el+.elc vs. el.gz+.elc files in the directory with built-in Org and 
preference of .el vs. elc in require), so I can not tell if it affects 
other package managers in newer Emacs. It is the case when 
`org-assert-version' prevents loading of mixed compilation result, but 
user experience is terrible since simple recompilation does not help.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05  4:18                             ` Max Nikulin
@ 2023-05-05  5:27                               ` Max Nikulin
  2023-05-05  6:46                                 ` Eli Zaretskii
  2023-05-05 14:29                               ` bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-05  5:27 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Ihor Radchenko, 62762, bzg, dmitry, Alan Mackenzie, Eli Zaretskii

On 05/05/2023 11:18, Max Nikulin wrote:
> On 05/05/2023 04:53, Stefan Monnier wrote:
>> Also, the use of `load-prefer-newer` in lisp/Makefile eliminates most of
>> the brokenness we used to have in our incremental builds.
> 
> `load-prefer-newer' is a kludge as well. E.g. Python people migrated 
> from comparison of timestamps to inscribing of .py file hash into byte 
> compiled .pyc files. So if the hash in .pyc does not match .py content 
> then .pyc file is recompiled or just ignored.

I have realized that neither `load-prefer-newer' not checking hash of 
the source .el file can help per se when an .elc file becomes stale due 
to update of a macro in a require'd file.

The robust way is to define compilation order through dependencies, 
preferably autogenerated ones). An alternative is to hope that usually 
it does not hurt and you are ready to remove .elc files (e.g. by make 
bootstrap) when you faced an apparent error or just suspect mixed 
version compilation as the cause of noticed strange behavior (I named 
this broken incremental builds).





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05  5:27                               ` Max Nikulin
@ 2023-05-05  6:46                                 ` Eli Zaretskii
  2023-05-05  7:27                                   ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-05  6:46 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Fri, 5 May 2023 12:27:25 +0700
> From: Max Nikulin <manikulin@gmail.com>
> Cc: Ihor Radchenko <yantar92@posteo.net>, Eli Zaretskii <eliz@gnu.org>,
>  bzg@gnu.org, dmitry@gutov.dev, 62762@debbugs.gnu.org,
>  Alan Mackenzie <acm@muc.de>
> 
> I have realized that neither `load-prefer-newer' not checking hash of 
> the source .el file can help per se when an .elc file becomes stale due 
> to update of a macro in a require'd file.

Yes.

> The robust way is to define compilation order through dependencies, 
> preferably autogenerated ones).

This doesn't work in Emacs, in general, due to circular dependencies.

> An alternative is to hope that usually it does not hurt and you are
> ready to remove .elc files (e.g. by make bootstrap) when you faced
> an apparent error or just suspect mixed version compilation as the
> cause of noticed strange behavior (I named this broken incremental
> builds).

That's what we have been doing for ages, and it generally works well.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05  6:46                                 ` Eli Zaretskii
@ 2023-05-05  7:27                                   ` Max Nikulin
  2023-05-05 10:38                                     ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-05  7:27 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 05/05/2023 13:46, Eli Zaretskii wrote:
> Date: Fri, 5 May 2023 12:27:25 +0700 From: Max Nikulin
>> The robust way is to define compilation order through dependencies,
>> preferably autogenerated ones).

> This doesn't work in Emacs, in general, due to circular dependencies.

Could you, please, provide an example where circular dependencies are 
unavoidable or cost of disentangling of mutual dependencies is prohibitive?

My general impression that behavior of code having circular dependencies 
is harder to comprehend.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05  7:27                                   ` Max Nikulin
@ 2023-05-05 10:38                                     ` Eli Zaretskii
  2023-05-05 11:20                                       ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-05 10:38 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Fri, 5 May 2023 14:27:29 +0700
> Cc: monnier@iro.umontreal.ca, yantar92@posteo.net, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> On 05/05/2023 13:46, Eli Zaretskii wrote:
> > Date: Fri, 5 May 2023 12:27:25 +0700 From: Max Nikulin
> >> The robust way is to define compilation order through dependencies,
> >> preferably autogenerated ones).
> 
> > This doesn't work in Emacs, in general, due to circular dependencies.
> 
> Could you, please, provide an example where circular dependencies are 
> unavoidable or cost of disentangling of mutual dependencies is prohibitive?

What do you mean by "unavoidable"?

> My general impression that behavior of code having circular dependencies 
> is harder to comprehend.

AFAIR, the problem is that we use 'require', eval-when-compile etc. to
get definitions of macros, functions, and variables.  There's nothing
difficult to comprehend in this.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05 10:38                                     ` Eli Zaretskii
@ 2023-05-05 11:20                                       ` Max Nikulin
  2023-05-05 11:33                                         ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-05 11:20 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 05/05/2023 17:38, Eli Zaretskii wrote:
>> Date: Fri, 5 May 2023 14:27:29 +0700 From: Max Nikulin
>>
>> On 05/05/2023 13:46, Eli Zaretskii wrote:
>>> Date: Fri, 5 May 2023 12:27:25 +0700 From: Max Nikulin
>>>> The robust way is to define compilation order through dependencies,
>>>> preferably autogenerated ones).
>>
>>> This doesn't work in Emacs, in general, due to circular dependencies.
>>
>> Could you, please, provide an example where circular dependencies are
>> unavoidable or cost of disentangling of mutual dependencies is prohibitive?
> 
> What do you mean by "unavoidable"?

Ones that do not allow to apply approaches like:
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=62762#140
Max Nikulin Fri, 5 May 2023 11:18:17 +0700
> In the C and C++ world the solution for cyclic dependencies is forward 
> declarations. Some kind of such approach I see in Org as well. 
> lisp/org/ol.el and lisp/org/org-element.el are mutually dependent. 
> org-element.el requires 'ol, while the latter just declares functions 
> from 'org-element.

On 05/05/2023 17:38, Eli Zaretskii wrote:
>> My general impression that behavior of code having circular dependencies
>> is harder to comprehend.
> 
> AFAIR, the problem is that we use 'require', eval-when-compile etc. to
> get definitions of macros, functions, and variables.  There's nothing
> difficult to comprehend in this.

I still have no idea which way it may be related to determining of order 
of compilation based on dependency tree. That is why I asked for 
particular examples.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05 11:20                                       ` Max Nikulin
@ 2023-05-05 11:33                                         ` Eli Zaretskii
  2023-05-05 15:33                                           ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-05 11:33 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Fri, 5 May 2023 18:20:09 +0700
> Cc: monnier@iro.umontreal.ca, yantar92@posteo.net, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> On 05/05/2023 17:38, Eli Zaretskii wrote:
> >>> This doesn't work in Emacs, in general, due to circular dependencies.
> >>
> >> Could you, please, provide an example where circular dependencies are
> >> unavoidable or cost of disentangling of mutual dependencies is prohibitive?
> > 
> > What do you mean by "unavoidable"?
> 
> Ones that do not allow to apply approaches like:
> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=62762#140

That's a huge message.  Which part of it specifically?

> Max Nikulin Fri, 5 May 2023 11:18:17 +0700
> > In the C and C++ world the solution for cyclic dependencies is forward 
> > declarations. Some kind of such approach I see in Org as well. 
> > lisp/org/ol.el and lisp/org/org-element.el are mutually dependent. 
> > org-element.el requires 'ol, while the latter just declares functions 
> > from 'org-element.

If it's this part, then I don't see how it can be relevant to our
case: our problem is to teach Make about these dependencies, not to
teach a Lisp compiler about them.  So forward declarations don't help
here, because Make doesn't have any such declarations, and it figures
out dependencies on its own, given only the prerequisites specified
for targets.

> On 05/05/2023 17:38, Eli Zaretskii wrote:
> >> My general impression that behavior of code having circular dependencies
> >> is harder to comprehend.
> > 
> > AFAIR, the problem is that we use 'require', eval-when-compile etc. to
> > get definitions of macros, functions, and variables.  There's nothing
> > difficult to comprehend in this.
> 
> I still have no idea which way it may be related to determining of order 
> of compilation based on dependency tree. That is why I asked for 
> particular examples.

I don't have ready examples off the top of my head, sorry.  You have
the Emacs Lisp sources, so you have all the information, and can find
those circular dependencies yourself if you don't believe me and
Stefan.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05  4:18                             ` Max Nikulin
  2023-05-05  5:27                               ` Max Nikulin
@ 2023-05-05 14:29                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-05 16:37                                 ` Max Nikulin
  1 sibling, 1 reply; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-05 14:29 UTC (permalink / raw)
  To: Max Nikulin
  Cc: Ihor Radchenko, 62762, bzg, dmitry, Alan Mackenzie, Eli Zaretskii

Hi Max,

> `load-prefer-newer' is a kludge as well.

I have to point out at this stage that I feel your answers aren't
helping address the very concrete short term question at hand.
Instead you're pointing to well known problems left and right that only
bite in very specific corner cases and with no really clear solution.

The problems `org-assert-version` is trying to fix happen a lot more
often than those corner cases and are much easier to handle.

> E.g. Python people migrated from comparison of timestamps to
> inscribing of .py file hash into byte compiled .pyc files.

Good for them.  But that's unrelated to he problem at hand (and would
only make a difference in cases that are a lot more hypothetical than
the ones we're considering here).

E.g. the mixed-version problems that `org-assert-version` tries to
detect can happen without any `.elc` file in sight at all.

Could we focus on the problem at hand, please?

> By the way, `load-prefer-newer' make things even worse [...] (.el
> files not changed, so they are older)

No, if ".el files not changed, so they are older", then
`load-prefer-newer` has no effect at all, so it can't make things worse.

>>> `org-assert-version' is just the most apparent manifestation.
>> AFAIK `org-assert-version` tries to solve a different problem.
> Of course `org-assert-version' was introduced to solve another
> problem, but it highlighted issues with dependency handling during
> incremental builds.

Yes, ELisp has lot of other problems.  But can we move those discussions
to other bug reports, otherwise I'm afraid we'll never get anywhere.

>> Indeed, we recently introduced `org--inhibit-version-check`
>> specifically so as not to use `org-assert-version` for Emacs's broken
>> incremental builds (i.e. we decided we preferred that brokenness
>> there).
> `org--inhibit-version-check' is even uglier kludge that partially
> deactivated `org-assert-version'

Maybe so, but its addition is still the embodiment of people's judgment
that for `git pull; make` in Emacs's sources, `org-assert-version` is
worse than the problems it tries to address.

> and just hides the issue with dependencies for incremental builds.

No, it doesn't.

>>> Perhaps a similar trick may be done in elisp by advicing e.g. `load'.
> Another idea: while single file is compiled per emacs invocation
> `load-history' may be compared before and after byte compilation.

It's not really "another idea" (unless you meant `advicing` in a very
narrow sense, but since we don't like Emacs to use advice within itself,
it would be a non-starter).
It's just one of the many ways to implement that same idea.

>> I can already warn them that an important problem will be the
>> presence of cyclic dependencies.
> In the C and C++ world the solution for cyclic dependencies is forward
> declarations. Some kind of such approach I see in Org as
> well. lisp/org/ol.el and lisp/org/org-element.el are mutually
> dependent. org-element.el requires 'ol, while the latter just declares
> functions from 'org-element.
>
> When dependency files are generated, it is possible to create a report on
> cyclic dependency and to disentangle them.

As part of my janitorial work, I regularly have to try and disentangle
circular dependencies.  In my experience the hardest part is to convince
the upstream maintainers to accept the churn, even though it brings no
material improvement (and forces them to get used to the new code
organization).

So, yes, technical changes could help, but it would only go so far.

[ I'm stopping here, I have to go.  ]


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05 11:33                                         ` Eli Zaretskii
@ 2023-05-05 15:33                                           ` Max Nikulin
  2023-05-05 15:49                                             ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-05 15:33 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 05/05/2023 18:33, Eli Zaretskii wrote:
>> Date: Fri, 5 May 2023 18:20:09 +0700 From: Max Nikulin
>> On 05/05/2023 17:38, Eli Zaretskii wrote:
>>>>> This doesn't work in Emacs, in general, due to circular dependencies.

Eli, I am still unable to associate this with particular cases of elisp 
code or with how it is split over several files. That is why I am again 
asking for examples illustrating issues you have in mind.

>>> What do you mean by "unavoidable"?
>>
>> Max Nikulin Fri, 5 May 2023 11:18:17 +0700
>>> In the C and C++ world the solution for cyclic dependencies is forward
>>> declarations. Some kind of such approach I see in Org as well.
>>> lisp/org/ol.el and lisp/org/org-element.el are mutually dependent.
>>> org-element.el requires 'ol, while the latter just declares functions
>>> from 'org-element.
> 
> If it's this part, then I don't see how it can be relevant to our
> case: our problem is to teach Make about these dependencies, not to
> teach a Lisp compiler about them.

I can not figure out which kind of cyclic dependencies may cause 
troubles with dependency generation, but I had a hope that it would be 
possible to reorganize code to avoid such kind of dependencies.

> I don't have ready examples off the top of my head, sorry.  You have
> the Emacs Lisp sources, so you have all the information, and can find
> those circular dependencies yourself if you don't believe me and
> Stefan.

It might be even better if you will provide a brief example unrelated to 
real Emacs code. I have no idea which code I should search for.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05 15:33                                           ` Max Nikulin
@ 2023-05-05 15:49                                             ` Eli Zaretskii
  2023-05-05 16:46                                               ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-05 15:49 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Fri, 5 May 2023 22:33:48 +0700
> Cc: monnier@iro.umontreal.ca, yantar92@posteo.net, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> On 05/05/2023 18:33, Eli Zaretskii wrote:
> >> Date: Fri, 5 May 2023 18:20:09 +0700 From: Max Nikulin
> >> On 05/05/2023 17:38, Eli Zaretskii wrote:
> >>>>> This doesn't work in Emacs, in general, due to circular dependencies.
> 
> Eli, I am still unable to associate this with particular cases of elisp 
> code or with how it is split over several files. That is why I am again 
> asking for examples illustrating issues you have in mind.
> 
> >>> What do you mean by "unavoidable"?
> >>
> >> Max Nikulin Fri, 5 May 2023 11:18:17 +0700
> >>> In the C and C++ world the solution for cyclic dependencies is forward
> >>> declarations. Some kind of such approach I see in Org as well.
> >>> lisp/org/ol.el and lisp/org/org-element.el are mutually dependent.
> >>> org-element.el requires 'ol, while the latter just declares functions
> >>> from 'org-element.
> > 
> > If it's this part, then I don't see how it can be relevant to our
> > case: our problem is to teach Make about these dependencies, not to
> > teach a Lisp compiler about them.
> 
> I can not figure out which kind of cyclic dependencies may cause 
> troubles with dependency generation, but I had a hope that it would be 
> possible to reorganize code to avoid such kind of dependencies.
> 
> > I don't have ready examples off the top of my head, sorry.  You have
> > the Emacs Lisp sources, so you have all the information, and can find
> > those circular dependencies yourself if you don't believe me and
> > Stefan.
> 
> It might be even better if you will provide a brief example unrelated to 
> real Emacs code. I have no idea which code I should search for.

You should look for all the ways we load one Lisp file from another:

  . require
  . eval-when-compile
  . eval-and-compile

etc.  When fileA.el does any of that to load fileB.el, and fileB.el
does something to load fileA.el (whether directly or indirectly, via
other files), you have a circular dependency.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05 14:29                               ` bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-05-05 16:37                                 ` Max Nikulin
  2023-05-05 18:17                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-05 16:37 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Ihor Radchenko, 62762, bzg, dmitry, Alan Mackenzie, Eli Zaretskii

On 05/05/2023 21:29, Stefan Monnier wrote:
>> `load-prefer-newer' is a kludge as well.
> 
> I have to point out at this stage that I feel your answers aren't
> helping address the very concrete short term question at hand.

It was not me who bring `load-prefer-newer' to this discussion. My point 
is: if timestamps were helpful to solve the issue with using of stale 
.elc files during incremental built after update then check based on .el 
content hashsum would do it even better.

> E.g. the mixed-version problems that `org-assert-version` tries to
> detect can happen without any `.elc` file in sight at all.

Current variant `org-assert-version' can not work when Org update is 
loaded uncompiled, Certainly mixed version loading may happen purely 
with .el files. Mixed compilation issue (the topic of this bug) happens 
namely with .elc files.

>> By the way, `load-prefer-newer' make things even worse [...] (.el
>> files not changed, so they are older)
> 
> No, if ".el files not changed, so they are older", then
> `load-prefer-newer` has no effect at all, so it can't make things worse.

If *.el files had higher priority than newer *.elc files than compiling 
result would be correct. An .elc file may become stale not due to change 
of its .el source, but due to changes in required files. The price is 
slower incremental builds. Initial clean build may use .elc files. This 
is applicable to Emacs builds, things may be more complicated when users 
build Org updates.

> Yes, ELisp has lot of other problems.  But can we move those discussions
> to other bug reports, otherwise I'm afraid we'll never get anywhere.

I see 2 possible routes to avoid make + org-assert-version issues
- to make incremental builds really reliable, rather than just "it 
generally works well"
- improve `org-assert-version'

Unfortunately committed code made `org-assert-version' less efficient. 
The function you suggested may solve some issues, but I am unsure if it 
can replace current variant of `org-assert-version' completely.

I have no ideas how to make `org-assert-version' better.

I had a hope that dependency generation may solve compiling issue, but I 
can not figure out what sort of circular dependencies is troublesome. I 
just must believe you and Eli.

> [ I'm stopping here, I have to go.  ]

Certainly there is no hurry. For me priority is the following:

Example of circular dependencies that may cause trouble during 
determining of compiling order (names of files or complete example, I 
hope it should not be longer that a dozen of lines).

Whether I missed something and your function may handle loading files 
from updated directory.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05 15:49                                             ` Eli Zaretskii
@ 2023-05-05 16:46                                               ` Max Nikulin
  2023-05-05 17:48                                                 ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-05 16:46 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 05/05/2023 22:49, Eli Zaretskii wrote:
> You should look for all the ways we load one Lisp file from another:
> 
>    . require
>    . eval-when-compile
>    . eval-and-compile

I was aware of these forms before you mentioned them first time in this 
discussion.

> etc.  When fileA.el does any of that to load fileB.el, and fileB.el
> does something to load fileA.el (whether directly or indirectly, via
> other files), you have a circular dependency.

I am sorry, but it is far from a complete example. I still have no idea 
how to combine it in a such way that there would be no problem to 
compile and load files, but attempt to create build dependencies would 
fail due to a cycle.

Perhaps editing some Emacs files you will notice the pattern you are 
writing about. I will be grateful if you provide names of files 
demonstrating cyclic dependency issue.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05 16:46                                               ` Max Nikulin
@ 2023-05-05 17:48                                                 ` Eli Zaretskii
  2023-05-05 18:26                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-05 17:48 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Fri, 5 May 2023 23:46:36 +0700
> Cc: monnier@iro.umontreal.ca, yantar92@posteo.net, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> >    . require
> >    . eval-when-compile
> >    . eval-and-compile
> 
> I was aware of these forms before you mentioned them first time in this 
> discussion.
> 
> > etc.  When fileA.el does any of that to load fileB.el, and fileB.el
> > does something to load fileA.el (whether directly or indirectly, via
> > other files), you have a circular dependency.
> 
> I am sorry, but it is far from a complete example. I still have no idea 
> how to combine it in a such way that there would be no problem to 
> compile and load files, but attempt to create build dependencies would 
> fail due to a cycle.
> 
> Perhaps editing some Emacs files you will notice the pattern you are 
> writing about. I will be grateful if you provide names of files 
> demonstrating cyclic dependency issue.

You seem to think it's easy to find these examples and provide them,
and I just stubbornly refuse to reveal them to you?

It isn't easy.  You need to actively find these references and chase
their chains, to find those cases.  I just know they exist because I
bumped into them in the past.

If you want to find them, you will have to write the code to detect
those dependencies, and then look at the graph produced from them.
There's no other way (unless Stefan happens to remember some by
heart, by some luck).





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05 16:37                                 ` Max Nikulin
@ 2023-05-05 18:17                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-06  5:25                                     ` Max Nikulin
  2023-05-06  6:00                                     ` Max Nikulin
  0 siblings, 2 replies; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-05 18:17 UTC (permalink / raw)
  To: Max Nikulin
  Cc: Ihor Radchenko, 62762, bzg, dmitry, Alan Mackenzie, Eli Zaretskii

> I have no ideas how to make `org-assert-version' better.

`my-require-with-shadow-check' is a suggestion to make it better.
And this sub-thread of the bug report was presumably your answer to the
question by Ihor:

    Max, do you see any obvious downsides in Stefan's idea about consulting
    `load-history' vs. `load-path'?

So are you saying that you don't think it's better?
If so, do you also think it's worse, and if so, in which respect?

> I had a hope that dependency generation may solve compiling issue,

It won't solve the mixed-version problem.

Incremental recompilation (i.e. `git pull; make`) is a qualitatively
different problem from the mixed-version problem, and by now, I'm pretty
much convinced that there just isn't a solution that fixes both: they
may look somewhat similar from a distance, but they're fundamentally
quite different.

Currently `org-assert-version` has no effect for `git pull; make` in
Emacs sources, so it's presumably focused on the mixed-version problem.
And I think that for this problem `my-require-with-shadow-check' is
a better check (e.g. it will also work when none of the files are
compiled).

> but I can not figure out what sort of circular dependencies is
> troublesome.  I just must believe you and Eli.

I'll refrain from discussing this here.  Incremental recompilation
problems should be discussed in another bug report, IMO.


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05 17:48                                                 ` Eli Zaretskii
@ 2023-05-05 18:26                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-11 15:14                                                     ` bug#62762: circular dependencies in elisp files and make Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-05 18:26 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, acm, Max Nikulin

> If you want to find them, you will have to write the code to detect
> those dependencies, and then look at the graph produced from them.
> There's no other way (unless Stefan happens to remember some by
> heart, by some luck).

I think looking for calls to `provide` that are not at the end of files
is a good first step to finding the obvious ones (if my memory serves,
viper and ediff are two examples in Emacs's own code.  The problem is
more common outside of Emacs because apparently fewer janitors roam
those realms).

Of course, the early files provide many other examples where we "solve"
the dependencies by hand to get things to bootstrap.


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05 18:17                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-05-06  5:25                                     ` Max Nikulin
  2023-05-06 13:02                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-06  6:00                                     ` Max Nikulin
  1 sibling, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-06  5:25 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Ihor Radchenko, 62762, bzg, dmitry, Alan Mackenzie, Eli Zaretskii

Stefan, my apologizes that I sent first copy exclusively to you.

On 06/05/2023 01:17, Stefan Monnier wrote:
>> I have no ideas how to make `org-assert-version' better.
> 
> `my-require-with-shadow-check' is a suggestion to make it better.

My current opinion is that `my-require-with-shadow-check' may be an 
improvement when *combined* with original `org-assert-version' (that 
inscribes org-version into .elc files).

The reason why `my-require-with-shadow-check' may be significantly less 
efficient if it will *replace* original implementation of 
`org-assert-version' is the following.

Consider a user who cloned org-mode git repository and loads Org mode 
from there with periodic pull and rebuild actions. Forget about built-in 
Org and assume that `load-path' is modified early enough to not cause 
any problem.

Now literally citing my Fri, 5 May 2023 11:18:17 +0700 message
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=62762#140

Does in help in the following case?
1. Base Org part is loaded on opening of some .org file.
2. Org in that directory is updated and recompiled.
3. New Org feature is loaded (autoloaded or by explicit call of e.g.
    (require ob-shell))

Additional argument:

When the reporter got the error from `org-assert-version' it was not 
necessary a false positive (however most probable on minor version 
update), user may face an error later while running Org because not all 
files were recompiled after changes in macros.

I am in doubts if `my-require-with-shadow-check' may help in such cases.

> And this sub-thread of the bug report was presumably your answer to the
> question by Ihor:
> 
>      Max, do you see any obvious downsides in Stefan's idea about consulting
>      `load-history' vs. `load-path'?

My excuses:
- message subject has not changed, so it was unclear that it was decided 
to discuss purely mitigation of symptoms instead of fixing of real cause
- participants of discussion are spread across time zones, so a longer 
messages may be preferred
- Configuration of https://debbugs.gnu.org is worse than 
https://bugs.debian.org, reply to specific messages links are missed.
- debbugs and thunderbird are not friends in respect to mbox links (and 
I have not created a wrapper script that should work as a workaround)





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-05 18:17                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-06  5:25                                     ` Max Nikulin
@ 2023-05-06  6:00                                     ` Max Nikulin
  2023-05-06  7:51                                       ` bug#62762: Incremental builds and Lisp files dependencies " Eli Zaretskii
  1 sibling, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-06  6:00 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Ihor Radchenko, 62762, bzg, dmitry, Alan Mackenzie, Eli Zaretskii

On 06/05/2023 01:17, Stefan Monnier wrote:
> I'll refrain from discussing this here.  Incremental recompilation
> problems should be discussed in another bug report, IMO.

I will try to explain why this bug report was caused by issues with 
incremental builds.

Original report:
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=62762#5

> Could someone fix that, so that I don't have to 'make bootstrap' every 
> other time after a 'git pull'?
> 
> make[3]: Entering directory '/home/dgutov/vc/emacs-master/lisp'
>   ELC      org/ox.elc
> Warning (emacs): Org version mismatch.  Org loading aborted.

It may be a *valid* error, however on minor Org updates it is likely a 
false positive.

ox.el has a number of `require's. Byte compilation loaded an .elc file 
before it was recompiled with new definition of a macro. Notice that an 
.elc file may become stale even if the corresponding .el file has not 
changed. The .el file may require macros from other .el (.elc) files and 
expand them during compiling.

So incremental build must compile files in certain order. It must take 
into account dependencies between .elc and .el files and prevent loading 
of stale .elc files.

`load-prefer-newer' can be a workaround only for direct "%.elc: %.el" 
dependencies. Transitional dependencies still may cause troubles.

Let's assume that a trouble with cyclic dependencies is a real one (I 
have not convinced in that). A way to the correct builds is to 
*completely* avoid loading of .elc files during incremental builds. When 
only a few files changed then relying purely on .el files should cause 
significant performance penalty. Unfortunately it would not work without 
describing at least some dependencies. In the `org-assert-version' they 
should be at least that all lisp/org/*.elc files depend on 
lisp/org/org-version.el and lisp/org/org-macs.el. Without automatic 
dependency generation it is a kludge, but it should significantly 
alleviate the issue. Grepping org sources for defmacro and adding e.g. 
org-element.el dependency will make incremental builds with stale macro 
definitions even more rare.

Commits pushed so far trade false positives to false negatives and to 
reports of bugs due to "undefined" functions and incorrect signatures to 
Org developers and maintainers.

Perhaps `org-assert-version' may be improved, but this report was caused 
by broken build rules.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: Incremental builds and Lisp files dependencies pulling a new version of the code
  2023-05-06  6:00                                     ` Max Nikulin
@ 2023-05-06  7:51                                       ` Eli Zaretskii
  2023-05-06 15:50                                         ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-06  7:51 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Sat, 6 May 2023 13:00:38 +0700
> Cc: Ihor Radchenko <yantar92@posteo.net>, Eli Zaretskii <eliz@gnu.org>,
>  bzg@gnu.org, dmitry@gutov.dev, 62762@debbugs.gnu.org,
>  Alan Mackenzie <acm@muc.de>
> From: Max Nikulin <manikulin@gmail.com>
> 
> On 06/05/2023 01:17, Stefan Monnier wrote:
> > I'll refrain from discussing this here.  Incremental recompilation
> > problems should be discussed in another bug report, IMO.
> 
> I will try to explain why this bug report was caused by issues with 
> incremental builds.

I've started a new thread, because I agree with Stefan: this is a
separate issue.  Please reply with this new thread's Subject.

> Let's assume that a trouble with cyclic dependencies is a real one (I 
> have not convinced in that). A way to the correct builds is to 
> *completely* avoid loading of .elc files during incremental builds. When 
> only a few files changed then relying purely on .el files should cause 
> significant performance penalty.

Exactly.  And please don't forget that quite a few files are
preloaded, so using only *.el means to preload only the *.el files,
which will result in a significantly slower bootstrap-emacs binary,
and the build will become annoyingly slow, for no good reason.

> Unfortunately it would not work without 
> describing at least some dependencies. In the `org-assert-version' they 
> should be at least that all lisp/org/*.elc files depend on 
> lisp/org/org-version.el and lisp/org/org-macs.el. Without automatic 
> dependency generation it is a kludge, but it should significantly 
> alleviate the issue.

This doesn't really work, not as long as we use Make: some *.elc files
might not exist yet, for whatever reasons, so Make will try to
generate them first, thus disrupting the order of generation that you
will try to encode in the dependencies.  We already tried that, and it
didn't work, not even just for Org.

> Commits pushed so far trade false positives to false negatives and to 
> reports of bugs due to "undefined" functions and incorrect signatures to 
> Org developers and maintainers.

Those commits only affect byte compilation of Org as part of building
Emacs, so I see no reason why they should cause the above issues for
Orge developers.

> Perhaps `org-assert-version' may be improved, but this report was caused 
> by broken build rules.

The bug#62762 was reported because Org behaved unlike any other Lisp
package in Emacs.  We have other packages that define macros used in
many other *.el files, and none of them does the version-check like
Org did.  The problems with making incompatible changes in one or more
of the macros are well known to Emacs developers who rebuild Emacs
frequently, and we have ways to deal with them.  Some of those ways
(the simplest ones) are encoded in the top-level Makefile, see
ADVICE-ON-FAILURE there.  There are others, more subtle ones, for
those, like myself, who don't bootstrap, ever, except the first time a
fresh repository is cloned.

That Org behaved in a stark different manner was therefore an
unpleasant annoyance, so we now fixed that by making Org behave in
this regard like any other Lisp package in Emacs -- but only when
Emacs is built, because the knob which forces this behavior is off by
default, and is only turned on by lisp/Makefile in the Emacs tree.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-06  5:25                                     ` Max Nikulin
@ 2023-05-06 13:02                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-07 16:23                                         ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-06 13:02 UTC (permalink / raw)
  To: Max Nikulin
  Cc: Ihor Radchenko, 62762, bzg, dmitry, Alan Mackenzie, Eli Zaretskii

AFAIU there are 2 main situations:

A) recompilation (i.e. `git pull; make`).
   This can happen either in Org's repository or in Emacs's repository.
   For Emacs repository, Emacs maintainers prefer recompilation to be
   faster even if it implies occasional breakage (clearly, the details
   matter to know which of the two evil we prefer, but we're not
   interested in "fixing of real cause" unless it's cheap enough).
B) mixed versions from different directories.

AFAICT `my-require-with-shadow-check` should be able to catch most/all
problems for (B), without impacting (A), and more reliably than
`org-assert-version` (and in an arguably less ad-hoc way).

So, to me, (assuming the above is true) the remaining question is what
Org developers want to do about `git pull; make` in Org's own repository.


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: Incremental builds and Lisp files dependencies pulling a new version of the code
  2023-05-06  7:51                                       ` bug#62762: Incremental builds and Lisp files dependencies " Eli Zaretskii
@ 2023-05-06 15:50                                         ` Max Nikulin
  2023-05-06 16:26                                           ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-06 15:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 06/05/2023 14:51, Eli Zaretskii wrote:
> This doesn't really work, not as long as we use Make: some *.elc files
> might not exist yet, for whatever reasons, so Make will try to
> generate them first, thus disrupting the order of generation that you
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> will try to encode in the dependencies.  We already tried that, and it
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> didn't work, not even just for Org.

Could you, please, be more precise? Do you suspect that Make may start 
building a target before completion of all rules for its prerequisites? 
It sounds like a grave bug in Make.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: Incremental builds and Lisp files dependencies pulling a new version of the code
  2023-05-06 15:50                                         ` Max Nikulin
@ 2023-05-06 16:26                                           ` Eli Zaretskii
  2023-05-07  2:45                                             ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-06 16:26 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Sat, 6 May 2023 22:50:22 +0700
> Cc: monnier@iro.umontreal.ca, yantar92@posteo.net, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> On 06/05/2023 14:51, Eli Zaretskii wrote:
> > This doesn't really work, not as long as we use Make: some *.elc files
> > might not exist yet, for whatever reasons, so Make will try to
> > generate them first, thus disrupting the order of generation that you
>                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > will try to encode in the dependencies.  We already tried that, and it
>         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > didn't work, not even just for Org.
> 
> Could you, please, be more precise? Do you suspect that Make may start 
> building a target before completion of all rules for its prerequisites? 

No, I mean that the order in which Make builds the targets might not
be what you think, if all you tell it that all org/*.elc files depend
on org-macs.elc.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: Incremental builds and Lisp files dependencies pulling a new version of the code
  2023-05-06 16:26                                           ` Eli Zaretskii
@ 2023-05-07  2:45                                             ` Max Nikulin
  2023-05-07  5:34                                               ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-07  2:45 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 06/05/2023 23:26, Eli Zaretskii wrote:
>> Date: Sat, 6 May 2023 22:50:22 +0700 From: Max Nikulin
>>
>> On 06/05/2023 14:51, Eli Zaretskii wrote:
>>> This doesn't really work, not as long as we use Make: some *.elc files
>>> might not exist yet, for whatever reasons, so Make will try to
>>> generate them first, thus disrupting the order of generation that you
>>                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> will try to encode in the dependencies.  We already tried that, and it
>>          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> didn't work, not even just for Org.
>>
>> Could you, please, be more precise? Do you suspect that Make may start
>> building a target before completion of all rules for its prerequisites?
> 
> No, I mean that the order in which Make builds the targets might not
> be what you think, if all you tell it that all org/*.elc files depend
> on org-macs.elc.

Sorry, but it is still not clear to we what "doesn't really work" and I 
feel that it may be important for further discussion.

If a Makefile contains a dependency like

org/ol.elc: org/org-macs.elc

and org/org-macs.elc needs update then the rule for org/ol.elc is 
executed after completion of the rule for org/org-macs.elc. The purpose 
of dependencies is to define order of execution of build rules.

However I suggested dependencies on org-macs.el, not on org-macs.elc:

Sat, 6 May 2023 13:00:38 +0700
>> they 
>> should be at least that all lisp/org/*.elc files depend on 
>> lisp/org/org-version.el and lisp/org/org-macs.el.






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: Incremental builds and Lisp files dependencies pulling a new version of the code
  2023-05-07  2:45                                             ` Max Nikulin
@ 2023-05-07  5:34                                               ` Eli Zaretskii
  0 siblings, 0 replies; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-07  5:34 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Sun, 7 May 2023 09:45:20 +0700
> Cc: monnier@iro.umontreal.ca, yantar92@posteo.net, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> On 06/05/2023 23:26, Eli Zaretskii wrote:
> >> Date: Sat, 6 May 2023 22:50:22 +0700 From: Max Nikulin
> >>
> > No, I mean that the order in which Make builds the targets might not
> > be what you think, if all you tell it that all org/*.elc files depend
> > on org-macs.elc.
> 
> Sorry, but it is still not clear to we what "doesn't really work" and I 
> feel that it may be important for further discussion.
> 
> If a Makefile contains a dependency like
> 
> org/ol.elc: org/org-macs.elc
> 
> and org/org-macs.elc needs update then the rule for org/ol.elc is 
> executed after completion of the rule for org/org-macs.elc. The purpose 
> of dependencies is to define order of execution of build rules.

My point was that with the above rule, if org-macs.elc doesn't exist,
Make will want to produce it, even though for your purposes there's no
reason to do that.

> However I suggested dependencies on org-macs.el, not on org-macs.elc:
> 
> Sat, 6 May 2023 13:00:38 +0700
> >> they 
> >> should be at least that all lisp/org/*.elc files depend on 
> >> lisp/org/org-version.el and lisp/org/org-macs.el.

I don't really understand in enough detail what is it that you are
suggesting, because you show your suggestion piecemeal.  Can you
describe the suggestion in its entirety, top to bottom, including all
the details?  In particular, since the proposed automatic dependency
generation will be side effect of byte-compilation (right?), how do
you make sure the compilation is in the correct order when
dependencies change due to changes in the source *.el files?

Please also consider parallel builds, something that almost all of the
Emacs developers use all the time.  Thus, if N files depend on foo.el,
when foo.el changes Make will want to run N parallel jobs compiling
each one of the N dependencies.

In addition, some of the *.el files are generated, so they change as
result of changes in other *.el files.  AFAIK, automatic dependency
generation doesn't usually deal with such cases, it only deals with
dependencies on files that are not regenerated as part of the build.
How do you suggest to handle this?

And finally, some of the Lisp files are preloaded, so their changes,
and the changes in their *.elc files as result of changes in their
prerequisites, affect the Emacs binary that is used to byte-compile
the Lisp files.  If the preloaded files are outdated, many
compilations might fail just because of this aspect.

If you have an idea for solving all of these problems (which are
really just the initial tips of the iceberg), please describe your
idea with all of its details.  Otherwise, this discussion is not
really useful.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-06 13:02                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-05-07 16:23                                         ` Max Nikulin
  2023-05-07 21:57                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-08 10:05                                           ` Ihor Radchenko
  0 siblings, 2 replies; 110+ messages in thread
From: Max Nikulin @ 2023-05-07 16:23 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Ihor Radchenko, 62762, bzg, dmitry, Alan Mackenzie, Eli Zaretskii

On 06/05/2023 20:02, Stefan Monnier wrote:
> AFAIU there are 2 main situations:
> 
> A) recompilation (i.e. `git pull; make`).
>     This can happen either in Org's repository or in Emacs's repository.
...
Are there brave enough developers and users who do not restart emacs 
after rebuild of emacs? Some Org users hope that `org-reload' works and 
they can update Org without restarting Emacs.

> B) mixed versions from different directories.
> 
> AFAICT `my-require-with-shadow-check` should be able to catch most/all
> problems for (B),

Agree.

> without impacting (A), and more reliably than
> `org-assert-version` (and in an arguably less ad-hoc way).

Sorry, but `org-assert-version' should catch loading from the same 
directory a file compiled for new version since loaded earlier 
org-version.el defined old version that does not match `org-version' 
inscribed into new .elc files. I assume either combination of "make 
clean" and "make" or proper incremental build. That is why I disagree 
with "without impacting (A)".

> So, to me, (assuming the above is true) the remaining question is what
> Org developers want to do about `git pull; make` in Org's own repository.

Perhaps `org-assert-directory' may be added to `org-assert-version'

By the way, if just org-macs should be checked then would not be it more 
efficient in respect to load time to define a variable containing the 
directory and to check in other files if they are loaded from the same 
directory? With such approach there is no need in walking through the 
`load-history' list.

==> tst-macs.el <==

(defun tst-get-load-dir ()
   (file-name-directory
    (or load-file-name
        ;; For `eval-buffer'.
        (buffer-file-name (buffer-base-buffer)))))

(defvar tst-load-dir (tst-get-load-dir))

(defun tst-assert-load-dir ()
   (let ((dir (tst-get-load-dir))
	(url "https://orgmode.org/worg/org-faq.html#mixed-install"))
     (unless (equal tst-load-dir dir)
       (error "Path shadowing detected, see <%s>. %s vs %s"
	     url dir tst-load-dir))))

(provide 'tst-macs)


==> tst-main.el <==

(require 'tst-macs)

(eval-and-compile
   (if (fboundp 'tst-assert-load-dir)
     (tst-assert-load-dir)
    (error "Path shadowing detected, see 
<https://orgmode.org/worg/org-faq.html#mixed-install>")))

(provide 'tst-main)






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-07 16:23                                         ` Max Nikulin
@ 2023-05-07 21:57                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-08 10:05                                           ` Ihor Radchenko
  1 sibling, 0 replies; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-07 21:57 UTC (permalink / raw)
  To: Max Nikulin
  Cc: Ihor Radchenko, 62762, bzg, dmitry, Alan Mackenzie, Eli Zaretskii

>> AFAIU there are 2 main situations:
>> A) recompilation (i.e. `git pull; make`).
>>     This can happen either in Org's repository or in Emacs's repository.
> ...
> Are there brave enough developers and users who do not restart emacs after
>  rebuild of Emacs?

I recompile daily, and restart every other month or so?
FWIW, I never bumped into a problem with Org due to that (and never
used `org-reload` either).

>> B) mixed versions from different directories.
>> AFAICT `my-require-with-shadow-check` should be able to catch most/all
>> problems for (B),
>
> Agree.
>
>> without impacting (A), and more reliably than
>> `org-assert-version` (and in an arguably less ad-hoc way).
>
> Sorry, but `org-assert-version' should catch loading from the same directory
> a file compiled for new version since loaded earlier org-version.el defined
> old version that does not match `org-version' inscribed into new .elc
> files.  I assume either combination of "make clean" and "make" or proper
> incremental build.

I'd consider these scenarios to fall into (A) or thereabout.  And users
who do like I do (i.e. recompile Org while a session is using those Org
files) get what they deserve if they encounter a problem.

We have so many more real problems that I'm not interested in
considering such cases.  I can give you a life-long supply of further
hypothetical cases if you're so inclined :-)

> By the way, if just org-macs should be checked then would not be it more
> efficient in respect to load time to define a variable containing the
> directory and to check in other files if they are loaded from the same
> directory? With such approach there is no need in walking through the
> `load-history' list.

You might be right.  I was thinking in more general terms (e.g. I'm
thinking that maybe a test along the lines of the one performed by
`my-require-with-shadow-check` could be (optionally) included in
`require`).


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-07 16:23                                         ` Max Nikulin
  2023-05-07 21:57                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-05-08 10:05                                           ` Ihor Radchenko
  2023-05-10 14:52                                             ` Max Nikulin
  1 sibling, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-05-08 10:05 UTC (permalink / raw)
  To: Max Nikulin
  Cc: 62762, bzg, dmitry, Stefan Monnier, Alan Mackenzie, Eli Zaretskii

Max Nikulin <manikulin@gmail.com> writes:

>> So, to me, (assuming the above is true) the remaining question is what
>> Org developers want to do about `git pull; make` in Org's own repository.
>
> Perhaps `org-assert-directory' may be added to `org-assert-version'
>
>
> (defun tst-assert-load-dir ()
>    (let ((dir (tst-get-load-dir))
> 	(url "https://orgmode.org/worg/org-faq.html#mixed-install"))
>      (unless (equal tst-load-dir dir)
>        (error "Path shadowing detected, see <%s>. %s vs %s"
> 	     url dir tst-load-dir))))

Sounds reasonable.
I think we can try to do the following:

1. Use the load-dir test, warn, and try to re-load
2. Use org-assert-version, but downgrade error to simple warning

WDYT?

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-08 10:05                                           ` Ihor Radchenko
@ 2023-05-10 14:52                                             ` Max Nikulin
  2023-06-23 12:02                                               ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-10 14:52 UTC (permalink / raw)
  To: Ihor Radchenko
  Cc: 62762, bzg, dmitry, Stefan Monnier, Alan Mackenzie, Eli Zaretskii

On 08/05/2023 17:05, Ihor Radchenko wrote:
> Max Nikulin writes:
>> (defun tst-assert-load-dir ()
>>     (let ((dir (tst-get-load-dir))
>> 	(url "https://orgmode.org/worg/org-faq.html#mixed-install"))
>>       (unless (equal tst-load-dir dir)
>>         (error "Path shadowing detected, see <%s>. %s vs %s"
>> 	     url dir tst-load-dir))))
> 
> I think we can try to do the following:
> 
> 1. Use the load-dir test, warn, and try to re-load
> 2. Use org-assert-version, but downgrade error to simple warning

Ihor, final decision is up to you.

I think, `org-reload' may be recommended in a warning message. I am 
unsure if `org-reload' called from the assertion while an Org component 
is loaded may not cause a more severe issue. My special concern is 
reloading when new Org is being compiled: is it safe or reloading should 
be suppressed completely?

I believe, during creation of .elc files, assert macro should signal an 
error since a warning is not enough to prevent loading mixed compilation 
result to next Emacs session. I do not like that currently during 
compiling with old Org loaded, `org-assert-version' causes just a 
warning. Users have difficulties with clean recompiling.

While loading, non-fatal error may be a better option when versions do 
not differ too much.

I like that you are not going to throw version check away completely.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-05 18:26                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-05-11 15:14                                                     ` Max Nikulin
  2023-05-11 15:20                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-11 15:59                                                       ` Eli Zaretskii
  0 siblings, 2 replies; 110+ messages in thread
From: Max Nikulin @ 2023-05-11 15:14 UTC (permalink / raw)
  To: Stefan Monnier, Eli Zaretskii; +Cc: bzg, dmitry, yantar92, 62762, acm

On 06/05/2023 01:26, Stefan Monnier wrote:
>> If you want to find them, you will have to write the code to detect
>> those dependencies, and then look at the graph produced from them.
>> There's no other way (unless Stefan happens to remember some by
>> heart, by some luck).
> I think looking for calls to `provide` that are not at the end of files
> is a good first step to finding the obvious ones (if my memory serves,
> viper and ediff are two examples in Emacs's own code.

I see no cyclic dependency in viper, at least based on `require':

viper.elc: viper-init.elc viper-keym.elc viper-cmd.elc
viper-cmd.elc: viper-util.elc viper-keym.elc viper-mous.elc 
viper-macs.elc viper-ex.elc
viper-macs.elc: viper-mous.elc viper-ex.elc viper-util.elc viper-keym.elc
viper-ex.elc: viper-keym.elc viper-util.elc
viper-keym.elc: viper-util.elc
viper-mous.elc: viper-util.elc
viper-util.elc: viper-init.elc

I expect that it should ensure ordering for make allowing parallel 
execution to some degree.

Frankly speaking, I have not realized why `provide' not at the end is 
important. Do you mean the following

lisp/vc/ediff-util.el:(provide 'ediff-util)    ;FIXME: Break cyclic 
dependencies and move to the end!

and mutual `require' 'ediff-util from ediff-init.el and 'ediff-init from 
ediff-util.el? My idea was to suppress loading of .elc files during 
compilation of such files.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-11 15:14                                                     ` bug#62762: circular dependencies in elisp files and make Max Nikulin
@ 2023-05-11 15:20                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-11 15:59                                                       ` Eli Zaretskii
  1 sibling, 0 replies; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-11 15:20 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, acm, Eli Zaretskii

> important. Do you mean the following
> lisp/vc/ediff-util.el:(provide 'ediff-util)    ;FIXME: Break cyclic
> dependencies and move to the end!

Sounds about right, yes.

> and mutual `require' 'ediff-util from ediff-init.el and 'ediff-init from
> ediff-util.el? My idea was to suppress loading of .elc files during
> compilation of such files.

When I looked at it, my approach was to break the cycle in an arbitrary
way and say that if it occasionally leads to a miscompilation it's the
package's fault.


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-11 15:14                                                     ` bug#62762: circular dependencies in elisp files and make Max Nikulin
  2023-05-11 15:20                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-05-11 15:59                                                       ` Eli Zaretskii
  2023-05-12 14:59                                                         ` Max Nikulin
  1 sibling, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-11 15:59 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Thu, 11 May 2023 22:14:03 +0700
> Cc: yantar92@posteo.net, bzg@gnu.org, dmitry@gutov.dev,
>  62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> My idea was to suppress loading of .elc files during compilation of
> such files.

That idea will make a typical build much slower, for the rare case
where such measures are really needed.  That's the wrong balance in my
book.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-11 15:59                                                       ` Eli Zaretskii
@ 2023-05-12 14:59                                                         ` Max Nikulin
  2023-05-12 15:10                                                           ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-12 14:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 11/05/2023 22:59, Eli Zaretskii wrote:
>> Date: Thu, 11 May 2023 22:14:03 +0700 From: Max Nikulin
>>
>> My idea was to suppress loading of .elc files during compilation of
>> such files.
> 
> That idea will make a typical build much slower, for the rare case
> where such measures are really needed.  That's the wrong balance in my
> book.

I have noticed that you are afraid that correct rebuild might be too 
slow, but I do not see a reason why it should be noticeable.

1. There is no need to suppress .elc during initial clean build that 
takes enough time. It is for incremental build when usually only a 
fraction of all lisp files are recompiled
2. At first, files necessary to load bytecomp are rebuilt, so during 
compiling majority of files, suffix list is modified immediately before 
`byte-compile-file' call. That is why only files required by source file 
of the current target are affected.
3. I hope, it is possible to suppress loading of .elc only in the case 
of circular dependencies.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-12 14:59                                                         ` Max Nikulin
@ 2023-05-12 15:10                                                           ` Eli Zaretskii
  2023-05-12 15:26                                                             ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-12 15:10 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Fri, 12 May 2023 21:59:56 +0700
> Cc: monnier@iro.umontreal.ca, yantar92@posteo.net, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> On 11/05/2023 22:59, Eli Zaretskii wrote:
> >> Date: Thu, 11 May 2023 22:14:03 +0700 From: Max Nikulin
> >>
> >> My idea was to suppress loading of .elc files during compilation of
> >> such files.
> > 
> > That idea will make a typical build much slower, for the rare case
> > where such measures are really needed.  That's the wrong balance in my
> > book.
> 
> I have noticed that you are afraid that correct rebuild might be too 
> slow, but I do not see a reason why it should be noticeable.
> 
> 1. There is no need to suppress .elc during initial clean build that 
> takes enough time. It is for incremental build when usually only a 
> fraction of all lisp files are recompiled

I think it will be much more than "a fraction", due to dependencies.
But I will withhold my judgment until I see the actual code and what
it does to the build.

> 2. At first, files necessary to load bytecomp are rebuilt

Why only bytecomp?  Byte compiling needs more than just bytecomp,
AFAIU.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-12 15:10                                                           ` Eli Zaretskii
@ 2023-05-12 15:26                                                             ` Max Nikulin
  2023-05-12 16:01                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-12 15:26 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 12/05/2023 22:10, Eli Zaretskii wrote:
>> Date: Fri, 12 May 2023 21:59:56 +0700 From: Max Nikulin
>>
>> 2. At first, files necessary to load bytecomp are rebuilt
> 
> Why only bytecomp?  Byte compiling needs more than just bytecomp,
> AFAIU.

Because the ".el.elc:" rule uses "-f batch-byte-compile". I expect that

emacs -Q --batch -l bytecomp --eval \
   "(mapc (lambda (x) (princ (car x) (terpri))) load-history)"

gives reasonable approximation to "files necessary to load bytecomp". 
What should be added to prerequisites besides bytecomp dependencies?





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-12 15:26                                                             ` Max Nikulin
@ 2023-05-12 16:01                                                               ` Eli Zaretskii
  2023-05-13  3:08                                                                 ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-12 16:01 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Fri, 12 May 2023 22:26:47 +0700
> Cc: monnier@iro.umontreal.ca, yantar92@posteo.net, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> On 12/05/2023 22:10, Eli Zaretskii wrote:
> >>
> > Why only bytecomp?  Byte compiling needs more than just bytecomp,
> > AFAIU.
> 
> Because the ".el.elc:" rule uses "-f batch-byte-compile". I expect that
> 
> emacs -Q --batch -l bytecomp --eval \
>    "(mapc (lambda (x) (princ (car x) (terpri))) load-history)"
> 
> gives reasonable approximation to "files necessary to load bytecomp". 
> What should be added to prerequisites besides bytecomp dependencies?

Anything that bytecomp loads via autoloads while compiling.  Also
byte-opt and its autoloads, I think.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-12 16:01                                                               ` Eli Zaretskii
@ 2023-05-13  3:08                                                                 ` Max Nikulin
  2023-05-13  6:50                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-13  3:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 12/05/2023 23:01, Eli Zaretskii wrote:
>> Date: Fri, 12 May 2023 22:26:47 +0700 From: Max Nikulin
>>
>> I expect that
>>
>> emacs -Q --batch -l bytecomp --eval \
>>     "(mapc (lambda (x) (princ (car x) (terpri))) load-history)"
>>
>> gives reasonable approximation to "files necessary to load bytecomp".
>> What should be added to prerequisites besides bytecomp dependencies?
> 
> Anything that bytecomp loads via autoloads while compiling.  Also
> byte-opt and its autoloads, I think.

You are right concerning autoloads, while byte-opt is just one extra 
file in the dependency list. However the same expression evaluated when 
`batch-byte-compile' call finished gives list of dependencies for the 
just created .elc files. Basic statistics based on dependency files may 
provide better approximation which files should be compiled at first to 
achieve faster build. I do not think that complications you described 
are blockers for accurate dependency tracking.

My initial idea was to compile files necessary for byte compilation at 
first and for compilation of "regular" files load components required 
for byte compilation and after that suppress loading of .elc files. What 
can be better is removing all stale .elc file before compiling of 
updates sources. A script iterates over dependency files and deletes 
.elc if any its prerequisite has been updated. Following compilation 
pass can safely use .elc files that are either survived from previous 
build as up to date or just refreshed.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-13  3:08                                                                 ` Max Nikulin
@ 2023-05-13  6:50                                                                   ` Eli Zaretskii
  2023-05-13  7:34                                                                     ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-13  6:50 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Sat, 13 May 2023 10:08:25 +0700
> Cc: monnier@iro.umontreal.ca, yantar92@posteo.net, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> My initial idea was to compile files necessary for byte compilation at 
> first and for compilation of "regular" files load components required 
> for byte compilation and after that suppress loading of .elc files. What 
> can be better is removing all stale .elc file before compiling of 
> updates sources. A script iterates over dependency files and deletes 
> .elc if any its prerequisite has been updated. Following compilation 
> pass can safely use .elc files that are either survived from previous 
> build as up to date or just refreshed.

So you will make each build always do two byte-compilation passes
where today we have just one?  And the first one of these will use
only *.el files, including for those that are preloaded into
bootstrap-emacs?  Doesn't that sound like a significant slow-down of
the build?

Also, what about native-compilation, with or without AOT?





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-13  6:50                                                                   ` Eli Zaretskii
@ 2023-05-13  7:34                                                                     ` Max Nikulin
  2023-05-13  8:46                                                                       ` Eli Zaretskii
                                                                                         ` (2 more replies)
  0 siblings, 3 replies; 110+ messages in thread
From: Max Nikulin @ 2023-05-13  7:34 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 13/05/2023 13:50, Eli Zaretskii wrote:
>> Date: Sat, 13 May 2023 10:08:25 +0700 From: Max Nikulin
>>
>> ... What
>> can be better is removing all stale .elc file before compiling of
>> updates sources. A script iterates over dependency files and deletes
>> .elc if any its prerequisite has been updated. Following compilation
>> pass can safely use .elc files that are either survived from previous
>> build as up to date or just refreshed.
> 
> So you will make each build always do two byte-compilation passes
> where today we have just one?  And the first one of these will use
> only *.el files, including for those that are preloaded into
> bootstrap-emacs?  Doesn't that sound like a significant slow-down of
> the build?

I do not see a reason for significant slow-down because I do not suggest 
two passes of *byte-compilataion*.

1. A script reads dependency files (if they exist) created during 
previous build and removes stale .elc files.
2. Normal "make" pass that takes into account dependency between files 
for ordering of compile commands. Dependency files are created or 
updated as a side-effect of compilation.

Likely it is reasonable to split stage 2 into steps similar to current 
targets like main-first and mark most of files as dependent on a target 
that (throw its dependencies) compiles files required for byte compilation.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-13  7:34                                                                     ` Max Nikulin
@ 2023-05-13  8:46                                                                       ` Eli Zaretskii
  2023-05-13 10:25                                                                         ` Max Nikulin
  2023-05-13 14:48                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-13 15:43                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-13  8:46 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Sat, 13 May 2023 14:34:06 +0700
> Cc: monnier@iro.umontreal.ca, yantar92@posteo.net, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> 1. A script reads dependency files (if they exist) created during 
> previous build and removes stale .elc files.

This will break if the updated files have different dependencies.  You
need to recreate the dependencies each build.

Also, it is not clear what is the plan for the macros.  If one of the
macros used during byte compilation changes in incompatible ways,
trying to byte-compile using Emacs which preloaded the previous
(outdated) definition of the macro will fail.  So some changes need
also to generate a new Emacs binary, not just byte-compile in the
right order.

> 2. Normal "make" pass that takes into account dependency between files 
> for ordering of compile commands. Dependency files are created or 
> updated as a side-effect of compilation.
> 
> Likely it is reasonable to split stage 2 into steps similar to current 
> targets like main-first and mark most of files as dependent on a target 
> that (throw its dependencies) compiles files required for byte compilation.

What is the plan for the various autoloads files?  They depend on all
the files, and many (all?) files depend on them.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-13  8:46                                                                       ` Eli Zaretskii
@ 2023-05-13 10:25                                                                         ` Max Nikulin
  2023-05-13 10:58                                                                           ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-13 10:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 13/05/2023 15:46, Eli Zaretskii wrote:
>> Date: Sat, 13 May 2023 14:34:06 +0700 From: Max Nikulin
>>
>> 1. A script reads dependency files (if they exist) created during
>> previous build and removes stale .elc files.
> 
> This will break if the updated files have different dependencies.  You
> need to recreate the dependencies each build.

Let's consider a.el that contains (require 'd) or it autoloads some 
macro from d.el. If a.el changed then a.elc is removed on this stage, so 
updated a.elc will be created on the next stage. Dependency on d.elc is 
known from previous build, so if d.el is changed then both a.elc and 
d.elc are removed. If new (require 'd-new) is added to a.el then it is 
not a problem as well. a.elc is removed due to changed a.el. d-new.elc 
is either up to date or it is removed due to changes in its dependencies 
or in d-new.el.

So no stale files should survive stage 1. The only issue with obsolete 
dependencies is that compilation order may be not optimal.

> Also, it is not clear what is the plan for the macros.  If one of the
> macros used during byte compilation changes in incompatible ways,
> trying to byte-compile using Emacs which preloaded the previous
> (outdated) definition of the macro will fail.

I hope, it is addressed above.

>  So some changes need
> also to generate a new Emacs binary, not just byte-compile in the
> right order.

I expect that dependencies of the script removing stale files are 
minimized. If changes in the breaks this script then it is time for 
"make clean". If emacs binary depends on .elc files then some file may 
be touched to let "make" know that the executable needs rebuild.

>> 2. Normal "make" pass that takes into account dependency between files
>> for ordering of compile commands. Dependency files are created or
>> updated as a side-effect of compilation.
>>
>> Likely it is reasonable to split stage 2 into steps similar to current
>> targets like main-first and mark most of files as dependent on a target
>> that (throw its dependencies) compiles files required for byte compilation.
> 
> What is the plan for the various autoloads files?  They depend on all
> the files, and many (all?) files depend on them.

My plan is that autoloads/loaddefs are order-only dependencies for .elc 
files. However autoloads/loaddefs files depends on all files necessary 
to generate them.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-13 10:25                                                                         ` Max Nikulin
@ 2023-05-13 10:58                                                                           ` Eli Zaretskii
  2023-05-13 11:21                                                                             ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-13 10:58 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Sat, 13 May 2023 17:25:06 +0700
> Cc: monnier@iro.umontreal.ca, yantar92@posteo.net, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> On 13/05/2023 15:46, Eli Zaretskii wrote:
> >> Date: Sat, 13 May 2023 14:34:06 +0700 From: Max Nikulin
> >>
> >> 1. A script reads dependency files (if they exist) created during
> >> previous build and removes stale .elc files.
> > 
> > This will break if the updated files have different dependencies.  You
> > need to recreate the dependencies each build.
> 
> Let's consider a.el that contains (require 'd) or it autoloads some 
> macro from d.el. If a.el changed then a.elc is removed on this stage, so 
> updated a.elc will be created on the next stage. Dependency on d.elc is 
> known from previous build, so if d.el is changed then both a.elc and 
> d.elc are removed. If new (require 'd-new) is added to a.el then it is 
> not a problem as well. a.elc is removed due to changed a.el. d-new.elc 
> is either up to date or it is removed due to changes in its dependencies 
> or in d-new.el.

I was talking about dependencies, not about stale files.  They will
need to be refreshed every build, because, unlike C sources, the *.el
files change in that aspect much more frequently.

> So no stale files should survive stage 1. The only issue with obsolete 
> dependencies is that compilation order may be not optimal.

Stale files are already not an issue, because the build runs with
load-prefer-newer set non-nil.

> > Also, it is not clear what is the plan for the macros.  If one of the
> > macros used during byte compilation changes in incompatible ways,
> > trying to byte-compile using Emacs which preloaded the previous
> > (outdated) definition of the macro will fail.
> 
> I hope, it is addressed above.

It isn't.

> >  So some changes need
> > also to generate a new Emacs binary, not just byte-compile in the
> > right order.
> 
> I expect that dependencies of the script removing stale files are 
> minimized. If changes in the breaks this script then it is time for 
> "make clean". If emacs binary depends on .elc files then some file may 
> be touched to let "make" know that the executable needs rebuild.

I don't understand how this will work, but don't let me discourage you
from trying to make it work and showing how.

> > What is the plan for the various autoloads files?  They depend on all
> > the files, and many (all?) files depend on them.
> 
> My plan is that autoloads/loaddefs are order-only dependencies for .elc 
> files. However autoloads/loaddefs files depends on all files necessary 
> to generate them.

Same here.

Thanks for working on this, anyway.  If it can work, it could be an
important change.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-13 10:58                                                                           ` Eli Zaretskii
@ 2023-05-13 11:21                                                                             ` Max Nikulin
  2023-05-13 14:49                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-05-13 11:21 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 13/05/2023 17:58, Eli Zaretskii wrote:
>> Date: Sat, 13 May 2023 17:25:06 +0700 From: Max Nikulin
>>
>> On 13/05/2023 15:46, Eli Zaretskii wrote:
>>>> Date: Sat, 13 May 2023 14:34:06 +0700 From: Max Nikulin
>>>>
>>>> 1. A script reads dependency files (if they exist) created during
----------^^^^^^^^^^^^^^^^^^^^^^^

>>>> previous build and removes stale .elc files.
>>>
>>> This will break if the updated files have different dependencies.  You
>>> need to recreate the dependencies each build.
>>
>> Let's consider a.el that contains (require 'd) or it autoloads some
>> macro from d.el. If a.el changed then a.elc is removed on this stage, so
>> updated a.elc will be created on the next stage. Dependency on d.elc is
>> known from previous build, so if d.el is changed then both a.elc and
>> d.elc are removed. If new (require 'd-new) is added to a.el then it is
>> not a problem as well. a.elc is removed due to changed a.el. d-new.elc
>> is either up to date or it is removed due to changes in its dependencies
>> or in d-new.el.
> 
> I was talking about dependencies, not about stale files.  They will
> need to be refreshed every build, because, unlike C sources, the *.el
> files change in that aspect much more frequently.

Writing "stale" I mean more than comparison timestamps of a.el and 
a.elc. Dependency files may contain

a.elc: a.el d.elc
d.elc: d.el

the script walks through dependency graph, compares timestamps and when 
it d.el is newer than d.elc, *both* "a.elc" and "d.elc" are removed. It 
is unfortunate that a part of "make" should be implemented in the 
script, but I am unsure if some trick is suitable to leverage "make" 
power for removing of files instead of their creation.

Next compile stage updates dependency files as a side effect and new 
dependencies may appear

d.elc: d.el d-transitive.elc

however absence of d-transitive.elc during dependency removing stage 1 
does not lead to any problem.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-13  7:34                                                                     ` Max Nikulin
  2023-05-13  8:46                                                                       ` Eli Zaretskii
@ 2023-05-13 14:48                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-05-15 10:11                                                                         ` Max Nikulin
  2023-05-13 15:43                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 1 reply; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-13 14:48 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, acm, Eli Zaretskii

> 1. A script reads dependency files (if they exist) created during previous
>   build and removes stale .elc files.

`load-prefer-newer` should give us the same result already.


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-13 11:21                                                                             ` Max Nikulin
@ 2023-05-13 14:49                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-13 14:49 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, acm, Eli Zaretskii

> Writing "stale" I mean more than comparison timestamps of a.el and
> a.elc. Dependency files may contain
>
> a.elc: a.el d.elc
> d.elc: d.el
>
> the script walks through dependency graph, compares timestamps and when it
> d.el is newer than d.elc, *both* "a.elc" and "d.elc" are removed.

Make will already take care of this dependency and recompile `d.elc`
before `a.elc`.


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-13  7:34                                                                     ` Max Nikulin
  2023-05-13  8:46                                                                       ` Eli Zaretskii
  2023-05-13 14:48                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-05-13 15:43                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 0 replies; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-13 15:43 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, acm, Eli Zaretskii

> I do not see a reason for significant slow-down because I do not suggest two
> passes of *byte-compilataion*.

Not sure about two passes, but if you want it to be "right" (i.e. aim
to never need `make bootstrap`), then every `.elc` file will transitively
depend on every preloaded `.el` file, including `loaddefs.el` which is
itself auto-generated from all the `.el` files.  IOW the only truly
"right" way is to always recompile all the `.elc` files whenever  `.el`
(or `.c` or `.h`) file is modified :-(

So, in order to avoid this, we need to make concessions, such as
ignoring (transitive) dependencies on preloaded files, and those files
used by the byte compiler.


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-13 14:48                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-05-15 10:11                                                                         ` Max Nikulin
  2023-05-15 11:20                                                                           ` Eli Zaretskii
  2023-05-15 15:00                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 110+ messages in thread
From: Max Nikulin @ 2023-05-15 10:11 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: yantar92, 62762, bzg, dmitry, acm, Eli Zaretskii

On 13/05/2023 21:48, Stefan Monnier wrote:
>> 1. A script reads dependency files (if they exist) created during previous
>>    build and removes stale .elc files.
> 
> `load-prefer-newer` should give us the same result already.

No, because some .elc files may become stale not because of modification 
of the corresponding files, but due to update of a macro inside a 
`require'd file. Removing of outdated .elc files *before* 
byte-compilation pass ensures that no obsolete macro definitions are used.

On 13/05/2023 21:49, Stefan Monnier wrote:
>> Writing "stale" I mean more than comparison timestamps of a.el and
>> a.elc. Dependency files may contain
>>
>> a.elc: a.el d.elc
>> d.elc: d.el
>>
>> the script walks through dependency graph, compares timestamps and when it
>> d.el is newer than d.elc, *both* "a.elc" and "d.elc" are removed.
> 
> Make will already take care of this dependency and recompile `d.elc`
> before `a.elc`.

You are right when dependency graph is a tree. You provided an example 
of circular dependency in lisp/vc/ediff-util.el. It is the case when to 
correctly recompile ediff it is necessary to remove ediff*.elc files 
before compilation (I do not like your approach with breaking cycle at 
an arbitrary edge since outdated macro definition still may be used). 
Files necessary for byte compilation is another example of a dependency 
loop. I assume there are may be more tricky cases I am unaware about, so 
prefer to be at the safe side.

Eli raised a question of rebuilding of an .elc file when a new 
dependency with outdated .elc file is introduced. Since it is almost 
impossible to get dependency list without byte compilation, there are 2 
options: ask make to rebuild .elc files files once more (updated 
dependency graph is available during second byte compilation pass) or 
just remove all stale .elc file before starting byte compilation. I 
prefer the latter approach.

Due to these reasons I prefer 2 stage incremental build.

On 13/05/2023 22:43, Stefan Monnier wrote:
> Not sure about two passes, but if you want it to be "right" (i.e. aim
> to never need `make bootstrap`), then every `.elc` file will transitively
> depend on every preloaded `.el` file, including `loaddefs.el` which is
> itself auto-generated from all the `.el` files.  IOW the only truly
> "right" way is to always recompile all the `.elc` files whenever  `.el`
> (or `.c` or `.h`) file is modified 🙁

I still hope, it is possible to add loaddefs files as order-only 
dependencies. I see just one case when it may lead to incomplete 
rebuild: a.el uses a function from al.el without (require 'al) and 
autoload cookie is missed in al.el. After compilation of a.el dependency 
on al.elc is unknown thus updating al.el is not a reason to recompile 
a.elc. I hope, raising priority of "Warning: the following functions are 
not known to be defined:" to an error preventing creation of .elc file 
will solve the issue.

Despite at first glance loaddefs ruin the idea with partial incremental 
rebuild and dependency tracking, it seems a workaround exists.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-15 10:11                                                                         ` Max Nikulin
@ 2023-05-15 11:20                                                                           ` Eli Zaretskii
  2023-05-15 13:00                                                                             ` Max Nikulin
  2023-05-15 15:00                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-05-15 11:20 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

> Date: Mon, 15 May 2023 17:11:25 +0700
> Cc: Eli Zaretskii <eliz@gnu.org>, yantar92@posteo.net, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> From: Max Nikulin <manikulin@gmail.com>
> 
> I see just one case when it may lead to incomplete 
> rebuild: a.el uses a function from al.el without (require 'al) and 
> autoload cookie is missed in al.el.

This can happen when we use 'declare-function'.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-15 11:20                                                                           ` Eli Zaretskii
@ 2023-05-15 13:00                                                                             ` Max Nikulin
  0 siblings, 0 replies; 110+ messages in thread
From: Max Nikulin @ 2023-05-15 13:00 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: yantar92, 62762, bzg, dmitry, monnier, acm

On 15/05/2023 18:20, Eli Zaretskii wrote:
>> Date: Mon, 15 May 2023 17:11:25 +0700 From: Max Nikulin
>>
>> I see just one case when it may lead to incomplete
>> rebuild: a.el uses a function from al.el without (require 'al) and
>> autoload cookie is missed in al.el.
> 
> This can happen when we use 'declare-function'.

Sorry, my bad. When a.el uses a *macro* from al.el then, instead of 
macro expansion result, function call appears in a.elc.

Anyway by this sentence I was trying to convince that it is enough to 
have loaddefs as order-only dependency. What would be more interesting 
is an example when an .elc file *must* be recompiled in response to 
update of a loaddefs file. I mean a case of hidden dependency on a file 
that is the source for autoload declaration.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: circular dependencies in elisp files and make
  2023-05-15 10:11                                                                         ` Max Nikulin
  2023-05-15 11:20                                                                           ` Eli Zaretskii
@ 2023-05-15 15:00                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 110+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-05-15 15:00 UTC (permalink / raw)
  To: Max Nikulin; +Cc: yantar92, 62762, bzg, dmitry, acm, Eli Zaretskii

> You are right when dependency graph is a tree.  You provided an
> example of circular dependency in lisp/vc/ediff-util.el.
[...]
> Due to these reasons I prefer 2 stage incremental build.

My intuition tells me it's probably not going to result in a good
trade-off, which is why I haven't worked on it so far.

But you don't need to try and convince me (or anyone else).
Instead, just go and implement it.

If you prove my intuition wrong, then we'll all be happy.


        Stefan






^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-05-10 14:52                                             ` Max Nikulin
@ 2023-06-23 12:02                                               ` Ihor Radchenko
  2023-06-25 14:37                                                 ` Max Nikulin
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-06-23 12:02 UTC (permalink / raw)
  To: Max Nikulin
  Cc: 62762, bzg, dmitry, Stefan Monnier, Alan Mackenzie, Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 2398 bytes --]

Max Nikulin <manikulin@gmail.com> writes:

>> I think we can try to do the following:
>> 
>> 1. Use the load-dir test, warn, and try to re-load
>> 2. Use org-assert-version, but downgrade error to simple warning
>
> Ihor, final decision is up to you.

> I think, `org-reload' may be recommended in a warning message. I am 
> unsure if `org-reload' called from the assertion while an Org component 
> is loaded may not cause a more severe issue. My special concern is 
> reloading when new Org is being compiled: is it safe or reloading should 
> be suppressed completely?

I am thinking about the following:
1. Use `org-reload' instead of load-dir test. This will re-load all the
   currently loaded Org libraries, forcing them to be consistent. This
   is necessary because Org does not only rely upon explicit (require
   ...) statements - we have way too many `declare-function' expecting
   other libraries to be loaded by other means.
2. Run `org-reload' _after_ loading current file.
   Because (equal (org-release) ,(org-release)) will only ever trigger
   during compilation when we (require 'already-compiled-library),
   running `org-reload' after loading 'already-compiled-library will
   also ensure consistent Org state after (require
   'already-compiled-library) is finished.

> I believe, during creation of .elc files, assert macro should signal an 
> error since a warning is not enough to prevent loading mixed compilation 
> result to next Emacs session. I do not like that currently during 
> compiling with old Org loaded, `org-assert-version' causes just a 
> warning. Users have difficulties with clean recompiling.
>
> While loading, non-fatal error may be a better option when versions do 
> not differ too much.

I do not think that we should throw and error. `org-reload' approach
should hopefully solve the problem with mixed versions. If not, not
throwing an error is still better because mixed compilation actually
works relatively fine in many cases - much better than throwing a hard
error from user perspective. And we will still notify the user that
something is wrong and that random failures are expected.

See the attached tentative patch for bugfix.

P.S. I am not sure how to approach this patch in a view of the Emacs
release process. This is a critical bug, so we aim for bugfix Org
release, but we do not want to make life harder for Emacs devs as well.


[-- Attachment #2: 0001-org-assert-version-Demote-to-warning-and-attempt-to-.patch --]
[-- Type: text/x-patch, Size: 58016 bytes --]

From 5d81ce17ade36135ae405305fb88efd79f97d96f Mon Sep 17 00:00:00 2001
Message-ID: <5d81ce17ade36135ae405305fb88efd79f97d96f.1687521721.git.yantar92@posteo.net>
From: Ihor Radchenko <yantar92@posteo.net>
Date: Fri, 23 Jun 2023 14:17:05 +0300
Subject: [PATCH] org-assert-version: Demote to warning and attempt to work
 around mixed versions

* lisp/org-load.el: New library containing load-related functions and commands.
(org-require-autoloaded-modules):
(org-reload):
(org-customize):
(org-create-customize-menu):
(org--inhibit-version-check): Move from other files.
(org-assert-version): Move from lisp/org-macs.el, remove error, and
instead try `org-reload' when version mismatch is detected.  Update
the warning text, explaining extra scenario when we compile from Git
source with stale .elc files.
* lisp/org-macs.el (org--inhibit-version-check):
(org-assert-version):
(org-find-library-dir): Move from lisp/org-compat.el
* lisp/org.el:
(org-require-autoloaded-modules):
(org-reload):
(org-customize):
(org-create-customize-menu): Move to lisp/org-load.el
* lisp/org-compat.el (org-find-library-dir): Move to lisp/org-macs.el

All the callers to `org-assert-version' are now using
(require 'org-load) instead of (require 'org-macs).

The changes in `org-assert-version' are aiming at 3 goals:

1. Move `org-assert-version' to a new file, not available in older
   Org versions.  This makes sure that (require 'org-load) either
   signals an error or guarantees loading `org-assert-version'
   macro.  Previous approach with defining the macro in org-macs.el
   suffered from byte-compilation silently treating the macro as
   undefined function; when org-macs.el was taken from older Org
   version and did not define the macro at all.

2. Be less strict and do not throw an error.  This is necessary
   because mixed Org versions have non-zero chance to produce working
   Org, while throwing an error is always hitting users.  In this
   scenario, pedantic approach makes more harm.

3. Try to recover gracefully from mixed version state by re-loading
   Org.  This should be considered the last resort and we need to
   attract user's attention with a warning, but at least `org-reload'
   has a chance to keep Org operational.

   An alternative to `org-reload' could also be
   "require-with-shadow-check" that ensures that each required library
   is taken from the up-to-date `load-path' ordering [1].  However,
   Org currently does not rely strictly upon `require' statements.
   Org libraries are full of `declare-function' statements that
   implicitly assume that certain libraries would be loaded by other
   means.  So, the alternative approach is less reliable compared to
   full Org re-loading.

[1] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=62762#110

Other discussions of the issue with `org-assert-version' and mixed
install:

- https://debbugs.gnu.org/cgi/bugreport.cgi?bug=59882
- https://list.orgmode.org/orgmode/tnm7ui$a8k$1@ciao.gmane.io/
- https://list.orgmode.org/orgmode/87bkonzisl.fsf@gnu.org/
- https://yhetil.org/emacs-devel/00b52cc1-b0ac-a0c0-c91d-33a7213e9881@web.de/
- https://irreal.org/blog/?p=10999
---
 lisp/ob-C.el           |   2 +-
 lisp/ob-R.el           |   2 +-
 lisp/ob-awk.el         |   2 +-
 lisp/ob-calc.el        |   2 +-
 lisp/ob-clojure.el     |   2 +-
 lisp/ob-comint.el      |   2 +-
 lisp/ob-core.el        |   2 +-
 lisp/ob-css.el         |   2 +-
 lisp/ob-ditaa.el       |   2 +-
 lisp/ob-dot.el         |   2 +-
 lisp/ob-emacs-lisp.el  |   2 +-
 lisp/ob-eshell.el      |   2 +-
 lisp/ob-eval.el        |   2 +-
 lisp/ob-exp.el         |   2 +-
 lisp/ob-forth.el       |   2 +-
 lisp/ob-fortran.el     |   2 +-
 lisp/ob-gnuplot.el     |   2 +-
 lisp/ob-groovy.el      |   2 +-
 lisp/ob-haskell.el     |   2 +-
 lisp/ob-java.el        |   2 +-
 lisp/ob-js.el          |   2 +-
 lisp/ob-julia.el       |   2 +-
 lisp/ob-latex.el       |   2 +-
 lisp/ob-lilypond.el    |   2 +-
 lisp/ob-lisp.el        |   2 +-
 lisp/ob-lob.el         |   2 +-
 lisp/ob-lua.el         |   2 +-
 lisp/ob-makefile.el    |   2 +-
 lisp/ob-matlab.el      |   2 +-
 lisp/ob-maxima.el      |   2 +-
 lisp/ob-ocaml.el       |   2 +-
 lisp/ob-octave.el      |   2 +-
 lisp/ob-org.el         |   2 +-
 lisp/ob-perl.el        |   2 +-
 lisp/ob-plantuml.el    |   2 +-
 lisp/ob-processing.el  |   2 +-
 lisp/ob-python.el      |   2 +-
 lisp/ob-ref.el         |   2 +-
 lisp/ob-ruby.el        |   2 +-
 lisp/ob-sass.el        |   2 +-
 lisp/ob-scheme.el      |   2 +-
 lisp/ob-screen.el      |   2 +-
 lisp/ob-sed.el         |   2 +-
 lisp/ob-shell.el       |   2 +-
 lisp/ob-sql.el         |   2 +-
 lisp/ob-sqlite.el      |   2 +-
 lisp/ob-table.el       |   2 +-
 lisp/ob-tangle.el      |   2 +-
 lisp/ob.el             |   2 +-
 lisp/oc-basic.el       |   2 +-
 lisp/oc-biblatex.el    |   2 +-
 lisp/oc-bibtex.el      |   2 +-
 lisp/oc-csl.el         |   2 +-
 lisp/oc-natbib.el      |   2 +-
 lisp/oc.el             |   2 +-
 lisp/ol-bbdb.el        |   2 +-
 lisp/ol-bibtex.el      |   2 +-
 lisp/ol-docview.el     |   2 +-
 lisp/ol-doi.el         |   2 +-
 lisp/ol-eshell.el      |   2 +-
 lisp/ol-eww.el         |   2 +-
 lisp/ol-gnus.el        |   2 +-
 lisp/ol-info.el        |   2 +-
 lisp/ol-irc.el         |   2 +-
 lisp/ol-man.el         |   2 +-
 lisp/ol-mhe.el         |   2 +-
 lisp/ol-rmail.el       |   2 +-
 lisp/ol-w3m.el         |   2 +-
 lisp/ol.el             |   2 +-
 lisp/org-agenda.el     |   2 +-
 lisp/org-archive.el    |   2 +-
 lisp/org-attach-git.el |   2 +-
 lisp/org-attach.el     |   2 +-
 lisp/org-capture.el    |   2 +-
 lisp/org-clock.el      |   2 +-
 lisp/org-compat.el     |   3 -
 lisp/org-crypt.el      |   2 +-
 lisp/org-ctags.el      |   2 +-
 lisp/org-cycle.el      |   2 +-
 lisp/org-datetree.el   |   2 +-
 lisp/org-duration.el   |   2 +-
 lisp/org-element.el    |   2 +-
 lisp/org-entities.el   |   2 +-
 lisp/org-faces.el      |   2 +-
 lisp/org-feed.el       |   2 +-
 lisp/org-fold-core.el  |   2 +-
 lisp/org-fold.el       |   2 +-
 lisp/org-footnote.el   |   2 +-
 lisp/org-goto.el       |   2 +-
 lisp/org-habit.el      |   2 +-
 lisp/org-id.el         |   2 +-
 lisp/org-indent.el     |   2 +-
 lisp/org-inlinetask.el |   2 +-
 lisp/org-keys.el       |   2 +-
 lisp/org-lint.el       |   2 +-
 lisp/org-list.el       |   2 +-
 lisp/org-load.el       | 196 +++++++++++++++++++++++++++++++++++++++++
 lisp/org-macro.el      |   2 +-
 lisp/org-macs.el       |  69 +--------------
 lisp/org-mobile.el     |   2 +-
 lisp/org-mouse.el      |   2 +-
 lisp/org-num.el        |   2 +-
 lisp/org-pcomplete.el  |   2 +-
 lisp/org-persist.el    |   2 +-
 lisp/org-plot.el       |   2 +-
 lisp/org-protocol.el   |   2 +-
 lisp/org-refile.el     |   2 +-
 lisp/org-src.el        |   2 +-
 lisp/org-table.el      |   2 +-
 lisp/org-tempo.el      |   2 +-
 lisp/org-timer.el      |   2 +-
 lisp/org.el            |  85 +-----------------
 lisp/ox-ascii.el       |   2 +-
 lisp/ox-beamer.el      |   2 +-
 lisp/ox-html.el        |   2 +-
 lisp/ox-icalendar.el   |   2 +-
 lisp/ox-koma-letter.el |   2 +-
 lisp/ox-latex.el       |   2 +-
 lisp/ox-man.el         |   2 +-
 lisp/ox-md.el          |   2 +-
 lisp/ox-odt.el         |   2 +-
 lisp/ox-org.el         |   2 +-
 lisp/ox-publish.el     |   2 +-
 lisp/ox-texinfo.el     |   2 +-
 lisp/ox.el             |   2 +-
 125 files changed, 321 insertions(+), 274 deletions(-)
 create mode 100644 lisp/org-load.el

diff --git a/lisp/ob-C.el b/lisp/ob-C.el
index 7763c4c07..4251f86bf 100644
--- a/lisp/ob-C.el
+++ b/lisp/ob-C.el
@@ -33,7 +33,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cc-mode)
diff --git a/lisp/ob-R.el b/lisp/ob-R.el
index f2cc069aa..3d29ebfec 100644
--- a/lisp/ob-R.el
+++ b/lisp/ob-R.el
@@ -29,7 +29,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ob-awk.el b/lisp/ob-awk.el
index e5e42a91d..2add0a329 100644
--- a/lisp/ob-awk.el
+++ b/lisp/ob-awk.el
@@ -33,7 +33,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-calc.el b/lisp/ob-calc.el
index 5572ce818..68ca87025 100644
--- a/lisp/ob-calc.el
+++ b/lisp/ob-calc.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-clojure.el b/lisp/ob-clojure.el
index d993e0cb7..0047f6dbf 100644
--- a/lisp/ob-clojure.el
+++ b/lisp/ob-clojure.el
@@ -46,7 +46,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-comint.el b/lisp/ob-comint.el
index adfe31c40..23b457001 100644
--- a/lisp/ob-comint.el
+++ b/lisp/ob-comint.el
@@ -31,7 +31,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob-core)
diff --git a/lisp/ob-core.el b/lisp/ob-core.el
index e69ce4f1d..a7315130b 100644
--- a/lisp/ob-core.el
+++ b/lisp/ob-core.el
@@ -24,7 +24,7 @@ ;;; ob-core.el --- Working with Code Blocks          -*- lexical-binding: t; -*-
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ob-css.el b/lisp/ob-css.el
index f93c576fc..0dff5525e 100644
--- a/lisp/ob-css.el
+++ b/lisp/ob-css.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-ditaa.el b/lisp/ob-ditaa.el
index 622000828..70f5ed679 100644
--- a/lisp/ob-ditaa.el
+++ b/lisp/ob-ditaa.el
@@ -37,7 +37,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-dot.el b/lisp/ob-dot.el
index ecef071a7..b62266503 100644
--- a/lisp/ob-dot.el
+++ b/lisp/ob-dot.el
@@ -40,7 +40,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-emacs-lisp.el b/lisp/ob-emacs-lisp.el
index f2111d649..3ebc2cf5d 100644
--- a/lisp/ob-emacs-lisp.el
+++ b/lisp/ob-emacs-lisp.el
@@ -27,7 +27,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob-core)
diff --git a/lisp/ob-eshell.el b/lisp/ob-eshell.el
index 95f5777ae..5c82a8f43 100644
--- a/lisp/ob-eshell.el
+++ b/lisp/ob-eshell.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-eval.el b/lisp/ob-eval.el
index 07e530772..071102ac9 100644
--- a/lisp/ob-eval.el
+++ b/lisp/ob-eval.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (eval-when-compile (require 'subr-x))  ; For `string-empty-p', Emacs < 29
diff --git a/lisp/ob-exp.el b/lisp/ob-exp.el
index 4d1b084be..d062c75d1 100644
--- a/lisp/ob-exp.el
+++ b/lisp/ob-exp.el
@@ -24,7 +24,7 @@ ;;; ob-exp.el --- Exportation of Babel Source Blocks -*- lexical-binding: t; -*-
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob-core)
diff --git a/lisp/ob-forth.el b/lisp/ob-forth.el
index e5dcad6d0..e90a6ae13 100644
--- a/lisp/ob-forth.el
+++ b/lisp/ob-forth.el
@@ -33,7 +33,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-fortran.el b/lisp/ob-fortran.el
index 2c050cb18..1e4b62159 100644
--- a/lisp/ob-fortran.el
+++ b/lisp/ob-fortran.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-gnuplot.el b/lisp/ob-gnuplot.el
index e3e42918c..fbd7f1186 100644
--- a/lisp/ob-gnuplot.el
+++ b/lisp/ob-gnuplot.el
@@ -40,7 +40,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-groovy.el b/lisp/ob-groovy.el
index c0da69fcb..7e3315baa 100644
--- a/lisp/ob-groovy.el
+++ b/lisp/ob-groovy.el
@@ -32,7 +32,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-haskell.el b/lisp/ob-haskell.el
index 7185ed61f..495d18d0e 100644
--- a/lisp/ob-haskell.el
+++ b/lisp/ob-haskell.el
@@ -40,7 +40,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-java.el b/lisp/ob-java.el
index 893860526..034034876 100644
--- a/lisp/ob-java.el
+++ b/lisp/ob-java.el
@@ -29,7 +29,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-js.el b/lisp/ob-js.el
index de7ea9131..e0fc0171b 100644
--- a/lisp/ob-js.el
+++ b/lisp/ob-js.el
@@ -39,7 +39,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-julia.el b/lisp/ob-julia.el
index cb5c7fa3b..9895aa10f 100644
--- a/lisp/ob-julia.el
+++ b/lisp/ob-julia.el
@@ -32,7 +32,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ob-latex.el b/lisp/ob-latex.el
index ce39628d6..68b584523 100644
--- a/lisp/ob-latex.el
+++ b/lisp/ob-latex.el
@@ -31,7 +31,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-lilypond.el b/lisp/ob-lilypond.el
index 9693b89e2..75470c71f 100644
--- a/lisp/ob-lilypond.el
+++ b/lisp/ob-lilypond.el
@@ -33,7 +33,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-lisp.el b/lisp/ob-lisp.el
index 048ef883c..268129460 100644
--- a/lisp/ob-lisp.el
+++ b/lisp/ob-lisp.el
@@ -37,7 +37,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-lob.el b/lisp/ob-lob.el
index f77bda73d..e8ceb42e3 100644
--- a/lisp/ob-lob.el
+++ b/lisp/ob-lob.el
@@ -24,7 +24,7 @@ ;;; ob-lob.el --- Functions Supporting the Library of Babel -*- lexical-binding:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ob-lua.el b/lisp/ob-lua.el
index 81521d9e0..6c7aeb2f5 100644
--- a/lisp/ob-lua.el
+++ b/lisp/ob-lua.el
@@ -36,7 +36,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-makefile.el b/lisp/ob-makefile.el
index 25306159b..31c4a509e 100644
--- a/lisp/ob-makefile.el
+++ b/lisp/ob-makefile.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-matlab.el b/lisp/ob-matlab.el
index 43344495d..38c7b539f 100644
--- a/lisp/ob-matlab.el
+++ b/lisp/ob-matlab.el
@@ -36,7 +36,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-maxima.el b/lisp/ob-maxima.el
index d1d7c7424..0673e0b7f 100644
--- a/lisp/ob-maxima.el
+++ b/lisp/ob-maxima.el
@@ -32,7 +32,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-ocaml.el b/lisp/ob-ocaml.el
index 09224b98b..7d89f6141 100644
--- a/lisp/ob-ocaml.el
+++ b/lisp/ob-ocaml.el
@@ -36,7 +36,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-octave.el b/lisp/ob-octave.el
index 1de263a52..9261404d4 100644
--- a/lisp/ob-octave.el
+++ b/lisp/ob-octave.el
@@ -30,7 +30,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-org.el b/lisp/ob-org.el
index 1bf02b461..79084e2f2 100644
--- a/lisp/ob-org.el
+++ b/lisp/ob-org.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-perl.el b/lisp/ob-perl.el
index c8cff5da5..45e31fd32 100644
--- a/lisp/ob-perl.el
+++ b/lisp/ob-perl.el
@@ -29,7 +29,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-plantuml.el b/lisp/ob-plantuml.el
index 3202c6e41..705925cd7 100644
--- a/lisp/ob-plantuml.el
+++ b/lisp/ob-plantuml.el
@@ -35,7 +35,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-processing.el b/lisp/ob-processing.el
index 4eeaf98e0..558b4099d 100644
--- a/lisp/ob-processing.el
+++ b/lisp/ob-processing.el
@@ -52,7 +52,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-python.el b/lisp/ob-python.el
index c19af0ab3..1512d3234 100644
--- a/lisp/ob-python.el
+++ b/lisp/ob-python.el
@@ -29,7 +29,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-ref.el b/lisp/ob-ref.el
index 2eae3690d..51ecd51fe 100644
--- a/lisp/ob-ref.el
+++ b/lisp/ob-ref.el
@@ -50,7 +50,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob-core)
diff --git a/lisp/ob-ruby.el b/lisp/ob-ruby.el
index b94bc73dd..390e32074 100644
--- a/lisp/ob-ruby.el
+++ b/lisp/ob-ruby.el
@@ -36,7 +36,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-sass.el b/lisp/ob-sass.el
index 1498b931e..c8970b2a6 100644
--- a/lisp/ob-sass.el
+++ b/lisp/ob-sass.el
@@ -39,7 +39,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-scheme.el b/lisp/ob-scheme.el
index ef41a2ec4..0d1ec142a 100644
--- a/lisp/ob-scheme.el
+++ b/lisp/ob-scheme.el
@@ -39,7 +39,7 @@ ;;; Requirements:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-screen.el b/lisp/ob-screen.el
index 269538e79..f7f1a1d67 100644
--- a/lisp/ob-screen.el
+++ b/lisp/ob-screen.el
@@ -35,7 +35,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-sed.el b/lisp/ob-sed.el
index 6469901fd..1b281c80d 100644
--- a/lisp/ob-sed.el
+++ b/lisp/ob-sed.el
@@ -41,7 +41,7 @@ ;;; Usage:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el
index 2c30a2605..b5deaf61b 100644
--- a/lisp/ob-shell.el
+++ b/lisp/ob-shell.el
@@ -27,7 +27,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-sql.el b/lisp/ob-sql.el
index f73e7003f..377e31f0f 100644
--- a/lisp/ob-sql.el
+++ b/lisp/ob-sql.el
@@ -71,7 +71,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-sqlite.el b/lisp/ob-sqlite.el
index 526b73ebd..533bee2a1 100644
--- a/lisp/ob-sqlite.el
+++ b/lisp/ob-sqlite.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob)
diff --git a/lisp/ob-table.el b/lisp/ob-table.el
index 5c91f33f8..88d74816f 100644
--- a/lisp/ob-table.el
+++ b/lisp/ob-table.el
@@ -54,7 +54,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ob-core)
diff --git a/lisp/ob-tangle.el b/lisp/ob-tangle.el
index e63bde89f..824dc963e 100644
--- a/lisp/ob-tangle.el
+++ b/lisp/ob-tangle.el
@@ -27,7 +27,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ob.el b/lisp/ob.el
index 4444ced58..0a81584f3 100644
--- a/lisp/ob.el
+++ b/lisp/ob.el
@@ -23,7 +23,7 @@ ;;; ob.el --- Working with Code Blocks in Org        -*- lexical-binding: t; -*-
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org-macs)
diff --git a/lisp/oc-basic.el b/lisp/oc-basic.el
index 1c8c37aa9..105e759ba 100644
--- a/lisp/oc-basic.el
+++ b/lisp/oc-basic.el
@@ -66,7 +66,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'bibtex)
diff --git a/lisp/oc-biblatex.el b/lisp/oc-biblatex.el
index b2d31f0f6..bb6d6dca8 100644
--- a/lisp/oc-biblatex.el
+++ b/lisp/oc-biblatex.el
@@ -63,7 +63,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'map)
diff --git a/lisp/oc-bibtex.el b/lisp/oc-bibtex.el
index d5e5490ed..a5a311224 100644
--- a/lisp/oc-bibtex.el
+++ b/lisp/oc-bibtex.el
@@ -36,7 +36,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'oc)
diff --git a/lisp/oc-csl.el b/lisp/oc-csl.el
index 2b00cb599..65e821593 100644
--- a/lisp/oc-csl.el
+++ b/lisp/oc-csl.el
@@ -112,7 +112,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/oc-natbib.el b/lisp/oc-natbib.el
index 855be2a5c..5900d720b 100644
--- a/lisp/oc-natbib.el
+++ b/lisp/oc-natbib.el
@@ -43,7 +43,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'oc)
diff --git a/lisp/oc.el b/lisp/oc.el
index 8a7b66209..e62088e11 100644
--- a/lisp/oc.el
+++ b/lisp/oc.el
@@ -61,7 +61,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org-compat)
diff --git a/lisp/ol-bbdb.el b/lisp/ol-bbdb.el
index 47bd9d98c..a0ec6a79a 100644
--- a/lisp/ol-bbdb.el
+++ b/lisp/ol-bbdb.el
@@ -93,7 +93,7 @@ ;;; Commentary:
 ;;
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ol-bibtex.el b/lisp/ol-bibtex.el
index fd9517233..dd11b422d 100644
--- a/lisp/ol-bibtex.el
+++ b/lisp/ol-bibtex.el
@@ -107,7 +107,7 @@ ;;; History:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'bibtex)
diff --git a/lisp/ol-docview.el b/lisp/ol-docview.el
index a9cd9b995..fd4525940 100644
--- a/lisp/ol-docview.el
+++ b/lisp/ol-docview.el
@@ -42,7 +42,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'doc-view)
diff --git a/lisp/ol-doi.el b/lisp/ol-doi.el
index 971b05087..e24c4b463 100644
--- a/lisp/ol-doi.el
+++ b/lisp/ol-doi.el
@@ -26,7 +26,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ol)
diff --git a/lisp/ol-eshell.el b/lisp/ol-eshell.el
index b7d3baf38..67b79538f 100644
--- a/lisp/ol-eshell.el
+++ b/lisp/ol-eshell.el
@@ -23,7 +23,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'eshell)
diff --git a/lisp/ol-eww.el b/lisp/ol-eww.el
index ee970b6aa..1d404b6de 100644
--- a/lisp/ol-eww.el
+++ b/lisp/ol-eww.el
@@ -45,7 +45,7 @@ ;;; Commentary:
 \f
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ol)
diff --git a/lisp/ol-gnus.el b/lisp/ol-gnus.el
index 7c07ce045..6a4362bc5 100644
--- a/lisp/ol-gnus.el
+++ b/lisp/ol-gnus.el
@@ -31,7 +31,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'gnus-sum)
diff --git a/lisp/ol-info.el b/lisp/ol-info.el
index ad9e4a12b..7df698daa 100644
--- a/lisp/ol-info.el
+++ b/lisp/ol-info.el
@@ -30,7 +30,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ol)
diff --git a/lisp/ol-irc.el b/lisp/ol-irc.el
index 3760644e8..b14d3c47f 100644
--- a/lisp/ol-irc.el
+++ b/lisp/ol-irc.el
@@ -48,7 +48,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ol)
diff --git a/lisp/ol-man.el b/lisp/ol-man.el
index 40fdc8f92..96c991b21 100644
--- a/lisp/ol-man.el
+++ b/lisp/ol-man.el
@@ -24,7 +24,7 @@ ;;; ol-man.el --- Links to man pages -*- lexical-binding: t; -*-
 ;;
 ;;; Commentary:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ol)
diff --git a/lisp/ol-mhe.el b/lisp/ol-mhe.el
index 403b5a254..16b1967f8 100644
--- a/lisp/ol-mhe.el
+++ b/lisp/ol-mhe.el
@@ -30,7 +30,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org-macs)
diff --git a/lisp/ol-rmail.el b/lisp/ol-rmail.el
index 287779828..f95b6999c 100644
--- a/lisp/ol-rmail.el
+++ b/lisp/ol-rmail.el
@@ -30,7 +30,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ol)
diff --git a/lisp/ol-w3m.el b/lisp/ol-w3m.el
index 6fb01a60d..6d14e6ebc 100644
--- a/lisp/ol-w3m.el
+++ b/lisp/ol-w3m.el
@@ -41,7 +41,7 @@ ;;; Acknowledgments:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ol)
diff --git a/lisp/ol.el b/lisp/ol.el
index 9ad191c8f..e5e8de80f 100644
--- a/lisp/ol.el
+++ b/lisp/ol.el
@@ -27,7 +27,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org-compat)
diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
index d3e616431..6ff3b3cb0 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -45,7 +45,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-archive.el b/lisp/org-archive.el
index e74c59a51..3f74e6d14 100644
--- a/lisp/org-archive.el
+++ b/lisp/org-archive.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org)
diff --git a/lisp/org-attach-git.el b/lisp/org-attach-git.el
index 4763aefd4..2c9242d70 100644
--- a/lisp/org-attach-git.el
+++ b/lisp/org-attach-git.el
@@ -29,7 +29,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org-attach)
diff --git a/lisp/org-attach.el b/lisp/org-attach.el
index e8b27751e..428c12068 100644
--- a/lisp/org-attach.el
+++ b/lisp/org-attach.el
@@ -34,7 +34,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-capture.el b/lisp/org-capture.el
index a696c615b..cf487ac19 100644
--- a/lisp/org-capture.el
+++ b/lisp/org-capture.el
@@ -47,7 +47,7 @@ ;;; TODO
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-clock.el b/lisp/org-clock.el
index d7fe14cd5..77225d2d6 100644
--- a/lisp/org-clock.el
+++ b/lisp/org-clock.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-compat.el b/lisp/org-compat.el
index d5bf2191a..360143018 100644
--- a/lisp/org-compat.el
+++ b/lisp/org-compat.el
@@ -1176,9 +1176,6 @@ (defun org-move-to-column (column &optional force _buffer)
            buffer-invisibility-spec)))
     (move-to-column column force)))
 
-(defmacro org-find-library-dir (library)
-  `(file-name-directory (or (locate-library ,library) "")))
-
 (defun org-count-lines (s)
   "How many lines in string S?"
   (let ((start 0) (n 1))
diff --git a/lisp/org-crypt.el b/lisp/org-crypt.el
index b5df115cf..b6a306371 100644
--- a/lisp/org-crypt.el
+++ b/lisp/org-crypt.el
@@ -54,7 +54,7 @@ ;;; Thanks:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org-macs)
diff --git a/lisp/org-ctags.el b/lisp/org-ctags.el
index 5dd2bfd59..8ff2563e1 100644
--- a/lisp/org-ctags.el
+++ b/lisp/org-ctags.el
@@ -135,7 +135,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (eval-when-compile (require 'cl-lib))
diff --git a/lisp/org-cycle.el b/lisp/org-cycle.el
index 90fc95f41..85e94657f 100644
--- a/lisp/org-cycle.el
+++ b/lisp/org-cycle.el
@@ -29,7 +29,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org-macs)
diff --git a/lisp/org-datetree.el b/lisp/org-datetree.el
index 035ef047a..d3491324d 100644
--- a/lisp/org-datetree.el
+++ b/lisp/org-datetree.el
@@ -30,7 +30,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org)
diff --git a/lisp/org-duration.el b/lisp/org-duration.el
index 2919efd4c..2adddcc1b 100644
--- a/lisp/org-duration.el
+++ b/lisp/org-duration.el
@@ -51,7 +51,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-element.el b/lisp/org-element.el
index df43ebcf0..7397cb6cb 100644
--- a/lisp/org-element.el
+++ b/lisp/org-element.el
@@ -58,7 +58,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'avl-tree)
diff --git a/lisp/org-entities.el b/lisp/org-entities.el
index 61083022b..7125a5c77 100644
--- a/lisp/org-entities.el
+++ b/lisp/org-entities.el
@@ -27,7 +27,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (declare-function org-mode "org" ())
diff --git a/lisp/org-faces.el b/lisp/org-faces.el
index 594c9a6e7..5c1bd50a1 100644
--- a/lisp/org-faces.el
+++ b/lisp/org-faces.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (defgroup org-faces nil
diff --git a/lisp/org-feed.el b/lisp/org-feed.el
index f0b294b4a..43c035ad6 100644
--- a/lisp/org-feed.el
+++ b/lisp/org-feed.el
@@ -88,7 +88,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org)
diff --git a/lisp/org-fold-core.el b/lisp/org-fold-core.el
index 6c17b00fa..1ba7601f1 100644
--- a/lisp/org-fold-core.el
+++ b/lisp/org-fold-core.el
@@ -270,7 +270,7 @@ ;;; Performance considerations
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org-macs)
diff --git a/lisp/org-fold.el b/lisp/org-fold.el
index 1b7ca22b0..2e63f5100 100644
--- a/lisp/org-fold.el
+++ b/lisp/org-fold.el
@@ -42,7 +42,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org-macs)
diff --git a/lisp/org-footnote.el b/lisp/org-footnote.el
index 6bdd0b32f..7874a4af1 100644
--- a/lisp/org-footnote.el
+++ b/lisp/org-footnote.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 ;;;; Declarations
diff --git a/lisp/org-goto.el b/lisp/org-goto.el
index 00bf5d46a..2da5a86e2 100644
--- a/lisp/org-goto.el
+++ b/lisp/org-goto.el
@@ -22,7 +22,7 @@ ;;; org-goto.el --- Fast navigation in an Org buffer  -*- lexical-binding: t; -*
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org)
diff --git a/lisp/org-habit.el b/lisp/org-habit.el
index fb6a48b5f..a835ff270 100644
--- a/lisp/org-habit.el
+++ b/lisp/org-habit.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-id.el b/lisp/org-id.el
index 490e4ddee..d7b4dd338 100644
--- a/lisp/org-id.el
+++ b/lisp/org-id.el
@@ -70,7 +70,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org)
diff --git a/lisp/org-indent.el b/lisp/org-indent.el
index fe5233878..0a0019a44 100644
--- a/lisp/org-indent.el
+++ b/lisp/org-indent.el
@@ -36,7 +36,7 @@ ;;; Commentary:
 ;;
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org-macs)
diff --git a/lisp/org-inlinetask.el b/lisp/org-inlinetask.el
index cb7fdf88b..1fb16a2f8 100644
--- a/lisp/org-inlinetask.el
+++ b/lisp/org-inlinetask.el
@@ -78,7 +78,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org)
diff --git a/lisp/org-keys.el b/lisp/org-keys.el
index 37a150bb7..b5c576b2a 100644
--- a/lisp/org-keys.el
+++ b/lisp/org-keys.el
@@ -27,7 +27,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-lint.el b/lisp/org-lint.el
index 0e2967b6c..e6c4d088f 100644
--- a/lisp/org-lint.el
+++ b/lisp/org-lint.el
@@ -85,7 +85,7 @@ ;;; Commentary:
 \f
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-list.el b/lisp/org-list.el
index 1fc99d070..63ff65bca 100644
--- a/lisp/org-list.el
+++ b/lisp/org-list.el
@@ -76,7 +76,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-load.el b/lisp/org-load.el
new file mode 100644
index 000000000..c618452f2
--- /dev/null
+++ b/lisp/org-load.el
@@ -0,0 +1,196 @@
+;;; org-load.el --- Functions and commands that load Org mode         -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023-2023 Free Software Foundation, Inc.
+
+;; Author: Ihor Radchenko <yantar92 at gmail dot com>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; This file contains commands and functions dealing with loading
+;; various parts of Org and checking consistency of the Org libraries.
+
+(require 'org-macs)
+
+(defun org-require-autoloaded-modules ()
+  (interactive)
+  (mapc #'require
+	'(org-agenda org-archive org-attach org-clock org-colview org-id
+		     org-table org-timer)))
+
+;;;###autoload
+(defun org-reload (&optional uncompiled)
+  "Reload all Org Lisp files.
+With prefix arg UNCOMPILED, load the uncompiled versions."
+  (interactive "P")
+  (require 'loadhist)
+  (let* ((org-dir     (org-find-library-dir "org"))
+	 (contrib-dir (or (org-find-library-dir "org-contribdir") org-dir))
+	 (feature-re "^\\(org\\|ob\\|ox\\|ol\\|oc\\)\\(-.*\\)?")
+	 (remove-re (format "\\`%s\\'"
+			    (regexp-opt '("org" "org-loaddefs" "org-version"))))
+	 (feats (delete-dups
+		 (mapcar 'file-name-sans-extension
+			 (mapcar 'file-name-nondirectory
+				 (delq nil
+				       (mapcar 'feature-file
+					       features))))))
+	 (lfeat (append
+		 (sort
+		  (setq feats
+			(delq nil (mapcar
+				 (lambda (f)
+				   (if (and (string-match feature-re f)
+					    (not (string-match remove-re f)))
+				       f nil))
+				 feats)))
+		  'string-lessp)
+		 (list "org-version" "org")))
+	 (load-suffixes (if uncompiled (reverse load-suffixes) load-suffixes))
+	 load-uncore load-misses)
+    (setq load-misses
+	  (delq t
+		(mapcar (lambda (f)
+			  (or (org-load-noerror-mustsuffix (concat org-dir f))
+			      (and (string= org-dir contrib-dir)
+				   (org-load-noerror-mustsuffix (concat contrib-dir f)))
+			      (and (org-load-noerror-mustsuffix (concat (org-find-library-dir f) f))
+				   (push f load-uncore)
+				   t)
+			      f))
+			lfeat)))
+    (when load-uncore
+      (message "The following feature%s found in load-path, please check if that's correct:\n%s"
+	       (if (> (length load-uncore) 1) "s were" " was")
+               (reverse load-uncore)))
+    (if load-misses
+	(message "Some error occurred while reloading Org feature%s\n%s\nPlease check *Messages*!\n%s"
+		 (if (> (length load-misses) 1) "s" "") load-misses (org-version nil 'full))
+      (message "Successfully reloaded Org\n%s" (org-version nil 'full)))))
+
+;;;###autoload
+(defun org-customize ()
+  "Call the customize function with org as argument."
+  (interactive)
+  (org-load-modules-maybe)
+  (org-require-autoloaded-modules)
+  (customize-browse 'org))
+
+(defun org-create-customize-menu ()
+  "Create a full customization menu for Org mode, insert it into the menu."
+  (interactive)
+  (org-load-modules-maybe)
+  (org-require-autoloaded-modules)
+  (easy-menu-change
+   '("Org") "Customize"
+   `(["Browse Org group" org-customize t]
+     "--"
+     ,(customize-menu-create 'org)
+     ["Set" Custom-set t]
+     ["Save" Custom-save t]
+     ["Reset to Current" Custom-reset-current t]
+     ["Reset to Saved" Custom-reset-saved t]
+     ["Reset to Standard Settings" Custom-reset-standard t]))
+  (message "\"Org\"-menu now contains full customization menu"))
+
+;;; Org version verification.
+
+(defvar org--inhibit-version-check nil
+  "When non-nil, skip the detection of mixed-versions situations.
+For internal use only.  See Emacs bug #62762.
+This variable is only supposed to be changed by Emacs build scripts.
+When nil, Org tries to detect when Org source files were compiled with
+a different version of Org (which tends to lead to incorrect `.elc' files),
+or when the current Emacs session has loaded a mix of files from different
+Org versions (typically the one bundled with Emacs and another one installed
+from GNU ELPA), which can happen if some parts of Org were loaded before
+`load-path' was changed (e.g. before the GNU-ELPA-installed Org is activated
+by `package-activate-all').")
+(defmacro org-assert-version ()
+  "Check compile time and runtime version match.
+Warn, and attempt to fix mixed version, if any."
+  ;; We intentionally use a more permissive `org-release' instead of
+  ;; `org-git-version' to work around deficiencies in Elisp
+  ;; compilation after pulling latest changes.  Unchanged files will
+  ;; not be re-compiled and thus their macro-expanded
+  ;; `org-assert-version' calls would fail using strict
+  ;; `org-git-version' check because the generated Org version strings
+  ;; will not match.
+  `(unless (or org--inhibit-version-check (equal (org-release) ,(org-release)))
+     (warn "Org version mismatch.  Random Org errors may occur.
+This warning usually appears when a built-in Org version is loaded
+prior to the more recent Org version.
+
+Version mismatch is commonly encountered in the following situations:
+
+1. Some compiled Org libraries are not re-compiled after Org update.
+
+   It is recommended to re-install Org, or, if Org is loaded from git
+   repo, to run
+
+      make clean; make autoloads
+
+2. Emacs is loaded using literate Org config and more recent Org
+   version is loaded inside the file loaded by `org-babel-load-file'.
+   `org-babel-load-file' triggers the built-in Org version clashing
+   the newer Org version attempt to be loaded later.
+
+   It is recommended to move the Org loading code before the
+   `org-babel-load-file' call.
+
+3. New Org version is loaded manually by setting `load-path', but some
+   other package depending on Org is loaded before the `load-path' is
+   configured.
+   This \"other package\" is triggering built-in Org version, again
+   causing the version mismatch.
+
+   It is recommended to set `load-path' as early in the config as
+   possible.
+
+4. New Org version is loaded using straight.el package manager and
+   other package depending on Org is loaded before straight triggers
+   loading of the newer Org version.
+
+   It is recommended to put
+
+    %s
+
+   early in the config.  Ideally, right after the straight.el
+   bootstrap.  Moving `use-package' :straight declaration may not be
+   sufficient if the corresponding `use-package' statement is
+   deferring the loading."
+           ;; Avoid `warn' replacing "'" with "’" (see `format-message').
+           "(straight-use-package 'org)")
+     ;; Try to re-load Org.
+     ;; Do the re-loading after the current, faulty file is loaded.
+     ;; The current file may still fail to load - situation we cannot
+     ;; work around.
+     ;; We re-load the whole Org here because Org commonly uses
+     ;; `declare-function' statements and thus more granular approach,
+     ;; like suggested in
+     ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=62762#110
+     ;; will not be as reliable.
+     ;; Note that this clause will never run during compilation
+     ;; because version check can only trigger in already compiled
+     ;; files with macro expanded differently during compilation and
+     ;; during loading.  (equal (org-release) ,(org-release)) is
+     ;; always t when compiling current `load-file-name'.
+     (eval-after-load load-file-name (org-reload t))))
+
+(provide 'org-load)
+
+;;; org-load.el ends here
diff --git a/lisp/org-macro.el b/lisp/org-macro.el
index 481e431c2..98706f676 100644
--- a/lisp/org-macro.el
+++ b/lisp/org-macro.el
@@ -47,7 +47,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-macs.el b/lisp/org-macs.el
index 1552675f8..984e7c023 100644
--- a/lisp/org-macs.el
+++ b/lisp/org-macs.el
@@ -34,72 +34,6 @@ ;;; Code:
 (require 'cl-lib)
 (require 'format-spec)
 
-;;; Org version verification.
-
-(defvar org--inhibit-version-check nil
-  "When non-nil, skip the detection of mixed-versions situations.
-For internal use only.  See Emacs bug #62762.
-This variable is only supposed to be changed by Emacs build scripts.
-When nil, Org tries to detect when Org source files were compiled with
-a different version of Org (which tends to lead to incorrect `.elc' files),
-or when the current Emacs session has loaded a mix of files from different
-Org versions (typically the one bundled with Emacs and another one installed
-from GNU ELPA), which can happen if some parts of Org were loaded before
-`load-path' was changed (e.g. before the GNU-ELPA-installed Org is activated
-by `package-activate-all').")
-(defmacro org-assert-version ()
-  "Assert compile time and runtime version match."
-  ;; We intentionally use a more permissive `org-release' instead of
-  ;; `org-git-version' to work around deficiencies in Elisp
-  ;; compilation after pulling latest changes.  Unchanged files will
-  ;; not be re-compiled and thus their macro-expanded
-  ;; `org-assert-version' calls would fail using strict
-  ;; `org-git-version' check because the generated Org version strings
-  ;; will not match.
-  `(unless (or org--inhibit-version-check (equal (org-release) ,(org-release)))
-     (warn "Org version mismatch.  Org loading aborted.
-This warning usually appears when a built-in Org version is loaded
-prior to the more recent Org version.
-
-Version mismatch is commonly encountered in the following situations:
-
-1. Emacs is loaded using literate Org config and more recent Org
-   version is loaded inside the file loaded by `org-babel-load-file'.
-   `org-babel-load-file' triggers the built-in Org version clashing
-   the newer Org version attempt to be loaded later.
-
-   It is recommended to move the Org loading code before the
-   `org-babel-load-file' call.
-
-2. New Org version is loaded manually by setting `load-path', but some
-   other package depending on Org is loaded before the `load-path' is
-   configured.
-   This \"other package\" is triggering built-in Org version, again
-   causing the version mismatch.
-
-   It is recommended to set `load-path' as early in the config as
-   possible.
-
-3. New Org version is loaded using straight.el package manager and
-   other package depending on Org is loaded before straight triggers
-   loading of the newer Org version.
-
-   It is recommended to put
-
-    %s
-
-   early in the config.  Ideally, right after the straight.el
-   bootstrap.  Moving `use-package' :straight declaration may not be
-   sufficient if the corresponding `use-package' statement is
-   deferring the loading."
-           ;; Avoid `warn' replacing "'" with "’" (see `format-message').
-           "(straight-use-package 'org)")
-     (error "Org version mismatch.  Make sure that correct `load-path' is set early in init.el")))
-
-;; We rely on org-macs when generating Org version.  Checking Org
-;; version here will interfere with Org build process.
-;; (org-assert-version)
-
 (declare-function org-mode "org" ())
 (declare-function org-agenda-files "org" (&optional unrestricted archives))
 (declare-function org-time-string-to-seconds "org" (s))
@@ -215,6 +149,9 @@ (defmacro org-eval-in-environment (environment form)
   (declare (debug (form form)) (indent 1) (obsolete cl-progv "2021"))
   `(eval (list 'let ,environment ',form)))
 
+(defmacro org-find-library-dir (library)
+  `(file-name-directory (or (locate-library ,library) "")))
+
 ;;;###autoload
 (defmacro org-load-noerror-mustsuffix (file)
   "Load FILE with optional arguments NOERROR and MUSTSUFFIX."
diff --git a/lisp/org-mobile.el b/lisp/org-mobile.el
index 01395a4b6..17cb2f881 100644
--- a/lisp/org-mobile.el
+++ b/lisp/org-mobile.el
@@ -31,7 +31,7 @@ ;;; Commentary:
 ;; iPhone and Android - any external viewer/flagging/editing
 ;; application that uses the same conventions could be used.
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-mouse.el b/lisp/org-mouse.el
index 3b2c4cba6..90779be3f 100644
--- a/lisp/org-mouse.el
+++ b/lisp/org-mouse.el
@@ -136,7 +136,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org)
diff --git a/lisp/org-num.el b/lisp/org-num.el
index cbe5e455e..9d3f14402 100644
--- a/lisp/org-num.el
+++ b/lisp/org-num.el
@@ -61,7 +61,7 @@ ;;; Commentary:
 \f
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-pcomplete.el b/lisp/org-pcomplete.el
index 0567052c0..e5cc707e7 100644
--- a/lisp/org-pcomplete.el
+++ b/lisp/org-pcomplete.el
@@ -26,7 +26,7 @@ ;;; Code:
 
 ;;;; Require other packages
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org-macs)
diff --git a/lisp/org-persist.el b/lisp/org-persist.el
index 01078f459..a43853d3c 100644
--- a/lisp/org-persist.el
+++ b/lisp/org-persist.el
@@ -149,7 +149,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org-compat)
diff --git a/lisp/org-plot.el b/lisp/org-plot.el
index fe61e9ace..0eb603dc4 100644
--- a/lisp/org-plot.el
+++ b/lisp/org-plot.el
@@ -31,7 +31,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-protocol.el b/lisp/org-protocol.el
index 2b07a377e..fc6d23f5e 100644
--- a/lisp/org-protocol.el
+++ b/lisp/org-protocol.el
@@ -128,7 +128,7 @@ ;;; Commentary:
 ;;
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org)
diff --git a/lisp/org-refile.el b/lisp/org-refile.el
index 5a41c022f..947a593df 100644
--- a/lisp/org-refile.el
+++ b/lisp/org-refile.el
@@ -25,7 +25,7 @@ ;;; Commentary:
 ;; Org Refile allows you to refile subtrees to various locations.
 
 ;;; Code:
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'org)
diff --git a/lisp/org-src.el b/lisp/org-src.el
index aadd8eba5..793d89ca1 100644
--- a/lisp/org-src.el
+++ b/lisp/org-src.el
@@ -31,7 +31,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-table.el b/lisp/org-table.el
index 83bad3f3a..4add43e6d 100644
--- a/lisp/org-table.el
+++ b/lisp/org-table.el
@@ -34,7 +34,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org-tempo.el b/lisp/org-tempo.el
index 81ec8fdcc..4d0847dcd 100644
--- a/lisp/org-tempo.el
+++ b/lisp/org-tempo.el
@@ -38,7 +38,7 @@ ;;; Commentary:
 ;;
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'tempo)
diff --git a/lisp/org-timer.el b/lisp/org-timer.el
index 919630e69..b4d24f45c 100644
--- a/lisp/org-timer.el
+++ b/lisp/org-timer.el
@@ -35,7 +35,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/org.el b/lisp/org.el
index 2e26c08e5..3966e9b3e 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -71,7 +71,7 @@ (defvar org-inlinetask-min-level)
 
 ;;;; Require other packages
 
-(require 'org-compat)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
@@ -18278,89 +18278,6 @@ (defun org-install-agenda-files-menu ()
 		  ;; Prevent initialization from failing.
 		  (ignore-errors (org-agenda-files t)))))))))
 
-;;;; Documentation
-
-(defun org-require-autoloaded-modules ()
-  (interactive)
-  (mapc #'require
-	'(org-agenda org-archive org-attach org-clock org-colview org-id
-		     org-table org-timer)))
-
-;;;###autoload
-(defun org-reload (&optional uncompiled)
-  "Reload all Org Lisp files.
-With prefix arg UNCOMPILED, load the uncompiled versions."
-  (interactive "P")
-  (require 'loadhist)
-  (let* ((org-dir     (org-find-library-dir "org"))
-	 (contrib-dir (or (org-find-library-dir "org-contribdir") org-dir))
-	 (feature-re "^\\(org\\|ob\\|ox\\|ol\\|oc\\)\\(-.*\\)?")
-	 (remove-re (format "\\`%s\\'"
-			    (regexp-opt '("org" "org-loaddefs" "org-version"))))
-	 (feats (delete-dups
-		 (mapcar 'file-name-sans-extension
-			 (mapcar 'file-name-nondirectory
-				 (delq nil
-				       (mapcar 'feature-file
-					       features))))))
-	 (lfeat (append
-		 (sort
-		  (setq feats
-			(delq nil (mapcar
-				   (lambda (f)
-				     (if (and (string-match feature-re f)
-					      (not (string-match remove-re f)))
-					 f nil))
-				   feats)))
-		  'string-lessp)
-		 (list "org-version" "org")))
-	 (load-suffixes (if uncompiled (reverse load-suffixes) load-suffixes))
-	 load-uncore load-misses)
-    (setq load-misses
-	  (delq t
-		(mapcar (lambda (f)
-			  (or (org-load-noerror-mustsuffix (concat org-dir f))
-			      (and (string= org-dir contrib-dir)
-				   (org-load-noerror-mustsuffix (concat contrib-dir f)))
-			      (and (org-load-noerror-mustsuffix (concat (org-find-library-dir f) f))
-				   (push f load-uncore)
-				   t)
-			      f))
-			lfeat)))
-    (when load-uncore
-      (message "The following feature%s found in load-path, please check if that's correct:\n%s"
-	       (if (> (length load-uncore) 1) "s were" " was")
-               (reverse load-uncore)))
-    (if load-misses
-	(message "Some error occurred while reloading Org feature%s\n%s\nPlease check *Messages*!\n%s"
-		 (if (> (length load-misses) 1) "s" "") load-misses (org-version nil 'full))
-      (message "Successfully reloaded Org\n%s" (org-version nil 'full)))))
-
-;;;###autoload
-(defun org-customize ()
-  "Call the customize function with org as argument."
-  (interactive)
-  (org-load-modules-maybe)
-  (org-require-autoloaded-modules)
-  (customize-browse 'org))
-
-(defun org-create-customize-menu ()
-  "Create a full customization menu for Org mode, insert it into the menu."
-  (interactive)
-  (org-load-modules-maybe)
-  (org-require-autoloaded-modules)
-  (easy-menu-change
-   '("Org") "Customize"
-   `(["Browse Org group" org-customize t]
-     "--"
-     ,(customize-menu-create 'org)
-     ["Set" Custom-set t]
-     ["Save" Custom-save t]
-     ["Reset to Current" Custom-reset-current t]
-     ["Reset to Saved" Custom-reset-saved t]
-     ["Reset to Standard Settings" Custom-reset-standard t]))
-  (message "\"Org\"-menu now contains full customization menu"))
-
 ;;;; Miscellaneous stuff
 
 ;;; Generally useful functions
diff --git a/lisp/ox-ascii.el b/lisp/ox-ascii.el
index 692dd216d..13dd7439f 100644
--- a/lisp/ox-ascii.el
+++ b/lisp/ox-ascii.el
@@ -28,7 +28,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ox)
diff --git a/lisp/ox-beamer.el b/lisp/ox-beamer.el
index 689bf1559..d00baa41d 100644
--- a/lisp/ox-beamer.el
+++ b/lisp/ox-beamer.el
@@ -30,7 +30,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index b27254b8a..93d8fb399 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -31,7 +31,7 @@ ;;; Code:
 
 ;;; Dependencies
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ox-icalendar.el b/lisp/ox-icalendar.el
index 81a77a770..16d88a6f3 100644
--- a/lisp/ox-icalendar.el
+++ b/lisp/ox-icalendar.el
@@ -32,7 +32,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ox-koma-letter.el b/lisp/ox-koma-letter.el
index 33eb0597b..9cd48c1f5 100644
--- a/lisp/ox-koma-letter.el
+++ b/lisp/ox-koma-letter.el
@@ -165,7 +165,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el
index 768bf402b..2be4ef34c 100644
--- a/lisp/ox-latex.el
+++ b/lisp/ox-latex.el
@@ -27,7 +27,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ox-man.el b/lisp/ox-man.el
index bb716f7b9..3b703fd1f 100644
--- a/lisp/ox-man.el
+++ b/lisp/ox-man.el
@@ -37,7 +37,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ox-md.el b/lisp/ox-md.el
index 5be0ca22e..9e368ba0f 100644
--- a/lisp/ox-md.el
+++ b/lisp/ox-md.el
@@ -29,7 +29,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ox-odt.el b/lisp/ox-odt.el
index dd96ed8e0..b0c0b234a 100644
--- a/lisp/ox-odt.el
+++ b/lisp/ox-odt.el
@@ -25,7 +25,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ox-org.el b/lisp/ox-org.el
index ed72cf4f2..98e4682b4 100644
--- a/lisp/ox-org.el
+++ b/lisp/ox-org.el
@@ -25,7 +25,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'ox)
diff --git a/lisp/ox-publish.el b/lisp/ox-publish.el
index f9c3877d7..23cd7f325 100644
--- a/lisp/ox-publish.el
+++ b/lisp/ox-publish.el
@@ -38,7 +38,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ox-texinfo.el b/lisp/ox-texinfo.el
index 5befcac1c..0e5e696db 100644
--- a/lisp/ox-texinfo.el
+++ b/lisp/ox-texinfo.el
@@ -26,7 +26,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
diff --git a/lisp/ox.el b/lisp/ox.el
index 6f819def9..f979c3eef 100644
--- a/lisp/ox.el
+++ b/lisp/ox.el
@@ -72,7 +72,7 @@ ;;; Commentary:
 
 ;;; Code:
 
-(require 'org-macs)
+(require 'org-load)
 (org-assert-version)
 
 (require 'cl-lib)
-- 
2.41.0


[-- Attachment #3: Type: text/plain, Size: 224 bytes --]


-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>

^ permalink raw reply related	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-06-23 12:02                                               ` Ihor Radchenko
@ 2023-06-25 14:37                                                 ` Max Nikulin
  2023-06-27 10:59                                                   ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-06-25 14:37 UTC (permalink / raw)
  To: Ihor Radchenko
  Cc: 62762, bzg, dmitry, Stefan Monnier, Alan Mackenzie, Eli Zaretskii

On 23/06/2023 19:02, Ihor Radchenko wrote:
> 1. Use `org-reload' instead of load-dir test.

Just a reminder: directory test may catch the case with shadowing by Ort 
that is not compiled. Version comparison is unable to detect it.

> I do not think that we should throw and error. `org-reload' approach
> should hopefully solve the problem with mixed versions.

Have you tested compilation with Org  already loaded to Emacs <= 28?

> P.S. I am not sure how to approach this patch in a view of the Emacs
> release process.
Are there other consequences of your changes for incremental rebuilds in 
Emacs source tree besides converting error to warning?

My impression is that the most wide spread case is installing the Org 
ELPA package should just work in Emacs-29. I am unsure concerning 
precise scenario for spacemacs. I have not idea if shadowing by 
correctly compiled Org is a frequent issue. Are there other cases 
affecting significant number of users and what is behavior for them?

Current warning is so long that it may confuse users who sees only its 
final part.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-06-25 14:37                                                 ` Max Nikulin
@ 2023-06-27 10:59                                                   ` Ihor Radchenko
  2023-06-27 11:40                                                     ` Eli Zaretskii
  2023-06-27 16:11                                                     ` Max Nikulin
  0 siblings, 2 replies; 110+ messages in thread
From: Ihor Radchenko @ 2023-06-27 10:59 UTC (permalink / raw)
  To: Max Nikulin
  Cc: 62762, bzg, dmitry, Stefan Monnier, Alan Mackenzie, Eli Zaretskii


Max Nikulin <manikulin@gmail.com> writes:
> On 23/06/2023 19:02, Ihor Radchenko wrote:
>> 1. Use `org-reload' instead of load-dir test.
>
> Just a reminder: directory test may catch the case with shadowing by Ort 
> that is not compiled. Version comparison is unable to detect it.

Yeah, you are right. We may need to combine both the approaches with
shadow require and version check.

I will look further into this.

>> I do not think that we should throw and error. `org-reload' approach
>> should hopefully solve the problem with mixed versions.
>
> Have you tested compilation with Org  already loaded to Emacs <= 28?

Do you know how to do it? Our previous reproducers involved M-x
package-install, but I am not sure how to test it without ELPA release.

>> P.S. I am not sure how to approach this patch in a view of the Emacs
>> release process.
> Are there other consequences of your changes for incremental rebuilds in 
> Emacs source tree besides converting error to warning?

There are no consequences at all. The whole check is completely bypassed
in Emacs tree. Even the warning is suppressed. See
`org--inhibit-version-check'.

> My impression is that the most wide spread case is installing the Org 
> ELPA package should just work in Emacs-29. I am unsure concerning 
> precise scenario for spacemacs. I have not idea if shadowing by 
> correctly compiled Org is a frequent issue. Are there other cases 
> affecting significant number of users and what is behavior for them?

Installing is not the concern. My concern is introducing major changes
right ahead for the release. My question was aimed at the Emacs devs
here.

> Current warning is so long that it may confuse users who sees only its 
> final part.

You are right. I will think how to approach this.
I am considering:
1. Move most the warning to dedicated manual section.
2. Display additional short warning at the bottom.

I am now leaning towards (1).

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-06-27 10:59                                                   ` Ihor Radchenko
@ 2023-06-27 11:40                                                     ` Eli Zaretskii
  2023-06-27 12:08                                                       ` Ihor Radchenko
  2023-06-27 16:11                                                     ` Max Nikulin
  1 sibling, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-06-27 11:40 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 62762, bzg, dmitry, monnier, acm, manikulin

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: Stefan Monnier <monnier@iro.umontreal.ca>, Eli Zaretskii <eliz@gnu.org>,
>  bzg@gnu.org, dmitry@gutov.dev, 62762@debbugs.gnu.org, Alan Mackenzie
>  <acm@muc.de>
> Date: Tue, 27 Jun 2023 10:59:57 +0000
> 
> > My impression is that the most wide spread case is installing the Org 
> > ELPA package should just work in Emacs-29. I am unsure concerning 
> > precise scenario for spacemacs. I have not idea if shadowing by 
> > correctly compiled Org is a frequent issue. Are there other cases 
> > affecting significant number of users and what is behavior for them?
> 
> Installing is not the concern. My concern is introducing major changes
> right ahead for the release. My question was aimed at the Emacs devs
> here.

I was not aware that this discussion is pertinent to the release
branch.  Is it?  I thought any changes in this matter are for master.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-06-27 11:40                                                     ` Eli Zaretskii
@ 2023-06-27 12:08                                                       ` Ihor Radchenko
  2023-06-27 12:12                                                         ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-06-27 12:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 62762, bzg, dmitry, monnier, acm, manikulin

Eli Zaretskii <eliz@gnu.org> writes:

>> Installing is not the concern. My concern is introducing major changes
>> right ahead for the release. My question was aimed at the Emacs devs
>> here.
>
> I was not aware that this discussion is pertinent to the release
> branch.  Is it?  I thought any changes in this matter are for master.

This is aiming for Org's bugfix branch (as a critical fix).
AFAIK, Org bugfix releases were going into release branch.

At the same time, this change is not aiming at Org distributed within
Emacs tree. The whole issue is with ELPA version of Org.

In any case, if Emacs release is coming really soon, I can just hold on
until Emacs is released.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-06-27 12:08                                                       ` Ihor Radchenko
@ 2023-06-27 12:12                                                         ` Eli Zaretskii
  2023-06-27 12:30                                                           ` Ihor Radchenko
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-06-27 12:12 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 62762, bzg, dmitry, monnier, acm, manikulin

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: manikulin@gmail.com, monnier@iro.umontreal.ca, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de
> Date: Tue, 27 Jun 2023 12:08:37 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> Installing is not the concern. My concern is introducing major changes
> >> right ahead for the release. My question was aimed at the Emacs devs
> >> here.
> >
> > I was not aware that this discussion is pertinent to the release
> > branch.  Is it?  I thought any changes in this matter are for master.
> 
> This is aiming for Org's bugfix branch (as a critical fix).
> AFAIK, Org bugfix releases were going into release branch.
> 
> At the same time, this change is not aiming at Org distributed within
> Emacs tree. The whole issue is with ELPA version of Org.

The above two paragraphs contradict each other, AFAIU.  If a change is
installed on the release branch of the Emacs Git repository, it will
be included in the release tarball, and thus in the Emacs source tree.

OTOH, if this is not about the Emacs Git repository, then why did you
say you were asking Emacs developers these questions?

I guess I'm missing something here.

> In any case, if Emacs release is coming really soon, I can just hold on
> until Emacs is released.

As long as this code will be in Emacs on the master branch, you don't
need to wait for the release (which is done from the release branch).





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-06-27 12:12                                                         ` Eli Zaretskii
@ 2023-06-27 12:30                                                           ` Ihor Radchenko
  2023-06-27 12:51                                                             ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Ihor Radchenko @ 2023-06-27 12:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 62762, Bastien, dmitry, monnier, acm, manikulin, Kyle Meyer

Eli Zaretskii <eliz@gnu.org> writes:

>> This is aiming for Org's bugfix branch (as a critical fix).
>> AFAIK, Org bugfix releases were going into release branch.
>> 
>> At the same time, this change is not aiming at Org distributed within
>> Emacs tree. The whole issue is with ELPA version of Org.
>
> The above two paragraphs contradict each other, AFAIU.  If a change is
> installed on the release branch of the Emacs Git repository, it will
> be included in the release tarball, and thus in the Emacs source tree.
>
> OTOH, if this is not about the Emacs Git repository, then why did you
> say you were asking Emacs developers these questions?
>
> I guess I'm missing something here.

Normally, every Org release is synchronized with Emacs upstream (master).
During the Emacs release, we have done the same for Emacs emacs-29
branch (Org 9.6.6 is included in emacs-29; see
https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/org/org.el?h=emacs-29#n12).

However, during the Emacs release process, if significant changes have
to be done on Org side, we may consider not syncing the Emacs release
branch and Org bugfix. See
https://orgmode.org/worg/org-maintenance.html#org-version-emacs

But definition of "significant" is subjective. So, I wanted to clarify
with you (Emacs dev).

CCing Kyle Meyer, in case if I misunderstand something.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-06-27 12:30                                                           ` Ihor Radchenko
@ 2023-06-27 12:51                                                             ` Eli Zaretskii
  0 siblings, 0 replies; 110+ messages in thread
From: Eli Zaretskii @ 2023-06-27 12:51 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 62762, bzg, dmitry, monnier, acm, manikulin, kyle

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: manikulin@gmail.com, monnier@iro.umontreal.ca, bzg@gnu.org,
>  dmitry@gutov.dev, 62762@debbugs.gnu.org, acm@muc.de, Kyle Meyer
>  <kyle@kyleam.com>, Bastien <bzg@gnu.org>
> Date: Tue, 27 Jun 2023 12:30:01 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> This is aiming for Org's bugfix branch (as a critical fix).
> >> AFAIK, Org bugfix releases were going into release branch.
> >> 
> >> At the same time, this change is not aiming at Org distributed within
> >> Emacs tree. The whole issue is with ELPA version of Org.
> >
> > The above two paragraphs contradict each other, AFAIU.  If a change is
> > installed on the release branch of the Emacs Git repository, it will
> > be included in the release tarball, and thus in the Emacs source tree.
> >
> > OTOH, if this is not about the Emacs Git repository, then why did you
> > say you were asking Emacs developers these questions?
> >
> > I guess I'm missing something here.
> 
> Normally, every Org release is synchronized with Emacs upstream (master).
> During the Emacs release, we have done the same for Emacs emacs-29
> branch (Org 9.6.6 is included in emacs-29; see
> https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/org/org.el?h=emacs-29#n12).
> 
> However, during the Emacs release process, if significant changes have
> to be done on Org side, we may consider not syncing the Emacs release
> branch and Org bugfix. See
> https://orgmode.org/worg/org-maintenance.html#org-version-emacs
> 
> But definition of "significant" is subjective. So, I wanted to clarify
> with you (Emacs dev).

I'm not sure I understood the above, but just to be clear: the
emacs-29 release branch was not supposed to have any of the changes
meant to prevent aborting the build due to Org version mismatch.  I
now see that the org--inhibit-version-check change did somehow get
installed on emacs-29, and I think it's unfortunate and was never
discussed.  In https://debbugs.gnu.org/cgi/bugreport.cgi?bug=62762#53
and again in https://debbugs.gnu.org/cgi/bugreport.cgi?bug=62762#65 I
clearly said that the change was installed only on master.  I think
the fact that this got backported to emacs-29 was unintentional.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-06-27 10:59                                                   ` Ihor Radchenko
  2023-06-27 11:40                                                     ` Eli Zaretskii
@ 2023-06-27 16:11                                                     ` Max Nikulin
  2023-07-04 12:20                                                       ` Ihor Radchenko
  1 sibling, 1 reply; 110+ messages in thread
From: Max Nikulin @ 2023-06-27 16:11 UTC (permalink / raw)
  To: Ihor Radchenko
  Cc: 62762, bzg, dmitry, Stefan Monnier, Alan Mackenzie, Eli Zaretskii

On 27/06/2023 17:59, Ihor Radchenko wrote:
> Max Nikulin writes:
>> On 23/06/2023 19:02, Ihor Radchenko wrote:

>>> I do not think that we should throw and error. `org-reload' approach
>>> should hopefully solve the problem with mixed versions.
>>
>> Have you tested compilation with Org  already loaded to Emacs <= 28?
> 
> Do you know how to do it? Our previous reproducers involved M-x
> package-install, but I am not sure how to test it without ELPA release.

I have not tried yet, but I hope, preparing a tar file and using 
`package-install-file' should behave in the same way as installing from 
ELPA. Some spacemacs users believe they have noticed some difference, 
but I am not convinced.

> You are right. I will think how to approach this.
> I am considering:
> 1. Move most the warning to dedicated manual section.
> 2. Display additional short warning at the bottom.
> 
> I am now leaning towards (1).

Since it will be only in new version of the manual, a URL with online 
manual should be provided. Using `info' may give old version with no 
added section. Perhaps the FAQ entry should be revised as well.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-06-27 16:11                                                     ` Max Nikulin
@ 2023-07-04 12:20                                                       ` Ihor Radchenko
  0 siblings, 0 replies; 110+ messages in thread
From: Ihor Radchenko @ 2023-07-04 12:20 UTC (permalink / raw)
  To: Max Nikulin
  Cc: 62762, bzg, dmitry, Stefan Monnier, Alan Mackenzie, Eli Zaretskii

Max Nikulin <manikulin@gmail.com> writes:

>> Do you know how to do it? Our previous reproducers involved M-x
>> package-install, but I am not sure how to test it without ELPA release.
>
> I have not tried yet, but I hope, preparing a tar file and using 
> `package-install-file' should behave in the same way as installing from 
> ELPA. Some spacemacs users believe they have noticed some difference, 
> but I am not convinced.

I tried this and indeed it revealed issues...

With

(defmacro org-require-with-shadowcheck (feature)
  "Load FEATURE making sure that it is loaded using current `load-path'.
When FEATURE is not yet loaded, act like `require' does.  When FEATURE
is loaded, but not consistent with the current value of `load-path',
re-load it."
  `(eval-and-compile
     (if (not (featurep ,feature)) (require ,feature)
       (let ((file (locate-library (symbol-name ,feature))))
         (unless (equal (feature-file ,feature) file)
	   ;; The feature is already provided, but from some other file
	   ;; than expected.  Presumably because `load-path` has been
	   ;; changed since the file was loaded.  This is likely a sign
	   ;; that we're loading a mix of files from different versions.
	   ;; That can spell trouble.
           (load file nil t t))))))

using https://git.sr.ht/~yantar92/org-mode/tree/feature/shadowcheck

1. emacs-30 -Q
2. M-x org-version
3. M-x package-install-file <RET> /path/to/org/lisp

I am getting

ob-C.el:40:2: Error: Eager macro-expansion failure: (error "Eager macro-expansion skipped due to cycle:
  … => (load \"org-element.el\") => (macroexpand-all (org-require-with-shadowcheck 'org …)) => (macroexpand (org-require-with-shadowcheck …)) => (load \"org.el\") => (load \"org-element.el\")")

which is rather curious since org.el is not supposed to load
org-element.el

I feel that I am missing something obvious.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-04-24 12:29                                             ` Ihor Radchenko
@ 2023-11-24 17:43                                               ` Dmitry Gutov
  2023-11-24 18:54                                                 ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Dmitry Gutov @ 2023-11-24 17:43 UTC (permalink / raw)
  To: Ihor Radchenko, Eli Zaretskii; +Cc: bzg, Kyle Meyer, 62762, monnier

On 24/04/2023 15:29, Ihor Radchenko wrote:
> Eli Zaretskii<eliz@gnu.org>  writes:
> 
>>> Let me know when you install the change on Emacs side.
>> Done.
> Thanks!
> Backported:https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=8eb209984
> Kyle, let me know if I did anything wrong.

Just to give an update on the problem:

I still see the "Org version mismatch" error fairly often when 
rebuilding Emacs (after which I have to invoke 'touch lisp/org/...' 
again), or when trying to use org-mode in an already-built Emacs. All of 
that with the master branch.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-11-24 17:43                                               ` Dmitry Gutov
@ 2023-11-24 18:54                                                 ` Eli Zaretskii
  2023-11-24 18:56                                                   ` Dmitry Gutov
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-11-24 18:54 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: bzg, yantar92, 62762, monnier, kyle

> Date: Fri, 24 Nov 2023 19:43:53 +0200
> Cc: monnier@iro.umontreal.ca, bzg@gnu.org, 62762@debbugs.gnu.org,
>  Kyle Meyer <kyle@kyleam.com>
> From: Dmitry Gutov <dmitry@gutov.dev>
> 
> I still see the "Org version mismatch" error fairly often when 
> rebuilding Emacs (after which I have to invoke 'touch lisp/org/...' 
> again), or when trying to use org-mode in an already-built Emacs. All of 
> that with the master branch.

That's because the version test was not removed, just suppressed in
the most frequent situations during the build.  But when Org files
need to be actually loaded (e.g., to generate a manual out of some
foo.org source), the test will kick in and will abort the command.

The only way to avoid that is to redesign and reimplement the solution
for version mismatch in Org macros.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-11-24 18:54                                                 ` Eli Zaretskii
@ 2023-11-24 18:56                                                   ` Dmitry Gutov
  2023-11-25  7:08                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Dmitry Gutov @ 2023-11-24 18:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, yantar92, 62762, monnier, kyle

On 24/11/2023 20:54, Eli Zaretskii wrote:
>> Date: Fri, 24 Nov 2023 19:43:53 +0200
>> Cc:monnier@iro.umontreal.ca,bzg@gnu.org,62762@debbugs.gnu.org,
>>   Kyle Meyer<kyle@kyleam.com>
>> From: Dmitry Gutov<dmitry@gutov.dev>
>>
>> I still see the "Org version mismatch" error fairly often when
>> rebuilding Emacs (after which I have to invoke 'touch lisp/org/...'
>> again), or when trying to use org-mode in an already-built Emacs. All of
>> that with the master branch.
> That's because the version test was not removed, just suppressed in
> the most frequent situations during the build.  But when Org files
> need to be actually loaded (e.g., to generate a manual out of some
> foo.org source), the test will kick in and will abort the command.
> 
> The only way to avoid that is to redesign and reimplement the solution
> for version mismatch in Org macros.

I thought the idea was to skip the version check at least when the Org 
version is built-in? That is, comes with Emacs as opposed to being 
installed from ELPA.





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-11-24 18:56                                                   ` Dmitry Gutov
@ 2023-11-25  7:08                                                     ` Eli Zaretskii
  2023-11-25 12:38                                                       ` Dmitry Gutov
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-11-25  7:08 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: bzg, yantar92, 62762, monnier, kyle

> Date: Fri, 24 Nov 2023 20:56:31 +0200
> Cc: yantar92@posteo.net, monnier@iro.umontreal.ca, bzg@gnu.org,
>  62762@debbugs.gnu.org, kyle@kyleam.com
> From: Dmitry Gutov <dmitry@gutov.dev>
> 
> On 24/11/2023 20:54, Eli Zaretskii wrote:
> >> Date: Fri, 24 Nov 2023 19:43:53 +0200
> >> Cc:monnier@iro.umontreal.ca,bzg@gnu.org,62762@debbugs.gnu.org,
> >>   Kyle Meyer<kyle@kyleam.com>
> >> From: Dmitry Gutov<dmitry@gutov.dev>
> >>
> >> I still see the "Org version mismatch" error fairly often when
> >> rebuilding Emacs (after which I have to invoke 'touch lisp/org/...'
> >> again), or when trying to use org-mode in an already-built Emacs. All of
> >> that with the master branch.
> > That's because the version test was not removed, just suppressed in
> > the most frequent situations during the build.  But when Org files
> > need to be actually loaded (e.g., to generate a manual out of some
> > foo.org source), the test will kick in and will abort the command.
> > 
> > The only way to avoid that is to redesign and reimplement the solution
> > for version mismatch in Org macros.
> 
> I thought the idea was to skip the version check at least when the Org 
> version is built-in?

AFAIU, this is impossible, as long as Org uses macros that can change
in incompatible ways, and as long as the decision of Org developers is
in effect to force recompilation each time they bump the version, so
as to avoid weird problems due to changes in macros.

The change we installed in the Emacs build procedure simply delays the
error until Org is actually used (as opposed to just being compiled as
part of the build update).





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-11-25  7:08                                                     ` Eli Zaretskii
@ 2023-11-25 12:38                                                       ` Dmitry Gutov
  2023-11-25 12:59                                                         ` Eli Zaretskii
  0 siblings, 1 reply; 110+ messages in thread
From: Dmitry Gutov @ 2023-11-25 12:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, yantar92, 62762, monnier, kyle

On 25/11/2023 09:08, Eli Zaretskii wrote:
> The change we installed in the Emacs build procedure simply delays the
> error until Org is actually used (as opposed to just being compiled as
> part of the build update).

In that case, could we have a way to avoid rebuilding the manuals? I 
recompile Emacs much more often than I read the manual, and in most 
cases it doesn't need to be the latest version.

Rebuilding the manual is in general the slowest step of the minor 
rebuilds, and skipping it could avoid this error to (at least until 
org-mode is used, yes).





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-11-25 12:38                                                       ` Dmitry Gutov
@ 2023-11-25 12:59                                                         ` Eli Zaretskii
  2023-11-25 13:55                                                           ` Dmitry Gutov
  0 siblings, 1 reply; 110+ messages in thread
From: Eli Zaretskii @ 2023-11-25 12:59 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: bzg, yantar92, 62762, monnier, kyle

> Date: Sat, 25 Nov 2023 14:38:36 +0200
> Cc: yantar92@posteo.net, monnier@iro.umontreal.ca, bzg@gnu.org,
>  62762@debbugs.gnu.org, kyle@kyleam.com
> From: Dmitry Gutov <dmitry@gutov.dev>
> 
> On 25/11/2023 09:08, Eli Zaretskii wrote:
> > The change we installed in the Emacs build procedure simply delays the
> > error until Org is actually used (as opposed to just being compiled as
> > part of the build update).
> 
> In that case, could we have a way to avoid rebuilding the manuals? I 

No one can guarantee that building the manuals is the only situation
where Org will be invoked during the build.  So this doesn't sound
like worth the trouble to me.  But you could always manually touch all
the manuals in the info/ subdirectory, before building, if you don't
care about keeping the manuals up-to-date.

> Rebuilding the manual is in general the slowest step of the minor 
> rebuilds, and skipping it could avoid this error to (at least until 
> org-mode is used, yes).

Manuals are rebuilt relatively rarely, and those in doc/emacs and
doc/lispref are rebuilt in parallel to other build commands, so "the
slowest step" is not accurate IME.  Another thing to keep in mind is
that whenever the Org macros change, frequently so does the Org
manual...





^ permalink raw reply	[flat|nested] 110+ messages in thread

* bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code
  2023-11-25 12:59                                                         ` Eli Zaretskii
@ 2023-11-25 13:55                                                           ` Dmitry Gutov
  0 siblings, 0 replies; 110+ messages in thread
From: Dmitry Gutov @ 2023-11-25 13:55 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bzg, yantar92, 62762, monnier, kyle

On 25/11/2023 14:59, Eli Zaretskii wrote:
>> Date: Sat, 25 Nov 2023 14:38:36 +0200
>> Cc:yantar92@posteo.net,monnier@iro.umontreal.ca,bzg@gnu.org,
>>   62762@debbugs.gnu.org,kyle@kyleam.com
>> From: Dmitry Gutov<dmitry@gutov.dev>
>>
>> On 25/11/2023 09:08, Eli Zaretskii wrote:
>>> The change we installed in the Emacs build procedure simply delays the
>>> error until Org is actually used (as opposed to just being compiled as
>>> part of the build update).
>> In that case, could we have a way to avoid rebuilding the manuals? I
> No one can guarantee that building the manuals is the only situation
> where Org will be invoked during the build.  So this doesn't sound
> like worth the trouble to me.  But you could always manually touch all
> the manuals in the info/ subdirectory, before building, if you don't
> care about keeping the manuals up-to-date.

Ok, I'll do that, thank you.





^ permalink raw reply	[flat|nested] 110+ messages in thread

end of thread, other threads:[~2023-11-25 13:55 UTC | newest]

Thread overview: 110+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-10 23:09 bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code Dmitry Gutov
2023-04-11  6:10 ` Eli Zaretskii
2023-04-11  7:18   ` Ihor Radchenko
2023-04-11  8:03     ` Eli Zaretskii
2023-04-11 18:35       ` Ihor Radchenko
2023-04-11 18:51         ` Eli Zaretskii
2023-04-11 18:59           ` Ihor Radchenko
2023-04-11 19:28             ` Eli Zaretskii
2023-04-11 19:37               ` Eli Zaretskii
2023-04-12  9:03               ` Ihor Radchenko
2023-04-12  9:21                 ` Eli Zaretskii
2023-04-13  8:34                   ` Ihor Radchenko
2023-04-13  8:37                     ` Eli Zaretskii
2023-04-13 14:20                       ` Ihor Radchenko
2023-04-13 14:55                         ` Eli Zaretskii
2023-04-13 15:05                           ` Ihor Radchenko
2023-04-15 10:48                             ` Eli Zaretskii
2023-04-15 11:36                               ` Ihor Radchenko
2023-04-15 11:40                                 ` Eli Zaretskii
2023-04-15 11:57                                   ` Ihor Radchenko
2023-04-15 12:08                                     ` Eli Zaretskii
2023-04-21 11:44                               ` Eli Zaretskii
2023-04-21 15:28                                 ` Ihor Radchenko
2023-04-22  9:49                                   ` Eli Zaretskii
2023-04-22 12:39                                     ` Ihor Radchenko
2023-04-22 12:48                                       ` Eli Zaretskii
2023-04-22 14:32                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-04-23  8:55                                         ` Ihor Radchenko
2023-04-24 11:21                                           ` Eli Zaretskii
2023-04-24 12:29                                             ` Ihor Radchenko
2023-11-24 17:43                                               ` Dmitry Gutov
2023-11-24 18:54                                                 ` Eli Zaretskii
2023-11-24 18:56                                                   ` Dmitry Gutov
2023-11-25  7:08                                                     ` Eli Zaretskii
2023-11-25 12:38                                                       ` Dmitry Gutov
2023-11-25 12:59                                                         ` Eli Zaretskii
2023-11-25 13:55                                                           ` Dmitry Gutov
2023-04-22 14:30         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-04-22 14:59           ` Eli Zaretskii
2023-04-23  9:21           ` Ihor Radchenko
2023-05-01  1:48             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-01 10:25               ` Ihor Radchenko
2023-05-01 16:49                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-02 11:26                   ` Ihor Radchenko
2023-05-02 13:12                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-03 10:30                       ` Ihor Radchenko
2023-05-03 21:37                         ` Alan Mackenzie
2023-05-04  5:35                           ` Eli Zaretskii
2023-05-04 14:02                             ` Alan Mackenzie
2023-05-04 14:10                               ` Eli Zaretskii
2023-05-04 15:31                         ` Max Nikulin
2023-05-04 21:53                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-05  4:18                             ` Max Nikulin
2023-05-05  5:27                               ` Max Nikulin
2023-05-05  6:46                                 ` Eli Zaretskii
2023-05-05  7:27                                   ` Max Nikulin
2023-05-05 10:38                                     ` Eli Zaretskii
2023-05-05 11:20                                       ` Max Nikulin
2023-05-05 11:33                                         ` Eli Zaretskii
2023-05-05 15:33                                           ` Max Nikulin
2023-05-05 15:49                                             ` Eli Zaretskii
2023-05-05 16:46                                               ` Max Nikulin
2023-05-05 17:48                                                 ` Eli Zaretskii
2023-05-05 18:26                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-11 15:14                                                     ` bug#62762: circular dependencies in elisp files and make Max Nikulin
2023-05-11 15:20                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-11 15:59                                                       ` Eli Zaretskii
2023-05-12 14:59                                                         ` Max Nikulin
2023-05-12 15:10                                                           ` Eli Zaretskii
2023-05-12 15:26                                                             ` Max Nikulin
2023-05-12 16:01                                                               ` Eli Zaretskii
2023-05-13  3:08                                                                 ` Max Nikulin
2023-05-13  6:50                                                                   ` Eli Zaretskii
2023-05-13  7:34                                                                     ` Max Nikulin
2023-05-13  8:46                                                                       ` Eli Zaretskii
2023-05-13 10:25                                                                         ` Max Nikulin
2023-05-13 10:58                                                                           ` Eli Zaretskii
2023-05-13 11:21                                                                             ` Max Nikulin
2023-05-13 14:49                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-13 14:48                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-15 10:11                                                                         ` Max Nikulin
2023-05-15 11:20                                                                           ` Eli Zaretskii
2023-05-15 13:00                                                                             ` Max Nikulin
2023-05-15 15:00                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-13 15:43                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-05 14:29                               ` bug#62762: 'make' often errors with "Org version mismatch" after pulling a new version of the code Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-05 16:37                                 ` Max Nikulin
2023-05-05 18:17                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-06  5:25                                     ` Max Nikulin
2023-05-06 13:02                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-07 16:23                                         ` Max Nikulin
2023-05-07 21:57                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-05-08 10:05                                           ` Ihor Radchenko
2023-05-10 14:52                                             ` Max Nikulin
2023-06-23 12:02                                               ` Ihor Radchenko
2023-06-25 14:37                                                 ` Max Nikulin
2023-06-27 10:59                                                   ` Ihor Radchenko
2023-06-27 11:40                                                     ` Eli Zaretskii
2023-06-27 12:08                                                       ` Ihor Radchenko
2023-06-27 12:12                                                         ` Eli Zaretskii
2023-06-27 12:30                                                           ` Ihor Radchenko
2023-06-27 12:51                                                             ` Eli Zaretskii
2023-06-27 16:11                                                     ` Max Nikulin
2023-07-04 12:20                                                       ` Ihor Radchenko
2023-05-06  6:00                                     ` Max Nikulin
2023-05-06  7:51                                       ` bug#62762: Incremental builds and Lisp files dependencies " Eli Zaretskii
2023-05-06 15:50                                         ` Max Nikulin
2023-05-06 16:26                                           ` Eli Zaretskii
2023-05-07  2:45                                             ` Max Nikulin
2023-05-07  5:34                                               ` Eli Zaretskii

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).