Skip to contentSkip to conversation

qemu: replace "" with <> in headers

PATCH In review Michael S. Tsirkin 4 participants 18 messages Mar 21, 2018 – Mar 22, 2018 KVM

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 qemu: replace "" with <> in headers

Our current scheme is to use
#include ""
for internal headers, and
#include <>
for external ones.

Unfortunately this is not based on compiler support: from C point of view, the "" form merely looks up headers in the current directory and then falls back on <> directories.

Thus, for example, a system header trace.h - should it be present - will conflict with our local trace.h

As another example of problems, a header by the same name in the source directory will always be picked up first - before any headers in the include directory.

Let's change the scheme: make sure all headers that are not in the source directory are included through a path starting with qemu/ , thus:

#include <>

headers in the same directory as source are included with

#include ""

as per standard.

This (untested) patch is just to start the discussion and does not change all of the codebase. If there's agreement, this will be run on all code to converting code to this scheme.

---
 scripts/changeheaders.pl | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
 create mode 100755 scripts/changeheaders.pl
scripts/changeheaders.pl new file +20 -0
new file mode 100755
index 0000000..22bd5b8
@@ -0,0 +1,20 @@
+#!/usr/bin/perl -pi
+
+if (m@^\s*#include\s+"([^"+]"@o) {
+    next;
+}
+
+my $hdr = $1;
+my $file = $ARGV;
+$file =~ s@/[^/]+$@@g;
+$file .= $hdr;
+
+if (-e $file) {
+    next;
+}
+
+if (m@^\s*#include\s+"qemu/@o) {
+    s@^(\s*#include\s+)"qemu/([^"]+)"(.*)$@$1<qemu/common/$2>$3@o) {
+} else {
+    s@^(\s*#include\s+)"([^"]+)"(.*)$@$1<qemu/$2>$3@o) {
+}
Signature · 6 lines
MST

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
maintainer
#1 lore raw

scripts/changeheaders.pl line 20

Quoted 5 lines · Michael S. Tsirkin
scripts/changeheaders.pl new file +5 -0
+if (m@^\s*#include\s+"qemu/@o) {
+    s@^(\s*#include\s+)"qemu/([^"]+)"(.*)$@$1<qemu/common/$2>$3@o) {
+} else {
+    s@^(\s*#include\s+)"([^"]+)"(.*)$@$1<qemu/$2>$3@o) {
+}

Can you explain the changes in the source tree layout?

Also, s{}{} and m{} are a bit more readable.

Paolo

#2 lore raw
Quoted 8 lines · Paolo Bonzini

scripts/changeheaders.pl line 20

Quoted 5 lines · Michael S. Tsirkin
scripts/changeheaders.pl new file +5 -0
+if (m@^\s*#include\s+"qemu/@o) {
+    s@^(\s*#include\s+)"qemu/([^"]+)"(.*)$@$1<qemu/common/$2>$3@o) {
+} else {
+    s@^(\s*#include\s+)"([^"]+)"(.*)$@$1<qemu/$2>$3@o) {
+}

Can you explain the changes in the source tree layout?

include/qemu -> include/qemu/common
include/* -> include/qemu/*

Thus one uses any qemu headers with

#include <qemu/....>

we can do the conversion gradually and avoid a flag day with some use of softlinks.

Quoted 3 lines

Also, s{}{} and m{} are a bit more readable.

Paolo

Thanks, will use.

Signature · 1 line
MST
maintainer
#3 lore raw
Quoted 3 lines · Michael S. Tsirkin
Quoted 1 line

Can you explain the changes in the source tree layout?

include/qemu -> include/qemu/common
include/* -> include/qemu/*

Ok, then perhaps "util" instead of common would match the source layout more.

Paolo

Quoted 3 lines

Thus one uses any qemu headers with

#include <qemu/....>

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

#4 lore raw
In reply to Paolo Bonzini
Quoted 8 lines · Paolo Bonzini

scripts/changeheaders.pl line 20

Quoted 5 lines · Michael S. Tsirkin
scripts/changeheaders.pl new file +5 -0
+if (m@^\s*#include\s+"qemu/@o) {
+    s@^(\s*#include\s+)"qemu/([^"]+)"(.*)$@$1<qemu/common/$2>$3@o) {
+} else {
+    s@^(\s*#include\s+)"([^"]+)"(.*)$@$1<qemu/$2>$3@o) {
+}

Can you explain the changes in the source tree layout?

include/qemu -> include/qemu/common
include/* -> include/qemu/*

Thus one uses any qemu headers with

#include <qemu/....>

we can do the conversion gradually and avoid a flag day with some use of softlinks.

Quoted 3 lines

Also, s{}{} and m{} are a bit more readable.

Paolo

Thanks, will use.

Signature · 6 lines
MST

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
maintainer
#5 lore raw
In reply to Michael S. Tsirkin

scripts/changeheaders.pl line 20

Quoted 5 lines · Michael S. Tsirkin
scripts/changeheaders.pl new file +5 -0
+if (m@^\s*#include\s+"qemu/@o) {
+    s@^(\s*#include\s+)"qemu/([^"]+)"(.*)$@$1<qemu/common/$2>$3@o) {
+} else {
+    s@^(\s*#include\s+)"([^"]+)"(.*)$@$1<qemu/$2>$3@o) {
+}

Can you explain the changes in the source tree layout?

Also, s{}{} and m{} are a bit more readable.

Paolo

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

#6 lore raw
In reply to Michael S. Tsirkin
Quoted 6 lines · Michael S. Tsirkin

Our current scheme is to use
#include ""
for internal headers, and
#include <>
for external ones.

Quoted 6 lines

Unfortunately this is not based on compiler support: from C point of view, the "" form merely looks up headers in the current directory and then falls back on <> directories.

Thus, for example, a system header trace.h - should it be present - will conflict with our local trace.h

If our local "trace.h" is in the current directory, then using "" is right and you can still use <trace.h> to get the system version.

If our local trace.h is in include/ top level, then it is going to block use of the system trace.h regardless of whether we use <> or ""

Fortunately our include/ tree uses sub-dirs, so we would typically use #include "$subdir/trace.h" and #include <trace.h> would still find the system header.

We just have to be careful we don't add stuff at the top level of our include/ dir with names that are liable to clash. This might suggest renaming include/elf.h to include/qemu/elf.h, or just moving elf.h to the qemu/ subdirectory. Likewise include/glib-compat.h might be better moved to qemu/ subdirectory.

Quoted 3 lines

As another example of problems, a header by the same name in the source directory will always be picked up first - before any headers in the include directory.

There's only a couple of headers in the top level of our include/ directory - everything else is pulled in with a named path eg #include "block/block_int.h", so that would not conflict with reference to a bare #include "block_int.h" from the current directory.

Quoted 11 lines

Let's change the scheme: make sure all headers that are not in the source directory are included through a path starting with qemu/ , thus:

#include <>

headers in the same directory as source are included with

#include ""

as per standard.

As stated before, I consider this a step backwards - it is a good clear standard to use "" for project local includes and <> for 3rd party / system includes IMHO. The change doesn't do anything beneficial for the two scenarios described above AFAICT.

Regards,
Daniel

Signature · 8 lines
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
#7 lore raw
Quoted 20 lines · Daniel P. Berrangé
Quoted 6 lines · Michael S. Tsirkin

Our current scheme is to use
#include ""
for internal headers, and
#include <>
for external ones.

Quoted 6 lines

Unfortunately this is not based on compiler support: from C point of view, the "" form merely looks up headers in the current directory and then falls back on <> directories.

Thus, for example, a system header trace.h - should it be present - will conflict with our local trace.h

If our local "trace.h" is in the current directory, then using "" is right and you can still use <trace.h> to get the system version.

If our local trace.h is in include/ top level, then it is going to block use of the system trace.h regardless of whether we use <> or ""

Quoted 9 lines

Fortunately our include/ tree uses sub-dirs, so we would typically use #include "$subdir/trace.h" and #include <trace.h> would still find the system header.
We just have to be careful we don't add stuff at the top level of our include/ dir with names that are liable to clash. This might suggest renaming include/elf.h to include/qemu/elf.h, or just moving elf.h to the qemu/ subdirectory. Likewise include/glib-compat.h might be better moved to qemu/ subdirectory.

This is exactly what this patch proposes, with a uniform scheme:
start everything with qemu/.

Quoted 9 lines
Quoted 4 lines

As another example of problems, a header by the same name in the source directory will always be picked up first - before any headers in the include directory.

There's only a couple of headers in the top level of our include/ directory - everything else is pulled in with a named path eg #include "block/block_int.h", so that would not conflict with reference to a bare #include "block_int.h" from the current directory.

We can not know that there are no system headers that start with block/ on any current or future systems.

Quoted 10 lines
Quoted 10 lines

Let's change the scheme: make sure all headers that are not in the source directory are included through a path starting with qemu/ , thus:

#include <>

headers in the same directory as source are included with

#include ""

Quoted 7 lines
Quoted 1 line

as per standard.

As stated before, I consider this a step backwards - it is a good clear standard to use "" for project local includes and <> for 3rd party / system includes IMHO. The change doesn't do anything beneficial for the two scenarios described above AFAICT.

I think you are mistaken on the last point:
1. Everything will be under qemu/ so we never clash with a system file
2. A local stale file anywhere in source directory is completely ignored since source is not on -I path.

I hope this clarifies things.

Quoted 7 lines

Regards,
Daniel

Signature · 3 lines
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

#8 lore raw
Quoted 39 lines · Michael S. Tsirkin
Quoted 20 lines · Daniel P. Berrangé
Quoted 6 lines · Michael S. Tsirkin

Our current scheme is to use
#include ""
for internal headers, and
#include <>
for external ones.

Quoted 6 lines

Unfortunately this is not based on compiler support: from C point of view, the "" form merely looks up headers in the current directory and then falls back on <> directories.

Thus, for example, a system header trace.h - should it be present - will conflict with our local trace.h

If our local "trace.h" is in the current directory, then using "" is right and you can still use <trace.h> to get the system version.

If our local trace.h is in include/ top level, then it is going to block use of the system trace.h regardless of whether we use <> or ""

Quoted 9 lines

Fortunately our include/ tree uses sub-dirs, so we would typically use #include "$subdir/trace.h" and #include <trace.h> would still find the system header.
We just have to be careful we don't add stuff at the top level of our include/ dir with names that are liable to clash. This might suggest renaming include/elf.h to include/qemu/elf.h, or just moving elf.h to the qemu/ subdirectory. Likewise include/glib-compat.h might be better moved to qemu/ subdirectory.

This is exactly what this patch proposes, with a uniform scheme:
start everything with qemu/.

Quoted 5 lines
Quoted 4 lines

As another example of problems, a header by the same name in the source directory will always be picked up first - before any headers in the include directory.

Quoted 7 lines
Quoted 4 lines

There's only a couple of headers in the top level of our include/ directory - everything else is pulled in with a named path eg #include "block/block_int.h", so that would not conflict with reference to a bare #include "block_int.h" from the current directory.

We can not know that there are no system headers that start with block/ on any current or future systems.

Ah true, good point. I guess that's where the benefit of -iquote comes into play.

Regards,
Daniel

Signature · 3 lines
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|
#9 lore raw
In reply to Michael S. Tsirkin
Quoted 39 lines · Michael S. Tsirkin
Quoted 20 lines · Daniel P. Berrangé
Quoted 6 lines · Michael S. Tsirkin

Our current scheme is to use
#include ""
for internal headers, and
#include <>
for external ones.

Quoted 6 lines

Unfortunately this is not based on compiler support: from C point of view, the "" form merely looks up headers in the current directory and then falls back on <> directories.

Thus, for example, a system header trace.h - should it be present - will conflict with our local trace.h

If our local "trace.h" is in the current directory, then using "" is right and you can still use <trace.h> to get the system version.

If our local trace.h is in include/ top level, then it is going to block use of the system trace.h regardless of whether we use <> or ""

Quoted 9 lines

Fortunately our include/ tree uses sub-dirs, so we would typically use #include "$subdir/trace.h" and #include <trace.h> would still find the system header.
We just have to be careful we don't add stuff at the top level of our include/ dir with names that are liable to clash. This might suggest renaming include/elf.h to include/qemu/elf.h, or just moving elf.h to the qemu/ subdirectory. Likewise include/glib-compat.h might be better moved to qemu/ subdirectory.

This is exactly what this patch proposes, with a uniform scheme:
start everything with qemu/.

Quoted 5 lines
Quoted 4 lines

As another example of problems, a header by the same name in the source directory will always be picked up first - before any headers in the include directory.

Quoted 7 lines
Quoted 4 lines

There's only a couple of headers in the top level of our include/ directory - everything else is pulled in with a named path eg #include "block/block_int.h", so that would not conflict with reference to a bare #include "block_int.h" from the current directory.

We can not know that there are no system headers that start with block/ on any current or future systems.

Ah true, good point. I guess that's where the benefit of -iquote comes into play.

Regards,
Daniel

Signature · 8 lines
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
#10 lore raw
In reply to Michael S. Tsirkin

Am 21.03.2018 um 15:46 hat Michael S. Tsirkin geschrieben:

Quoted 6 lines

Our current scheme is to use
#include ""
for internal headers, and
#include <>
for external ones.

Quoted 6 lines

Unfortunately this is not based on compiler support: from C point of view, the "" form merely looks up headers in the current directory and then falls back on <> directories.

Thus, for example, a system header trace.h - should it be present - will conflict with our local trace.h

You're right that there is a conflict, even though only in one
direction: "trace.h" is unambiguously the local trace.h in our source tree, but <trace.h> refers to the same local header rather than the system header as you would expect.

An easy way to resolve this conflict would be using -iquote rather than -I for directories in the source tree, so that <trace.h> unambiguously refers to the system header and "trace.h" unambiguously refers to the QEMU header.

Quoted 12 lines

As another example of problems, a header by the same name in the source directory will always be picked up first - before any headers in the include directory.

Let's change the scheme: make sure all headers that are not in the source directory are included through a path starting with qemu/ , thus:

#include <>

headers in the same directory as source are included with

Quoted 7 lines

#include ""

as per standard.

This (untested) patch is just to start the discussion and does not change all of the codebase. If there's agreement, this will be run on all code to converting code to this scheme.

Renaming files is always painful. If that's the fix, the cure might be worse than the disease. As far as I know, the conflict is only theoretical, so in that case I'd say: If it ain't broke, don't fix it.

Kevin

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

#11 lore raw
Quoted 19 lines · Kevin Wolf

Am 21.03.2018 um 15:46 hat Michael S. Tsirkin geschrieben:

Quoted 6 lines

Our current scheme is to use
#include ""
for internal headers, and
#include <>
for external ones.

Quoted 6 lines

Unfortunately this is not based on compiler support: from C point of view, the "" form merely looks up headers in the current directory and then falls back on <> directories.

Thus, for example, a system header trace.h - should it be present - will conflict with our local trace.h

You're right that there is a conflict, even though only in one
direction: "trace.h" is unambiguously the local trace.h in our source tree, but <trace.h> refers to the same local header rather than the system header as you would expect.

Quoted 4 lines

An easy way to resolve this conflict would be using -iquote rather than -I for directories in the source tree, so that <trace.h> unambiguously refers to the system header and "trace.h" unambiguously refers to the QEMU header.

I posted patches to that effect for 2.12. It's all still very much a non-standard convention and so less robust than prefixing file name with a project-specifix prefix.

Quoted 20 lines
Quoted 12 lines

As another example of problems, a header by the same name in the source directory will always be picked up first - before any headers in the include directory.

Let's change the scheme: make sure all headers that are not in the source directory are included through a path starting with qemu/ , thus:

#include <>

headers in the same directory as source are included with

Quoted 7 lines

#include ""

as per standard.

This (untested) patch is just to start the discussion and does not change all of the codebase. If there's agreement, this will be run on all code to converting code to this scheme.

Quoted 5 lines

Renaming files is always painful. If that's the fix, the cure might be worse than the disease. As far as I know, the conflict is only theoretical, so in that case I'd say: If it ain't broke, don't fix it.

Kevin

It's broke I think, it's very hard for new people to contribute to QEMU. Look e.g. at rdma which all has messed up includes - and that's from an experienced conributor who just isn't an experienced maintainer.

Amount of time spent on teaching new people trivia about our conventions just isn't funny. They should be self-documenting and violations should cause the build to fail.

Signature · 1 line
MST
#12 lore raw

Am 21.03.2018 um 16:58 hat Michael S. Tsirkin geschrieben:

Quoted 20 lines · Kevin Wolf
Quoted 19 lines

Am 21.03.2018 um 15:46 hat Michael S. Tsirkin geschrieben:

Quoted 6 lines

Our current scheme is to use
#include ""
for internal headers, and
#include <>
for external ones.

Quoted 6 lines

Unfortunately this is not based on compiler support: from C point of view, the "" form merely looks up headers in the current directory and then falls back on <> directories.

Thus, for example, a system header trace.h - should it be present - will conflict with our local trace.h

You're right that there is a conflict, even though only in one
direction: "trace.h" is unambiguously the local trace.h in our source tree, but <trace.h> refers to the same local header rather than the system header as you would expect.

Quoted 6 lines
Quoted 4 lines

An easy way to resolve this conflict would be using -iquote rather than -I for directories in the source tree, so that <trace.h> unambiguously refers to the system header and "trace.h" unambiguously refers to the QEMU header.

I posted patches to that effect for 2.12.

Ah, I missed those. That's good (and imho enough).

Quoted 2 lines

It's all still very much a non-standard convention and so less robust than prefixing file name with a project-specifix prefix.

I've always had the impression that it's by far the most common convention, to the point that I'd blindly assume it when joining a new project.

Quoted 24 lines
Quoted 24 lines
Quoted 12 lines

As another example of problems, a header by the same name in the source directory will always be picked up first - before any headers in the include directory.

Let's change the scheme: make sure all headers that are not in the source directory are included through a path starting with qemu/ , thus:

#include <>

headers in the same directory as source are included with

Quoted 7 lines

#include ""

as per standard.

This (untested) patch is just to start the discussion and does not change all of the codebase. If there's agreement, this will be run on all code to converting code to this scheme.

Renaming files is always painful. If that's the fix, the cure might be worse than the disease. As far as I know, the conflict is only theoretical, so in that case I'd say: If it ain't broke, don't fix it.

Quoted 5 lines
Quoted 1 line

Kevin

It's broke I think, it's very hard for new people to contribute to QEMU. Look e.g. at rdma which all has messed up includes - and that's from an experienced conributor who just isn't an experienced maintainer.

I don't think the problem is that the convention is hard to apply (it's definitely not). It's knowing about the convention. This problem isn't going away by switching to a different, less common convention. We're only going to see more offenders then.

Quoted 3 lines

Amount of time spent on teaching new people trivia about our conventions just isn't funny. They should be self-documenting and violations should cause the build to fail.

Yes, but your proposal doesn't achieve this. You can still use "qemu/foo.h" instead of <qemu/foo.h> and it will build successfully. That's something we can't change, as far as I know, because the include path for "foo.h" is always a superset of <foo.h>.

If anything, this means that we should prefer "foo.h" for local headers (i.e. the way it currently is) because we can let the compiler enforce
it: <foo.h> for "foo.h" can become a build error, and does so with your -iquote patch, but the other way round doesn't work.

Then it's only system headers that you can possibly get wrong, but for those everyone should be used to using <foo.h> anyway.

Kevin

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

#13 lore raw
Quoted 6 lines · Kevin Wolf
Quoted 2 lines

It's all still very much a non-standard convention and so less robust than prefixing file name with a project-specifix prefix.

I've always had the impression that it's by far the most common convention, to the point that I'd blindly assume it when joining a new project.

Any examples?

Quoted 26 lines
Quoted 26 lines
Quoted 25 lines
Quoted 12 lines

As another example of problems, a header by the same name in the source directory will always be picked up first - before any headers in the include directory.

Let's change the scheme: make sure all headers that are not in the source directory are included through a path starting with qemu/ , thus:

#include <>

headers in the same directory as source are included with

Quoted 7 lines

#include ""

as per standard.

This (untested) patch is just to start the discussion and does not change all of the codebase. If there's agreement, this will be run on all code to converting code to this scheme.

Renaming files is always painful. If that's the fix, the cure might be worse than the disease. As far as I know, the conflict is only theoretical, so in that case I'd say: If it ain't broke, don't fix it.

Kevin

Quoted 8 lines
Quoted 3 lines

It's broke I think, it's very hard for new people to contribute to QEMU. Look e.g. at rdma which all has messed up includes - and that's from an experienced conributor who just isn't an experienced maintainer.

I don't think the problem is that the convention is hard to apply (it's definitely not). It's knowing about the convention. This problem isn't going away by switching to a different, less common convention. We're only going to see more offenders then.

Not if we have some automatic tools to catch violators.

Quoted 8 lines
Quoted 3 lines

Amount of time spent on teaching new people trivia about our conventions just isn't funny. They should be self-documenting and violations should cause the build to fail.

Yes, but your proposal doesn't achieve this. You can still use "qemu/foo.h" instead of <qemu/foo.h> and it will build successfully. That's something we can't change, as far as I know, because the include path for "foo.h" is always a superset of <foo.h>.

If the rule is that "" is only for files in the current directory then we can easily code up a checkpatch script to catch violators.

Quoted 9 lines

If anything, this means that we should prefer "foo.h" for local headers (i.e. the way it currently is) because we can let the compiler enforce
it: <foo.h> for "foo.h" can become a build error, and does so with your -iquote patch, but the other way round doesn't work.

Then it's only system headers that you can possibly get wrong, but for those everyone should be used to using <foo.h> anyway.

Kevin

If my proposal to prefix all include directories with qemu/ is accepted, then we can solve the stale file problem by prohibiting a directory named qemu everywhere in source.

Signature · 1 line
MST
maintainer
#14 lore raw
Quoted 8 lines · Michael S. Tsirkin
Quoted 5 lines · Kevin Wolf
Quoted 2 lines

It's all still very much a non-standard convention and so less robust than prefixing file name with a project-specifix prefix.

I've always had the impression that it's by far the most common convention, to the point that I'd blindly assume it when joining a new project.

Any examples?

GCC - https://github.com/gcc-mirror/gcc/blob/master/gcc/reload.c
Libvirt - https://github.com/libvirt/libvirt/blob/master/src/util/virprocess.c
SDL - https://github.com/SDL-mirror/SDL/blob/master/src/core/unix/SDL_poll.c

Anything but Linux really.

I find <qemu/foo/bar.h> verbose and unnecessary. The only advantage of your proposal is that files included from the source directory would be clearly noticeable. That said, it's easy to add a checkpatch.pl rule that detects when ".../..." is used on a file not under include/.

Paolo

maintainer
#15 lore raw
In reply to Michael S. Tsirkin
Quoted 8 lines · Michael S. Tsirkin
Quoted 5 lines · Kevin Wolf
Quoted 2 lines

It's all still very much a non-standard convention and so less robust than prefixing file name with a project-specifix prefix.

I've always had the impression that it's by far the most common convention, to the point that I'd blindly assume it when joining a new project.

Any examples?

GCC - https://github.com/gcc-mirror/gcc/blob/master/gcc/reload.c
Libvirt - https://github.com/libvirt/libvirt/blob/master/src/util/virprocess.c
SDL - https://github.com/SDL-mirror/SDL/blob/master/src/core/unix/SDL_poll.c

Anything but Linux really.

I find <qemu/foo/bar.h> verbose and unnecessary. The only advantage of your proposal is that files included from the source directory would be clearly noticeable. That said, it's easy to add a checkpatch.pl rule that detects when ".../..." is used on a file not under include/.

Paolo

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel

#16 lore raw
In reply to Kevin Wolf
Quoted 6 lines · Kevin Wolf
Quoted 2 lines

It's all still very much a non-standard convention and so less robust than prefixing file name with a project-specifix prefix.

I've always had the impression that it's by far the most common convention, to the point that I'd blindly assume it when joining a new project.

Any examples?

Quoted 26 lines
Quoted 26 lines
Quoted 25 lines
Quoted 12 lines

As another example of problems, a header by the same name in the source directory will always be picked up first - before any headers in the include directory.

Let's change the scheme: make sure all headers that are not in the source directory are included through a path starting with qemu/ , thus:

#include <>

headers in the same directory as source are included with

Quoted 7 lines

#include ""

as per standard.

This (untested) patch is just to start the discussion and does not change all of the codebase. If there's agreement, this will be run on all code to converting code to this scheme.

Renaming files is always painful. If that's the fix, the cure might be worse than the disease. As far as I know, the conflict is only theoretical, so in that case I'd say: If it ain't broke, don't fix it.

Kevin

Quoted 8 lines
Quoted 3 lines

It's broke I think, it's very hard for new people to contribute to QEMU. Look e.g. at rdma which all has messed up includes - and that's from an experienced conributor who just isn't an experienced maintainer.

I don't think the problem is that the convention is hard to apply (it's definitely not). It's knowing about the convention. This problem isn't going away by switching to a different, less common convention. We're only going to see more offenders then.

Not if we have some automatic tools to catch violators.

Quoted 8 lines
Quoted 3 lines

Amount of time spent on teaching new people trivia about our conventions just isn't funny. They should be self-documenting and violations should cause the build to fail.

Yes, but your proposal doesn't achieve this. You can still use "qemu/foo.h" instead of <qemu/foo.h> and it will build successfully. That's something we can't change, as far as I know, because the include path for "foo.h" is always a superset of <foo.h>.

If the rule is that "" is only for files in the current directory then we can easily code up a checkpatch script to catch violators.

Quoted 9 lines

If anything, this means that we should prefer "foo.h" for local headers (i.e. the way it currently is) because we can let the compiler enforce
it: <foo.h> for "foo.h" can become a build error, and does so with your -iquote patch, but the other way round doesn't work.

Then it's only system headers that you can possibly get wrong, but for those everyone should be used to using <foo.h> anyway.

Kevin

If my proposal to prefix all include directories with qemu/ is accepted, then we can solve the stale file problem by prohibiting a directory named qemu everywhere in source.

Signature · 6 lines
MST

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
#17 lore raw
In reply to Kevin Wolf
Quoted 19 lines · Kevin Wolf

Am 21.03.2018 um 15:46 hat Michael S. Tsirkin geschrieben:

Quoted 6 lines

Our current scheme is to use
#include ""
for internal headers, and
#include <>
for external ones.

Quoted 6 lines

Unfortunately this is not based on compiler support: from C point of view, the "" form merely looks up headers in the current directory and then falls back on <> directories.

Thus, for example, a system header trace.h - should it be present - will conflict with our local trace.h

You're right that there is a conflict, even though only in one
direction: "trace.h" is unambiguously the local trace.h in our source tree, but <trace.h> refers to the same local header rather than the system header as you would expect.

Quoted 4 lines

An easy way to resolve this conflict would be using -iquote rather than -I for directories in the source tree, so that <trace.h> unambiguously refers to the system header and "trace.h" unambiguously refers to the QEMU header.

I posted patches to that effect for 2.12. It's all still very much a non-standard convention and so less robust than prefixing file name with a project-specifix prefix.

Quoted 20 lines
Quoted 12 lines

As another example of problems, a header by the same name in the source directory will always be picked up first - before any headers in the include directory.

Let's change the scheme: make sure all headers that are not in the source directory are included through a path starting with qemu/ , thus:

#include <>

headers in the same directory as source are included with

Quoted 7 lines

#include ""

as per standard.

This (untested) patch is just to start the discussion and does not change all of the codebase. If there's agreement, this will be run on all code to converting code to this scheme.

Quoted 5 lines

Renaming files is always painful. If that's the fix, the cure might be worse than the disease. As far as I know, the conflict is only theoretical, so in that case I'd say: If it ain't broke, don't fix it.

Kevin

It's broke I think, it's very hard for new people to contribute to QEMU. Look e.g. at rdma which all has messed up includes - and that's from an experienced conributor who just isn't an experienced maintainer.

Amount of time spent on teaching new people trivia about our conventions just isn't funny. They should be self-documenting and violations should cause the build to fail.

Signature · 6 lines
MST

_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel